wp_publish_post()WP 2.1.0

Публикует запись. Меняет её статус с future, draft и т.д. на publish. Запускает все хуки необходимые для смены статуса записи.

Подробнее читайте в описании функции: wp_transition_post_status()

Если вам нужно поменять статус записи например с draft на publish, то лучше запустить функцию wp_update_post():

wp_update_post( [
	'ID' => $post_id,
	'post_status' => 'publish',
] );

Эта функция не делает всех нужных операций для правильной смены статуса, в частности не выставляются даты поста и возможно что-то еще.

Работает на основе: wp_transition_post_status()

Возвращает

null. Ничего (null)

Использование

wp_publish_post( $post_id );
$post_id(число/WP_Post) (обязательный)
Объект или ID записи.

Примеры

0

#1 Публикация поста с задержкой

Допустим нам нужно опубликовать пост только если пройдена какая-то проверка. Для этого, мы добавляем пост в БД со статусом pending. Затем делаем нашу проверку и если она пройдена публикуем пост, а если не пройдена, то ничего не делаем.

function add_coin_post(){

	// Добавляем пост в БД

	$post_data = [
		'post_type'   => 'coin',
		'post_title'  => $args['name'],
		'post_name'   => sanitize_title( $symbol ),
		'post_status' => 'pending', // ! IMPORTANT
	];

	$post_id = wp_insert_post( wp_slash( $post_data ), true, false );

	if( is_wp_error( $post_id ) ){
		return $post_id;
	}

	// ДЕЛАЕМ НУЖНУЮ НАМ ПРОВЕРКУ
	// где будет определена переменная $check_is_ok, если все ок

	if( $check_is_ok ){

		// запускаем хуки публикации на которых будут проделаны
		// операции для нового опубликованного поста
		wp_publish_post( $post_id );
	}

}

Заметки

  • Global. wpdb. $wpdb WordPress database abstraction object.

Список изменений

С версии 2.1.0 Введена.

Код wp_publish_post() WP 6.4.3

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 );
}