Skip to:
Content

bbPress.org

Changeset 4059


Ignore:
Timestamp:
07/05/2012 05:32:33 AM (9 years ago)
Author:
johnjamesjacoby
Message:

Performance:

  • Add 'numeric' to applicable meta-queries to avoid casting as char.
  • Remove meta-queries, and use post_parent where possible.
  • Introduce _bbp_has_replies_where() filter, attached to 'posts_where' which is responsible for adding the lead topic to the results. This avoids having to use a costly meta-query, potentially resulting in full table scans.
  • Audit meta-queries, and tweak where needed.
  • Fixes #1885.
  • Props vibol for investigation.
Location:
branches/plugin/bbp-includes
Files:
7 edited

Legend:

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

    r4034 r4059  
    14711471                            'key'     => '_bbp_forum_id',
    14721472                            'value'   => $forum_id,
     1473                            'type'    => 'numeric',
    14731474                            'compare' => '='
    14741475                        ) );
     
    15011502                            'feed'           => true,
    15021503                            'post_type'      => bbp_get_topic_post_type(),
    1503                             'post_parent'    => 'any',
     1504                            'post_parent'    => $forum_id,
    15041505                            'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
    15051506                            'posts_per_page' => bbp_get_topics_per_rss_page(),
    1506                             'order'          => 'DESC',
    1507                             'meta_query'     => $meta_query
     1507                            'order'          => 'DESC'
    15081508                        );
    15091509
     
    15501550
    15511551                        // Output the feed
    1552                         bbp_display_replies_feed_rss2();
     1552                        bbp_display_replies_feed_rss2( array( 'feed' => true ) );
    15531553
    15541554                    // All topics
  • branches/plugin/bbp-includes/bbp-core-filters.php

    r3966 r4059  
    201201add_filter( 'bbp_pre_anonymous_post_author_website', 'wp_filter_kses',      10 );
    202202
     203// Queries
     204add_filter( 'posts_where', '_bbp_has_replies_where', 10, 2 );
     205
    203206/** Functions *****************************************************************/
    204207
  • branches/plugin/bbp-includes/bbp-core-shortcodes.php

    r4048 r4059  
    377377        }
    378378
    379         // Filter the query
    380         if ( ! bbp_is_single_topic() ) {
    381             add_filter( 'bbp_before_has_replies_parse_args', array( $this, 'display_topic_query' ) );
    382         }
    383 
    384379        // Start output buffer
    385380        $this->start( 'bbp_single_topic' );
     
    749744        $args['show_stickies'] = true;
    750745        $args['order']         = 'DESC';
    751         return $args;
    752     }
    753 
    754     /**
    755      * Filter the query for the topic index
    756      *
    757      * @since bbPress (r3637)
    758      *
    759      * @param array $args
    760      * @return array
    761      */
    762     public function display_topic_query( $args = array() ) {
    763         $args['meta_query'] = array( array(
    764             'key'     => '_bbp_topic_id',
    765             'value'   => bbpress()->current_topic_id,
    766             'compare' => '='
    767         ) );
    768 
    769746        return $args;
    770747    }
  • branches/plugin/bbp-includes/bbp-forum-functions.php

    r4042 r4059  
    15691569
    15701570    // Setup arrays
    1571     $retval = $private = $hidden = $meta_query = $forum_ids = array();
    1572 
     1571    $private = $hidden = $meta_query = $forum_ids = array();
     1572
     1573    // Default return value
     1574    switch ( $type ) {
     1575        case 'string' :
     1576            $retval = '';
     1577            break;
     1578
     1579        case 'array'  :
     1580            $retval = array();
     1581            break;
     1582
     1583        case 'meta_query' :
     1584            $retval = array( array() ) ;
     1585            break;
     1586    }
     1587   
    15731588    // Exclude for everyone but super admins
    15741589    if ( !is_super_admin() ) {
     
    16051620                        'key'     => '_bbp_forum_id',
    16061621                        'value'   => implode( ',', $forum_ids ),
     1622                        'type'    => 'numeric',
    16071623                        'compare' => ( 1 < count( $forum_ids ) ) ? 'NOT IN' : '!='
    16081624                    );
     
    19491965    // Validate forum ID
    19501966    $forum_id = bbp_get_forum_id( $forum_id );
    1951 
    19521967    if ( empty( $forum_id ) )
    19531968        return;
     
    19561971    if ( bbp_has_topics( array(
    19571972        'post_type'      => bbp_get_topic_post_type(),
     1973        'post_parent'    => $forum_id,
    19581974        'post_status'    => 'any',
    1959         'posts_per_page' => -1,
    1960         'meta_query'     => array( array(
    1961             'key'        => '_bbp_forum_id',
    1962             'value'      => $forum_id,
    1963             'compare'    => '='
    1964         ) )
     1975        'posts_per_page' => -1
    19651976    ) ) ) {
    19661977        while ( bbp_topics() ) {
     
    19932004    // Validate forum ID
    19942005    $forum_id = bbp_get_forum_id( $forum_id );
    1995 
    19962006    if ( empty( $forum_id ) )
    19972007        return;
     
    20072017    if ( bbp_has_topics( array(
    20082018        'post_type'      => bbp_get_topic_post_type(),
     2019        'post_parent'    => $forum_id,
    20092020        'post_status'    => $post_stati,
    2010         'posts_per_page' => -1,
    2011         'meta_query'     => array( array(
    2012             'key'        => '_bbp_forum_id',
    2013             'value'      => $forum_id,
    2014             'compare'    => '='
    2015         ) )
     2021        'posts_per_page' => -1
    20162022    ) ) ) {
    20172023
  • branches/plugin/bbp-includes/bbp-reply-functions.php

    r4042 r4059  
    13661366}
    13671367
     1368/** Filters *******************************************************************/
     1369
     1370/**
     1371 * Used by bbp_has_replies() to add the topic to the posts
     1372 *
     1373 * This function filters the 'post_where' of the WP_Query, and changes the query
     1374 * to include both the topic AND its children in the same loop.
     1375 *
     1376 * @since bbPress (r4058)
     1377 *
     1378 * @param string $where
     1379 * @return string
     1380 */
     1381function _bbp_has_replies_where( $where, $query ) {
     1382
     1383    // Bail if no post_parent to replace
     1384    if ( ! is_numeric( $query->get( 'post_parent' ) ) )
     1385        return $where;
     1386
     1387    // Bail if not a topic and reply query
     1388    if ( array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ) != $query->get( 'post_type' ) )
     1389        return $where;
     1390
     1391    // Get the topic ID
     1392    $topic_id = bbp_get_topic_id();
     1393
     1394    // The text we're searching for
     1395    $search   = 'wp_posts.post_parent = ' . $topic_id ;
     1396
     1397    // The text to replace it with
     1398    $replace  = '(wp_posts.ID = ' . $topic_id . ' OR wp_posts.post_parent = ' . $topic_id . ')';
     1399
     1400    // Try to replace the search text with the replacement
     1401    if ( $new_where = str_replace( $search, $replace, $where ) )
     1402        $where = $new_where;
     1403
     1404    return $where;
     1405}
     1406
    13681407/** Feeds *********************************************************************/
    13691408
  • branches/plugin/bbp-includes/bbp-reply-template.php

    r4042 r4059  
    6767    global $wp_rewrite;
    6868
    69     // Default status
    70     $default_status = join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) );
    71 
    72     // Skip topic_id if in the replies widget query
    73     $parent_args['meta_query'] = array( array(
    74         'key'     => '_bbp_topic_id',
    75         'value'   => bbp_get_topic_id(),
    76         'compare' => '='
    77     ) );
    78 
    7969    // What are the default allowed statuses (based on user caps)
    8070    if ( bbp_get_view_all( 'edit_others_replies' ) )
    81         $default_status = join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id(), bbp_get_spam_status_id(), bbp_get_trash_status_id() ) );
     71        $default_post_status = join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id(), bbp_get_spam_status_id(), bbp_get_trash_status_id() ) );
     72    else
     73        $default_post_status = join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) );
     74
     75    // Maybe Search
     76    $default_reply_search = !empty( $_REQUEST['rs'] ) ? $_REQUEST['rs'] : false;
     77    $default_post_parent  = ( bbp_is_single_topic() ) ? bbp_get_topic_id() : 'any';
     78    $default_post_type    = ( bbp_is_single_topic() && bbp_show_lead_topic() ) ? bbp_get_reply_post_type() : array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
    8279
    8380    // Default query args
    8481    $default = array(
    85         'post_type'      => bbp_show_lead_topic() ? bbp_get_reply_post_type() : array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ),
    86         'orderby'        => 'date',                                           // 'author', 'date', 'title', 'modified', 'parent', rand',
    87         'order'          => 'ASC',                                            // 'ASC', 'DESC'
    88         'posts_per_page' => bbp_get_replies_per_page(),                       // Max number
    89         'paged'          => bbp_get_paged(),                                  // Page Number
    90         's'              => !empty( $_REQUEST['rs'] ) ? $_REQUEST['rs'] : '', // Reply Search
    91         'post_status'    => $default_status                                   // Post Status
     82        'post_type'      => $default_post_type,         // Only replies
     83        'post_parent'    => $default_post_parent,       // Of this topic
     84        'post_status'    => $default_post_status,       // Of this status
     85        'posts_per_page' => bbp_get_replies_per_page(), // This many
     86        'paged'          => bbp_get_paged(),            // On this page
     87        'orderby'        => 'date',                     // Sorted by date
     88        'order'          => 'ASC',                      // Oldest to newest
     89        's'              => $default_reply_search,      // Maybe search
    9290    );
    93 
    94     // Merge the default args and parent args together
    95     if ( !empty( $parent_args ) )
    96         $default = array_merge( $parent_args, $default );
    9791
    9892    // Set up topic variables
  • branches/plugin/bbp-includes/bbp-topic-functions.php

    r4042 r4059  
    28312831
    28322832    // Topic is being permanently deleted, so its replies gotta go too
     2833    // @todo remove meta query
    28332834    if ( bbp_has_replies( array(
    28342835        'post_type'      => bbp_get_reply_post_type(),
     
    28382839            'key'        => '_bbp_topic_id',
    28392840            'value'      => $topic_id,
     2841            'type'       => 'numeric',
    28402842            'compare'    => '='
    28412843        ) )
     
    28752877
    28762878    // Topic is being trashed, so its replies are trashed too
     2879    // @todo remove meta query
    28772880    if ( bbp_has_replies( array(
    28782881        'post_type'      => bbp_get_reply_post_type(),
     
    28822885            'key'        => '_bbp_topic_id',
    28832886            'value'      => $topic_id,
     2887            'type'       => 'numeric',
    28842888            'compare'    => '='
    28852889        ) )
Note: See TracChangeset for help on using the changeset viewer.