BP_REST_Reply_Actions_Endpoint::move_item( WP_REST_Request $request )
Move a Reply.
Description
Parameters
- $request
-
(Required) Full details about the request.
Return
(WP_REST_Response) | WP_Error
Source
File: bp-forums/classes/class-bp-rest-reply-actions-endpoint.php
public function move_item( $request ) { /** Move Reply */ if ( empty( $request['id'] ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_reply_id', __( 'A reply ID is required.', 'buddyboss' ), array( 'status' => 400, ) ); } else { $move_reply_id = (int) $request['id']; } $move_reply = bbp_get_reply( $move_reply_id ); // Reply exists. if ( empty( $move_reply ) ) { return new WP_Error( 'bp_rest_bbp_mover_reply_r_not_found', __( 'The reply you want to move was not found.', 'buddyboss' ), array( 'status' => 400, ) ); } /** Topic to Move From */ // Get the current topic a reply is in. $source_topic = bbp_get_topic( $move_reply->post_parent ); // No topic. if ( empty( $source_topic ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_source_not_found', __( 'The topic you want to move from was not found.', 'buddyboss' ), array( 'status' => 400, ) ); } // Use cannot edit topic. if ( ! current_user_can( 'edit_topic', $source_topic->ID ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_source_permission', __( 'You do not have permission to edit the source topic.', 'buddyboss' ), array( 'status' => rest_authorization_required_code(), ) ); } // How to move. if ( ! empty( $request['move_option'] ) ) { $move_option = (string) trim( $request['move_option'] ); } // Invalid move option. if ( empty( $move_option ) || ! in_array( $move_option, array( 'existing', 'topic' ), true ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_option', __( 'You need to choose a valid move option.', 'buddyboss' ), array( 'status' => 400, ) ); // Valid move option. } else { // What kind of move. switch ( $move_option ) { // Into an existing topic. case 'existing': // Get destination topic id. if ( empty( $request['destination_topic_id'] ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_destination_id', __( 'A topic ID is required.', 'buddyboss' ), array( 'status' => 400, ) ); } else { $destination_topic_id = (int) $request['destination_topic_id']; } // Get the destination topic. $destination_topic = bbp_get_topic( $destination_topic_id ); // No destination topic. if ( empty( $destination_topic ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_destination_not_found', __( 'The topic you want to move to was not found.', 'buddyboss' ), array( 'status' => 400, ) ); } // User cannot edit the destination topic. if ( ! current_user_can( 'edit_topic', $destination_topic->ID ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_destination_permission', __( 'You do not have permission to edit the destination topic.', 'buddyboss' ), array( 'status' => 400, ) ); } // Bump the reply position. $reply_position = bbp_get_topic_reply_count( $destination_topic->ID, true ) + 1; // Update the reply. wp_update_post( array( 'ID' => $move_reply->ID, 'post_title' => '', 'post_name' => false, // will be automatically generated. 'post_parent' => $destination_topic->ID, 'menu_order' => $reply_position, 'guid' => '', ) ); // Adjust reply meta values. bbp_update_reply_topic_id( $move_reply->ID, $destination_topic->ID ); bbp_update_reply_forum_id( $move_reply->ID, bbp_get_topic_forum_id( $destination_topic->ID ) ); break; // Move reply to a new topic. case 'topic': default: // User needs to be able to publish topics. if ( current_user_can( 'publish_topics' ) ) { // Use the new title that was passed. if ( ! empty( $request['destination_topic_title'] ) ) { $destination_topic_title = sanitize_text_field( $request['destination_topic_title'] ); // Use the source topic title. } else { $destination_topic_title = $source_topic->post_title; } // Update the topic. $destination_topic_id = wp_update_post( array( 'ID' => $move_reply->ID, 'post_title' => $destination_topic_title, 'post_name' => false, 'post_type' => bbp_get_topic_post_type(), 'post_parent' => $source_topic->post_parent, 'guid' => '', ) ); $destination_topic = bbp_get_topic( $destination_topic_id ); // Make sure the new topic knows its a topic. bbp_update_topic_topic_id( $move_reply->ID ); // Shouldn't happen. if ( false === $destination_topic_id || is_wp_error( $destination_topic_id ) || empty( $destination_topic ) ) { return new WP_Error( 'bp_rest_bbp_move_reply_destination_reply', __( 'There was a problem converting the reply into the topic. Please try again.', 'buddyboss' ), array( 'status' => 400, ) ); } // User cannot publish posts. } else { return new WP_Error( 'bp_rest_bbp_move_reply_destination_permission', __( 'You do not have permission to create new topics. The reply could not be converted into a topic.', 'buddyboss' ), array( 'status' => rest_authorization_required_code(), ) ); } break; } } /** No Errors - Clean Up */ // Update counts, etc... do_action( 'bbp_pre_move_reply', $move_reply->ID, $source_topic->ID, $destination_topic->ID ); /** Date Check */ // Check if the destination topic is older than the move reply. if ( strtotime( $move_reply->post_date ) < strtotime( $destination_topic->post_date ) ) { // Set destination topic post_date to 1 second before from reply. $destination_post_date = gmdate( 'Y-m-d H:i:s', strtotime( $move_reply->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 ), ) ); } // Set the last reply ID and freshness to the move_reply. $last_reply_id = $move_reply->ID; $freshness = $move_reply->post_date; // Get the reply to. $parent = bbp_get_reply_to( $move_reply->ID ); // Fix orphaned children. $children = get_posts( array( 'post_type' => bbp_get_reply_post_type(), 'meta_key' => '_bbp_reply_to', // phpcs:ignore 'meta_type' => 'NUMERIC', 'meta_value' => $move_reply->ID, // phpcs:ignore ) ); if ( ! empty( $children ) ) { foreach ( $children as $child ) { bbp_update_reply_to( $child->ID, $parent ); } } // Remove reply_to from moved reply. delete_post_meta( $move_reply->ID, '_bbp_reply_to' ); // It is a new topic and we need to set some default metas to make. // the topic display in bbp_has_topics() list. if ( 'topic' === $move_option ) { bbp_update_topic_last_reply_id( $destination_topic->ID, $last_reply_id ); bbp_update_topic_last_active_id( $destination_topic->ID, $last_reply_id ); bbp_update_topic_last_active_time( $destination_topic->ID, $freshness ); // Otherwise update the existing destination topic. } else { 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 ); } // Update source topic ID last active. bbp_update_topic_last_reply_id( $source_topic->ID ); bbp_update_topic_last_active_id( $source_topic->ID ); bbp_update_topic_last_active_time( $source_topic->ID ); /** Successful Move */ // Update counts, etc... do_action( 'bbp_post_move_reply', $move_reply->ID, $source_topic->ID, $destination_topic->ID ); return $this->topic_endpoint->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.