Publishes a post by transitioning the post status.
Parameters
$post
int|WP_Postrequired- Post ID or post object.
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
Version | Description |
---|---|
2.1.0 | Introduced. |
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`?