WordPress Version: 6.1
/**
* Publishes a post by transitioning the post status.
*
* @since 2.1.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param int|WP_Post $post Post ID or post object.
*/
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);
}