Skip to:
Content

bbPress.org


Ignore:
Timestamp:
11/09/2019 05:35:42 AM (4 years ago)
Author:
johnjamesjacoby
Message:

Counts (meta-data): full audit of forum/topic/reply, public/non-public counts.

This commit is the result of a full count audit, exposing multiple inconsistencies and voids in relation to how public and non-public counts are (re)calculated.

For instance, hidden forum replies are not counted at all, until now. By introducing a new Repair tool, hidden forum reply counts are now counted.

In addition, there were multiple bugs with topic & reply moderation, where the act of approving or unapproving topics or replies would cause the numbers to be inaccurate, or where topics & replies being caught in moderation were still increasing public counts.

It was also possible to, as a Key Master, publicly reply to unapproved topics, which was a completely unanticipated side-effect of allowing Key Masters to do pretty much anything. Going forward, the default reply status is the topic status, but is still beholden to all existing moderation settings and user role capabilities. This results in a more sane user experience, and prevents the unusual circumstance of there being "0 topics and 30 replies" in public-facing forums.

Certain count increase/decrease actions have been reprioritized to avoid collisions and race conditions, proving once again that ya gotta get up to get down.

See #2838. Fixes #1799.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/includes/replies/template.php

    r6922 r6923  
    436436
    437437        // Set needed variables
    438         $reply_id   = bbp_get_reply_id      ( $reply_id );
    439         $topic_id   = bbp_get_reply_topic_id( $reply_id );
     438        $reply_id = bbp_get_reply_id( $reply_id );
     439
     440        // Juggle reply & topic IDs for unpretty URL formatting
     441        if ( bbp_is_reply( $reply_id ) ) {
     442            $topic_id = bbp_get_reply_topic_id( $reply_id );
     443        } elseif ( bbp_is_topic( $reply_id ) ) {
     444            $topic_id = bbp_get_topic_id( $reply_id );
     445            $reply_id = $topic_id;
     446        }
    440447
    441448        // Hierarchical reply page
     
    448455        }
    449456
     457        // Get links & URLS
    450458        $reply_hash = '#post-' . $reply_id;
    451459        $topic_link = bbp_get_topic_permalink( $topic_id, $redirect_to );
    452460        $topic_url  = remove_query_arg( 'view', $topic_link );
    453461
     462        // Get vars needed to support pending topics with unpretty links
     463        $has_slug   = bbp_get_topic( $topic_id )->post_name;
     464        $pretty     = bbp_use_pretty_urls();
     465        $published  = ! bbp_is_topic_pending( $topic_id );
     466
    454467        // Don't include pagination if on first page
    455468        if ( 1 >= $reply_page ) {
    456             $url = user_trailingslashit( $topic_url ) . $reply_hash;
     469
     470            // Pretty permalinks
     471            if ( ! empty( $has_slug ) && ! empty( $pretty ) && ! empty( $published ) ) {
     472                $url = user_trailingslashit( $topic_url ) . $reply_hash;
     473
     474            // Unpretty links
     475            } else {
     476                $url = $topic_url . $reply_hash;
     477            }
    457478
    458479        // Include pagination
     
    460481
    461482            // Pretty permalinks
    462             if ( bbp_use_pretty_urls() ) {
     483            if ( ! empty( $has_slug ) && ! empty( $pretty ) && ! empty( $published ) ) {
    463484                $url = trailingslashit( $topic_url ) . trailingslashit( bbp_get_paged_slug() ) . $reply_page;
    464485                $url = user_trailingslashit( $url ) . $reply_hash;
    465486
    466             // Yucky links
     487            // Unpretty links
    467488            } else {
    468489                $url = add_query_arg( 'paged', $reply_page, $topic_url ) . $reply_hash;
     
    762783            $reply_id     = bbp_get_reply_id( $reply_id );
    763784            $revision_log = get_post_meta( $reply_id, '_bbp_revision_log', true );
    764             $revision_log = empty( $revision_log ) ? array() : $revision_log;
     785            $revision_log = ! empty( $revision_log )
     786                ? $revision_log
     787                : array();
    765788
    766789            // Filter & return
     
    852875 *
    853876 * @since 2.0.0 bbPress (r3496)
     877 * @since 2.6.0 bbPress (r6922) Returns false if topic is also not published
    854878 *
    855879 * @param int $reply_id Optional. Topic id
     
    858882function bbp_is_reply_published( $reply_id = 0 ) {
    859883    $reply_id     = bbp_get_reply_id( $reply_id );
     884    $topic_id     = bbp_get_reply_topic_id( $reply_id );
    860885    $status       = bbp_get_public_status_id();
    861     $reply_status = bbp_get_reply_status( $reply_id ) === $status;
     886    $topic_status = bbp_is_topic_published( $topic_id );
     887    $reply_status = ( bbp_get_reply_status( $reply_id ) === $status );
     888    $retval       = ( $reply_status && $topic_status );
    862889
    863890    // Filter & return
    864     return (bool) apply_filters( 'bbp_is_reply_published', (bool) $reply_status, $reply_id );
     891    return (bool) apply_filters( 'bbp_is_reply_published', (bool) $retval, $reply_id );
    865892}
    866893
     
    13961423    function bbp_get_reply_topic_id( $reply_id = 0 ) {
    13971424        $reply_id = bbp_get_reply_id( $reply_id );
    1398         $topic_id = get_post_field( 'post_parent', $reply_id );
     1425        $topic_id = (int) get_post_field( 'post_parent', $reply_id );
    13991426
    14001427        // Meta-data fallback
    14011428        if ( empty( $topic_id ) ) {
    1402             $topic_id = get_post_meta( $reply_id, '_bbp_topic_id', true );
     1429            $topic_id = (int) get_post_meta( $reply_id, '_bbp_topic_id', true );
    14031430        }
    14041431
    14051432        // Filter
    14061433        if ( ! empty( $topic_id ) ) {
    1407             $topic_id = bbp_get_topic_id( $topic_id );
    1408         }
    1409 
    1410         // Filter & return
    1411         return (int) apply_filters( 'bbp_get_reply_topic_id', (int) $topic_id, $reply_id );
     1434            $topic_id = (int) bbp_get_topic_id( $topic_id );
     1435        }
     1436
     1437        // Filter & return
     1438        return (int) apply_filters( 'bbp_get_reply_topic_id', $topic_id, $reply_id );
    14121439    }
    14131440
     
    14331460    function bbp_get_reply_forum_id( $reply_id = 0 ) {
    14341461        $reply_id = bbp_get_reply_id( $reply_id );
    1435         $forum_id = get_post_field( 'post_parent', bbp_get_reply_topic_id( $reply_id ) );
     1462        $topic_id = bbp_get_reply_topic_id( $reply_id );
     1463        $forum_id = (int) get_post_field( 'post_parent', $topic_id );
    14361464
    14371465        // Meta-data fallback
    14381466        if ( empty( $forum_id ) ) {
    1439             $forum_id = get_post_meta( $reply_id, '_bbp_forum_id', true );
     1467            $forum_id = (int) get_post_meta( $reply_id, '_bbp_forum_id', true );
    14401468        }
    14411469
    14421470        // Filter
    14431471        if ( ! empty( $forum_id ) ) {
    1444             $forum_id = bbp_get_forum_id( $forum_id );
     1472            $forum_id = (int) bbp_get_forum_id( $forum_id );
    14451473        }
    14461474
     
    22722300
    22732301    // If pretty permalinks are enabled, make our pagination pretty
    2274     if ( bbp_use_pretty_urls() ) {
     2302    if ( bbp_use_pretty_urls() && ! bbp_is_topic_pending( $topic_id )) {
    22752303
    22762304        // User's replies
Note: See TracChangeset for help on using the changeset viewer.