Выполнение функции при публикации записи
Я пытаюсь использовать эту созданную мной функцию, когда запись публикуется впервые.
function a_new_post($post){
$post_id = $post->ID;
if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
// ...выполнить код один раз
update_post_meta( $post_id, 'firstpublish', true );
}
}
add_action( 'draft_to_published', 'a_new_post' );
Я не вижу в коде ничего неправильного, но когда я пытаюсь создать тестовые записи и проверяю базу данных, поле "firstpublished" не создается.
Кто-нибудь видит, в чем проблема?
Правильное действие - 'draft_to_publish'
.
Чтобы убедиться, что вы используете правильный статус, попробуйте получить список всех зарегистрированных статусов записей (включая пользовательские статусы) с помощью:
<pre><?php print '- ' . implode( "\n- ", array_keys( get_post_stati() ) );?></pre>
На чистой установке WordPress вы должны получить:
- publish
- future
- draft
- pending
- private
- trash
- auto-draft
- inherit
Обратите внимание, что publish_post
вызывается каждый раз, когда вы редактируете опубликованную запись.
Также обратите внимание, что get_post_stati()
- одно из тех непредсказуемых названий в WordPress: оно просто неверное. Множественное число существительного status - statuses в английском и statūs в латинском. :D
В зависимости от ваших потребностей, вы также можете использовать хук 'transition_post_status'
. Вы получаете новый и старый статус в качестве аргументов, третий аргумент - объект записи. Этот хук также сработает для future_to_publish
, а также для записей, которые были удалены в корзину, а затем опубликованы заново (trash_to_publish
).
Пример:
add_action( 'transition_post_status', 'a_new_post', 10, 3 );
function a_new_post( $new_status, $old_status, $post )
{
if ( 'publish' !== $new_status or 'publish' === $old_status )
return;
if ( 'post' !== $post->post_type )
return; // ограничиваем фильтр определенным типом записи
// делаем что-то потрясающее
}

Установка мета-значения времени первого сохранения записи так просто применить в первый раз.
function a_new_post( $post_id, $post, $update ) {
if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
update_post_meta( $post_id, 'firstpublish', true );
}
}
add_action( 'save_post', 'a_new_post', 10, 3 );
