BP_REST_Topics_Actions_Endpoint::merge_item( WP_REST_Request $request )
Merge Topic
Description
Parameters
- $request
-
(Required) Full details about the request.
Return
(WP_REST_Response) | WP_Error
Source
File: bp-forums/classes/class-bp-rest-topics-actions-endpoint.php
public function merge_item( $request ) { // Define local variable(s). $source_topic_id = 0; $destination_topic_id = 0; $source_topic = 0; $destination_topic = 0; $subscribers = array(); $favoriters = array(); $replies = array(); // Topic id. if ( empty( $request['id'] ) ) { return new WP_Error( 'bp_rest_topic_invalid_id', __( 'Invalid topic ID.', 'buddyboss' ), array( 'status' => 404, ) ); } else { $source_topic_id = (int) $request['id']; } // Source topic not found. $source_topic = bbp_get_topic( $source_topic_id ); if ( empty( $source_topic ) ) { return new WP_Error( 'bp_rest_bbp_merge_topic_source_not_found', __( 'The topic you want to merge was not found.', 'buddyboss' ), array( 'status' => 404, ) ); } // Cannot edit source topic. if ( ! current_user_can( 'edit_topic', $source_topic->ID ) ) { return new WP_Error( 'bp_rest_bbp_merge_topic_source_permission', __( 'Sorry, You do not have permission to edit the source topic.', 'buddyboss' ), array( 'status' => rest_authorization_required_code(), ) ); } /** Destination Topic */ // Topic id. if ( empty( $request['destination_id'] ) ) { return new WP_Error( 'bp_rest_bbp_merge_topic_destination_id', __( 'Sorry, Destination discussion ID not found.', 'buddyboss' ), array( 'status' => 404, ) ); } else { $destination_topic_id = (int) $request['destination_id']; } // Destination topic not found. $destination_topic = bbp_get_topic( $destination_topic_id ); if ( empty( $destination_topic ) ) { return new WP_Error( 'bp_rest_bbp_merge_topic_destination_not_found', __( 'Sorry, The discussion you want to merge to was not found.', 'buddyboss' ), array( 'status' => 404, ) ); } // Cannot edit destination topic. if ( ! current_user_can( 'edit_topic', $destination_topic->ID ) ) { return new WP_Error( 'bp_rest_bbp_merge_topic_destination_permission', __( 'Sorry, You do not have the permissions to edit the destination discussion.', 'buddyboss' ), array( 'status' => rest_authorization_required_code(), ) ); } /** 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 = gmdate( '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( $request['subscribers'] ) && ( true === $request['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( $request['favorites'] ) && true === $request['favorites'] ) { 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( $request['tags'] ) && ( true === $request['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( /* translators: Topic Title. */ __( '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 ); /** * Fires after a list of topic is merged via the REST API. * * @param array $destination_topic Destination topic. * @param array $source_topic Source topic. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ do_action( 'bp_rest_topic_get_item', $destination_topic, $source_topic, $request ); return $this->get_item( array( 'id' => $destination_topic->ID, 'context' => 'view', ) ); }
Changelog
Version | Description |
---|---|
0.1.0 | 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.