bbp_merge_topic_handler( string $action = '' )
Merge topic handler
Description
Handles the front end merge topic submission
Parameters
- $action
-
(Optional) The requested action to compare this function to
Default value: ''
Source
File: bp-forums/topics/functions.php
function bbp_merge_topic_handler( $action = '' ) {
// Bail if action is not bbp-merge-topic
if ( 'bbp-merge-topic' !== $action )
return;
// Define local variable(s)
$source_topic_id = $destination_topic_id = 0;
$source_topic = $destination_topic = 0;
$subscribers = $favoriters = $replies = array();
/** Source Topic **********************************************************/
// Topic id
if ( empty( $_POST['bbp_topic_id'] ) ) {
bbp_add_error( 'bbp_merge_topic_source_id', __( '<strong>ERROR</strong>: Discussion ID not found.', 'buddyboss' ) );
} else {
$source_topic_id = (int) $_POST['bbp_topic_id'];
}
// Nonce check
if ( ! bbp_verify_nonce_request( 'bbp-merge-topic_' . $source_topic_id ) ) {
bbp_add_error( 'bbp_merge_topic_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'buddyboss' ) );
return;
// Source topic not found
} elseif ( !$source_topic = bbp_get_topic( $source_topic_id ) ) {
bbp_add_error( 'bbp_merge_topic_source_not_found', __( '<strong>ERROR</strong>: The discussion you want to merge was not found.', 'buddyboss' ) );
return;
}
// Cannot edit source topic
if ( !current_user_can( 'edit_topic', $source_topic->ID ) ) {
bbp_add_error( 'bbp_merge_topic_source_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the source discussion.', 'buddyboss' ) );
return;
}
/** Destination Topic *****************************************************/
// Topic id
if ( empty( $_POST['bbp_destination_topic'] ) )
bbp_add_error( 'bbp_merge_topic_destination_id', __( '<strong>ERROR</strong>: Destination discussion ID not found.', 'buddyboss' ) );
else
$destination_topic_id = (int) $_POST['bbp_destination_topic'];
// Destination topic not found
if ( !$destination_topic = bbp_get_topic( $destination_topic_id ) )
bbp_add_error( 'bbp_merge_topic_destination_not_found', __( '<strong>ERROR</strong>: The discussion you want to merge to was not found.', 'buddyboss' ) );
// Cannot edit destination topic
if ( !current_user_can( 'edit_topic', $destination_topic->ID ) )
bbp_add_error( 'bbp_merge_topic_destination_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the destination discussion.', 'buddyboss' ) );
// Bail if errors
if ( bbp_has_errors() )
return;
/** No Errors *************************************************************/
// Update counts, etc...
do_action( 'bbp_merge_topic', $destination_topic->ID, $source_topic->ID );
/** Date Check ************************************************************/
// Check if the destination topic is older than the source topic
if ( strtotime( $source_topic->post_date ) < strtotime( $destination_topic->post_date ) ) {
// Set destination topic post_date to 1 second before source topic
$destination_post_date = date( 'Y-m-d H:i:s', strtotime( $source_topic->post_date ) - 1 );
// Update destination topic
wp_update_post( array(
'ID' => $destination_topic_id,
'post_date' => $destination_post_date,
'post_date_gmt' => get_gmt_from_date( $destination_post_date )
) );
}
/** Subscriptions *********************************************************/
// Get subscribers from source topic
$subscribers = bbp_get_topic_subscribers( $source_topic->ID );
// Remove the topic from everybody's subscriptions
if ( !empty( $subscribers ) ) {
// Loop through each user
foreach ( (array) $subscribers as $subscriber ) {
// Shift the subscriber if told to
if ( !empty( $_POST['bbp_topic_subscribers'] ) && ( "1" === $_POST['bbp_topic_subscribers'] ) && bbp_is_subscriptions_active() )
bbp_add_user_subscription( $subscriber, $destination_topic->ID );
// Remove old subscription
bbp_remove_user_subscription( $subscriber, $source_topic->ID );
}
}
/** Favorites *************************************************************/
// Get favoriters from source topic
$favoriters = bbp_get_topic_favoriters( $source_topic->ID );
// Remove the topic from everybody's favorites
if ( !empty( $favoriters ) ) {
// Loop through each user
foreach ( (array) $favoriters as $favoriter ) {
// Shift the favoriter if told to
if ( !empty( $_POST['bbp_topic_favoriters'] ) && "1" === $_POST['bbp_topic_favoriters'] )
bbp_add_user_favorite( $favoriter, $destination_topic->ID );
// Remove old favorite
bbp_remove_user_favorite( $favoriter, $source_topic->ID );
}
}
/** Tags ******************************************************************/
// Get the source topic tags
$source_topic_tags = wp_get_post_terms( $source_topic->ID, bbp_get_topic_tag_tax_id(), array( 'fields' => 'names' ) );
// Tags to possibly merge
if ( !empty( $source_topic_tags ) && !is_wp_error( $source_topic_tags ) ) {
// Shift the tags if told to
if ( !empty( $_POST['bbp_topic_tags'] ) && ( "1" === $_POST['bbp_topic_tags'] ) )
wp_set_post_terms( $destination_topic->ID, $source_topic_tags, bbp_get_topic_tag_tax_id(), true );
// Delete the tags from the source topic
wp_delete_object_term_relationships( $source_topic->ID, bbp_get_topic_tag_tax_id() );
}
/** Source Topic **********************************************************/
// Status
bbp_open_topic( $source_topic->ID );
// Sticky
bbp_unstick_topic( $source_topic->ID );
// Get the replies of the source topic
$replies = (array) get_posts( array(
'post_parent' => $source_topic->ID,
'post_type' => bbp_get_reply_post_type(),
'posts_per_page' => -1,
'order' => 'ASC'
) );
// Prepend the source topic to its replies array for processing
array_unshift( $replies, $source_topic );
if ( !empty( $replies ) ) {
/** Merge Replies *****************************************************/
// Change the post_parent of each reply to the destination topic id
foreach ( $replies as $reply ) {
// Update the reply
wp_update_post( array(
'ID' => $reply->ID,
'post_title' => sprintf( __( 'Reply To: %s', 'buddyboss' ), $destination_topic->post_title ),
'post_name' => false,
'post_type' => bbp_get_reply_post_type(),
'post_parent' => $destination_topic->ID,
'guid' => ''
) );
// Adjust reply meta values
bbp_update_reply_topic_id( $reply->ID, $destination_topic->ID );
bbp_update_reply_forum_id( $reply->ID, bbp_get_topic_forum_id( $destination_topic->ID ) );
// Adjust reply to values
$reply_to = bbp_get_reply_to( $reply->ID );
if ( empty( $reply_to ) ) {
bbp_update_reply_to( $reply->ID, $source_topic->ID );
}
// Do additional actions per merged reply
do_action( 'bbp_merged_topic_reply', $reply->ID, $destination_topic->ID );
}
}
/** Successful Merge ******************************************************/
// Update topic's last meta data
bbp_update_topic_last_reply_id ( $destination_topic->ID );
bbp_update_topic_last_active_id ( $destination_topic->ID );
bbp_update_topic_last_active_time( $destination_topic->ID );
// Send the post parent of the source topic as it has been shifted
// (possibly to a new forum) so we need to update the counts of the
// old forum as well as the new one
do_action( 'bbp_merged_topic', $destination_topic->ID, $source_topic->ID, $source_topic->post_parent );
// Redirect back to new topic
wp_safe_redirect( bbp_get_topic_permalink( $destination_topic->ID ) );
// For good measure
exit();
}
Changelog
| Version | Description |
|---|---|
| bbPress (r2756) | Introduced. |
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.