W3cubDocs

/WordPress

wp_update_post( array|object $postarr = array(), bool $wp_error = false, bool $fire_after_hooks = true ): int|WP_Error

Updates a post with new post data.

Description

The date does not have to be set for drafts. You can set the date and it will not be overridden.

Parameters

$postarrarray|objectoptional
Post data. Arrays are expected to be escaped, objects are not. See wp_insert_post() for accepted arguments.
Default array.
More Arguments from wp_insert_post( … $postarr )An array of elements that make up a post to update or insert.
  • ID int
    The post ID. If equal to something other than 0, the post with that ID will be updated. Default 0.
  • post_author int
    The ID of the user who added the post. Default is the current user ID.
  • post_date string
    The date of the post. Default is the current time.
  • post_date_gmt string
    The date of the post in the GMT timezone. Default is the value of $post_date.
  • post_content string
    The post content. Default empty.
  • post_content_filtered string
    The filtered post content. Default empty.
  • post_title string
    The post title. Default empty.
  • post_excerpt string
    The post excerpt. Default empty.
  • post_status string
    The post status. Default 'draft'.
  • post_type string
    The post type. Default 'post'.
  • comment_status string
    Whether the post can accept comments. Accepts 'open' or 'closed'.
    Default is the value of 'default_comment_status' option.
  • ping_status string
    Whether the post can accept pings. Accepts 'open' or 'closed'.
    Default is the value of 'default_ping_status' option.
  • post_password string
    The password to access the post. Default empty.
  • post_name string
    The post name. Default is the sanitized post title when creating a new post.
  • to_ping string
    Space or carriage return-separated list of URLs to ping.
    Default empty.
  • pinged string
    Space or carriage return-separated list of URLs that have been pinged. Default empty.
  • post_parent int
    Set this for the post it belongs to, if any. Default 0.
  • menu_order int
    The order the post should be displayed in. Default 0.
  • post_mime_type string
    The mime type of the post. Default empty.
  • guid string
    Global Unique ID for referencing the post. Default empty.
  • import_id int
    The post ID to be used when inserting a new post.
    If specified, must not match any existing post ID. Default 0.
  • post_category int[]
    Array of category IDs.
    Defaults to value of the 'default_category' option.
  • tags_input array
    Array of tag names, slugs, or IDs. Default empty.
  • tax_input array
    An array of taxonomy terms keyed by their taxonomy name.
    If the taxonomy is hierarchical, the term list needs to be either an array of term IDs or a comma-separated string of IDs.
    If the taxonomy is non-hierarchical, the term list can be an array that contains term names or slugs, or a comma-separated string of names or slugs. This is because, in hierarchical taxonomy, child terms can have the same names with different parent terms, so the only way to connect them is using ID. Default empty.
  • meta_input array
    Array of post meta values keyed by their post meta key. Default empty.
  • page_template string
    Page template to use.

Default:array()

$wp_errorbooloptional
Whether to return a WP_Error on failure.

Default:false

$fire_after_hooksbooloptional
Whether to fire the after insert hooks.

Default:true

Return

int|WP_Error The post ID on success. The value 0 or WP_Error on failure.

Source

function wp_update_post( $postarr = array(), $wp_error = false, $fire_after_hooks = true ) {
	if ( is_object( $postarr ) ) {
		// Non-escaped post was passed.
		$postarr = get_object_vars( $postarr );
		$postarr = wp_slash( $postarr );
	}

	// First, get all of the original fields.
	$post = get_post( $postarr['ID'], ARRAY_A );

	if ( is_null( $post ) ) {
		if ( $wp_error ) {
			return new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) );
		}
		return 0;
	}

	// Escape data pulled from DB.
	$post = wp_slash( $post );

	// Passed post category list overwrites existing category list if not empty.
	if ( isset( $postarr['post_category'] ) && is_array( $postarr['post_category'] )
		&& count( $postarr['post_category'] ) > 0
	) {
		$post_cats = $postarr['post_category'];
	} else {
		$post_cats = $post['post_category'];
	}

	// Drafts shouldn't be assigned a date unless explicitly done so by the user.
	if ( isset( $post['post_status'] )
		&& in_array( $post['post_status'], array( 'draft', 'pending', 'auto-draft' ), true )
		&& empty( $postarr['edit_date'] ) && ( '0000-00-00 00:00:00' === $post['post_date_gmt'] )
	) {
		$clear_date = true;
	} else {
		$clear_date = false;
	}

	// Merge old and new fields with new fields overwriting old ones.
	$postarr                  = array_merge( $post, $postarr );
	$postarr['post_category'] = $post_cats;
	if ( $clear_date ) {
		$postarr['post_date']     = current_time( 'mysql' );
		$postarr['post_date_gmt'] = '';
	}

	if ( 'attachment' === $postarr['post_type'] ) {
		return wp_insert_attachment( $postarr, false, 0, $wp_error );
	}

	// Discard 'tags_input' parameter if it's the same as existing post tags.
	if ( isset( $postarr['tags_input'] ) && is_object_in_taxonomy( $postarr['post_type'], 'post_tag' ) ) {
		$tags      = get_the_terms( $postarr['ID'], 'post_tag' );
		$tag_names = array();

		if ( $tags && ! is_wp_error( $tags ) ) {
			$tag_names = wp_list_pluck( $tags, 'name' );
		}

		if ( $postarr['tags_input'] === $tag_names ) {
			unset( $postarr['tags_input'] );
		}
	}

	return wp_insert_post( $postarr, $wp_error, $fire_after_hooks );
}

Changelog

Version Description
5.6.0 Added the $fire_after_hooks parameter.
3.5.0 Added the $wp_error parameter to allow a WP_Error to be returned on failure.
1.0.0 Introduced.

© 2003–2024 WordPress Foundation
Licensed under the GNU GPLv2+ License.
https://developer.wordpress.org/reference/functions/wp_update_post