Как правильно подключить сообщение об обновлении?

19

я пытаюсь перехватить, когда сообщение обновляется, но все перехвата updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

Я пробовал это, add_action('save_post', 'my_function');но ни один идентификатор не был отражен, или, возможно, это сообщение уже отражено, но никогда не отображается из-за переадресации заголовка.

rusly
источник
2
у вас есть пробел после save_post, это опечатка здесь, или это было в вашем исходном коде? также включите отладку во время разработки.
Майло,
@Milo извините за опечатку, но не в оригинальном коде
rusly
если это так, то при создании нового сообщения вы должны увидеть результат в левом верхнем углу экрана. сохранение существующего сообщения происходит перед перенаправлением, поэтому вы ничего не увидите, если у вас не включена отладка.
Майло

Ответы:

55

Когда сообщение обновляется, возникает несколько ловушек:

  • 'pre_post_update'это действие выстрелил только до того пост обновляется, передается аргумент являются 2: $post_IDи $dataчто это массив всех других colums базы данных о почтовом столе
  • 'transition_post_status'является хуком, запускаемым при обновлении, и передают 3 аргумента: $ new_post_status $old_post_statusи $post(объект).
  • Затем запускаются 2 других переходных хука, но они имеют динамическое имя, это означает, что эффективное действие зависит от старого и нового статуса сообщения. "{$old_status}_to_{$new_status}"и "{$new_status}_{$post->post_type}". Сначала передайте в качестве аргумента только объект post, а затем передайте id сообщения и объект post. Найдите документацию здесь .
  • 'edit_post'которые передают 2 аргумента: $post_IDи $post(объект)
  • 'post_updated'что передача 3 аргумента: $post_ID, $post_after(после объекта после обновления), $post_before(после объекта перед обновлением)
  • Другой динамический крюк: "save_post_{$post->post_type}"это зависит от почтового типа, например , для стандартных должностей 'save_post_post'и страниц 'save_post_page', этот крюк пропуск 3 аргумента: $post_ID, $post(объект) и $updateэто логическое значение (истина или ложь) , что справедливо при выполнении обновления, в На самом деле этот хук срабатывает также при первом сохранении записи.
  • ' save_post', который запускается как при обновлении, так и при первом сохранении и передает те же 3 аргумента из предыдущего хука.
  • ' save_post_{$post_type}', который запускается как при обновлении, так и при первом сохранении, и передает те же первые 2 аргумента предыдущего хука.
  • Наконец, у вас есть ' wp_insert_post' , который запускается как при обновлении, так и при первом сохранении, и передает те же 3 аргумента из предыдущих 2 хуков.

Эти ловушки запускаются каждый раз, когда сообщение обновляется, как через административные страницы в бэкэнде, так и при обновлении «вручную» с помощью wp_update_postили wp_insert_postфункций.

Когда сообщение обновляется с использованием страниц администратора, запускаются дополнительные хуки, например, 'update_post_redirect'или 'post_updated_messages'. (См. Этот и этот WPSE ответы для примеров использования).

Обратите внимание, что если вы хотите использовать какой-то аргумент hooks, это не первый аргумент, который вы должны явно объявить в add_actionвызове.

Например, если вы хотите использовать '$update'аргумент (то есть третий) 'save_post'хука, который нужно добавить в 3качестве $accepted_argsпараметра add_action( см. Документы ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

Последнее замечание касательно времени : вы должны быть уверены, что оно add_actionвызывается до того, как будет запущено действие, иначе оно ничего не сделает

Например, этот код:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

ничего не будет делать, потому что действие добавляется после срабатывания хука. Это легко распознать, в реальном мире код не всегда таков.

Gmazzap
источник
Я думаю, что ловушка действия 'save_post' также запускается при нажатии Add New (Post, Page, CPT) на панели инструментов. Чтобы увидеть себя просто запустите этот код. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Почему действие «save_post» запускается при добавлении нового, а не при публикации? Предположим, чтобы сделать пост черновика.
lowtechsun
@lowtechsun Как сказано в A, перехваты запускаются каждый раз, когда сообщение обновляется, т.е. сохраняется в БД. Когда вы нажимаете «Добавить новый», близкий к загрузке страницы, WP создает черновой пост, сохраненный в БД, поэтому он запускает хуки.
gmazzap
Спасибо, что вернулись ко мне. Только что узнал об этом вчера и подумал, что концепция этого сбивает с толку. То есть сначала я открываю страницу, чтобы добавить новый пост. На этом этапе я думал, что я еще не создал пост. Только после того, как я нажму «Опубликовать», я подумаю, что новый пост создан. Продолжая это, я надеюсь, что WP удалит автоматически черновик сообщения, если я нажму «Добавить новый», но затем покину страницу, не нажимая «Опубликовать»?
lowtechsun
2

Почему бы не зацепить post_updated_messages. Таким образом, вы можете показать это сообщение так же, как обновленный пост WordPress по умолчанию.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Посмотрите на пример здесь:

http://codex.wordpress.org/Function_Reference/register_post_type

под post_updated_messages

Джейкоб Рэмбо
источник