Skip to:
Content

bbPress.org

Changeset 2769


Ignore:
Timestamp:
01/07/2011 09:20:44 PM (13 years ago)
Author:
johnjamesjacoby
Message:

Introduce forum statistics; fixes #1427. Introduce method to limit number of pages in topics query. Props GautamGupta via Google Code-in

Location:
branches/plugin
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • branches/plugin/bbp-includes/bbp-functions.php

    r2768 r2769  
    9191    $args   = array( $forums, $depth, $r, $current );
    9292    return call_user_func_array( array( &$walker, 'walk' ), $args );
     93}
     94
     95/**
     96 * Get the forum statistics
     97 *
     98 * @since bbPress (r2769)
     99 *
     100 * @param mixed $args Optional. The function supports these arguments (all
     101 *                     default to true):
     102 *  - count_users: Count users?
     103 *  - count_forums: Count forums?
     104 *  - count_topics: Count topics? If set to false, private, spammed and trashed
     105 *                   topics are also not counted.
     106 *  - count_private_topics: Count private topics? (only counted if the current
     107 *                           user has read_private_topics cap)
     108 *  - count_spammed_topics: Count spammed topics? (only counted if the current
     109 *                           user has edit_others_topics cap)
     110 *  - count_trashed_topics: Count trashed topics? (only counted if the current
     111 *                           user has view_trash cap)
     112 *  - count_replies: Count replies? If set to false, private, spammed and
     113 *                   trashed replies are also not counted.
     114 *  - count_private_replies: Count private replies? (only counted if the current
     115 *                           user has read_private_replies cap)
     116 *  - count_spammed_replies: Count spammed replies? (only counted if the current
     117 *                           user has edit_others_replies cap)
     118 *  - count_trashed_replies: Count trashed replies? (only counted if the current
     119 *                           user has view_trash cap)
     120 *  - count_tags: Count tags? If set to false, empty tags are also not counted
     121 *  - count_empty_tags: Count empty tags?
     122 * @uses bbp_count_users() To count the number of registered users
     123 * @uses wp_count_posts() To count the number of forums, topics and replies
     124 * @uses wp_count_terms() To count the number of topic tags
     125 * @uses current_user_can() To check if the user is capable of doing things
     126 * @uses number_format_i18n() To format the number
     127 * @uses apply_filters() Calls 'bbp_get_statistics' with the statistics and args
     128 * @return object Walked forum tree
     129 */
     130function bbp_get_statistics( $args = '' ) {
     131    global $bbp;
     132
     133    $defaults = array (
     134        'count_users'           => true,
     135        'count_forums'          => true,
     136        'count_topics'          => true,
     137        'count_private_topics'  => true,
     138        'count_spammed_topics'  => true,
     139        'count_trashed_topics'  => true,
     140        'count_replies'         => true,
     141        'count_private_replies' => true,
     142        'count_spammed_replies' => true,
     143        'count_trashed_replies' => true,
     144        'count_tags'            => true,
     145        'count_empty_tags'      => true
     146    );
     147
     148    $r = wp_parse_args( $args, $defaults );
     149    extract( $r );
     150
     151    // Users
     152    if ( !empty( $count_users ) )
     153        $user_count = bbp_get_total_users();
     154
     155    // Forums
     156    if ( !empty( $count_forums ) ) {
     157        $forum_count = wp_count_posts( $bbp->forum_id );
     158        $forum_count = $forum_count->publish;
     159    }
     160
     161    // Topics
     162    if ( !empty( $count_topics ) ) {
     163
     164        $all_topics     = wp_count_posts( $bbp->topic_id );
     165
     166        // Published (publish + closed)
     167        $topic_count    = $all_topics->publish + $all_topics->{$bbp->closed_status_id};
     168
     169        if ( current_user_can( 'read_private_topics' ) || current_user_can( 'edit_others_topics' ) || current_user_can( 'view_trash' ) ) {
     170
     171            // Private
     172            $private_topics = ( !empty( $count_private_topics ) && current_user_can( 'read_private_topics' ) ) ? (int) $all_topics->private                 : 0;
     173
     174            // Spam
     175            $spammed_topics = ( !empty( $count_spammed_topics ) && current_user_can( 'edit_others_topics'  ) ) ? (int) $all_topics->{$bbp->spam_status_id}  : 0;
     176
     177            // Trash
     178            $trashed_topics = ( !empty( $count_trashed_topics ) && current_user_can( 'view_trash'          ) ) ? (int) $all_topics->{$bbp->trash_status_id} : 0;
     179
     180            // Total hidden (private + spam + trash)
     181            $hidden_topic_count = $private_topics + $spammed_topics + $trashed_topics;
     182
     183            // Generate the hidden topic count's title attribute
     184            $hidden_topic_title  = !empty( $private_topics ) ? sprintf( __( 'Private: %s | ', 'bbpress' ), number_format_i18n( $private_topics ) ) : '';
     185            $hidden_topic_title .= !empty( $spammed_topics ) ? sprintf( __( 'Spammed: %s | ', 'bbpress' ), number_format_i18n( $spammed_topics ) ) : '';
     186            $hidden_topic_title .= !empty( $trashed_topics ) ? sprintf( __( 'Trashed: %s',    'bbpress' ), number_format_i18n( $trashed_topics ) ) : '';
     187
     188        }
     189
     190    }
     191
     192    // Replies
     193    if ( !empty( $count_replies ) ) {
     194
     195        $all_replies     = wp_count_posts( $bbp->reply_id );
     196
     197        // Published
     198        $reply_count     = $all_replies->publish;
     199
     200        if ( current_user_can( 'read_private_replies' ) || current_user_can( 'edit_others_replies' ) || current_user_can( 'view_trash' ) ) {
     201
     202            // Private
     203            $private_replies = ( !empty( $count_private_replies ) && current_user_can( 'read_private_replies' ) ) ? (int) $all_replies->private                 : 0;
     204
     205            // Spam
     206            $spammed_replies = ( !empty( $count_spammed_replies ) && current_user_can( 'edit_others_replies'  ) ) ? (int) $all_replies->{$bbp->spam_status_id}  : 0;
     207
     208            // Trash
     209            $trashed_replies = ( !empty( $count_trashed_replies ) && current_user_can( 'view_trash'           ) ) ? (int) $all_replies->{$bbp->trash_status_id} : 0;
     210
     211            // Total hidden (private + spam + trash)
     212            $hidden_reply_count = $private_replies + $spammed_replies + $trashed_replies;
     213
     214            // Generate the hidden reply count's title attribute
     215            $hidden_reply_title  = !empty( $private_replies ) ? sprintf( __( 'Private: %s | ', 'bbpress' ), number_format_i18n( $private_replies ) ) : '';
     216            $hidden_reply_title .= !empty( $spammed_replies ) ? sprintf( __( 'Spammed: %s | ', 'bbpress' ), number_format_i18n( $spammed_replies ) ) : '';
     217            $hidden_reply_title .= !empty( $trashed_replies ) ? sprintf( __( 'Trashed: %s',    'bbpress' ), number_format_i18n( $trashed_replies ) ) : '';
     218
     219        }
     220
     221    }
     222
     223    // Topic Tags
     224    if ( !empty( $count_tags ) ) {
     225        $topic_tag_count = wp_count_terms( $bbp->topic_tag_id, array( 'hide_empty' => true ) );
     226
     227        if ( !empty( $count_empty_tags ) && current_user_can( 'edit_topic_tags' ) )
     228            $empty_topic_tag_count = wp_count_terms( $bbp->topic_tag_id ) - $topic_tag_count;
     229    }
     230
     231    $statistics = compact( 'user_count', 'forum_count', 'topic_count', 'hidden_topic_count', 'reply_count', 'hidden_reply_count', 'topic_tag_count', 'empty_topic_tag_count' );
     232    $statistics = array_map( 'absint',             $statistics );
     233    $statistics = array_map( 'number_format_i18n', $statistics );
     234
     235    // Add the hidden (topic/reply) count title attribute strings because we don't need to run the math functions on these (see above)
     236    if ( isset( $hidden_topic_title ) )
     237        $statistics['hidden_topic_title'] = $hidden_topic_title;
     238
     239    if ( isset( $hidden_reply_title ) )
     240        $statistics['hidden_reply_title'] = $hidden_reply_title;
     241
     242    return apply_filters( 'bbp_get_statistics', $statistics, $args );
    93243}
    94244
  • branches/plugin/bbp-includes/bbp-topic-template.php

    r2768 r2769  
    6565        // Ignore sticky topics?
    6666        'ignore_sticky_topics' => false,
     67
     68        // Maximum number of pages to show
     69        'max_num_pages'        => false,
    6770    );
    6871
     
    8689    }
    8790
     91    // Limited the number of pages shown
     92    if ( !empty( $max_num_pages ) )
     93        $bbp->topic_query->max_num_pages = $max_num_pages;
     94
    8895    // Put sticky posts at the top of the posts array, much part of code taken from query.php in wp-includes
    8996    if ( empty( $ignore_sticky_topics ) && ( is_page() || bbp_is_forum() ) && bbp_get_paged() <= 1 ) {
     
    154161    // Only add pagination if query returned results
    155162    if ( ( (int) $bbp->topic_query->post_count || (int) $bbp->topic_query->found_posts ) && (int) $bbp->topic_query->posts_per_page ) {
     163
     164        // Limited the number of topics shown based on maximum allowed pages
     165        if ( ( !empty( $max_num_pages ) ) && $bbp->topic_query->found_posts > $bbp->topic_query->max_num_pages * $bbp->topic_query->post_count )
     166            $bbp->topic_query->found_posts = $bbp->topic_query->max_num_pages * $bbp->topic_query->post_count;
    156167
    157168        // If pretty permalinks are enabled, make our pagination pretty
     
    162173        else
    163174            $base = add_query_arg( 'paged', '%#%' );
     175
    164176
    165177        // Pagination settings with filter
  • branches/plugin/bbp-includes/bbp-users.php

    r2758 r2769  
    518518}
    519519
     520/**
     521 * Get the total number of users on the forums
     522 *
     523 *  - Checks for a global $bbp_total_users, if it is set, then that is returned.
     524 *  - Runs the filter 'bbp_get_total_users', if we get anything other than false
     525 *     (strict check ===), then that is returned.
     526 *  - Runs its own query to count the users
     527 *
     528 * @since bbPress (r2769)
     529 *
     530 * @uses wp_cache_get() Check if query is in cache
     531 * @uses apply_filters() Calls 'bbp_get_total_users' with bool false
     532 * @uses wp_cache_set() Set the query in the cache
     533 * @uses wpdb::get_var() To execute our query and get the var back
     534 * @return int Total number of users
     535 */
     536function bbp_get_total_users() {
     537    global $wpdb, $bbp_total_users;
     538
     539    if ( $bbp_total_users = wp_cache_get( 'bbp_total_users', 'bbpress' ) )
     540        return $bbp_total_users;
     541
     542    $bbp_total_users = $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->users} USE INDEX (PRIMARY);" );
     543
     544    wp_cache_set( 'bbp_total_users', $bbp_total_users, 'bbpress' );
     545
     546    return apply_filters( 'bbp_get_total_users', (int) $bbp_total_users );
     547}
     548
    520549?>
  • branches/plugin/bbpress.php

    r2768 r2769  
    6262
    6363    /**
    64      * @var string Closed post status id. Used by forums and topics.
     64     * @var string Closed post status id. Used by topics.
    6565     */
    6666    var $closed_status_id;
Note: See TracChangeset for help on using the changeset viewer.