bbp_merge_topic_handler( string $action = '' )
Merge topic handler
Description Description
Handles the front end merge topic submission
Parameters Parameters
- $action
-
(Optional) The requested action to compare this function to
Default value: ''
Source Source
File: includes/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>: Topic ID not found.', 'bbpress' ) ); } 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?', 'bbpress' ) ); 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 topic you want to merge was not found.', 'bbpress' ) ); 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 permission to edit the source topic.', 'bbpress' ) ); return; } /** Destination Topic *****************************************************/ // Topic id if ( empty( $_POST['bbp_destination_topic'] ) ) { bbp_add_error( 'bbp_merge_topic_destination_id', __( '<strong>ERROR</strong>: Destination topic ID not found.', 'bbpress' ) ); } 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 topic you want to merge to was not found.', 'bbpress' ) ); } // 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 permission to edit the destination topic.', 'bbpress' ) ); } // 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 ) ) ); } /** Engagements ***********************************************************/ // Get engagements from source topic $engagements = bbp_get_topic_engagements( $source_topic->ID ); // Maybe migrate engagements if ( ! empty( $engagements ) ) { foreach ( $engagements as $engager ) { bbp_add_user_engagement( $engager, $destination_topic->ID ); } } /** Subscriptions *********************************************************/ // Get subscribers from source topic $subscribers = bbp_get_subscribers( $source_topic->ID ); // Maybe migrate subscriptions if ( ! empty( $subscribers ) && ! empty( $_POST['bbp_topic_subscribers'] ) && ( '1' === $_POST['bbp_topic_subscribers'] ) ) { foreach ( $subscribers as $subscriber ) { bbp_add_user_subscription( $subscriber, $destination_topic->ID ); } } /** Favorites *************************************************************/ // Get favoriters from source topic $favoriters = bbp_get_topic_favoriters( $source_topic->ID ); // Maybe migrate favorites if ( ! empty( $favoriters ) && ! empty( $_POST['bbp_topic_favoriters'] ) && ( '1' === $_POST['bbp_topic_favoriters'] ) ) { foreach ( $favoriters as $favoriter ) { bbp_add_user_favorite( $favoriter, $destination_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 ); // Delete source topic's last & count meta data delete_post_meta( $source_topic->ID, '_bbp_last_reply_id' ); delete_post_meta( $source_topic->ID, '_bbp_last_active_id' ); delete_post_meta( $source_topic->ID, '_bbp_last_active_time' ); delete_post_meta( $source_topic->ID, '_bbp_voice_count' ); delete_post_meta( $source_topic->ID, '_bbp_reply_count' ); delete_post_meta( $source_topic->ID, '_bbp_reply_count_hidden' ); // Delete source topics user relationships delete_post_meta( $source_topic->ID, '_bbp_favorite' ); delete_post_meta( $source_topic->ID, '_bbp_subscription' ); delete_post_meta( $source_topic->ID, '_bbp_engagement' ); // 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' => '', '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 ) ); // Update the reply position bbp_update_reply_position( $reply->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 bbp_redirect( bbp_get_topic_permalink( $destination_topic->ID ) ); }
Changelog Changelog
Version | Description |
---|---|
2.0.0 | Introduced. |