Skip to:
Content

bbPress.org

Ticket #1799: 1799.3.patch

File 1799.3.patch, 18.2 KB (added by netweb, 8 years ago)
  • src/includes/common/functions.php

     
    14001400 * @param int $parent_id Parent id
    14011401 * @param string $post_type Post type. Defaults to 'post'
    14021402 * @uses bbp_get_topic_post_type() To get the topic post type
    1403  * @uses wp_cache_get() To check if there is a cache of the last child id
    1404  * @uses wpdb::prepare() To prepare the query
    1405  * @uses wpdb::get_var() To get the result of the query in a variable
    1406  * @uses wp_cache_set() To set the cache for future use
     1403 * @uses WP_Query To get get the posts
    14071404 * @uses apply_filters() Calls 'bbp_get_public_child_last_id' with the child
    14081405 *                        id, parent id and post type
    14091406 * @return int The last active post_id
    14101407 */
    14111408function bbp_get_public_child_last_id( $parent_id = 0, $post_type = 'post' ) {
    1412         global $wpdb;
    14131409
    14141410        // Bail if nothing passed
    1415         if ( empty( $parent_id ) )
     1411        if ( empty( $parent_id ) ) {
    14161412                return false;
     1413        }
    14171414
    1418         // The ID of the cached query
    1419         $cache_id = 'bbp_parent_' . $parent_id . '_type_' . $post_type . '_child_last_id';
     1415        // Get the public posts status
     1416        $post_status = array( bbp_get_public_status_id() );
    14201417
     1418        // Add closed status if topic post type
     1419        if ( $post_type === bbp_get_topic_post_type() ) {
     1420                $post_status[] = bbp_get_closed_status_id();
     1421        }
     1422
    14211423        // Check for cache and set if needed
    1422         $child_id = wp_cache_get( $cache_id, 'bbpress_posts' );
    1423         if ( false === $child_id ) {
    1424                 $post_status = array( bbp_get_public_status_id() );
     1424        $query = new WP_Query( array(
     1425                'fields'      => 'ids',
     1426                'post_parent' => $parent_id,
     1427                'post_status' => $post_status,
     1428                'post_type'   => $post_type,
    14251429
    1426                 // Add closed status if topic post type
    1427                 if ( $post_type === bbp_get_topic_post_type() ) {
    1428                         $post_status[] = bbp_get_closed_status_id();
    1429                 }
     1430                // Maybe change these later
     1431                'posts_per_page'         => 1,
     1432                'update_post_term_cache' => false,
     1433                'update_post_meta_cache' => false,
     1434                'ignore_sticky_posts'    => true,
     1435        ) );
     1436        $child_id = array_shift( $query->posts );
     1437        unset( $query );
    14301438
    1431                 // Join post statuses together
    1432                 $post_status = "'" . implode( "', '", $post_status ) . "'";
    1433 
    1434                 $child_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s' ORDER BY ID DESC LIMIT 1;", $parent_id, $post_type ) );
    1435                 wp_cache_set( $cache_id, $child_id, 'bbpress_posts' );
    1436         }
    1437 
    14381439        // Filter and return
    14391440        return apply_filters( 'bbp_get_public_child_last_id', (int) $child_id, $parent_id, $post_type );
    14401441}
     
    14451446 * @param int $parent_id Parent id
    14461447 * @param string $post_type Post type. Defaults to 'post'
    14471448 * @uses bbp_get_topic_post_type() To get the topic post type
    1448  * @uses wp_cache_get() To check if there is a cache of the children count
    1449  * @uses wpdb::prepare() To prepare the query
    1450  * @uses wpdb::get_var() To get the result of the query in a variable
    1451  * @uses wp_cache_set() To set the cache for future use
     1449 * @uses WP_Query To get get the posts
    14521450 * @uses apply_filters() Calls 'bbp_get_public_child_count' with the child
    14531451 *                        count, parent id and post type
    14541452 * @return int The number of children
    14551453 */
    14561454function bbp_get_public_child_count( $parent_id = 0, $post_type = 'post' ) {
    1457         global $wpdb;
    14581455
    14591456        // Bail if nothing passed
    1460         if ( empty( $parent_id ) )
     1457        if ( empty( $parent_id ) ) {
    14611458                return false;
     1459        }
    14621460
    1463         // The ID of the cached query
    1464         $cache_id    = 'bbp_parent_' . $parent_id . '_type_' . $post_type . '_child_count';
     1461        // Check the public post status
     1462        $post_status = array( bbp_get_public_status_id() );
    14651463
    1466         // Check for cache and set if needed
    1467         $child_count = wp_cache_get( $cache_id, 'bbpress_posts' );
    1468         if ( false === $child_count ) {
    1469                 $post_status = array( bbp_get_public_status_id() );
     1464        // Add closed status if topic post type
     1465        if ( $post_type === bbp_get_topic_post_type() ) {
     1466                $post_status[] = bbp_get_closed_status_id();
     1467        }
    14701468
    1471                 // Add closed status if topic post type
    1472                 if ( $post_type === bbp_get_topic_post_type() ) {
    1473                         $post_status[] = bbp_get_closed_status_id();
    1474                 }
     1469        $query = new WP_Query( array(
     1470                'fields'      => 'ids',
     1471                'post_parent' => $parent_id,
     1472                'post_status' => $post_status,
     1473                'post_type'   => $post_type,
    14751474
    1476                 // Join post statuses together
    1477                 $post_status = "'" . implode( "', '", $post_status ) . "'";
     1475                // Maybe change these later
     1476                'posts_per_page'         => -1,
     1477                'update_post_term_cache' => false,
     1478                'update_post_meta_cache' => false,
     1479                'ignore_sticky_posts'    => true,
     1480        ) );
     1481        $child_count = $query->post_count;
     1482        unset( $query );
    14781483
    1479                 $child_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s';", $parent_id, $post_type ) );
    1480                 wp_cache_set( $cache_id, $child_count, 'bbpress_posts' );
    1481         }
    1482 
    14831484        // Filter and return
    14841485        return apply_filters( 'bbp_get_public_child_count', (int) $child_count, $parent_id, $post_type );
    14851486}
     
    14901491 * @param int $parent_id Parent id
    14911492 * @param string $post_type Post type. Defaults to 'post'
    14921493 * @uses bbp_get_topic_post_type() To get the topic post type
    1493  * @uses wp_cache_get() To check if there is a cache of the children
    1494  * @uses wpdb::prepare() To prepare the query
    1495  * @uses wpdb::get_col() To get the result of the query in an array
    1496  * @uses wp_cache_set() To set the cache for future use
     1494 * @uses WP_Query To get get the posts
    14971495 * @uses apply_filters() Calls 'bbp_get_public_child_ids' with the child ids,
    14981496 *                        parent id and post type
    14991497 * @return array The array of children
    15001498 */
    15011499function bbp_get_public_child_ids( $parent_id = 0, $post_type = 'post' ) {
    1502         global $wpdb;
    15031500
    15041501        // Bail if nothing passed
    1505         if ( empty( $parent_id ) )
     1502        if ( empty( $parent_id ) ) {
    15061503                return false;
     1504        }
    15071505
    1508         // The ID of the cached query
    1509         $cache_id  = 'bbp_parent_public_' . $parent_id . '_type_' . $post_type . '_child_ids';
     1506        // Get the public post status
     1507        $post_status = array( bbp_get_public_status_id() );
    15101508
    1511         // Check for cache and set if needed
    1512         $child_ids = wp_cache_get( $cache_id, 'bbpress_posts' );
    1513         if ( false === $child_ids ) {
    1514                 $post_status = array( bbp_get_public_status_id() );
     1509        // Add closed status if topic post type
     1510        if ( $post_type === bbp_get_topic_post_type() ) {
     1511                $post_status[] = bbp_get_closed_status_id();
     1512        }
    15151513
    1516                 // Add closed status if topic post type
    1517                 if ( $post_type === bbp_get_topic_post_type() ) {
    1518                         $post_status[] = bbp_get_closed_status_id();
    1519                 }
     1514        $query = new WP_Query( array(
     1515                'fields'      => 'ids',
     1516                'post_parent' => $parent_id,
     1517                'post_status' => $post_status,
     1518                'post_type'   => $post_type,
    15201519
    1521                 // Join post statuses together
    1522                 $post_status = "'" . implode( "', '", $post_status ) . "'";
     1520                // Maybe change these later
     1521                'posts_per_page'         => -1,
     1522                'update_post_term_cache' => false,
     1523                'update_post_meta_cache' => false,
     1524                'ignore_sticky_posts'    => true,
     1525        ) );
     1526        $child_ids = !empty( $query->posts ) ? $query->posts : array();
     1527        unset( $query );
    15231528
    1524                 $child_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s' ORDER BY ID DESC;", $parent_id, $post_type ) );
    1525                 wp_cache_set( $cache_id, $child_ids, 'bbpress_posts' );
    1526         }
    1527 
    15281529        // Filter and return
    15291530        return apply_filters( 'bbp_get_public_child_ids', $child_ids, $parent_id, $post_type );
    15301531}
     
    15351536 * @param int $parent_id Parent id
    15361537 * @param string $post_type Post type. Defaults to 'post'
    15371538 * @uses bbp_get_topic_post_type() To get the topic post type
    1538  * @uses wp_cache_get() To check if there is a cache of the children
    1539  * @uses wpdb::prepare() To prepare the query
    1540  * @uses wpdb::get_col() To get the result of the query in an array
    1541  * @uses wp_cache_set() To set the cache for future use
     1539 * @uses WP_Query To get get the posts
    15421540 * @uses apply_filters() Calls 'bbp_get_public_child_ids' with the child ids,
    15431541 *                        parent id and post type
    15441542 * @return array The array of children
    15451543 */
    15461544function bbp_get_all_child_ids( $parent_id = 0, $post_type = 'post' ) {
    1547         global $wpdb;
    15481545
    15491546        // Bail if nothing passed
    1550         if ( empty( $parent_id ) )
     1547        if ( empty( $parent_id ) ) {
    15511548                return false;
     1549        }
    15521550
    1553         // The ID of the cached query
    1554         $cache_id  = 'bbp_parent_all_' . $parent_id . '_type_' . $post_type . '_child_ids';
     1551        // Get the public post status
     1552        $post_status = array( bbp_get_public_status_id() );
    15551553
    1556         // Check for cache and set if needed
    1557         $child_ids = wp_cache_get( $cache_id, 'bbpress_posts' );
    1558         if ( false === $child_ids ) {
    1559                 $post_status = array( bbp_get_public_status_id() );
     1554        // Extra post statuses based on post type
     1555        switch ( $post_type ) {
    15601556
    1561                 // Extra post statuses based on post type
    1562                 switch ( $post_type ) {
     1557                // Forum
     1558                case bbp_get_forum_post_type() :
     1559                        $post_status[] = bbp_get_private_status_id();
     1560                        $post_status[] = bbp_get_hidden_status_id();
     1561                        break;
    15631562
    1564                         // Forum
    1565                         case bbp_get_forum_post_type() :
    1566                                 $post_status[] = bbp_get_private_status_id();
    1567                                 $post_status[] = bbp_get_hidden_status_id();
    1568                                 break;
     1563                // Topic
     1564                case bbp_get_topic_post_type() :
     1565                        $post_status[] = bbp_get_closed_status_id();
     1566                        $post_status[] = bbp_get_trash_status_id();
     1567                        $post_status[] = bbp_get_spam_status_id();
     1568                        break;
    15691569
    1570                         // Topic
    1571                         case bbp_get_topic_post_type() :
    1572                                 $post_status[] = bbp_get_closed_status_id();
    1573                                 $post_status[] = bbp_get_trash_status_id();
    1574                                 $post_status[] = bbp_get_spam_status_id();
    1575                                 break;
     1570                // Reply
     1571                case bbp_get_reply_post_type() :
     1572                        $post_status[] = bbp_get_trash_status_id();
     1573                        $post_status[] = bbp_get_spam_status_id();
     1574                        break;
     1575        }
    15761576
    1577                         // Reply
    1578                         case bbp_get_reply_post_type() :
    1579                                 $post_status[] = bbp_get_trash_status_id();
    1580                                 $post_status[] = bbp_get_spam_status_id();
    1581                                 break;
    1582                 }
     1577        $query = new WP_Query( array(
     1578                'fields'      => 'ids',
     1579                'post_parent' => $parent_id,
     1580                'post_status' => 'any',
     1581                'post_type'   => $post_type,
    15831582
    1584                 // Join post statuses together
    1585                 $post_status = "'" . implode( "', '", $post_status ) . "'";
     1583                // Maybe change these later
     1584                'posts_per_page'         => -1,
     1585                'update_post_term_cache' => false,
     1586                'update_post_meta_cache' => false,
     1587                'ignore_sticky_posts'    => true,
     1588        ) );
     1589        $child_ids = !empty( $query->posts ) ? $query->posts : array();
     1590        unset( $query );
    15861591
    1587                 $child_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s' ORDER BY ID DESC;", $parent_id, $post_type ) );
    1588                 wp_cache_set( $cache_id, $child_ids, 'bbpress_posts' );
    1589         }
    1590 
    15911592        // Filter and return
    15921593        return apply_filters( 'bbp_get_all_child_ids', $child_ids, (int) $parent_id, $post_type );
    15931594}
  • src/includes/core/cache.php

     
    145145
    146146        do_action( 'bbp_clean_post_cache', $_post->ID, $_post );
    147147
    148         // Child query types to clean
    149         $post_types = array(
    150                 bbp_get_topic_post_type(),
    151                 bbp_get_forum_post_type(),
    152                 bbp_get_reply_post_type()
    153         );
    154 
    155         // Loop through query types and clean caches
    156         foreach ( $post_types as $post_type ) {
    157                 wp_cache_delete( 'bbp_get_forum_'     . $_post->ID . '_reply_id',                              'bbpress_posts' );
    158                 wp_cache_delete( 'bbp_parent_'        . $_post->ID . '_type_' . $post_type . '_child_last_id', 'bbpress_posts' );
    159                 wp_cache_delete( 'bbp_parent_'        . $_post->ID . '_type_' . $post_type . '_child_count',   'bbpress_posts' );
    160                 wp_cache_delete( 'bbp_parent_public_' . $_post->ID . '_type_' . $post_type . '_child_ids',     'bbpress_posts' );
    161                 wp_cache_delete( 'bbp_parent_all_'    . $_post->ID . '_type_' . $post_type . '_child_ids',     'bbpress_posts' );
    162         }
    163 
    164148        // Invalidate parent caches
    165149        if ( ! empty( $_post->post_parent ) ) {
    166150                bbp_clean_post_cache( $_post->post_parent );
  • src/includes/forums/functions.php

     
    929929        // First, delete everything.
    930930        delete_option( '_bbp_private_forums' );
    931931        delete_option( '_bbp_hidden_forums'  );
    932        
     932
    933933        /**
    934934         * Don't search for both private/hidden statuses. Since 'pre_get_posts' is an
    935          * action, it's not removed by suppress_filters. We need to make sure that 
     935         * action, it's not removed by suppress_filters. We need to make sure that
    936936         * we're only searching for the supplied post_status.
    937937         *
    938938         * @see https://bbpress.trac.wordpress.org/ticket/2512
     
    954954                'post_status'      => bbp_get_hidden_status_id(),
    955955                'fields'           => 'ids'
    956956        ) );
    957        
     957
    958958        // Enable forum visibilty normalization
    959959        add_action( 'pre_get_posts', 'bbp_pre_get_posts_normalize_forum_visibility', 4 );
    960960
     
    14491449 * @return int Topic hidden topic count
    14501450 */
    14511451function bbp_update_forum_topic_count_hidden( $forum_id = 0, $topic_count = 0 ) {
    1452         global $wpdb;
    14531452
    14541453        // If topic_id was passed as $forum_id, then get its forum
    14551454        if ( bbp_is_topic( $forum_id ) ) {
     
    14661465
    14671466                // Get topics of forum
    14681467                if ( empty( $topic_count ) ) {
    1469                         $post_status = "'" . implode( "','", array( bbp_get_trash_status_id(), bbp_get_spam_status_id() ) ) . "'";
    1470                         $topic_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s';", $forum_id, bbp_get_topic_post_type() ) );
     1468                        $query = new WP_Query( array(
     1469                                'fields'      => 'ids',
     1470                                'post_parent' => $forum_id,
     1471                                'post_status' => array( bbp_get_trash_status_id(), bbp_get_spam_status_id() ),
     1472                                'post_type'   => bbp_get_topic_post_type(),
     1473
     1474                                // Maybe change these later
     1475                                'posts_per_page'         => -1,
     1476                                'update_post_term_cache' => false,
     1477                                'update_post_meta_cache' => false,
     1478                                'ignore_sticky_posts'    => true,
     1479                        ) );
     1480                        $topic_count = $query->post_count;
     1481                        unset( $query );
    14711482                }
    14721483
    14731484                // Update the count
     
    14991510 * @return int Forum reply count
    15001511 */
    15011512function bbp_update_forum_reply_count( $forum_id = 0 ) {
    1502         global $wpdb;
    15031513
    15041514        $forum_id = bbp_get_forum_id( $forum_id );
    15051515        $children_reply_count = 0;
     
    15151525        // Don't count replies if the forum is a category
    15161526        $topic_ids = bbp_forum_query_topic_ids( $forum_id );
    15171527        if ( !empty( $topic_ids ) ) {
    1518                 $topic_ids   = implode( ',', wp_parse_id_list( $topic_ids ) );
    1519                 $reply_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent IN ( {$topic_ids} ) AND post_status = '%s' AND post_type = '%s';", bbp_get_public_status_id(), bbp_get_reply_post_type() ) );
     1528                $query = new WP_Query( array(
     1529                        'fields'          => 'ids',
     1530                        'post_parent__in' => $topic_ids,
     1531                        'post_status'     => bbp_get_public_status_id(),
     1532                        'post_type'       => bbp_get_reply_post_type(),
     1533
     1534                        // Maybe change these later
     1535                        'posts_per_page'         => -1,
     1536                        'update_post_term_cache' => false,
     1537                        'update_post_meta_cache' => false,
     1538                        'ignore_sticky_posts'    => true,
     1539                ) );
     1540                $reply_count = ! empty( $query->posts ) ? count( $query->posts ) : 0;
     1541                unset( $query );
    15201542        } else {
    15211543                $reply_count = 0;
    15221544        }
     
    19041926 */
    19051927function bbp_forum_query_subforum_ids( $forum_id ) {
    19061928        $subforum_ids = bbp_get_all_child_ids( $forum_id, bbp_get_forum_post_type() );
    1907         //usort( $subforum_ids, '_bbp_forum_query_usort_subforum_ids' );
    19081929
    19091930        return apply_filters( 'bbp_get_forum_subforum_ids', $subforum_ids, $forum_id );
    19101931}
    19111932
    19121933/**
    1913  * Callback to sort forum ID's based on last active time
    1914  *
    1915  * @since bbPress (r3789)
    1916  * @param int $a First forum ID to compare
    1917  * @param int $b Second forum ID to compare
    1918  * @return Position change based on sort
    1919  */
    1920 function _bbp_forum_query_usort_subforum_ids( $a = 0, $b = 0 ) {
    1921         $ta = get_post_meta( $a, '_bbp_last_active_time', true );
    1922         $tb = get_post_meta( $b, '_bbp_last_active_time', true );
    1923         return ( $ta < $tb ) ? -1 : 1;
    1924 }
    1925 
    1926 /**
    19271934 * Returns the forum's last reply id
    19281935 *
    19291936 * @since bbPress (r2908)
     
    19301937 *
    19311938 * @param int $forum_id Forum id
    19321939 * @param int $topic_ids Optional. Topic ids
    1933  * @uses wp_cache_get() To check for cache and retrieve it
    19341940 * @uses bbp_forum_query_topic_ids() To get the forum's topic ids
    1935  * @uses wpdb::prepare() To prepare the query
    1936  * @uses wpdb::get_var() To execute the query and get the var back
    19371941 * @uses bbp_get_reply_post_type() To get the reply post type
    1938  * @uses wp_cache_set() To set the cache for future use
    19391942 * @uses apply_filters() Calls 'bbp_forum_query_last_reply_id' with the reply id
    19401943 *                        and forum id
    19411944 */
    1942 function bbp_forum_query_last_reply_id( $forum_id, $topic_ids = 0 ) {
    1943         global $wpdb;
     1945function bbp_forum_query_last_reply_id( $forum_id = 0, $topic_ids = 0 ) {
    19441946
    1945         $cache_id = 'bbp_get_forum_' . $forum_id . '_reply_id';
    1946         $reply_id = (int) wp_cache_get( $cache_id, 'bbpress_posts' );
     1947        // Validate forum
     1948        $forum_id = bbp_get_forum_id( $forum_id );
    19471949
    1948         if ( false === $reply_id ) {
     1950        // Get topic ID's if none were passed
     1951        if ( empty( $topic_ids ) ) {
     1952                $topic_ids = bbp_forum_query_topic_ids( $forum_id );
     1953        }
    19491954
    1950                 if ( empty( $topic_ids ) ) {
    1951                         $topic_ids = bbp_forum_query_topic_ids( $forum_id );
    1952                 }
     1955        $query = new WP_Query( array(
     1956                'fields'          => 'ids',
     1957                'post_parent__in' => $topic_ids,
     1958                'post_status'     => bbp_get_public_status_id(),
     1959                'post_type'       => bbp_get_reply_post_type(),
    19531960
    1954                 if ( !empty( $topic_ids ) ) {
    1955                         $topic_ids = implode( ',', wp_parse_id_list( $topic_ids ) );
    1956                         $reply_id  = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent IN ( {$topic_ids} ) AND post_status = '%s' AND post_type = '%s' ORDER BY ID DESC LIMIT 1;", bbp_get_public_status_id(), bbp_get_reply_post_type() ) );
    1957                         wp_cache_set( $cache_id, $reply_id, 'bbpress_posts' ); // May be (int) 0
    1958                 } else {
    1959                         wp_cache_set( $cache_id, '0', 'bbpress_posts' );
    1960                 }
    1961         }
     1961                // Maybe change these later
     1962                'posts_per_page'         => 1,
     1963                'update_post_term_cache' => false,
     1964                'update_post_meta_cache' => false,
     1965                'ignore_sticky_posts'    => true,
     1966        ) );
     1967        $reply_id = array_shift( $query->posts );
     1968        unset( $query );
    19621969
    19631970        return (int) apply_filters( 'bbp_get_forum_last_reply_id', (int) $reply_id, $forum_id );
    19641971}