Skip to:
Content

bbPress.org

Changeset 5368


Ignore:
Timestamp:
06/05/2014 09:33:50 PM (10 years ago)
Author:
johnjamesjacoby
Message:

Update to tools:

  • Update topic & reply count repair tools to only delete the appropriate meta keys from the appropriate parents.
  • Include new reply hierarchy repair tool, to fix a possibly poisoned reply hierarchy.

Props netweb. See #2586 (trunk)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/includes/admin/tools.php

    r5314 r5368  
    284284function bbp_admin_repair_list() {
    285285    $repair_list = array(
    286         0  => array( 'bbp-sync-topic-meta',          __( 'Recalculate the parent topic for each post',        'bbpress' ), 'bbp_admin_repair_topic_meta'               ),
    287         5  => array( 'bbp-sync-forum-meta',          __( 'Recalculate the parent forum for each post',        'bbpress' ), 'bbp_admin_repair_forum_meta'               ),
     286        0  => array( 'bbp-sync-topic-meta',          __( 'Recalculate parent topic for each reply',           'bbpress' ), 'bbp_admin_repair_topic_meta'               ),
     287        5  => array( 'bbp-sync-forum-meta',          __( 'Recalculate parent forum for each reply',           'bbpress' ), 'bbp_admin_repair_forum_meta'               ),
    288288        10 => array( 'bbp-sync-forum-visibility',    __( 'Recalculate private and hidden forums',             'bbpress' ), 'bbp_admin_repair_forum_visibility'         ),
    289289        15 => array( 'bbp-sync-all-topics-forums',   __( 'Recalculate last activity in each topic and forum', 'bbpress' ), 'bbp_admin_repair_freshness'                ),
    290         20 => array( 'bbp-sync-all-topics-sticky',   __( 'Recalculate the sticky relationship of each topic', 'bbpress' ), 'bbp_admin_repair_sticky'                   ),
    291         25 => array( 'bbp-group-forums',             __( 'Repair BuddyPress Group Forum relationships',       'bbpress' ), 'bbp_admin_repair_group_forum_relationship' ),
    292         30 => array( 'bbp-forum-topics',             __( 'Count topics in each forum',                        'bbpress' ), 'bbp_admin_repair_forum_topic_count'        ),
    293         35 => array( 'bbp-forum-replies',            __( 'Count replies in each forum',                       'bbpress' ), 'bbp_admin_repair_forum_reply_count'        ),
    294         40 => array( 'bbp-topic-replies',            __( 'Count replies in each topic',                       'bbpress' ), 'bbp_admin_repair_topic_reply_count'        ),
    295         45 => array( 'bbp-topic-voices',             __( 'Count voices in each topic',                        'bbpress' ), 'bbp_admin_repair_topic_voice_count'        ),
    296         50 => array( 'bbp-topic-hidden-replies',     __( 'Count spammed & trashed replies in each topic',     'bbpress' ), 'bbp_admin_repair_topic_hidden_reply_count' ),
    297         55 => array( 'bbp-user-topics',              __( 'Count topics for each user',                        'bbpress' ), 'bbp_admin_repair_user_topic_count'         ),
    298         60 => array( 'bbp-user-replies',             __( 'Count replies for each user',                       'bbpress' ), 'bbp_admin_repair_user_reply_count'         ),
    299         65 => array( 'bbp-user-favorites',           __( 'Remove trashed topics from user favorites',         'bbpress' ), 'bbp_admin_repair_user_favorites'           ),
    300         70 => array( 'bbp-user-topic-subscriptions', __( 'Remove trashed topics from user subscriptions',     'bbpress' ), 'bbp_admin_repair_user_topic_subscriptions' ),
    301         75 => array( 'bbp-user-forum-subscriptions', __( 'Remove trashed forums from user subscriptions',     'bbpress' ), 'bbp_admin_repair_user_forum_subscriptions' ),
    302         80 => array( 'bbp-user-role-map',            __( 'Remap existing users to default forum roles',       'bbpress' ), 'bbp_admin_repair_user_roles'               )
     290        20 => array( 'bbp-sync-all-topics-sticky',   __( 'Recalculate sticky relationship of each topic',     'bbpress' ), 'bbp_admin_repair_sticky'                   ),
     291        25 => array( 'bbp-sync-all-reply-positions', __( 'Recalculate reply position hierarchy',              'bbpress' ), 'bbp_admin_repair_reply_menu_order'         ),
     292        30 => array( 'bbp-group-forums',             __( 'Repair BuddyPress Group Forum relationships',       'bbpress' ), 'bbp_admin_repair_group_forum_relationship' ),
     293        35 => array( 'bbp-forum-topics',             __( 'Count topics in each forum',                        'bbpress' ), 'bbp_admin_repair_forum_topic_count'        ),
     294        40 => array( 'bbp-forum-replies',            __( 'Count replies in each forum',                       'bbpress' ), 'bbp_admin_repair_forum_reply_count'        ),
     295        45 => array( 'bbp-topic-replies',            __( 'Count replies in each topic',                       'bbpress' ), 'bbp_admin_repair_topic_reply_count'        ),
     296        50 => array( 'bbp-topic-voices',             __( 'Count voices in each topic',                        'bbpress' ), 'bbp_admin_repair_topic_voice_count'        ),
     297        55 => array( 'bbp-topic-hidden-replies',     __( 'Count spammed & trashed replies in each topic',     'bbpress' ), 'bbp_admin_repair_topic_hidden_reply_count' ),
     298        60 => array( 'bbp-user-topics',              __( 'Count topics for each user',                        'bbpress' ), 'bbp_admin_repair_user_topic_count'         ),
     299        65 => array( 'bbp-user-replies',             __( 'Count replies for each user',                       'bbpress' ), 'bbp_admin_repair_user_reply_count'         ),
     300        70 => array( 'bbp-user-favorites',           __( 'Remove trashed topics from user favorites',         'bbpress' ), 'bbp_admin_repair_user_favorites'           ),
     301        75 => array( 'bbp-user-topic-subscriptions', __( 'Remove trashed topics from user subscriptions',     'bbpress' ), 'bbp_admin_repair_user_topic_subscriptions' ),
     302        80 => array( 'bbp-user-forum-subscriptions', __( 'Remove trashed forums from user subscriptions',     'bbpress' ), 'bbp_admin_repair_user_forum_subscriptions' ),
     303        85 => array( 'bbp-user-role-map',            __( 'Remap existing users to default forum roles',       'bbpress' ), 'bbp_admin_repair_user_roles'               )
    303304    );
    304305    ksort( $repair_list );
     
    326327    $result    = __( 'Failed!', 'bbpress' );
    327328
    328     $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count';";
    329     if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
    330         return array( 1, sprintf( $statement, $result ) );
    331 
    332329    // Post types and status
    333330    $tpt = bbp_get_topic_post_type();
     
    336333    $cps = bbp_get_closed_status_id();
    337334
     335    // Delete the meta key _bbp_reply_count for each topic
     336    $sql_delete = "DELETE `postmeta` FROM `{$wpdb->postmeta}` AS `postmeta`
     337                        LEFT JOIN `{$wpdb->posts}` AS `posts` ON `posts`.`ID` = `postmeta`.`post_id`
     338                        WHERE `posts`.`post_type` = '{$tpt}'
     339                        AND `postmeta`.`meta_key` = '_bbp_reply_count'";
     340
     341    if ( is_wp_error( $wpdb->query( $sql_delete ) ) ) {
     342        return array( 1, sprintf( $statement, $result ) );
     343    }
     344
     345    // Recalculate the meta key _bbp_reply_count for each topic
    338346    $sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
    339347            SELECT `topics`.`ID` AS `post_id`, '_bbp_reply_count' AS `meta_key`, COUNT(`replies`.`ID`) As `meta_value`
     
    347355                GROUP BY `topics`.`ID`);";
    348356
    349     if ( is_wp_error( $wpdb->query( $sql ) ) )
     357    if ( is_wp_error( $wpdb->query( $sql ) ) ) {
    350358        return array( 2, sprintf( $statement, $result ) );
     359    }
    351360
    352361    return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
     
    620629    $result    = __( 'Failed!', 'bbpress' );
    621630
    622     $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` IN ( '_bbp_reply_count', '_bbp_total_reply_count' );";
    623     if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
    624         return array( 1, sprintf( $statement, $result ) );
    625 
     631    // Post type
     632    $fpt = bbp_get_forum_post_type();
     633
     634    // Delete the meta keys _bbp_reply_count and _bbp_total_reply_count for each forum
     635    $sql_delete = "DELETE `postmeta` FROM `{$wpdb->postmeta}` AS `postmeta`
     636                        LEFT JOIN `{$wpdb->posts}` AS `posts` ON `posts`.`ID` = `postmeta`.`post_id`
     637                        WHERE `posts`.`post_type` = '{$fpt}'
     638                        AND `postmeta`.`meta_key` = '_bbp_reply_count'
     639                        OR `postmeta`.`meta_key` = '_bbp_total_reply_count'";
     640
     641    if ( is_wp_error( $wpdb->query( $sql_delete ) ) ) {
     642        return array( 1, sprintf( $statement, $result ) );
     643    }
     644 
     645    // Recalculate the metas key _bbp_reply_count and _bbp_total_reply_count for each forum
    626646    $forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) );
    627647    if ( !empty( $forums ) ) {
     
    12831303
    12841304    // Complete results
     1305    return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
     1306}
     1307
     1308/**
     1309 * Recalculate reply menu order
     1310 *
     1311 * @since bbPress (r5367)
     1312 *
     1313 * @uses wpdb::query() To run our recount sql queries
     1314 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
     1315 * @uses bbp_get_reply_post_type() To get the reply post type
     1316 * @uses bbp_update_reply_position() To update the reply position
     1317 * @return array An array of the status code and the message
     1318 */
     1319function bbp_admin_repair_reply_menu_order() {
     1320    global $wpdb;
     1321
     1322    $statement = __( 'Recalculating reply menu order … %s', 'bbpress' );
     1323    $result    = __( 'No reply hierachy to recalculate!',          'bbpress' );
     1324
     1325    // Post type
     1326    $rpt = bbp_get_reply_post_type();
     1327
     1328    // Get an array of reply id's to update the menu oder for each reply
     1329    $replies = $wpdb->get_results( "SELECT `a`.`ID` FROM `{$wpdb->posts}` AS `a`
     1330                                        INNER JOIN (
     1331                                            SELECT `menu_order`, `post_parent`
     1332                                            FROM `{$wpdb->posts}`
     1333                                            GROUP BY `menu_order`, `post_parent`
     1334                                            HAVING COUNT( * ) >1
     1335                                        )`b`
     1336                                        ON `a`.`menu_order` = `b`.`menu_order`
     1337                                        AND `a`.`post_parent` = `b`.`post_parent`
     1338                                        WHERE `post_type` = '{$rpt}';", OBJECT_K );
     1339
     1340    // Bail if no replies returned
     1341    if ( empty( $replies ) ) {
     1342        return array( 1, sprintf( $statement, $result ) );
     1343    }
     1344
     1345    // Recalculate the menu order position for each reply
     1346    foreach ( $replies as $reply ) {
     1347        bbp_update_reply_position( $reply->ID );
     1348    }
     1349
     1350    // Cleanup
     1351    unset( $replies, $reply );
     1352
     1353    // Flush the cache; things are about to get ugly.
     1354    wp_cache_flush();
     1355
    12851356    return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
    12861357}
Note: See TracChangeset for help on using the changeset viewer.