wp_xmlrpc_server::wp_editPost( array $args ): true|IXR_Error

Edits a post for any registered post type.

Description

The $content_struct parameter only needs to contain fields that should be changed. All other fields will retain their existing values.

Parameters

$argsarrayrequired
Method arguments. Note: arguments must be ordered as documented.
  • 0 int
    Blog ID (unused).
  • 1 string
    Username.
  • 2 string
    Password.
  • 3 int
    Post ID.
  • 4 array
    Extra content arguments.

Return

true|IXR_Error True on success, IXR_Error on failure.

Source

public function wp_editPost( $args ) {
	if ( ! $this->minimum_args( $args, 5 ) ) {
		return $this->error;
	}

	$this->escape( $args );

	$username       = $args[1];
	$password       = $args[2];
	$post_id        = (int) $args[3];
	$content_struct = $args[4];

	$user = $this->login( $username, $password );
	if ( ! $user ) {
		return $this->error;
	}

	/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
	do_action( 'xmlrpc_call', 'wp.editPost', $args, $this );

	$post = get_post( $post_id, ARRAY_A );

	if ( empty( $post['ID'] ) ) {
		return new IXR_Error( 404, __( 'Invalid post ID.' ) );
	}

	if ( isset( $content_struct['if_not_modified_since'] ) ) {
		// If the post has been modified since the date provided, return an error.
		if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) {
			return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) );
		}
	}

	// Convert the date field back to IXR form.
	$post['post_date'] = $this->_convert_date( $post['post_date'] );

	/*
	 * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,
	 * since _insert_post() will ignore the non-GMT date if the GMT date is set.
	 */
	if ( '0000-00-00 00:00:00' === $post['post_date_gmt'] || isset( $content_struct['post_date'] ) ) {
		unset( $post['post_date_gmt'] );
	} else {
		$post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] );
	}

	/*
	 * If the API client did not provide 'post_date', then we must not perpetuate the value that
	 * was stored in the database, or it will appear to be an intentional edit. Conveying it here
	 * as if it was coming from the API client will cause an otherwise zeroed out 'post_date_gmt'
	 * to get set with the value that was originally stored in the database when the draft was created.
	 */
	if ( ! isset( $content_struct['post_date'] ) ) {
		unset( $post['post_date'] );
	}

	$this->escape( $post );
	$merged_content_struct = array_merge( $post, $content_struct );

	$retval = $this->_insert_post( $user, $merged_content_struct );
	if ( $retval instanceof IXR_Error ) {
		return $retval;
	}

	return true;
}

Hooks

do_action( ‘xmlrpc_call’, string $name, array|string $args, wp_xmlrpc_server $server )

Fires after the XML-RPC user has been authenticated but before the rest of the method logic begins.

Changelog

VersionDescription
3.4.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.