wp_publish_post( int|WP_Post $post )

Publishes a post by transitioning the post status.

Parameters

$postint|WP_Postrequired
Post ID or post object.

More Information

This function does not do anything except transition the post status. If you want to ensure post_name is set, use wp_update_post() instead.

Source

function wp_publish_post( $post ) {
	global $wpdb;

	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	if ( 'publish' === $post->post_status ) {
		return;
	}

	$post_before = get_post( $post->ID );

	// Ensure at least one term is applied for taxonomies with a default term.
	foreach ( get_object_taxonomies( $post->post_type, 'object' ) as $taxonomy => $tax_object ) {
		// Skip taxonomy if no default term is set.
		if (
			'category' !== $taxonomy &&
			empty( $tax_object->default_term )
		) {
			continue;
		}

		// Do not modify previously set terms.
		if ( ! empty( get_the_terms( $post, $taxonomy ) ) ) {
			continue;
		}

		if ( 'category' === $taxonomy ) {
			$default_term_id = (int) get_option( 'default_category', 0 );
		} else {
			$default_term_id = (int) get_option( 'default_term_' . $taxonomy, 0 );
		}

		if ( ! $default_term_id ) {
			continue;
		}
		wp_set_post_terms( $post->ID, array( $default_term_id ), $taxonomy );
	}

	$wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post->ID ) );

	clean_post_cache( $post->ID );

	$old_status        = $post->post_status;
	$post->post_status = 'publish';
	wp_transition_post_status( 'publish', $old_status, $post );

	/** This action is documented in wp-includes/post.php */
	do_action( "edit_post_{$post->post_type}", $post->ID, $post );

	/** This action is documented in wp-includes/post.php */
	do_action( 'edit_post', $post->ID, $post );

	/** This action is documented in wp-includes/post.php */
	do_action( "save_post_{$post->post_type}", $post->ID, $post, true );

	/** This action is documented in wp-includes/post.php */
	do_action( 'save_post', $post->ID, $post, true );

	/** This action is documented in wp-includes/post.php */
	do_action( 'wp_insert_post', $post->ID, $post, true );

	wp_after_insert_post( $post, true, $post_before );
}

Hooks

do_action( ‘edit_post’, int $post_id, WP_Post $post )

Fires once an existing post has been updated.

do_action( “edit_post_{$post->post_type}”, int $post_id, WP_Post $post )

Fires once an existing post has been updated.

do_action( ‘save_post’, int $post_id, WP_Post $post, bool $update )

Fires once a post has been saved.

do_action( “save_post_{$post->post_type}”, int $post_id, WP_Post $post, bool $update )

Fires once a post has been saved.

do_action( ‘wp_insert_post’, int $post_id, WP_Post $post, bool $update )

Fires once a post has been saved.

Changelog

VersionDescription
2.1.0Introduced.

User Contributed Notes

  1. Skip to note 2 content

    Feedback: The function name does not seem to indicate that it does not do the usual actions expected from transitioning a post to publish status. The note inside “more information” is easy to miss.

    Can the following note be moved from more information to the main description?
    This function does not do anything except transition the post status. If you want to ensure post_name is set, use wp_update_post() instead.

    P.S. Just a thought (I don’t have the full context), if the function is only supposed to be used when publishing a future post then consider deprecating this and creating a new one called `wp_publish_future_post`?

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