Skip to:
Content

bbPress.org

Changeset 6607


Ignore:
Timestamp:
07/02/2017 04:39:49 PM (7 years ago)
Author:
johnjamesjacoby
Message:

Queries: nopaging audit.

  • In r6506 the nopaging query argument was added to various queries to avoid paginating results when it wasn't necessary. This resulted in a few queries (widgets mainly) not obeying their specific settings.
  • In #3123, other inconsistencies in our query arguments were uncovered, triggering the need to audit our query usages and equalize them once again.

This change brings all queries back to par with one another, specifically in regards to posts_per_page => -1 style queries, and queries where filters can be suppressed and meta/term caches should not be primed.

It also groups together the get_user_object_ids functions. These are now unused in bbPress proper, though were previously useful before the engagements API was in place. These queries are considered too inefficient to rely upon in large-scale applications, but are included to provide filterable wrappers should someone need them, or should we need to bring them back later.

Props thebrandonallen. Fixes #3123.

Location:
trunk/src/includes
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/includes/common/functions.php

    r6586 r6607  
    14721472
    14731473    $query = new WP_Query( array(
    1474         'fields'      => 'ids',
    1475         'post_parent' => $parent_id,
    1476         'post_status' => $post_status,
    1477         'post_type'   => $post_type,
    1478         'orderby'     => array(
     1474        'fields'         => 'ids',
     1475        'post_parent'    => $parent_id,
     1476        'post_status'    => $post_status,
     1477        'post_type'      => $post_type,
     1478        'posts_per_page' => 1,
     1479        'orderby'        => array(
    14791480            'post_date' => 'DESC',
    14801481            'ID'        => 'DESC'
    14811482        ),
    14821483
    1483         // Maybe change these later
    1484         'posts_per_page'         => 1,
     1484        // Performance
     1485        'suppress_filters'       => true,
    14851486        'update_post_term_cache' => false,
    14861487        'update_post_meta_cache' => false,
     
    15081509
    15091510    // Bail if nothing passed
    1510     if ( empty( $parent_id ) ) {
     1511    if ( empty( $parent_id ) || empty( $post_type ) ) {
    15111512        return false;
    15121513    }
     
    15211522
    15221523    $query = new WP_Query( array(
    1523         'fields'      => 'ids',
    1524         'post_parent' => $parent_id,
    1525         'post_status' => $post_status,
    1526         'post_type'   => $post_type,
    1527 
    1528         // Maybe change these later
    1529         'posts_per_page'         => -1,
     1524        'fields'         => 'ids',
     1525        'post_parent'    => $parent_id,
     1526        'post_status'    => $post_status,
     1527        'post_type'      => $post_type,
     1528        'posts_per_page' => -1,
     1529
     1530        // Performance
     1531        'nopaging'               => true,
     1532        'suppress_filters'       => true,
    15301533        'update_post_term_cache' => false,
    15311534        'update_post_meta_cache' => false,
     
    15671570
    15681571    $query = new WP_Query( array(
    1569         'fields'           => 'ids',
    1570         'suppress_filters' => true,
    1571         'post_parent'      => $parent_id,
    1572         'post_status'      => $post_status,
    1573         'post_type'        => $post_type,
    1574         'posts_per_page'   => -1,
    1575 
    1576         // Maybe change these later
     1572        'fields'         => 'ids',
     1573        'post_parent'    => $parent_id,
     1574        'post_status'    => $post_status,
     1575        'post_type'      => $post_type,
     1576        'posts_per_page' => -1,
     1577        'orderby'        => array(
     1578            'post_date' => 'DESC',
     1579            'ID'        => 'DESC'
     1580        ),
     1581
     1582        // Performance
     1583        'nopaging'               => true,
     1584        'suppress_filters'       => true,
    15771585        'update_post_term_cache' => false,
    15781586        'update_post_meta_cache' => false,
    15791587        'ignore_sticky_posts'    => true,
    1580         'no_found_rows'          => true,
    1581         'nopaging'               => true
     1588        'no_found_rows'          => true
    15821589    ) );
    15831590    $child_ids = ! empty( $query->posts ) ? $query->posts : array();
  • trunk/src/includes/forums/capabilities.php

    r6573 r6607  
    219219
    220220/**
    221  * Get array of forum IDs that a user can moderate
    222  *
    223  * @since 2.6.0 bbPress (r5834)
    224  *
    225  * @param int $user_id User id.
    226  *
    227  * @return boolean|array Return false on error or empty, or array of forum ids
    228  */
    229 function bbp_get_moderator_forum_ids( $user_id = 0 ) {
    230     $user_id = bbp_get_user_id( $user_id );
    231     $forums  = new WP_Query( array(
    232         'fields'        => 'ids',
    233         'post_type'     => bbp_get_forum_post_type(),
    234         'nopaging'      => true,
    235         'no_found_rows' => true,
    236         'meta_query'    => array( array(
    237             'key'     => '_bbp_moderator_id',
    238             'value'   => $user_id,
    239             'compare' => 'NUMERIC'
    240         ) )
    241     ) );
    242 
    243     // Filter & return
    244     return (array) apply_filters( 'bbp_get_moderator_forum_ids', $forums->posts, $user_id, $forums );
    245 }
    246 
    247 /**
    248221 * Can a user moderate a forum?
    249222 *
  • trunk/src/includes/forums/functions.php

    r6585 r6607  
    963963    // Query for private forums
    964964    $private_forums = new WP_Query( array(
    965         'fields'           => 'ids',
    966         'suppress_filters' => true,
    967         'post_type'        => bbp_get_forum_post_type(),
    968         'post_status'      => bbp_get_private_status_id(),
    969         'posts_per_page'   => -1,
     965        'fields'         => 'ids',
     966        'post_type'      => bbp_get_forum_post_type(),
     967        'post_status'    => bbp_get_private_status_id(),
     968        'posts_per_page' => -1,
    970969
    971970        // Performance
     971        'nopaging'               => true,
     972        'suppress_filters'       => true,
     973        'update_post_term_cache' => false,
     974        'update_post_meta_cache' => false,
    972975        'ignore_sticky_posts'    => true,
    973         'no_found_rows'          => true,
    974         'nopaging'               => true,
    975         'update_post_term_cache' => false,
    976         'update_post_meta_cache' => false
     976        'no_found_rows'          => true
    977977    ) );
    978978
     
    986986
    987987        // Performance
     988        'nopaging'               => true,
     989        'suppress_filters'       => true,
     990        'update_post_term_cache' => false,
     991        'update_post_meta_cache' => false,
    988992        'ignore_sticky_posts'    => true,
    989         'no_found_rows'          => true,
    990         'nopaging'               => true,
    991         'update_post_term_cache' => false,
    992         'update_post_meta_cache' => false
     993        'no_found_rows'          => true
    993994    ) );
    994995
     
    16031604 *                       i.e. the forum is automatically retrieved.
    16041605 * @param bool $total_count Optional. To return the total count or normal count?
    1605  
    16061606 * @return int Forum topic count
    16071607 */
     
    16621662        if ( empty( $topic_count ) ) {
    16631663            $query = new WP_Query( array(
    1664                 'fields'           => 'ids',
    1665                 'suppress_filters' => true,
    1666                 'post_parent'      => $forum_id,
    1667                 'post_status'      => array( bbp_get_trash_status_id(), bbp_get_spam_status_id(), bbp_get_pending_status_id() ),
    1668                 'post_type'        => bbp_get_topic_post_type(),
    1669                 'posts_per_page'   => -1,
     1664                'fields'         => 'ids',
     1665                'post_parent'    => $forum_id,
     1666                'post_status'    => array( bbp_get_trash_status_id(), bbp_get_spam_status_id(), bbp_get_pending_status_id() ),
     1667                'post_type'      => bbp_get_topic_post_type(),
     1668                'posts_per_page' => -1,
    16701669
    16711670                // Performance
     1671                'nopaging'               => true,
     1672                'suppress_filters'       => true,
    16721673                'update_post_term_cache' => false,
    16731674                'update_post_meta_cache' => false,
    16741675                'ignore_sticky_posts'    => true,
    1675                 'no_found_rows'          => true,
    1676                 'nopaging'               => true
     1676                'no_found_rows'          => true
    16771677            ) );
    16781678            $topic_count = $query->post_count;
     
    17201720    if ( ! empty( $topic_ids ) ) {
    17211721        $query = new WP_Query( array(
    1722             'fields'           => 'ids',
    1723             'suppress_filters' => true,
    1724             'post_parent__in'  => $topic_ids,
    1725             'post_status'      => bbp_get_public_status_id(),
    1726             'post_type'        => bbp_get_reply_post_type(),
    1727             'posts_per_page'   => -1,
     1722            'fields'          => 'ids',
     1723            'post_parent__in' => $topic_ids,
     1724            'post_status'     => bbp_get_public_status_id(),
     1725            'post_type'       => bbp_get_reply_post_type(),
     1726            'posts_per_page'  => -1,
    17281727
    17291728            // Performance
     1729            'nopaging'               => true,
     1730            'suppress_filters'       => true,
    17301731            'update_post_term_cache' => false,
    17311732            'update_post_meta_cache' => false,
    17321733            'ignore_sticky_posts'    => true,
    1733             'no_found_rows'          => true,
    1734             'nopaging'               => true
     1734            'no_found_rows'          => true
    17351735        ) );
    17361736        $reply_count = ! empty( $query->posts ) ? count( $query->posts ) : 0;
     
    21372137        'update_post_meta_cache' => false,
    21382138        'ignore_sticky_posts'    => true,
    2139         'no_found_rows'          => true,
    2140         'nopaging'               => true
     2139        'no_found_rows'          => true
    21412140    ) );
    21422141    $reply_id = array_shift( $query->posts );
     
    22732272    // Note that we get all post statuses here
    22742273    $topics = new WP_Query( array(
    2275         'fields'           => 'id=>parent',
    2276         'suppress_filters' => true,
    2277 
    2278         // What and how
    2279         'post_type'        => bbp_get_topic_post_type(),
    2280         'post_parent'      => $forum_id,
    2281         'post_status'      => array_keys( get_post_stati() ),
    2282         'posts_per_page'   => -1,
     2274        'fields'         => 'id=>parent',
     2275        'post_type'      => bbp_get_topic_post_type(),
     2276        'post_parent'    => $forum_id,
     2277        'post_status'    => array_keys( get_post_stati() ),
     2278        'posts_per_page' => -1,
    22832279
    22842280        // Performance
     2281        'nopaging'               => true,
     2282        'suppress_filters'       => true,
     2283        'update_post_term_cache' => false,
     2284        'update_post_meta_cache' => false,
    22852285        'ignore_sticky_posts'    => true,
    2286         'no_found_rows'          => true,
    2287         'nopaging'               => true,
    2288         'update_post_term_cache' => false,
    2289         'update_post_meta_cache' => false
     2286        'no_found_rows'          => true
    22902287    ) );
    22912288
     
    23302327    // Forum is being trashed, so its topics (and replies) are trashed too
    23312328    $topics = new WP_Query( array(
    2332         'fields'           => 'id=>parent',
    2333         'suppress_filters' => true,
    2334         'post_type'        => bbp_get_topic_post_type(),
    2335         'post_parent'      => $forum_id,
    2336         'post_status'      => $post_stati,
    2337         'posts_per_page'   => -1,
     2329        'fields'         => 'id=>parent',
     2330        'post_type'      => bbp_get_topic_post_type(),
     2331        'post_parent'    => $forum_id,
     2332        'post_status'    => $post_stati,
     2333        'posts_per_page' => -1,
    23382334
    23392335        // Performance
     2336        'nopaging'               => true,
     2337        'suppress_filters'       => true,
     2338        'update_post_term_cache' => false,
     2339        'update_post_meta_cache' => false,
    23402340        'ignore_sticky_posts'    => true,
    2341         'no_found_rows'          => true,
    2342         'nopaging'               => true,
    2343         'update_post_term_cache' => false,
    2344         'update_post_meta_cache' => false
     2341        'no_found_rows'          => true
    23452342    ) );
    23462343
  • trunk/src/includes/topics/functions.php

    r6585 r6607  
    28822882    // Topic is being spammed, so its replies are trashed
    28832883    $replies = new WP_Query( array(
    2884         'suppress_filters' => true,
    2885         'post_type'        => bbp_get_reply_post_type(),
    2886         'post_status'      => bbp_get_public_status_id(),
    2887         'post_parent'      => $topic_id,
    2888         'posts_per_page'   => -1,
    2889         'nopaging'         => true,
    2890         'no_found_rows'    => true,
    2891         'fields'           => 'id=>parent'
     2884        'fields'         => 'id=>parent',
     2885        'post_type'      => bbp_get_reply_post_type(),
     2886        'post_status'    => bbp_get_public_status_id(),
     2887        'post_parent'    => $topic_id,
     2888        'posts_per_page' => -1,
     2889
     2890        // Performance
     2891        'nopaging'               => true,
     2892        'suppress_filters'       => true,
     2893        'update_post_term_cache' => false,
     2894        'update_post_meta_cache' => false,
     2895        'ignore_sticky_posts'    => true,
     2896        'no_found_rows'          => true
    28922897    ) );
    28932898
     
    29152920/**
    29162921 * Store the tags to a topic in post meta before it's marked as spam so they
    2917  * can be retreived and unspammed later.
     2922 * can be retrieved and unspammed later.
    29182923 *
    29192924 * Usually you'll want to do this before the topic itself is marked as spam.
     
    32733278    // Note that we get all post statuses here
    32743279    $replies = new WP_Query( array(
    3275         'suppress_filters' => true,
    3276         'post_type'        => bbp_get_reply_post_type(),
    3277         'post_status'      => array_keys( get_post_stati() ),
    3278         'post_parent'      => $topic_id,
    3279         'posts_per_page'   => -1,
    3280         'nopaging'         => true,
    3281         'no_found_rows'    => true,
    3282         'fields'           => 'id=>parent'
     3280        'fields'         => 'id=>parent',
     3281        'post_type'      => bbp_get_reply_post_type(),
     3282        'post_status'    => array_keys( get_post_stati() ),
     3283        'post_parent'    => $topic_id,
     3284        'posts_per_page' => -1,
     3285
     3286        // Performance
     3287        'nopaging'               => true,
     3288        'suppress_filters'       => true,
     3289        'update_post_term_cache' => false,
     3290        'update_post_meta_cache' => false,
     3291        'ignore_sticky_posts'    => true,
     3292        'no_found_rows'          => true
    32833293    ) );
    32843294
     
    33293339    // Topic is being trashed, so its replies are trashed too
    33303340    $replies = new WP_Query( array(
    3331         'suppress_filters' => true,
    3332         'post_type'        => bbp_get_reply_post_type(),
    3333         'post_status'      => bbp_get_public_status_id(),
    3334         'post_parent'      => $topic_id,
    3335         'posts_per_page'   => -1,
    3336         'nopaging'         => true,
    3337         'no_found_rows'    => true,
    3338         'fields'           => 'id=>parent'
     3341        'fields'         => 'id=>parent',
     3342        'post_type'      => bbp_get_reply_post_type(),
     3343        'post_status'    => bbp_get_public_status_id(),
     3344        'post_parent'    => $topic_id,
     3345        'posts_per_page' => -1,
     3346
     3347        // Performance
     3348        'nopaging'               => true,
     3349        'suppress_filters'       => true,
     3350        'update_post_term_cache' => false,
     3351        'update_post_meta_cache' => false,
     3352        'ignore_sticky_posts'    => true,
     3353        'no_found_rows'          => true
    33393354    ) );
    33403355
  • trunk/src/includes/users/engagements.php

    r6573 r6607  
    228228    // Filter & return
    229229    return apply_filters( 'bbp_get_user_engagements', $engagements, $user_id );
    230 }
    231 
    232 /**
    233  * Get a user's engaged topic ids
    234  *
    235  * @since 2.6.0 bbPress (r6320)
    236  *
    237  * @param int $user_id Optional. User id
    238  *
    239  * @return array Topic ids if user has engaged, otherwise empty array
    240  */
    241 function bbp_get_user_engaged_topic_ids( $user_id = 0 ) {
    242     $user_id     = bbp_get_user_id( $user_id );
    243     $engagements = new WP_Query( array(
    244         'fields'        => 'ids',
    245         'post_type'     => bbp_get_topic_post_type(),
    246         'nopaging'      => true,
    247         'no_found_rows' => true,
    248         'meta_query'    => array( array(
    249             'key'     => '_bbp_engagement',
    250             'value'   => $user_id,
    251             'compare' => 'NUMERIC'
    252         ) )
    253     ) );
    254 
    255     // Filter & return
    256     return (array) apply_filters( 'bbp_get_user_engaged_topic_ids', $engagements->posts, $user_id );
    257230}
    258231
     
    928901
    929902/**
     903 * Get a user's object IDs
     904 *
     905 * For the most part, you should not need to use this function, and may even
     906 * want to come up with a more efficient way to get IDs on your own. Nevertheless,
     907 * it is available here for your convenience, using the most efficient query
     908 * parameters available inside of the various query APIs.
     909 *
     910 * @since 2.6.0 bbPress (r6606)
     911 *
     912 * @param int    $user_id   The user id
     913 * @param string $meta_key  The relationship key
     914 * @param string $meta_type The relationship type (usually 'post')
     915 * @param array  $args      The arguments to override defaults
     916 *
     917 * @return array|bool Results if user has objects, otherwise null
     918 */
     919function bbp_get_user_object_ids( $args = array() ) {
     920    $object_ids = $defaults = array();
     921
     922    // Parse arguments
     923    $r = bbp_parse_args( $args, array(
     924        'user_id'     => 0,
     925        'object_type' => bbp_get_topic_post_type(),
     926        'meta_key'    => '',
     927        'meta_type'   => 'post',
     928        'filter'      => 'user_object_ids',
     929        'args'        => array()
     930    ), 'get_user_object_ids' );
     931
     932    // Sanitize arguments
     933    $r['user_id']     = bbp_get_user_id( $r['user_id'] );
     934    $r['meta_key']    = sanitize_key( $r['meta_key'] );
     935    $r['meta_type']   = sanitize_key( $r['meta_type'] );
     936    $r['object_type'] = sanitize_key( $r['object_type'] );
     937    $r['filter']      = sanitize_key( $r['filter'] );
     938
     939    // Defaults
     940    if ( 'post' === $r['meta_type'] ) {
     941        $defaults = array(
     942            'fields'         => 'ids',
     943            'post_type'      => $r['object_type'],
     944            'posts_per_page' => -1,
     945            'meta_query'     => array( array(
     946                'key'     => $r['meta_key'],
     947                'value'   => $r['user_id'],
     948                'compare' => 'NUMERIC'
     949            ),
     950
     951            // Performance
     952            'nopaging'               => true,
     953            'suppress_filters'       => true,
     954            'update_post_term_cache' => false,
     955            'update_post_meta_cache' => false,
     956            'ignore_sticky_posts'    => true,
     957            'no_found_rows'          => true
     958        ) );
     959    }
     960
     961    // Parse arguments
     962    $r = bbp_parse_args( $r['args'], $defaults, "get_{$r['filter']}_args" );
     963
     964    // Queries
     965    if ( 'post' === $r['meta_type'] ) {
     966        $query      = new WP_Query( $r );
     967        $object_ids = $query->posts;
     968    }
     969
     970    // Filter & return
     971    return (array) apply_filters( "bbp_get_{$r['filter']}", $object_ids, $r, $args );
     972}
     973
     974/**
     975 * Get array of forum IDs that a user can moderate
     976 *
     977 * @since 2.6.0 bbPress (r5834)
     978 *
     979 * @param int $user_id User id.
     980 *
     981 * @return array Return array of forum ids, or empty array
     982 */
     983function bbp_get_moderator_forum_ids( $user_id = 0 ) {
     984    return bbp_get_user_object_ids( array(
     985        'user_id'   => $user_id,
     986        'meta_key'  => '_bbp_moderator_id',
     987        'post_type' => bbp_get_forum_post_type(),
     988        'filter'    => 'moderator_forum_ids'
     989    ) );
     990}
     991
     992/**
     993 * Get a user's engaged topic ids
     994 *
     995 * @since 2.6.0 bbPress (r6320)
     996 *
     997 * @param int $user_id Optional. User id
     998 *
     999 * @return array Return array of topic ids, or empty array
     1000 */
     1001function bbp_get_user_engaged_topic_ids( $user_id = 0 ) {
     1002    return bbp_get_user_object_ids( array(
     1003        'user_id'  => $user_id,
     1004        'meta_key' => '_bbp_engagement',
     1005        'filter'   => 'user_engaged_topic_ids'
     1006    ) );
     1007}
     1008
     1009/**
    9301010 * Get a user's favorite topic ids
    9311011 *
     
    9341014 * @param int $user_id Optional. User id
    9351015 *
    936  * @return array|bool Results if user has favorites, otherwise null
     1016 * @return array Return array of favorited ids, or empty array
    9371017 */
    9381018function bbp_get_user_favorites_topic_ids( $user_id = 0 ) {
    939     $user_id   = bbp_get_user_id( $user_id );
    940     $favorites = new WP_Query( array(
    941         'fields'        => 'ids',
    942         'post_type'     => bbp_get_topic_post_type(),
    943         'nopaging'      => true,
    944         'no_found_rows' => true,
    945         'meta_query'    => array( array(
    946             'key'     => '_bbp_favorite',
    947             'value'   => $user_id,
    948             'compare' => 'NUMERIC'
    949         ) )
     1019    return bbp_get_user_object_ids( array(
     1020        'user_id'  => $user_id,
     1021        'meta_key' => '_bbp_favorite',
     1022        'filter'   => 'user_favorites_topic_ids'
    9501023    ) );
    951 
    952     // Filter & return
    953     return (array) apply_filters( 'bbp_get_user_favorites_topic_ids', $favorites->posts, $user_id );
    954 }
    955 
     1024}
    9561025
    9571026/**
     
    9621031 * @param int $user_id Optional. User id
    9631032 *
    964  * @return array|bool Results if user has subscriptions, otherwise null
     1033 * @return array Return array of subscribed ids, or empty array
    9651034 */
    9661035function bbp_get_user_subscribed_forum_ids( $user_id = 0 ) {
    967     $user_id       = bbp_get_user_id( $user_id );
    968     $subscriptions = new WP_Query( array(
    969         'fields'        => 'ids',
    970         'post_type'     => bbp_get_forum_post_type(),
    971         'nopaging'      => true,
    972         'no_found_rows' => true,
    973         'meta_query'    => array( array(
    974             'key'     => '_bbp_subscription',
    975             'value'   => $user_id,
    976             'compare' => 'NUMERIC'
    977         ) )
     1036    return bbp_get_user_object_ids( array(
     1037        'user_id'   => $user_id,
     1038        'meta_key'  => '_bbp_subscription',
     1039        'post_type' => bbp_get_forum_post_type(),
     1040        'filter'    => 'user_subscribed_forum_ids'
    9781041    ) );
    979 
    980     // Filter & return
    981     return (array) apply_filters( 'bbp_get_user_subscribed_forum_ids', $subscriptions->posts, $user_id );
    9821042}
    9831043
     
    9891049 * @param int $user_id Optional. User id
    9901050 *
    991  * @return array|bool Results if user has subscriptions, otherwise null
     1051 * @return array Return array of subscribed ids, or empty array
    9921052 */
    9931053function bbp_get_user_subscribed_topic_ids( $user_id = 0 ) {
    994     $user_id       = bbp_get_user_id( $user_id );
    995     $subscriptions = new WP_Query( array(
    996         'fields'        => 'ids',
    997         'post_type'     => bbp_get_topic_post_type(),
    998         'nopaging'      => true,
    999         'no_found_rows' => true,
    1000         'meta_query' => array( array(
    1001             'key'     => '_bbp_subscription',
    1002             'value'   => $user_id,
    1003             'compare' => 'NUMERIC'
    1004         ) )
     1054    return bbp_get_user_object_ids( array(
     1055        'user_id'  => $user_id,
     1056        'meta_key' => '_bbp_subscription',
     1057        'filter'   => 'user_subscribed_topic_ids'
    10051058    ) );
    1006 
    1007     // Filter & return
    1008     return (array) apply_filters( 'bbp_get_user_subscribed_topic_ids', $subscriptions->posts, $user_id );
    10091059}
    10101060
Note: See TracChangeset for help on using the changeset viewer.