Вывод информации при обновлении поста (ошибка, предупреждение)
у меня при обновлении поста функция выполняет определенные задачи (проверяет поля, перезаписывает их и тп.). Я использую это таким образом:
function update_post($post_ID) {
// бла бла бла (функция ничего не возвращает и не выводит)
}
add_action( 'save_post', 'update_post', 100, 1 );
прочитав про функцию admin_notices я сделал так:
function update_post($post_ID) {
// бла бла бла (функция ничего не возвращает и не выводит, но может заполнить переменную $message)
if (!empty($message)) {
echo $message;
}
}
add_action( 'save_post', 'update_post', 100, 1 );
add_action( 'admin_notices', 'update_post' );
правильно ли так использовать? не выполняется ли функция два раза?
Нет, не правильно. Выполняется 2 раза, второй раз вхолостую, первый раз может вызвать ошибку...
Там все немного сложнее: при сохранении записи, WP отправляет запрос на файл
post.php. Там его обрабатывает и затем редиректит обратно на страницу записи. Установка хука теряется при редиректе... Чтобы не терялась, нужно в URL для редиректа добавить свою переменную, потом, если она есть, выводить соответствующее сообщение...Вот код, проверил работает:
add_action( 'save_post', 'my_save_post', 10, 3 ); add_action( 'admin_notices', 'my_admin_notices' ); function my_save_post( $post_id, $post, $update ) { // Тут делаем что нужно // ... // Добавляем свою переменную запроса при редиректе add_filter( 'redirect_post_location', 'my_add_notice_query_var', 99 ); } function my_add_notice_query_var( $location ) { remove_filter( 'redirect_post_location', 'my_add_notice_query_var', 99 ); return add_query_arg( array( 'MY_QUERY_VAR' => 'Текст Сообщения' ), $location ); } function my_admin_notices() { if ( ! isset($_GET['MY_QUERY_VAR']) ) return; echo '<div class="updated"><p>'. esc_html($_GET['MY_QUERY_VAR']) .'</p></div>'; }дошли руки протестировать этот способ, и не пойму, как в функцию my_admin_notices передать нужный мне текст?
Поправил пример, теперь там это есть...
Можно еще set_transient() get_transient() использовать.
спасибо, однако я так попробовал уже, но потом встал вопрос а как в функцию my_add_notice_query_var передать нужный мне текст?) текст ведь генерируется в главной функции my_save_post
спасибо за намек в сторону transient, пока временно решил проблему примерно также - в функции my_save_post создаю произвольное поле с нужным мне текстом по результатам выполнения скрипта, а в функции my_admin_notices проверяю у поста наличие текста и вывожу на экран этот текст если он есть. затем сразу удаляю это поле, чтобы ошибка не выводилась два раза.