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

admin_notices хук-событие . WP 2.0.11

Срабатывает во время вывода заметок (сообщений, ошибок) в верхней части страницы админ-панели. Прикрепляемая функция должна выводить HTML на экран.

Несмотря на то, что сообщение выводится по заголовком, технически это сообщение выводится раньше, оно просто затем перемещается под заголовок скриптом. Сделано это для удобства, чтобы заметку можно было вывести раньше чем выводится HTML код самой страницы.

Пример того как выглядит такая заметка:

Заметка в админ-панели wordpress

А так выглядит её код:

<div id="message" class="updated">
	<p>Запись обновлена. <a href="http://wptest.ru/zagolovok/">Посмотреть</a></p>
</div>

Или удаляемое сообщение:

<div id="message" class="updated notice is-dismissible">
	<p>Запись обновлена. <a href="http://wptest.ru/zagolovok/">Посмотреть</a></p>
</div>

Классы которые можно использовать для блока:

  • updated - для успешных операций. Белый фон, зеленая полоска слева;

  • error - для ошибок. Белый фон, красная полоска слева;

  • notice - для сообщений. Белый фон, никакой маркировки;

  • notice notice-warning - для предупреждений. Белый фон, оранжевая полоска слева;

  • update-nag - блок с оранжевой полоской слева. Блок будет расположен перед заголовком <h2> (а не после) и будет иметь css свойство inline-block (а не block).

  • notice is-dismissible - эти два класса можно дописать к любому из вышеперечисленных и в конце сообщения появится крестик, чтобы удалить (убрать из вида) блок сообщения. С версии 4.2.
Аналоги события admin_notices

У этого хука есть заменители, аналоги, которые принято использовать для той же цели: вывести сообщение, но в других условиях:

  • network_admin_notices - используется для работы с мультисайтовой сборкой, сообщение будет выводиться для администратора сети.

  • user_admin_notices - используется для работы с мультисайтовой сборкой, сообщение будет выводиться для администратора сайта сети.

  • all_admin_notices - работает точно так же, как admin_notices, но имеет другое название. Наверное, для наглядности цели использования в коде плагина, также возможно в будущем будут работать в разных условиях.

Использование

add_action('admin_notices', 'action_function_name_11' );
function action_function_name_11(){
	// Действие...
}

Примеры

#1 Базовое использование

Представим, что мы пишем плагин и при обновлении на странице опций плагина нам нужно вывести сообщение "Настройки обновлены!". Для этого в функции обработки POST запроса, при успешном обновлении добавим функцию к событию 'admin_notices':

<?php
add_action( 'admin_notices', 'my_plugin_notice' );
function my_plugin_notice() {
	?>
	<div class="updated">
		<p>"Настройки обновлены!"</p>
	</div>
	<?php
}
?>

Также, здесь мы можем использовать функцию локализации _e, чтобы сообщение можно было переводить:

<div class="updated">
		<p><?php _e( 'Настройки обновлены!', 'my-text-domain' ); ?></p>
</div>

Класс "updated" выведет сообщение с белым фоном и зеленой полоской слева.

#2 Вывод ошибки

Пример аналогичный первому, только тут выведем сообщение об ошибке.

add_action('admin_notices', 'my_plugin_error_notice');
function my_plugin_error_notice(){
	$message = "Ошибка сохранения";
	echo '<div class="error"> <p>$message</p></div>';
}

Класс "error" выведет сообщение с белым фоном и красной полоской слева.

#3 Нестандартный блок

add_action('admin_notices', function(){
	echo '<div class="update-nag"><p>Моё Сообщение</p></div>';
});

Класс "update-nag" выведет сообщение с белым фоном и оранжевой полоской слева. Кроме того, блок будет расположен перед заголовком (тегом <h2>)

Связи хука

Используется в файле: wp-admin/admin-header.php

Остальные хуки из файла: wp-admin/admin-header.php:

Фрагменты кода хука admin_notices

Фрагмент из: wp-admin/admin-header.php WP 4.8.2
...
	 */
	do_action( 'network_admin_notices' );
} elseif ( is_user_admin() ) {
	/**
	 * Prints user admin screen notices.
	 *
	 * @since 3.1.0
	 */
	do_action( 'user_admin_notices' );
} else {
	/**
	 * Prints admin screen notices.
	 *
	 * @since 3.1.0
	 */
	do_action( 'admin_notices' );
}

/**
 * Prints generic admin screen notices.
 *
 * @since 3.1.0
 */
do_action( 'all_admin_notices' );

if ( $parent_file == 'options-general.php' )
	require(ABSPATH . 'wp-admin/options-head.php');
admin_notices 8 комментариев
  • А как вывести такую штуку при условии, например, только на странице редактирования записи? smile

    1
    Ответить1.8 года назад #
    • Сама нашла случайно. smile Через глобальную переменную global $pagenow проверяем на какой странице находится пользователь в админке.

      Ответить1.8 года назад #
    • Упс, ошиблась в дополнении ко всему надо делать так.
      Если хотим выводить сообщение на странице типа записи "Страницы", то

      add_action('admin_notices', function(){
      	global $pagenow;
      	if( get_query_var('post_type')=='page' && 'edit.php' == $pagenow )
      	{
      		echo '<div class="update-nag"><p>Моё Сообщение</p></div>';
      	}
      });
      1
      Ответить1.8 года назад #
      • Kama4486

        Вы все правильно сделали, но я бы рекомендовал использовать более стабильную фнукцию: http://wp-kama.ru/function/get_current_screen .

        Ваш код можно переписать так:

        // выводим сообщение только на странице редактирования постоянных страниц
        add_filter('admin_footer', function(){
        	// выходим если это не страница создания/редактирования page
        	$cs = get_current_screen();
        	if( $cs->parent_base != 'edit' || $cs->post_type != 'page' ) return;
        
        	echo '<div class="update-nag"><p>Моё Сообщение</p></div>';
        });
        
        1
        Ответить1.8 года назад #
  • Вадик

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

    function update_post($post_ID) {
    	бла бла бла (функция ничего не возвращает и не выводит)
    }
    add_action( 'save_post', 'update_post', 100, 1 );

    после этой статьи я сделал так:

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

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

    Ответитьгод назад #
    • Kama4486

      Нет. не правильно, выполняется 2 раза, второй раз вхолостую, первый раз может вызвать ошибку...

      Надо так:

      add_action( 'save_post', 'my_update_post', 100 );
      function my_update_post( $post_ID ){
      	// бла бла бла
      
      	// добавим заметку
      	add_action( 'admin_notices', function(){
      		$massage = 'Текст сообщения';
      		echo '<div class="updated"><p>'. $massage .'</p></div>';
      	});
      }
      Ответитьгод назад #
      • вадим

        спасибо за ответ.

        попробовал твой вариант. почему-то при обновлении поста текст не выводится. даже заменил весь свой скрипт на твой - не работает. только вместо класса "updated" использовал также "update-nag"

        Ответитьгод назад #
        • Kama4486

          Я тоже ошибся...

          Там все сложнее: при сохранении записи, 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( 'YOUR_QUERY_VAR' => 'ID' ), $location );
          }
          
          function my_admin_notices() {
          	if ( ! isset($_GET['YOUR_QUERY_VAR']) )
          	 return;
          
          	echo '<div class="updated"><p>Текст Сообщения</p></div>';
          }

          П.С. Если не сложно продублируй этот вопрос в вопросы. Тема вроде полезная иногда...

          Ответитьгод назад #

Здравствуйте, !

Ваш комментарий