BP_REST_Reply_Actions_Endpoint::move_item( WP_REST_Request $request )

Move a Reply.

Description

Parameters

$request

(WP_REST_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

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.