WordPress как на ладони
wordpress jino

Вывод информации при обновлении поста (ошибка, предупреждение)

у меня при обновлении поста функция выполняет определенные задачи (проверяет поля, перезаписывает их и тп.). Я использую это таким образом:

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

правильно ли так использовать? не выполняется ли функция два раза?

1
Гость 1.2 года назад
  • 0
    Kama4660

    Нет, не правильно. Выполняется 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>';
    }
    вадик 1.1 года назад

    дошли руки протестировать этот способ, и не пойму, как в функцию my_admin_notices передать нужный мне текст?

    Kama 1.1 года назад

    Поправил пример, теперь там это есть...

    Можно еще set_transient() get_transient() использовать.

    вадик 1.1 года назад

    спасибо, однако я так попробовал уже, но потом встал вопрос а как в функцию my_add_notice_query_var передать нужный мне текст?) текст ведь генерируется в главной функции my_save_post

    спасибо за намек в сторону transient, пока временно решил проблему примерно также - в функции my_save_post создаю произвольное поле с нужным мне текстом по результатам выполнения скрипта, а в функции my_admin_notices проверяю у поста наличие текста и вывожу на экран этот текст если он есть. затем сразу удаляю это поле, чтобы ошибка не выводилась два раза.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.