Выполнение функции при публикации записи

19 окт. 2012 г., 01:14:54
Просмотры: 21.3K
Голосов: 5

Я пытаюсь использовать эту созданную мной функцию, когда запись публикуется впервые.

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" не создается.

Кто-нибудь видит, в чем проблема?

3
Комментарии

Разве не стоит изменить хук на publish_post? draft_to_publish не сработает во всех случаях

Mridul Aggarwal Mridul Aggarwal
19 окт. 2012 г. 10:40:35

Я пробовал publish_post, и он не работает (http://wordpress.stackexchange.com/questions/141779/how-to-test-a-blog-post-for-publish-vs-update-status)

User User
22 апр. 2014 г. 01:28:46

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

User User
1 мая 2014 г. 23:53:02
Все ответы на вопрос 2
0
18

Правильное действие - '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; // ограничиваем фильтр определенным типом записи

    // делаем что-то потрясающее
}
19 окт. 2012 г. 12:25:18
0

Установка мета-значения времени первого сохранения записи так просто применить в первый раз.

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 );
6 мар. 2018 г. 14:31:52