$item ) {
// Current item is ours, so set our separator here
if ( ( ( 'edit.php?post_type=' . $top_menu_type ) == $item ) ) {
$bbp_menu_order[] = 'separator-bbpress';
unset( $menu_order[$bbp_separator] );
}
// Skip our separator
if ( !in_array( $item, array( 'separator-bbpress' ) ) )
$bbp_menu_order[] = $item;
}
// Return our custom order
return $bbp_menu_order;
}
/**
* Assemble the admin notices
*
* @since bbPress (r2613)
*
* @param string|WP_Error $message A message to be displayed or {@link WP_Error}
* @param string $class Optional. A class to be added to the message div
* @uses WP_Error::get_error_messages() To get the error messages of $message
* @uses add_action() Adds the admin notice action with the message HTML
* @return string The message HTML
*/
function bbp_admin_notices( $message, $class = false ) {
if ( is_string( $message ) ) {
$message = '
' . $message . '
';
$class = $class ? $class : 'updated';
} elseif ( is_wp_error( $message ) ) {
$errors = $message->get_error_messages();
switch ( count( $errors ) ) {
case 0:
return false;
break;
case 1:
$message = '' . $errors[0] . '
';
break;
default:
$message = '' . "\n\t" . '- ' . join( '
' . "\n\t" . '- ', $errors ) . '
' . "\n" . '
';
break;
}
$class = $class ? $class : 'error';
} else {
return false;
}
$message = '' . $message . '
';
$message = str_replace( "'", "\'", $message );
$lambda = create_function( '', "echo '$message';" );
add_action( 'admin_notices', $lambda );
return $lambda;
}
/**
* Get the array of the recount list
*
* @since bbPress (r2613)
*
* @uses apply_filters() Calls 'bbp_recount_list' with the recount list array
* @return array Recount list
*/
function bbp_recount_list() {
$recount_list = array(
5 => array( 'bbp-forum-topics', __( 'Count topics in each forum', 'bbpress' ), 'bbp_recount_forum_topics' ),
10 => array( 'bbp-forum-replies', __( 'Count replies in each forum', 'bbpress' ), 'bbp_recount_forum_replies' ),
15 => array( 'bbp-topic-replies', __( 'Count replies in each topic', 'bbpress' ), 'bbp_recount_topic_replies' ),
20 => array( 'bbp-topic-voices', __( 'Count voices in each topic', 'bbpress' ), 'bbp_recount_topic_voices' ),
25 => array( 'bbp-topic-hidden-replies', __( 'Count spammed & trashed replies in each topic', 'bbpress' ), 'bbp_recount_topic_hidden_replies' ),
30 => array( 'bbp-topics-replied', __( 'Count replies for each user', 'bbpress' ), 'bbp_recount_user_topics_replied' ),
35 => array( 'bbp-clean-favorites', __( 'Remove trashed topics from user favorites', 'bbpress' ), 'bbp_recount_clean_favorites' ),
40 => array( 'bbp-clean-subscriptions', __( 'Remove trashed topics from user subscriptions', 'bbpress' ), 'bbp_recount_clean_subscriptions' ),
//45 => array( 'bbp-topic-tag-count', __( 'Count tags for every topic', 'bbpress' ), 'bbp_recount_topic_tags' ),
//50 => array( 'bbp-tags-tag-count', __( 'Count topics for every tag', 'bbpress' ), 'bbp_recount_tag_topics' ),
//55 => array( 'bbp-tags-delete-empty', __( 'Delete tags with no topics', 'bbpress' ), 'bbp_recount_tag_delete_empty' ),
60 => array( 'bbp-sync-all-topics-forums', __( 'Recalculate last activity in each topic and forum', 'bbpress' ), 'bbp_recount_rewalk' )
);
ksort( $recount_list );
return apply_filters( 'bbp_recount_list', $recount_list );
}
/**
* Recount topic replies
*
* @since bbPress (r2613)
*
* @uses bbp_get_reply_post_type() To get the reply post type
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_topic_replies() {
global $wpdb, $bbp;
$statement = __( 'Counting the number of replies in each topic… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count';";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 1, sprintf( $statement, $result ) );
// Post types and status
$tpt = bbp_get_topic_post_type();
$rpt = bbp_get_reply_post_type();
$pps = bbp_get_public_status_id();
$cps = bbp_get_closed_status_id();
$sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
SELECT `topics`.`ID` AS `post_id`, '_bbp_reply_count' AS `meta_key`, COUNT(`replies`.`ID`) As `meta_value`
FROM `{$wpdb->posts}` AS `topics`
LEFT JOIN `{$wpdb->posts}` as `replies`
ON `replies`.`post_parent` = `topics`.`ID`
AND `replies`.`post_status` = '{$pps}'
AND `replies`.`post_type` = '{$rpt}'
WHERE `topics`.`post_type` = '{$tpt}'
AND `topics`.`post_status` IN ( '{$pps}', '{$cps}' )
GROUP BY `topics`.`ID`);";
if ( is_wp_error( $wpdb->query( $sql ) ) )
return array( 2, sprintf( $statement, $result ) );
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Recount topic voices
*
* @since bbPress (r2613)
*
* @uses bbp_get_reply_post_type() To get the reply post type
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_topic_voices() {
global $wpdb, $bbp;
$statement = __( 'Counting the number of voices in each topic… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_voice_count';";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 1, sprintf( $statement, $result ) );
// Post types and status
$tpt = bbp_get_topic_post_type();
$rpt = bbp_get_reply_post_type();
$pps = bbp_get_public_status_id();
$cps = bbp_get_closed_status_id();
$sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
SELECT `postmeta`.`meta_value`, '_bbp_voice_count', COUNT(DISTINCT `post_author`) as `meta_value`
FROM `{$wpdb->posts}` AS `posts`
LEFT JOIN `{$wpdb->postmeta}` AS `postmeta`
ON `posts`.`ID` = `postmeta`.`post_id`
AND `postmeta`.`meta_key` = '_bbp_topic_id'
WHERE `posts`.`post_type` IN ( '{$tpt}', '{$rpt}' )
AND `posts`.`post_status` IN ( '{$pps}', '{$cps}' )
AND `posts`.`post_author` != '0'
GROUP BY `postmeta`.`meta_value`);";
if ( is_wp_error( $wpdb->query( $sql ) ) )
return array( 2, sprintf( $statement, $result ) );
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Recount topic hidden replies (spammed/trashed)
*
* @since bbPress (r2747)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_topic_hidden_replies() {
global $wpdb, $bbp;
$statement = __( 'Counting the number of spammed and trashed replies in each topic… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count_hidden';";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 1, sprintf( $statement, $result ) );
$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`);";
if ( is_wp_error( $wpdb->query( $sql ) ) )
return array( 2, sprintf( $statement, $result ) );
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Recount forum topics
*
* @since bbPress (r2613)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @uses bbp_get_forum_post_type() To get the forum post type
* @uses get_posts() To get the forums
* @uses bbp_update_forum_topic_count() To update the forum topic count
* @return array An array of the status code and the message
*/
function bbp_recount_forum_topics() {
global $wpdb;
$statement = __( 'Counting the number of topics in each forum… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$sql_delete = "DELETE FROM {$wpdb->postmeta} WHERE meta_key IN ( '_bbp_topic_count', '_bbp_total_topic_count' );";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 1, sprintf( $statement, $result ) );
if ( $forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) ) ) {
foreach( $forums as $forum ) {
bbp_update_forum_topic_count( $forum->ID );
}
} else {
return array( 2, sprintf( $statement, $result ) );
}
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Recount forum replies
*
* @since bbPress (r2613)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @uses bbp_get_forum_post_type() To get the forum post type
* @uses get_posts() To get the forums
* @uses bbp_update_forum_reply_count() To update the forum reply count
* @return array An array of the status code and the message
*/
function bbp_recount_forum_replies() {
global $wpdb;
$statement = __( 'Counting the number of replies in each forum… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` IN ( '_bbp_reply_count', '_bbp_total_reply_count' );";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 1, sprintf( $statement, $result ) );
if ( $forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) ) ) {
foreach( $forums as $forum ) {
bbp_update_forum_reply_count( $forum->ID );
}
} else {
return array( 2, sprintf( $statement, $result ) );
}
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Recount topic replied by the users
*
* @since bbPress (r2613)
*
* @uses bbp_get_reply_post_type() To get the reply post type
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_user_topics_replied() {
global $wpdb, $bbp;
$statement = __( 'Counting the number of topics to which each user has replied… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$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`;";
$insert_rows = $wpdb->get_results( $sql_select );
if ( is_wp_error( $insert_rows ) )
return array( 1, sprintf( $statement, $result ) );
$insert_values = array();
foreach ( $insert_rows as $insert_row )
$insert_values[] = "('{$insert_row->post_author}', '_bbp_topics_replied', '{$insert_row->_count}')";
if ( !count( $insert_values ) )
return array( 2, sprintf( $statement, $result ) );
$sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '_bbp_topics_replied';";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 3, sprintf( $statement, $result ) );
$insert_values = array_chunk( $insert_values, 10000 );
foreach ( $insert_values as $chunk ) {
$chunk = "\n" . join( ",\n", $chunk );
$sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
if ( is_wp_error( $wpdb->query( $sql_insert ) ) )
return array( 4, sprintf( $statement, $result ) );
}
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
// This function bypasses the taxonomy API
/**
* Recount topic tags in each topic
*
* @since bbPress (r2613)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_topic_tags() {
global $wpdb;
$statement = __( 'Counting the number of topic tags in each topic… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
// // Delete empty tags
// $delete = bbp_recount_tag_delete_empty();
// if ( $delete[0] > 0 ) {
// $result = __( 'Could not delete empty tags.' );
// return array( 1, sprintf( $statement, $result ) );
// }
//
// // Get all tags
// $sql_terms = "SELECT
// `$wpdb->term_relationships`.`object_id`,
// `$wpdb->term_taxonomy`.`term_id`
// FROM `$wpdb->term_relationships`
// JOIN `$wpdb->term_taxonomy`
// ON `$wpdb->term_taxonomy`.`term_taxonomy_id` = `$wpdb->term_relationships`.`term_taxonomy_id`
// WHERE
// `$wpdb->term_taxonomy`.`taxonomy` = 'bb_topic_tag'
// ORDER BY
// `$wpdb->term_relationships`.`object_id`,
// `$wpdb->term_taxonomy`.`term_id`;";
//
// $terms = $wpdb->get_results( $sql_terms );
// if ( is_wp_error( $terms ) || !is_array( $terms ) )
// return array( 2, sprintf( $statement, $result ) );
//
// if ( empty( $terms ) ) {
// $result = __( 'No topic tags found.' );
// return array( 3, sprintf( $statement, $result ) );
// }
//
// // Count the tags in each topic
// $topics = array( );
// foreach ( $terms as $term ) {
// if ( !isset( $topics[$term->object_id] ) ) {
// $topics[$term->object_id] = 1;
// } else {
// $topics[$term->object_id]++;
// }
// }
//
// if ( empty( $topics ) )
// return array( 4, sprintf( $statement, $result ) );
//
// // Build the values to insert into the SQL statement
// $values = array( );
// foreach ( $topics as $topic_id => $tag_count )
// $values[] = '(' . $topic_id . ', ' . $tag_count . ')';
//
// if ( empty( $values ) )
// return array( 5, sprintf( $statement, $result ) );
//
// // Update the topics with the new tag counts
// $values = array_chunk( $values, 10000 );
// foreach ( $values as $chunk ) {
// $sql = "INSERT INTO `$wpdb->topics` (`topic_id`, `tag_count`) VALUES " . implode( ", ", $chunk ) . " ON DUPLICATE KEY UPDATE `tag_count` = VALUES(`tag_count`);";
// if ( is_wp_error( $wpdb->query( $sql ) ) ) {
// return array( 6, sprintf( $statement, $result ) );
// }
// }
//
// $result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
// This function bypasses the taxonomy API
/**
* Recount the number of topics in each topic tag
*
* @since bbPress (r2613)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_tag_topics() {
global $wpdb;
$statement = __( 'Counting the number of topics in each topic tag… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
// // Delete empty tags
// $delete = bbp_recount_tag_delete_empty();
// if ( $delete[0] > 0 ) {
// $result = __( 'Could not delete empty tags.' );
// return array( 1, sprintf( $statement, $result ) );
// }
//
// // Get all tags
// $sql_terms = "SELECT
// `$wpdb->term_taxonomy`.`term_taxonomy_id`,
// `$wpdb->term_relationships`.`object_id`
// FROM `$wpdb->term_relationships`
// JOIN `$wpdb->term_taxonomy`
// ON `$wpdb->term_taxonomy`.`term_taxonomy_id` = `$wpdb->term_relationships`.`term_taxonomy_id`
// WHERE
// `$wpdb->term_taxonomy`.`taxonomy` = 'bb_topic_tag'
// ORDER BY
// `$wpdb->term_taxonomy`.`term_taxonomy_id`,
// `$wpdb->term_relationships`.`object_id`;";
//
// $terms = $wpdb->get_results( $sql_terms );
// if ( is_wp_error( $terms ) || !is_array( $terms ) )
// return array( 2, sprintf( $statement, $result ) );
//
// if ( empty( $terms ) ) {
// $result = __( 'No topic tags found.', 'bbpress' );
// return array( 3, sprintf( $statement, $result ) );
// }
//
// // Count the topics in each tag
// $tags = array( );
// foreach ( $terms as $term ) {
// if ( !isset( $tags[$term->term_taxonomy_id] ) ) {
// $tags[$term->term_taxonomy_id] = 1;
// } else {
// $tags[$term->term_taxonomy_id]++;
// }
// }
//
// if ( empty( $tags ) )
// return array( 4, sprintf( $statement, $result ) );
//
// // Build the values to insert into the SQL statement
// $values = array( );
// foreach ( $tags as $term_taxonomy_id => $count )
// $values[] = '(' . $term_taxonomy_id . ', ' . $count . ')';
//
// if ( empty( $values ) )
// return array( 5, sprintf( $statement, $result ) );
//
// // Update the terms with the new tag counts
// $values = array_chunk( $values, 10000 );
// foreach ( $values as $chunk ) {
// $sql = "INSERT INTO `$wpdb->term_taxonomy` (`term_taxonomy_id`, `count`) VALUES " . implode( ", ", $chunk ) . " ON DUPLICATE KEY UPDATE `count` = VALUES(`count`);";
// if ( is_wp_error( $wpdb->query( $sql ) ) ) {
// return array( 6, sprintf( $statement, $result ) );
// }
// }
//
// if ( $return_boolean )
// return true;
//
// $result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
// This function bypasses the taxonomy API
/**
* Recount topic tags with no topics
*
* @since bbPress (r2613)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_tag_delete_empty() {
global $wpdb;
$statement = __( 'Deleting topic tags with no topics… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
// static $run_once;
// if ( isset( $run_once ) ) {
// if ( $run_once > 0 ) {
// $exit = sprintf( __( 'failure (returned code %s)', 'bbpress' ), $run_once );
// } else {
// $exit = __( 'success', 'bbpress' );
// }
// $result = sprintf( __( 'Already run with %s.', 'bbpress' ), $exit );
// return array( $run_once, sprintf( $statement, $result ) );
// }
//
// // Get all topic ids
// $sql_topics = "SELECT `topic_id` FROM $wpdb->topics ORDER BY `topic_id`;";
// $topics = $wpdb->get_results( $sql_topics );
// if ( is_wp_error( $topics ) ) {
// $result = __( 'No topics found.', 'bbpress' );
// $run_once = 1;
// return array( 1, sprintf( $statement, $result ) );
// }
//
// $topic_ids = array( );
//
// foreach ( $topics as $topic )
// $topic_ids[] = $topic->topic_id;
//
// // Get all topic tag term relationships without a valid topic id
// $in_topic_ids = implode( ', ', $topic_ids );
// $sql_bad_term_relationships = "SELECT
// `$wpdb->term_taxonomy`.`term_taxonomy_id`,
// `$wpdb->term_taxonomy`.`term_id`,
// `$wpdb->term_relationships`.`object_id`
// FROM `$wpdb->term_relationships`
// JOIN `$wpdb->term_taxonomy`
// ON `$wpdb->term_taxonomy`.`term_taxonomy_id` = `$wpdb->term_relationships`.`term_taxonomy_id`
// WHERE
// `$wpdb->term_taxonomy`.`taxonomy` = 'bb_topic_tag' AND
// `$wpdb->term_relationships`.`object_id` NOT IN ($in_topic_ids)
// ORDER BY
// `$wpdb->term_relationships`.`object_id`,
// `$wpdb->term_taxonomy`.`term_id`,
// `$wpdb->term_taxonomy`.`term_taxonomy_id`;";
//
// $bad_term_relationships = $wpdb->get_results( $sql_bad_term_relationships );
// if ( is_wp_error( $bad_term_relationships ) || !is_array( $bad_term_relationships ) ) {
// $run_once = 2;
// return array( 2, sprintf( $statement, $result ) );
// }
//
// // Delete those bad term relationships
// if ( !empty( $bad_term_relationships ) ) {
// $values = array( );
// foreach ( $bad_term_relationships as $bad_term_relationship ) {
// $values[] = '(`object_id` = ' . $bad_term_relationship->object_id . ' AND `term_taxonomy_id` = ' . $bad_term_relationship->term_taxonomy_id . ')';
// }
// if ( !empty( $values ) ) {
// $values = join( ' OR ', $values );
// $sql_bad_term_relationships_delete = "DELETE
// FROM `$wpdb->term_relationships`
// WHERE $values;";
// if ( is_wp_error( $wpdb->query( $sql_bad_term_relationships_delete ) ) ) {
// $run_once = 3;
// return array( 3, sprintf( $statement, $result ) );
// }
// }
// }
//
// // Now get all term taxonomy ids with term relationships
// $sql_term_relationships = "SELECT `term_taxonomy_id` FROM $wpdb->term_relationships ORDER BY `term_taxonomy_id`;";
// $term_taxonomy_ids = $wpdb->get_col( $sql_term_relationships );
// if ( is_wp_error( $term_taxonomy_ids ) ) {
// $run_once = 4;
// return array( 4, sprintf( $statement, $result ) );
// }
// $term_taxonomy_ids = array_unique( $term_taxonomy_ids );
//
// // Delete topic tags that don't have any term relationships
// if ( !empty( $term_taxonomy_ids ) ) {
// $in_term_taxonomy_ids = implode( ', ', $term_taxonomy_ids );
// $sql_delete_term_relationships = "DELETE
// FROM $wpdb->term_taxonomy
// WHERE
// `taxonomy` = 'bb_topic_tag' AND
// `term_taxonomy_id` NOT IN ($in_term_taxonomy_ids);";
// if ( is_wp_error( $wpdb->query( $sql_delete_term_relationships ) ) ) {
// $run_once = 5;
// return array( 5, sprintf( $statement, $result ) );
// }
// }
//
// // Get all valid term ids
// $sql_terms = "SELECT `term_id` FROM $wpdb->term_taxonomy ORDER BY `term_id`;";
// $term_ids = $wpdb->get_col( $sql_terms );
// if ( is_wp_error( $term_ids ) ) {
// $run_once = 6;
// return array( 6, sprintf( $statement, $result ) );
// }
// $term_ids = array_unique( $term_ids );
//
// // Delete terms that don't have any associated term taxonomies
// if ( !empty( $term_ids ) ) {
// $in_term_ids = implode( ', ', $term_ids );
// $sql_delete_terms = "DELETE
// FROM $wpdb->terms
// WHERE
// `term_id` NOT IN ($in_term_ids);";
// if ( is_wp_error( $wpdb->query( $sql_delete_terms ) ) ) {
// $run_once = 7;
// return array( 7, sprintf( $statement, $result ) );
// }
// }
//
// $result = __( 'Complete!', 'bbpress' );
// $run_once = 0;
return array( 0, sprintf( $statement, $result ) );
}
/**
* Clean the users' favorites
*
* @since bbPress (r2613)
*
* @uses bbp_get_topic_post_type() To get the topic post type
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_clean_favorites() {
global $wpdb, $bbp;
$statement = __( 'Removing trashed topics from user favorites… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$users = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `favorites` FROM `$wpdb->usermeta` WHERE `meta_key` = '_bbp_favorites';" );
if ( is_wp_error( $users ) )
return array( 1, sprintf( $statement, $result ) );
$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() . "';" );
if ( is_wp_error( $topics ) )
return array( 2, sprintf( $statement, $result ) );
$values = array();
foreach ( $users as $user ) {
if ( empty( $user->favorites ) || !is_string( $user->favorites ) )
continue;
$favorites = array_intersect( $topics, (array) explode( ',', $user->favorites ) );
if ( empty( $favorites ) || !is_array( $favorites ) )
continue;
$favorites = join( ',', $favorites );
$values[] = "('$user->user_id', '_bbp_favorites', '$favorites')";
}
if ( !count( $values ) ) {
$result = __( 'Nothing to remove!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
$sql_delete = "DELETE FROM `$wpdb->usermeta` WHERE `meta_key` = '_bbp_favorites';";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 4, sprintf( $statement, $result ) );
$values = array_chunk( $values, 10000 );
foreach ( $values as $chunk ) {
$chunk = "\n" . join( ",\n", $chunk );
$sql_insert = "INSERT INTO `$wpdb->usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
if ( is_wp_error( $wpdb->query( $sql_insert ) ) )
return array( 5, sprintf( $statement, $result ) );
}
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Clean the users' subscriptions
*
* @since bbPress (r2668)
*
* @uses bbp_get_topic_post_type() To get the topic post type
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_clean_subscriptions() {
global $wpdb, $bbp;
$statement = __( 'Removing trashed topics from user subscriptions… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
$users = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `subscriptions` FROM `$wpdb->usermeta` WHERE `meta_key` = '_bbp_subscriptions';" );
if ( is_wp_error( $users ) )
return array( 1, sprintf( $statement, $result ) );
$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() . "';" );
if ( is_wp_error( $topics ) )
return array( 2, sprintf( $statement, $result ) );
$values = array();
foreach ( $users as $user ) {
if ( empty( $user->subscriptions ) || !is_string( $user->subscriptions ) )
continue;
$subscriptions = array_intersect( $topics, (array) explode( ',', $user->subscriptions ) );
if ( empty( $subscriptions ) || !is_array( $subscriptions ) )
continue;
$subscriptions = join( ',', $subscriptions );
$values[] = "('$user->user_id', '_bbp_subscriptions', '$subscriptions')";
}
if ( !count( $values ) ) {
$result = __( 'Nothing to remove!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
$sql_delete = "DELETE FROM `$wpdb->usermeta` WHERE `meta_key` = '_bbp_subscriptions';";
if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
return array( 4, sprintf( $statement, $result ) );
$values = array_chunk( $values, 10000 );
foreach ( $values as $chunk ) {
$chunk = "\n" . join( ",\n", $chunk );
$sql_insert = "INSERT INTO `$wpdb->usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
if ( is_wp_error( $wpdb->query( $sql_insert ) ) )
return array( 5, sprintf( $statement, $result ) );
}
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Recaches the last post in every topic and forum
*
* @since bbPress (r3040)
*
* @uses wpdb::query() To run our recount sql queries
* @uses is_wp_error() To check if the executed query returned {@link WP_Error}
* @return array An array of the status code and the message
*/
function bbp_recount_rewalk() {
global $wpdb, $bbp;
$statement = __( 'Recomputing latest post in every topic and forum… %s', 'bbpress' );
$result = __( 'Failed!', 'bbpress' );
// First, delete everything.
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' );" ) ) )
return array( 1, sprintf( $statement, $result ) );
// Next, give all the topics with replies the ID their last reply.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `topic`.`ID`, '_bbp_last_reply_id', MAX( `reply`.`ID` )
FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
GROUP BY `topic`.`ID` );" ) ) )
return array( 2, sprintf( $statement, $result ) );
// For any remaining topics, give a reply ID of 0.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `ID`, '_bbp_last_reply_id', 0
FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_reply_id'
WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
return array( 3, sprintf( $statement, $result ) );
// Now we give all the forums with topics the ID their last topic.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `forum`.`ID`, '_bbp_last_topic_id', `topic`.`ID`
FROM `$wpdb->posts` AS `forum` INNER JOIN `$wpdb->posts` AS `topic` ON `forum`.`ID` = `topic`.`post_parent`
WHERE `topic`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `forum`.`post_type` = 'forum' AND `topic`.`post_type` = 'topic'
GROUP BY `forum`.`ID` );" ) ) )
return array( 4, sprintf( $statement, $result ) );
// For any remaining forums, give a topic ID of 0.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `ID`, '_bbp_last_topic_id', 0
FROM `$wpdb->posts` AS `forum` LEFT JOIN `$wpdb->postmeta` AS `topic`
ON `forum`.`ID` = `topic`.`post_id` AND `topic`.`meta_key` = '_bbp_last_topic_id'
WHERE `topic`.`meta_id` IS NULL AND `forum`.`post_type` = 'forum' );" ) ) )
return array( 5, sprintf( $statement, $result ) );
// After that, we give all the topics with replies the ID their last reply (again, this time for a different reason).
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `topic`.`ID`, '_bbp_last_active_id', MAX( `reply`.`ID` )
FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
GROUP BY `topic`.`ID` );" ) ) )
return array( 6, sprintf( $statement, $result ) );
// For any remaining topics, give a reply ID of themself.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `ID`, '_bbp_last_active_id', `ID`
FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_active_id'
WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
return array( 7, sprintf( $statement, $result ) );
// Give topics with replies their last update time.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `topic`.`ID`, '_bbp_last_active_time', MAX( `reply`.`post_date` )
FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
GROUP BY `topic`.`ID` );" ) ) )
return array( 8, sprintf( $statement, $result ) );
// Give topics without replies their last update time.
if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
( SELECT `ID`, '_bbp_last_active_time', `post_date`
FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_active_time'
WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
return array( 9, sprintf( $statement, $result ) );
// Forums need to know what their last active item is as well. Now it gets a bit more complex to do in the database.
$forums = $wpdb->get_col( "SELECT `ID` FROM `$wpdb->posts` WHERE `post_type` = 'forum' and `post_status` != 'auto-draft';" );
if ( is_wp_error( $forums ) )
return array( 10, sprintf( $statement, $result ) );
// Loop through each forum and update them
foreach ( $forums as $forum_id )
bbp_update_forum( array( 'forum_id' => $forum_id ) );
// Complete results
$result = __( 'Complete!', 'bbpress' );
return array( 0, sprintf( $statement, $result ) );
}
/**
* Filter sample permalinks so that certain languages display properly.
*
* @since bbPress (r3336)
*
* @param string $post_link Custom post type permalink
* @param object $post Post data object
* @param bool $leavename Optional, defaults to false. Whether to keep post name or page name.
* @param bool $sample Optional, defaults to false. Is it a sample permalink.
*
* @uses is_admin() To make sure we're on an admin page
* @uses bbp_is_custom_post_type() To get the forum post type
*
* @return string The custom post type permalink
*/
function bbp_filter_sample_permalink( $post_link, $post, $leavename, $sample ) {
// Bail if not on an admin page and not getting a sample permalink
if ( !empty( $sample ) && is_admin() && bbp_is_custom_post_type() )
return urldecode( $post_link );
// Return post link
return $post_link;
}
?>