Skip to:
Content

bbPress.org

source: trunk/includes/admin/tools.php @ 4526

Last change on this file since 4526 was 4526, checked in by johnjamesjacoby, 9 years ago

Updater:

  • Move bbPress 1.x role removal out of updater and into BuddyPress's repair tool.
  • Property svn:eol-style set to native
File size: 43.3 KB
Line 
1<?php
2
3/**
4 * bbPress Admin Tools Page
5 *
6 * @package bbPress
7 * @subpackage Administration
8 */
9
10// Exit if accessed directly
11if ( !defined( 'ABSPATH' ) ) exit;
12
13/** Repair ********************************************************************/
14
15/**
16 * Admin repair page
17 *
18 * @since bbPress (r2613)
19 *
20 * @uses bbp_admin_repair_list() To get the recount list
21 * @uses check_admin_referer() To verify the nonce and the referer
22 * @uses wp_cache_flush() To flush the cache
23 * @uses do_action() Calls 'admin_notices' to display the notices
24 * @uses screen_icon() To display the screen icon
25 * @uses wp_nonce_field() To add a hidden nonce field
26 */
27function bbp_admin_repair() {
28?>
29
30        <div class="wrap">
31
32                <?php screen_icon( 'tools' ); ?>
33
34                <h2 class="nav-tab-wrapper"><?php bbp_tools_admin_tabs( __( 'Repair Forums', 'bbpress' ) ); ?></h2>
35
36                <p><?php _e( 'bbPress keeps track of relationships between forums, topics, replies, and topic tags, and users. Occasionally these relationships become out of sync, most often after an import or migration. Use the tools below to manually recalculate these relationships.', 'bbpress' ); ?></p>
37                <p class="description"><?php _e( 'Some of these tools create substantial database overhead. Avoid running more than 1 repair job at a time.', 'bbpress' ); ?></p>
38
39                <form class="settings" method="post" action="">
40                        <table class="form-table">
41                                <tbody>
42                                        <tr valign="top">
43                                                <th scope="row"><?php _e( 'Relationships to Repair:', 'bbpress' ) ?></th>
44                                                <td>
45                                                        <fieldset>
46                                                                <legend class="screen-reader-text"><span><?php _e( 'Repair', 'bbpress' ) ?></span></legend>
47
48                                                                <?php foreach ( bbp_admin_repair_list() as $item ) : ?>
49
50                                                                        <label><input type="checkbox" class="checkbox" name="<?php echo esc_attr( $item[0] ) . '" id="' . esc_attr( str_replace( '_', '-', $item[0] ) ); ?>" value="1" /> <?php echo esc_html( $item[1] ); ?></label><br />
51
52                                                                <?php endforeach; ?>
53
54                                                        </fieldset>
55                                                </td>
56                                        </tr>
57                                </tbody>
58                        </table>
59
60                        <fieldset class="submit">
61                                <input class="button-primary" type="submit" name="submit" value="<?php esc_attr_e( 'Repair Items', 'bbpress' ); ?>" />
62                                <?php wp_nonce_field( 'bbpress-do-counts' ); ?>
63                        </fieldset>
64                </form>
65        </div>
66
67<?php
68}
69
70/**
71 * Handle the processing and feedback of the admin tools page
72 *
73 * @since bbPress (r2613)
74 *
75 * @uses bbp_admin_repair_list() To get the recount list
76 * @uses check_admin_referer() To verify the nonce and the referer
77 * @uses wp_cache_flush() To flush the cache
78 * @uses do_action() Calls 'admin_notices' to display the notices
79 */
80function bbp_admin_repair_handler() {
81
82        if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) ) {
83                check_admin_referer( 'bbpress-do-counts' );
84
85                // Stores messages
86                $messages = array();
87
88                wp_cache_flush();
89
90                foreach ( (array) bbp_admin_repair_list() as $item ) {
91                        if ( isset( $item[2] ) && isset( $_POST[$item[0]] ) && 1 == $_POST[$item[0]] && is_callable( $item[2] ) ) {
92                                $messages[] = call_user_func( $item[2] );
93                        }
94                }
95
96                if ( count( $messages ) ) {
97                        foreach ( $messages as $message ) {
98                                bbp_admin_tools_feedback( $message[1] );
99                        }
100                }
101        }
102}
103
104/**
105 * Assemble the admin notices
106 *
107 * @since bbPress (r2613)
108 *
109 * @param string|WP_Error $message A message to be displayed or {@link WP_Error}
110 * @param string $class Optional. A class to be added to the message div
111 * @uses WP_Error::get_error_messages() To get the error messages of $message
112 * @uses add_action() Adds the admin notice action with the message HTML
113 * @return string The message HTML
114 */
115function bbp_admin_tools_feedback( $message, $class = false ) {
116        if ( is_string( $message ) ) {
117                $message = '<p>' . $message . '</p>';
118                $class = $class ? $class : 'updated';
119        } elseif ( is_wp_error( $message ) ) {
120                $errors = $message->get_error_messages();
121
122                switch ( count( $errors ) ) {
123                        case 0:
124                                return false;
125                                break;
126
127                        case 1:
128                                $message = '<p>' . $errors[0] . '</p>';
129                                break;
130
131                        default:
132                                $message = '<ul>' . "\n\t" . '<li>' . join( '</li>' . "\n\t" . '<li>', $errors ) . '</li>' . "\n" . '</ul>';
133                                break;
134                }
135
136                $class = $class ? $class : 'error';
137        } else {
138                return false;
139        }
140
141        $message = '<div id="message" class="' . esc_attr( $class ) . '">' . $message . '</div>';
142        $message = str_replace( "'", "\'", $message );
143        $lambda  = create_function( '', "echo '$message';" );
144
145        add_action( 'admin_notices', $lambda );
146
147        return $lambda;
148}
149
150/**
151 * Get the array of the repair list
152 *
153 * @since bbPress (r2613)
154 *
155 * @uses apply_filters() Calls 'bbp_repair_list' with the list array
156 * @return array Repair list of options
157 */
158function bbp_admin_repair_list() {
159        $repair_list = array(
160                0  => array( 'bbp-sync-topic-meta',        __( 'Recalculate the parent topic for each post',          'bbpress' ), 'bbp_admin_repair_topic_meta'               ),
161                5  => array( 'bbp-sync-forum-meta',        __( 'Recalculate the parent forum for each post',          'bbpress' ), 'bbp_admin_repair_forum_meta'               ),
162                10 => array( 'bbp-sync-forum-visibility',  __( 'Recalculate private and hidden forums',               'bbpress' ), 'bbp_admin_repair_forum_visibility'         ),
163                15 => array( 'bbp-sync-all-topics-forums', __( 'Recalculate last activity in each topic and forum',   'bbpress' ), 'bbp_admin_repair_freshness'                ),
164                20 => array( 'bbp-group-forums',           __( 'Repair BuddyPress Group Forum relationships',         'bbpress' ), 'bbp_admin_repair_group_forum_relationship' ),
165                25 => array( 'bbp-forum-topics',           __( 'Count topics in each forum',                          'bbpress' ), 'bbp_admin_repair_forum_topic_count'        ),
166                30 => array( 'bbp-forum-replies',          __( 'Count replies in each forum',                         'bbpress' ), 'bbp_admin_repair_forum_reply_count'        ),
167                35 => array( 'bbp-topic-replies',          __( 'Count replies in each topic',                         'bbpress' ), 'bbp_admin_repair_topic_reply_count'        ),
168                40 => array( 'bbp-topic-voices',           __( 'Count voices in each topic',                          'bbpress' ), 'bbp_admin_repair_topic_voice_count'        ),
169                45 => array( 'bbp-topic-hidden-replies',   __( 'Count spammed & trashed replies in each topic',       'bbpress' ), 'bbp_admin_repair_topic_hidden_reply_count' ),
170                50 => array( 'bbp-user-replies',           __( 'Count topics for each user',                          'bbpress' ), 'bbp_admin_repair_user_topic_count'         ),
171                55 => array( 'bbp-user-topics',            __( 'Count replies for each user',                         'bbpress' ), 'bbp_admin_repair_user_reply_count'         ),
172                60 => array( 'bbp-user-favorites',         __( 'Remove trashed topics from user favorites',           'bbpress' ), 'bbp_admin_repair_user_favorites'           ),
173                65 => array( 'bbp-user-subscriptions',     __( 'Remove trashed topics from user subscriptions',       'bbpress' ), 'bbp_admin_repair_user_subscriptions'       ),
174                70 => array( 'bbp-user-role-map',          __( 'Remap existing users to default forum roles',         'bbpress' ), 'bbp_admin_repair_user_roles'               )
175        );
176        ksort( $repair_list );
177
178        return (array) apply_filters( 'bbp_repair_list', $repair_list );
179}
180
181/**
182 * Recount topic replies
183 *
184 * @since bbPress (r2613)
185 *
186 * @uses bbp_get_reply_post_type() To get the reply post type
187 * @uses wpdb::query() To run our recount sql queries
188 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
189 * @return array An array of the status code and the message
190 */
191function bbp_admin_repair_topic_reply_count() {
192        global $wpdb;
193
194        $statement = __( 'Counting the number of replies in each topic&hellip; %s', 'bbpress' );
195        $result    = __( 'Failed!', 'bbpress' );
196
197        $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count';";
198        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
199                return array( 1, sprintf( $statement, $result ) );
200
201        // Post types and status
202        $tpt = bbp_get_topic_post_type();
203        $rpt = bbp_get_reply_post_type();
204        $pps = bbp_get_public_status_id();
205        $cps = bbp_get_closed_status_id();
206
207        $sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
208                        SELECT `topics`.`ID` AS `post_id`, '_bbp_reply_count' AS `meta_key`, COUNT(`replies`.`ID`) As `meta_value`
209                                FROM `{$wpdb->posts}` AS `topics`
210                                        LEFT JOIN `{$wpdb->posts}` as `replies`
211                                                ON  `replies`.`post_parent` = `topics`.`ID`
212                                                AND `replies`.`post_status` = '{$pps}'
213                                                AND `replies`.`post_type`   = '{$rpt}'
214                                WHERE `topics`.`post_type` = '{$tpt}'
215                                        AND `topics`.`post_status` IN ( '{$pps}', '{$cps}' )
216                                GROUP BY `topics`.`ID`);";
217
218        if ( is_wp_error( $wpdb->query( $sql ) ) )
219                return array( 2, sprintf( $statement, $result ) );
220
221        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
222}
223
224/**
225 * Recount topic voices
226 *
227 * @since bbPress (r2613)
228 *
229 * @uses bbp_get_reply_post_type() To get the reply post type
230 * @uses wpdb::query() To run our recount sql queries
231 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
232 * @return array An array of the status code and the message
233 */
234function bbp_admin_repair_topic_voice_count() {
235        global $wpdb;
236
237        $statement = __( 'Counting the number of voices in each topic&hellip; %s', 'bbpress' );
238        $result    = __( 'Failed!', 'bbpress' );
239
240        $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_voice_count';";
241        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
242                return array( 1, sprintf( $statement, $result ) );
243
244        // Post types and status
245        $tpt = bbp_get_topic_post_type();
246        $rpt = bbp_get_reply_post_type();
247        $pps = bbp_get_public_status_id();
248        $cps = bbp_get_closed_status_id();
249
250        $sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
251                        SELECT `postmeta`.`meta_value`, '_bbp_voice_count', COUNT(DISTINCT `post_author`) as `meta_value`
252                                FROM `{$wpdb->posts}` AS `posts`
253                                LEFT JOIN `{$wpdb->postmeta}` AS `postmeta`
254                                        ON `posts`.`ID` = `postmeta`.`post_id`
255                                        AND `postmeta`.`meta_key` = '_bbp_topic_id'
256                                WHERE `posts`.`post_type` IN ( '{$tpt}', '{$rpt}' )
257                                        AND `posts`.`post_status` IN ( '{$pps}', '{$cps}' )
258                                        AND `posts`.`post_author` != '0'
259                                GROUP BY `postmeta`.`meta_value`);";
260
261        if ( is_wp_error( $wpdb->query( $sql ) ) )
262                return array( 2, sprintf( $statement, $result ) );
263
264        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
265}
266
267/**
268 * Recount topic hidden replies (spammed/trashed)
269 *
270 * @since bbPress (r2747)
271 *
272 * @uses wpdb::query() To run our recount sql queries
273 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
274 * @return array An array of the status code and the message
275 */
276function bbp_admin_repair_topic_hidden_reply_count() {
277        global $wpdb;
278
279        $statement = __( 'Counting the number of spammed and trashed replies in each topic&hellip; %s', 'bbpress' );
280        $result    = __( 'Failed!', 'bbpress' );
281
282        $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count_hidden';";
283        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
284                return array( 1, sprintf( $statement, $result ) );
285
286        $sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (SELECT `post_parent`, '_bbp_reply_count_hidden', COUNT(`post_status`) as `meta_value` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_reply_post_type() . "' AND `post_status` IN ( '" . join( "','", array( bbp_get_trash_status_id(), bbp_get_spam_status_id() ) ) . "') GROUP BY `post_parent`);";
287        if ( is_wp_error( $wpdb->query( $sql ) ) )
288                return array( 2, sprintf( $statement, $result ) );
289
290        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
291}
292
293/**
294 * Repair group forum ID mappings after a bbPress 1.1 to bbPress 2.2 conversion
295 *
296 * @since bbPress (r4395)
297 *
298 * @global WPDB $wpdb
299 * @return If a wp_error() occurs and no converted forums are found
300 */
301function bbp_admin_repair_group_forum_relationship() {
302        global $wpdb;
303
304        $statement = __( 'Repairing BuddyPress group-forum relationships&hellip; %s', 'bbpress' );
305        $g_count     = 0;
306        $f_count     = 0;
307
308        // Copy the BuddyPress filter here, incase BuddyPress is not active
309        $prefix    = apply_filters( 'bp_core_get_table_prefix', $wpdb->base_prefix );
310        $tablename = $prefix . 'bp_groups_groupmeta';
311
312        // Get the converted forum IDs
313        $forum_ids = $wpdb->query( "SELECT `forum`.`ID`, `forummeta`.`meta_value`
314                                                                FROM `{$wpdb->posts}` AS `forum`
315                                                                        LEFT JOIN `{$wpdb->postmeta}` AS `forummeta`
316                                                                                ON `forum`.`ID` = `forummeta`.`post_id`
317                                                                                AND `forummeta`.`meta_key` = '_bbp_old_forum_id'
318                                                                WHERE `forum`.`post_type` = 'forum'
319                                                                GROUP BY `forum`.`ID`;" );
320
321        // Bail if forum IDs returned an error
322        if ( is_wp_error( $forum_ids ) || empty( $wpdb->last_result ) )
323                return array( 2, sprintf( $statement, __( 'Failed!', 'bbpress' ) ) );
324
325        // Stash the last results
326        $results = $wpdb->last_result;
327
328        // Update each group forum
329        foreach ( $results as $group_forums ) {
330
331                // Only update if is a converted forum
332                if ( ! isset( $group_forums->meta_value ) )
333                        continue;
334
335                // Attempt to update group meta
336                $updated = $wpdb->query( "UPDATE `{$tablename}` SET `meta_value` = '{$group_forums->ID}' WHERE `meta_key` = 'forum_id' AND `meta_value` = '{$group_forums->meta_value}';" );
337
338                // Bump the count
339                if ( !empty( $updated ) && ! is_wp_error( $updated ) ) {
340                        ++$g_count;
341                }
342
343                // Update group's forum metadata
344                $group_id = (int) $wpdb->get_var( "SELECT `group_id` FROM `{$tablename}` WHERE `meta_key` = 'forum_id' AND `meta_value` = '{$group_forums->ID}';" );
345                if ( !empty( $group_id ) ) {
346                        update_post_meta( $group_forums->ID, '_bbp_group_ids', array( $group_id ) );
347                        ++$f_count;
348                }
349        }
350
351        // Make some logical guesses at the old group root forum
352        if ( function_exists( 'bp_forums_parent_forum_id' ) ) {
353                $old_default_forum_id = bp_forums_parent_forum_id();
354        } elseif ( defined( 'BP_FORUMS_PARENT_FORUM_ID' ) ) {
355                $old_default_forum_id = (int) BP_FORUMS_PARENT_FORUM_ID;
356        } else {
357                $old_default_forum_id = 1;
358        }
359
360        // Try to get the group root forum
361        $posts = get_posts( array(
362                'post_type'   => bbp_get_forum_post_type(),
363                'meta_key'    => '_bbp_old_forum_id',
364                'meta_value'  => $old_default_forum_id,
365                'numberposts' => 1
366        ) );
367
368        // Found the group root forum
369        if ( ! empty( $posts ) ) {
370
371                // Rename 'Default Forum'  since it's now visible in sitewide forums
372                if ( 'Default Forum' == $posts[0]->post_title ) {
373                        wp_update_post( array(
374                                'ID'         => $posts[0]->ID,
375                                'post_title' => __( 'Group Forums', 'bbpress' ),
376                        ) );
377                }
378
379                // Update the group forums root metadata
380                update_option( '_bbp_group_forums_root_id', $posts[0]->ID );
381        }
382
383        // Remove old bbPress 1.1 roles (BuddyPress)
384        remove_role( 'member'    );
385        remove_role( 'inactive'  );
386        remove_role( 'blocked'   );
387        remove_role( 'moderator' );
388        remove_role( 'keymaster' );
389
390        // Complete results
391        $result = sprintf( __( 'Complete! %s groups updated; %s forums updated.', 'bbpress' ), bbp_number_format( $g_count ), bbp_number_format( $f_count ) );
392        return array( 0, sprintf( $statement, $result ) );
393}
394
395/**
396 * Recount forum topics
397 *
398 * @since bbPress (r2613)
399 *
400 * @uses wpdb::query() To run our recount sql queries
401 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
402 * @uses bbp_get_forum_post_type() To get the forum post type
403 * @uses get_posts() To get the forums
404 * @uses bbp_update_forum_topic_count() To update the forum topic count
405 * @return array An array of the status code and the message
406 */
407function bbp_admin_repair_forum_topic_count() {
408        global $wpdb;
409
410        $statement = __( 'Counting the number of topics in each forum&hellip; %s', 'bbpress' );
411        $result    = __( 'Failed!', 'bbpress' );
412
413        $sql_delete = "DELETE FROM {$wpdb->postmeta} WHERE meta_key IN ( '_bbp_topic_count', '_bbp_total_topic_count' );";
414        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
415                return array( 1, sprintf( $statement, $result ) );
416
417        $forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) );
418        if ( !empty( $forums ) ) {
419                foreach( $forums as $forum ) {
420                        bbp_update_forum_topic_count( $forum->ID );
421                }
422        } else {
423                return array( 2, sprintf( $statement, $result ) );
424        }
425
426        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
427}
428
429/**
430 * Recount forum replies
431 *
432 * @since bbPress (r2613)
433 *
434 * @uses wpdb::query() To run our recount sql queries
435 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
436 * @uses bbp_get_forum_post_type() To get the forum post type
437 * @uses get_posts() To get the forums
438 * @uses bbp_update_forum_reply_count() To update the forum reply count
439 * @return array An array of the status code and the message
440 */
441function bbp_admin_repair_forum_reply_count() {
442        global $wpdb;
443
444        $statement = __( 'Counting the number of replies in each forum&hellip; %s', 'bbpress' );
445        $result    = __( 'Failed!', 'bbpress' );
446
447        $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` IN ( '_bbp_reply_count', '_bbp_total_reply_count' );";
448        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
449                return array( 1, sprintf( $statement, $result ) );
450
451        $forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) );
452        if ( !empty( $forums ) ) {
453                foreach( $forums as $forum ) {
454                        bbp_update_forum_reply_count( $forum->ID );
455                }
456        } else {
457                return array( 2, sprintf( $statement, $result ) );
458        }
459
460        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
461}
462
463/**
464 * Recount topics by the users
465 *
466 * @since bbPress (r3889)
467 *
468 * @uses bbp_get_reply_post_type() To get the reply post type
469 * @uses wpdb::query() To run our recount sql queries
470 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
471 * @return array An array of the status code and the message
472 */
473function bbp_admin_repair_user_topic_count() {
474        global $wpdb;
475
476        $statement   = __( 'Counting the number of topics each user has created&hellip; %s', 'bbpress' );
477        $result      = __( 'Failed!', 'bbpress' );
478        $sql_select  = "SELECT `post_author`, COUNT(DISTINCT `ID`) as `_count` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_topic_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "' GROUP BY `post_author`;";
479        $insert_rows = $wpdb->get_results( $sql_select );
480
481        if ( is_wp_error( $insert_rows ) )
482                return array( 1, sprintf( $statement, $result ) );
483
484        $key           = $wpdb->prefix . '_bbp_topic_count';
485        $insert_values = array();
486        foreach ( $insert_rows as $insert_row )
487                $insert_values[] = "('{$insert_row->post_author}', '{$key}', '{$insert_row->_count}')";
488
489        if ( !count( $insert_values ) )
490                return array( 2, sprintf( $statement, $result ) );
491
492        $sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
493        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
494                return array( 3, sprintf( $statement, $result ) );
495
496        foreach ( array_chunk( $insert_values, 10000 ) as $chunk ) {
497                $chunk = "\n" . join( ",\n", $chunk );
498                $sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
499
500                if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
501                        return array( 4, sprintf( $statement, $result ) );
502                }
503        }
504
505        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
506}
507
508/**
509 * Recount topic replied by the users
510 *
511 * @since bbPress (r2613)
512 *
513 * @uses bbp_get_reply_post_type() To get the reply post type
514 * @uses wpdb::query() To run our recount sql queries
515 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
516 * @return array An array of the status code and the message
517 */
518function bbp_admin_repair_user_reply_count() {
519        global $wpdb;
520
521        $statement   = __( 'Counting the number of topics to which each user has replied&hellip; %s', 'bbpress' );
522        $result      = __( 'Failed!', 'bbpress' );
523        $sql_select  = "SELECT `post_author`, COUNT(DISTINCT `ID`) as `_count` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_reply_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "' GROUP BY `post_author`;";
524        $insert_rows = $wpdb->get_results( $sql_select );
525
526        if ( is_wp_error( $insert_rows ) )
527                return array( 1, sprintf( $statement, $result ) );
528
529        $key           = $wpdb->prefix . '_bbp_reply_count';
530        $insert_values = array();
531        foreach ( $insert_rows as $insert_row )
532                $insert_values[] = "('{$insert_row->post_author}', '{$key}', '{$insert_row->_count}')";
533
534        if ( !count( $insert_values ) )
535                return array( 2, sprintf( $statement, $result ) );
536
537        $sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
538        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
539                return array( 3, sprintf( $statement, $result ) );
540
541        foreach ( array_chunk( $insert_values, 10000 ) as $chunk ) {
542                $chunk = "\n" . join( ",\n", $chunk );
543                $sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
544
545                if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
546                        return array( 4, sprintf( $statement, $result ) );
547                }
548        }
549
550        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
551}
552
553/**
554 * Clean the users' favorites
555 *
556 * @since bbPress (r2613)
557 *
558 * @uses bbp_get_topic_post_type() To get the topic post type
559 * @uses wpdb::query() To run our recount sql queries
560 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
561 * @return array An array of the status code and the message
562 */
563function bbp_admin_repair_user_favorites() {
564        global $wpdb;
565
566        $statement = __( 'Removing trashed topics from user favorites&hellip; %s', 'bbpress' );
567        $result    = __( 'Failed!', 'bbpress' );
568        $key       = $wpdb->prefix . '_bbp_favorites';
569        $users     = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `favorites` FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';" );
570
571        if ( is_wp_error( $users ) )
572                return array( 1, sprintf( $statement, $result ) );
573
574        $topics = $wpdb->get_col( "SELECT `ID` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_topic_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "';" );
575
576        if ( is_wp_error( $topics ) )
577                return array( 2, sprintf( $statement, $result ) );
578
579        $values = array();
580        foreach ( $users as $user ) {
581                if ( empty( $user->favorites ) || !is_string( $user->favorites ) )
582                        continue;
583
584                $favorites = array_intersect( $topics, (array) explode( ',', $user->favorites ) );
585                if ( empty( $favorites ) || !is_array( $favorites ) )
586                        continue;
587
588                $favorites_joined = join( ',', $favorites );
589                $values[]         = "('{$user->user_id}', '{$key}, '{$favorites_joined}')";
590
591                // Cleanup
592                unset( $favorites, $favorites_joined );
593        }
594
595        if ( !count( $values ) ) {
596                $result = __( 'Nothing to remove!', 'bbpress' );
597                return array( 0, sprintf( $statement, $result ) );
598        }
599
600        $sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
601        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
602                return array( 4, sprintf( $statement, $result ) );
603
604        foreach ( array_chunk( $values, 10000 ) as $chunk ) {
605                $chunk = "\n" . join( ",\n", $chunk );
606                $sql_insert = "INSERT INTO `$wpdb->usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
607                if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
608                        return array( 5, sprintf( $statement, $result ) );
609                }
610        }
611
612        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
613}
614
615/**
616 * Clean the users' subscriptions
617 *
618 * @since bbPress (r2668)
619 *
620 * @uses bbp_get_topic_post_type() To get the topic post type
621 * @uses wpdb::query() To run our recount sql queries
622 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
623 * @return array An array of the status code and the message
624 */
625function bbp_admin_repair_user_subscriptions() {
626        global $wpdb;
627
628        $statement = __( 'Removing trashed topics from user subscriptions&hellip; %s', 'bbpress' );
629        $result    = __( 'Failed!', 'bbpress' );
630        $key       = $wpdb->prefix . '_bbp_subscriptions';
631        $users     = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `subscriptions` FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';" );
632
633        if ( is_wp_error( $users ) )
634                return array( 1, sprintf( $statement, $result ) );
635
636        $topics = $wpdb->get_col( "SELECT `ID` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_topic_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "';" );
637        if ( is_wp_error( $topics ) )
638                return array( 2, sprintf( $statement, $result ) );
639
640        $values = array();
641        foreach ( $users as $user ) {
642                if ( empty( $user->subscriptions ) || !is_string( $user->subscriptions ) )
643                        continue;
644
645                $subscriptions = array_intersect( $topics, (array) explode( ',', $user->subscriptions ) );
646                if ( empty( $subscriptions ) || !is_array( $subscriptions ) )
647                        continue;
648
649                $subscriptions_joined = join( ',', $subscriptions );
650                $values[]             = "('{$user->user_id}', '{$key}', '{$subscriptions_joined}')";
651
652                // Cleanup
653                unset( $subscriptions, $subscriptions_joined );
654        }
655
656        if ( !count( $values ) ) {
657                $result = __( 'Nothing to remove!', 'bbpress' );
658                return array( 0, sprintf( $statement, $result ) );
659        }
660
661        $sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
662        if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
663                return array( 4, sprintf( $statement, $result ) );
664
665        foreach ( array_chunk( $values, 10000 ) as $chunk ) {
666                $chunk = "\n" . join( ",\n", $chunk );
667                $sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
668                if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
669                        return array( 5, sprintf( $statement, $result ) );
670                }
671        }
672
673        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
674}
675
676/**
677 * This repair tool will map each user of the current site to their respective
678 * forums role. By default, Admins will be Key Masters, and every other role
679 * will be the default role defined in Settings > Forums (Participant).
680 *
681 * @since bbPress (r4340)
682 *
683 * @uses bbp_get_user_role_map() To get the map of user roles
684 * @uses get_editable_roles() To get the current WordPress roles
685 * @uses get_users() To get the users of each role (limited to ID field)
686 * @uses bbp_set_user_role() To set each user's forums role
687 */
688function bbp_admin_repair_user_roles() {
689
690        $statement    = __( 'Remapping forum role for each user on this site&hellip; %s', 'bbpress' );
691        $changed      = 0;
692        $role_map     = bbp_get_user_role_map();
693        $default_role = bbp_get_default_role();
694
695        // Bail if no role map exists
696        if ( empty( $role_map ) )
697                return array( 1, sprintf( $statement, __( 'Failed!', 'bbpress' ) ) );
698
699        // Iterate through each role...
700        foreach ( array_keys( get_editable_roles() ) as $role ) {
701
702                // Reset the offset
703                $offset = 0;
704
705                // If no role map exists, give the default forum role (bbp-participant)
706                $new_role = isset( $role_map[$role] ) ? $role_map[$role] : $default_role;
707                       
708                // Get users of this site, limited to 1000
709                while ( $users = get_users( array(
710                                'role'   => $role,
711                                'fields' => 'ID',
712                                'number' => 1000,
713                                'offset' => $offset
714                        ) ) ) {
715
716                        // Iterate through each user of $role and try to set it
717                        foreach ( (array) $users as $user_id ) {
718                                if ( bbp_set_user_role( $user_id, $new_role ) ) {
719                                        ++$changed; // Keep a count to display at the end
720                                }
721                        }
722
723                        // Bump the offset for the next query iteration
724                        $offset = $offset + 1000;
725                }
726        }
727
728        $result = sprintf( __( 'Complete! %s users updated.', 'bbpress' ), bbp_number_format( $changed ) );
729        return array( 0, sprintf( $statement, $result ) );
730}
731
732/**
733 * Recaches the last post in every topic and forum
734 *
735 * @since bbPress (r3040)
736 *
737 * @uses wpdb::query() To run our recount sql queries
738 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
739 * @return array An array of the status code and the message
740 */
741function bbp_admin_repair_freshness() {
742        global $wpdb;
743
744        $statement = __( 'Recomputing latest post in every topic and forum&hellip; %s', 'bbpress' );
745        $result    = __( 'Failed!', 'bbpress' );
746
747        // First, delete everything.
748        if ( is_wp_error( $wpdb->query( "DELETE FROM `$wpdb->postmeta` WHERE `meta_key` IN ( '_bbp_last_reply_id', '_bbp_last_topic_id', '_bbp_last_active_id', '_bbp_last_active_time' );" ) ) )
749                return array( 1, sprintf( $statement, $result ) );
750
751        // Next, give all the topics with replies the ID their last reply.
752        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
753                        ( SELECT `topic`.`ID`, '_bbp_last_reply_id', MAX( `reply`.`ID` )
754                        FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
755                        WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
756                        GROUP BY `topic`.`ID` );" ) ) )
757                return array( 2, sprintf( $statement, $result ) );
758
759        // For any remaining topics, give a reply ID of 0.
760        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
761                        ( SELECT `ID`, '_bbp_last_reply_id', 0
762                        FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
763                        ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_reply_id'
764                        WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
765                return array( 3, sprintf( $statement, $result ) );
766
767        // Now we give all the forums with topics the ID their last topic.
768        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
769                        ( SELECT `forum`.`ID`, '_bbp_last_topic_id', `topic`.`ID`
770                        FROM `$wpdb->posts` AS `forum` INNER JOIN `$wpdb->posts` AS `topic` ON `forum`.`ID` = `topic`.`post_parent`
771                        WHERE `topic`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `forum`.`post_type` = 'forum' AND `topic`.`post_type` = 'topic'
772                        GROUP BY `forum`.`ID` );" ) ) )
773                return array( 4, sprintf( $statement, $result ) );
774
775        // For any remaining forums, give a topic ID of 0.
776        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
777                        ( SELECT `ID`, '_bbp_last_topic_id', 0
778                        FROM `$wpdb->posts` AS `forum` LEFT JOIN `$wpdb->postmeta` AS `topic`
779                        ON `forum`.`ID` = `topic`.`post_id` AND `topic`.`meta_key` = '_bbp_last_topic_id'
780                        WHERE `topic`.`meta_id` IS NULL AND `forum`.`post_type` = 'forum' );" ) ) )
781                return array( 5, sprintf( $statement, $result ) );
782
783        // After that, we give all the topics with replies the ID their last reply (again, this time for a different reason).
784        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
785                        ( SELECT `topic`.`ID`, '_bbp_last_active_id', MAX( `reply`.`ID` )
786                        FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
787                        WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
788                        GROUP BY `topic`.`ID` );" ) ) )
789                return array( 6, sprintf( $statement, $result ) );
790
791        // For any remaining topics, give a reply ID of themself.
792        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
793                        ( SELECT `ID`, '_bbp_last_active_id', `ID`
794                        FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
795                        ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_active_id'
796                        WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
797                return array( 7, sprintf( $statement, $result ) );
798
799        // Give topics with replies their last update time.
800        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
801                        ( SELECT `topic`.`ID`, '_bbp_last_active_time', MAX( `reply`.`post_date` )
802                        FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
803                        WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
804                        GROUP BY `topic`.`ID` );" ) ) )
805                return array( 8, sprintf( $statement, $result ) );
806
807        // Give topics without replies their last update time.
808        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
809                        ( SELECT `ID`, '_bbp_last_active_time', `post_date`
810                        FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
811                        ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_active_time'
812                        WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
813                return array( 9, sprintf( $statement, $result ) );
814
815        // Forums need to know what their last active item is as well. Now it gets a bit more complex to do in the database.
816        $forums = $wpdb->get_col( "SELECT `ID` FROM `$wpdb->posts` WHERE `post_type` = 'forum' and `post_status` != 'auto-draft';" );
817        if ( is_wp_error( $forums ) )
818                return array( 10, sprintf( $statement, $result ) );
819
820        // Loop through forums
821        foreach ( $forums as $forum_id ) {
822                if ( !bbp_is_forum_category( $forum_id ) ) {
823                        bbp_update_forum( array( 'forum_id' => $forum_id ) );
824                }
825        }
826
827        // Loop through categories when forums are done
828        foreach ( $forums as $forum_id ) {
829                if ( bbp_is_forum_category( $forum_id ) ) {
830                        bbp_update_forum( array( 'forum_id' => $forum_id ) );
831                }
832        }
833
834        // Complete results
835        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
836}
837
838/**
839 * Recaches the private and hidden forums
840 *
841 * @since bbPress (r4104)
842 *
843 * @uses delete_option() to delete private and hidden forum pointers
844 * @uses WP_Query() To query post IDs
845 * @uses is_wp_error() To return if error occurred
846 * @uses update_option() To update the private and hidden post ID pointers
847 * @return array An array of the status code and the message
848 */
849function bbp_admin_repair_forum_visibility() {
850
851        $statement = __( 'Recalculating forum visibility &hellip; %s', 'bbpress' );
852        $result    = __( 'Failed!', 'bbpress' );
853
854        // First, delete everything.
855        delete_option( '_bbp_private_forums' );
856        delete_option( '_bbp_hidden_forums'  );
857
858        // Next, get all the private and hidden forums
859        $private_forums = new WP_Query( array(
860                'suppress_filters' => true,
861                'nopaging'         => true,
862                'post_type'        => bbp_get_forum_post_type(),
863                'post_status'      => bbp_get_private_status_id(),
864                'fields'           => 'ids'
865        ) );
866        $hidden_forums = new WP_Query( array(
867                'suppress_filters' => true,
868                'nopaging'         => true,
869                'post_type'        => bbp_get_forum_post_type(),
870                'post_status'      => bbp_get_hidden_status_id(),
871                'fields'           => 'ids'
872        ) );
873
874        // Bail if queries returned errors
875        if ( is_wp_error( $private_forums ) || is_wp_error( $hidden_forums ) )
876                return array( 2, sprintf( $statement, $result ) );
877
878        update_option( '_bbp_private_forums', $private_forums->posts ); // Private forums
879        update_option( '_bbp_hidden_forums',  $hidden_forums->posts  ); // Hidden forums
880
881        // Reset the $post global
882        wp_reset_postdata();
883
884        // Complete results
885        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
886}
887
888/**
889 * Recaches the forum for each post
890 *
891 * @since bbPress (r3876)
892 *
893 * @uses wpdb::query() To run our recount sql queries
894 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
895 * @return array An array of the status code and the message
896 */
897function bbp_admin_repair_forum_meta() {
898        global $wpdb;
899
900        $statement = __( 'Recalculating the forum for each post &hellip; %s', 'bbpress' );
901        $result    = __( 'Failed!', 'bbpress' );
902
903        // First, delete everything.
904        if ( is_wp_error( $wpdb->query( "DELETE FROM `$wpdb->postmeta` WHERE `meta_key` = '_bbp_forum_id';" ) ) )
905                return array( 1, sprintf( $statement, $result ) );
906
907        // Next, give all the topics with replies the ID their last reply.
908        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
909                        ( SELECT `forum`.`ID`, '_bbp_forum_id', `forum`.`post_parent`
910                        FROM `$wpdb->posts`
911                                AS `forum`
912                        WHERE `forum`.`post_type` = 'forum'
913                        GROUP BY `forum`.`ID` );" ) ) )
914                return array( 2, sprintf( $statement, $result ) );
915
916        // Next, give all the topics with replies the ID their last reply.
917        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
918                        ( SELECT `topic`.`ID`, '_bbp_forum_id', `topic`.`post_parent`
919                        FROM `$wpdb->posts`
920                                AS `topic`
921                        WHERE `topic`.`post_type` = 'topic'
922                        GROUP BY `topic`.`ID` );" ) ) )
923                return array( 3, sprintf( $statement, $result ) );
924
925        // Next, give all the topics with replies the ID their last reply.
926        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
927                        ( SELECT `reply`.`ID`, '_bbp_forum_id', `topic`.`post_parent`
928                        FROM `$wpdb->posts`
929                                AS `reply`
930                        INNER JOIN `$wpdb->posts`
931                                AS `topic`
932                                ON `reply`.`post_parent` = `topic`.`ID`
933                        WHERE `topic`.`post_type` = 'topic'
934                                AND `reply`.`post_type` = 'reply'
935                        GROUP BY `reply`.`ID` );" ) ) )
936                return array( 4, sprintf( $statement, $result ) );
937
938        // Complete results
939        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
940}
941
942/**
943 * Recaches the topic for each post
944 *
945 * @since bbPress (r3876)
946 *
947 * @uses wpdb::query() To run our recount sql queries
948 * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
949 * @return array An array of the status code and the message
950 */
951function bbp_admin_repair_topic_meta() {
952        global $wpdb;
953
954        $statement = __( 'Recalculating the topic for each post &hellip; %s', 'bbpress' );
955        $result    = __( 'Failed!', 'bbpress' );
956
957        // First, delete everything.
958        if ( is_wp_error( $wpdb->query( "DELETE FROM `$wpdb->postmeta` WHERE `meta_key` = '_bbp_topic_id';" ) ) )
959                return array( 1, sprintf( $statement, $result ) );
960
961        // Next, give all the topics with replies the ID their last reply.
962        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
963                        ( SELECT `topic`.`ID`, '_bbp_topic_id', `topic`.`ID`
964                        FROM `$wpdb->posts`
965                                AS `topic`
966                        WHERE `topic`.`post_type` = 'topic'
967                        GROUP BY `topic`.`ID` );" ) ) )
968                return array( 3, sprintf( $statement, $result ) );
969
970        // Next, give all the topics with replies the ID their last reply.
971        if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
972                        ( SELECT `reply`.`ID`, '_bbp_topic_id', `topic`.`ID`
973                        FROM `$wpdb->posts`
974                                AS `reply`
975                        INNER JOIN `$wpdb->posts`
976                                AS `topic`
977                                ON `reply`.`post_parent` = `topic`.`ID`
978                        WHERE `topic`.`post_type` = 'topic'
979                                AND `reply`.`post_type` = 'reply'
980                        GROUP BY `reply`.`ID` );" ) ) )
981                return array( 4, sprintf( $statement, $result ) );
982
983        // Complete results
984        return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
985}
986
987/** Reset ********************************************************************/
988
989/**
990 * Admin reset page
991 *
992 * @since bbPress (r2613)
993 *
994 * @uses check_admin_referer() To verify the nonce and the referer
995 * @uses do_action() Calls 'admin_notices' to display the notices
996 * @uses screen_icon() To display the screen icon
997 * @uses wp_nonce_field() To add a hidden nonce field
998 */
999function bbp_admin_reset() {
1000?>
1001
1002        <div class="wrap">
1003
1004                <?php screen_icon( 'tools' ); ?>
1005
1006                <h2 class="nav-tab-wrapper"><?php bbp_tools_admin_tabs( __( 'Reset Forums', 'bbpress' ) ); ?></h2>
1007                <p><?php _e( 'This will revert your forums back to a brand new installation. This process cannot be undone. <strong>Backup your database before proceeding</strong>.', 'bbpress' ); ?></p>
1008
1009                <form class="settings" method="post" action="">
1010                        <table class="form-table">
1011                                <tbody>
1012                                        <tr valign="top">
1013                                                <th scope="row"><?php _e( 'The following data will be removed:', 'bbpress' ) ?></th>
1014                                                <td>
1015                                                        <?php _e( 'All Forums',           'bbpress' ); ?><br />
1016                                                        <?php _e( 'All Topics',           'bbpress' ); ?><br />
1017                                                        <?php _e( 'All Replies',          'bbpress' ); ?><br />
1018                                                        <?php _e( 'All Topic Tags',       'bbpress' ); ?><br />
1019                                                        <?php _e( 'Related Meta Data',    'bbpress' ); ?><br />
1020                                                        <?php _e( 'Forum Settings',       'bbpress' ); ?><br />
1021                                                        <?php _e( 'Forum Activity',       'bbpress' ); ?><br />
1022                                                        <?php _e( 'Forum User Roles',     'bbpress' ); ?><br />
1023                                                        <?php _e( 'Importer Helper Data', 'bbpress' ); ?><br />
1024                                                </td>
1025                                        </tr>
1026                                        <tr valign="top">
1027                                                <th scope="row"><?php _e( 'Are you sure you want to do this?', 'bbpress' ) ?></th>
1028                                                <td>
1029                                                        <fieldset>
1030                                                                <legend class="screen-reader-text"><span><?php _e( "Say it ain't so!", 'bbpress' ) ?></span></legend>
1031                                                                <label><input type="checkbox" class="checkbox" name="bbpress-are-you-sure" id="bbpress-are-you-sure" value="1" /> <?php _e( 'This process cannot be undone.', 'bbpress' ); ?></label>
1032                                                        </fieldset>
1033                                                </td>
1034                                        </tr>
1035                                </tbody>
1036                        </table>
1037
1038                        <fieldset class="submit">
1039                                <input class="button-primary" type="submit" name="submit" value="<?php esc_attr_e( 'Reset bbPress', 'bbpress' ); ?>" />
1040                                <?php wp_nonce_field( 'bbpress-reset' ); ?>
1041                        </fieldset>
1042                </form>
1043        </div>
1044
1045<?php
1046}
1047
1048/**
1049 * Handle the processing and feedback of the admin tools page
1050 *
1051 * @since bbPress (r2613)
1052 *
1053 * @uses check_admin_referer() To verify the nonce and the referer
1054 * @uses wp_cache_flush() To flush the cache
1055 */
1056function bbp_admin_reset_handler() {
1057        if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && !empty( $_POST['bbpress-are-you-sure'] ) ) {
1058                check_admin_referer( 'bbpress-reset' );
1059
1060                global $wpdb;
1061
1062                // Stores messages
1063                $messages = array();
1064                $failed   = __( 'Failed',   'bbpress' );
1065                $success  = __( 'Success!', 'bbpress' );
1066
1067                // Flush the cache; things are about to get ugly.
1068                wp_cache_flush();
1069
1070                /** Posts *************************************************************/
1071
1072                $statement  = __( 'Deleting Posts&hellip; %s', 'bbpress' );
1073                $sql_posts  = $wpdb->get_results( "SELECT `ID` FROM `{$wpdb->posts}` WHERE `post_type` IN ('forum', 'topic', 'reply')", OBJECT_K );
1074                $sql_delete = "DELETE FROM `{$wpdb->posts}` WHERE `post_type` IN ('forum', 'topic', 'reply')";
1075                $result     = is_wp_error( $wpdb->query( $sql_delete ) ) ? $failed : $success;
1076                $messages[] = sprintf( $statement, $result );
1077
1078
1079                /** Post Meta *********************************************************/
1080
1081                if ( !empty( $sql_posts ) ) {
1082                        foreach( $sql_posts as $key => $value ) {
1083                                $sql_meta[] = $key;
1084                        }
1085                        $statement  = __( 'Deleting Post Meta&hellip; %s', 'bbpress' );
1086                        $sql_meta   = implode( "', '", $sql_meta );
1087                        $sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `post_id` IN ('{$sql_meta}');";
1088                        $result     = is_wp_error( $wpdb->query( $sql_delete ) ) ? $failed : $success;
1089                        $messages[] = sprintf( $statement, $result );
1090                }
1091
1092                /** Topic Tags ********************************************************/
1093
1094                // @todo
1095
1096                /** User Meta *********************************************************/
1097
1098                $statement  = __( 'Deleting User Meta&hellip; %s', 'bbpress' );
1099                $sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` LIKE '%%_bbp_%%';";
1100                $result     = is_wp_error( $wpdb->query( $sql_delete ) ) ? $failed : $success;
1101                $messages[] = sprintf( $statement, $result );
1102
1103                /** Converter *********************************************************/
1104
1105                $statement  = __( 'Deleting Conversion Table&hellip; %s', 'bbpress' );
1106                $table_name = $wpdb->prefix . 'bbp_converter_translator';
1107                if ( $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) == $table_name ) {
1108                        $wpdb->query( "DROP TABLE {$table_name}" );
1109                        $result = $success;
1110                } else {
1111                        $result = $failed;
1112                }
1113                $messages[] = sprintf( $statement, $result );
1114
1115                /** Options ***********************************************************/
1116
1117                $statement  = __( 'Deleting Settings&hellip; %s', 'bbpress' );
1118                $sql_delete = bbp_delete_options();
1119                $messages[] = sprintf( $statement, $success );
1120
1121                /** Roles *************************************************************/
1122
1123                $statement  = __( 'Deleting Roles and Capabilities&hellip; %s', 'bbpress' );
1124                $sql_delete = bbp_remove_roles();
1125                $sql_delete = bbp_remove_caps();
1126                $messages[] = sprintf( $statement, $success );
1127
1128                /** Output ************************************************************/
1129
1130                if ( count( $messages ) ) {
1131                        foreach ( $messages as $message ) {
1132                                bbp_admin_tools_feedback( $message );
1133                        }
1134                }
1135        }
1136}
Note: See TracBrowser for help on using the repository browser.