WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

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

Админ-заметки в WordPress (admin notises API)

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

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

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

Так выглядит шаблон таких сообщений

<div class="{class}"><p>{message}</p></div>
{class}

CSS классы блока. Обязательный класс notice и к нему добавляем, в зависимости от нужд:

  • notice-success - для успешных операций. Зеленая полоска слева.

  • notice-error - для ошибок. Красная полоска слева.

  • notice-warning - для предупреждений. Оранжевая полоска слева.

  • notice-info - для информации. Синяя полоска слева.

  • is-dismissible - добавляет иконку-кнопку "закрыть" (крестик в конце блока). Иконка добавляется через javascript. По клику на нее блок-заметка будет скрыт (удален), но это состояние не сохраняется, то есть при обновлении страницы блок снова будет отображаться.

class="notice notice-success is-dismissible" - пример всего набора классов.

Есть еще класс update-nag - это блок с оранжевой полоской. Будет расположен перед заголовком <h2>, а не после и будет иметь css свойство inline-block, а не block, т.е. не на всю ширину экрана.

Использовать этот тип не рекомендуется нигде.

До версии 4.7 были еще класса updated - то же что notice-success и error - то же что notice-error. Они все еще поддерживаются, но использовать их не рекомендуется.

{message}
Текст или HTML сообщения.
Аналоги события 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="notice notice-success is-dismissible">
		<p>Настройки обновлены!</p>
	</div>
	<?php
}

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

<div class="notice notice-success is-dismissible">
	<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="notice notice-error is-dismissible"> <p>'. $message .'</p></div>';
}

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

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

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

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

Список изменений

С версии 3.1.0 Введена.

Где вызывается хук

В файле: /wp-admin/admin-header.php
admin_notices
wp-admin/admin-header.php 281
do_action( 'admin_notices' );

Где используется хук в ядре WP

wp-admin/includes/admin-filters.php 103
add_action( 'admin_notices', 'default_password_nag' );
wp-admin/includes/admin-filters.php 104
add_action( 'admin_notices', 'new_user_email_admin_notice' );
wp-admin/includes/admin-filters.php 114
add_action( 'admin_notices', 'update_nag', 3 );
wp-admin/includes/admin-filters.php 115
add_action( 'admin_notices', 'paused_plugins_notice', 5 );
wp-admin/includes/admin-filters.php 116
add_action( 'admin_notices', 'paused_themes_notice', 5 );
wp-admin/includes/admin-filters.php 117
add_action( 'admin_notices', 'maintenance_nag', 10 );
wp-admin/includes/admin-filters.php 118
add_action( 'admin_notices', 'wp_recovery_mode_nag', 1 );
wp-admin/includes/admin-filters.php 141
add_action( 'admin_notices', array( 'WP_Privacy_Policy_Content', 'notice' ) );
wp-admin/includes/class-wp-privacy-policy-content.php 110
add_action( 'admin_notices', array( 'WP_Privacy_Policy_Content', 'policy_text_changed_notice' ) );
wp-admin/includes/ms-admin-filters.php 35
add_action( 'admin_notices', 'site_admin_notice' );
15 комментов
Полезные 3 Вопросы 1 Все
  • А как вывести такую штуку при условии, например, только на странице редактирования записи? smile

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

      Ответить19.Ноя.2015 05:24 #
    • Упс, ошиблась в дополнении ко всему надо делать так.
      Если хотим выводить сообщение на странице типа записи "Страницы", то

      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
      Ответить19.Ноя.2015 05:47 #
      • Kama7728

        Вы все правильно сделали, но я бы рекомендовал использовать более стабильную фнукцию: 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' ){
        		echo '<div class="update-nag"><p>Моё Сообщение</p></div>';
        	}
        });
        
        4
        Ответить19.Ноя.2015 06:50 #
  • Вадик

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

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

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

    Ответить18.Авг.2016 16:04 #
    • Kama7728

      Нет. не правильно, выполняется 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>';
      	});
      }
      Ответить18.Авг.2016 19:02 #
      • вадим

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

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

        Ответить18.Авг.2016 23:21 #
        • Kama7728

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

          Там все сложнее: при сохранении записи, 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>';
          }

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

          Ответить18.Авг.2016 23:46 #
  • Taras

    ошибка в тексте (выводится по заголовком)

    1
    Ответить12.Фев.2019 04:30 #
  • @ Алексей

    Хорошая штука. НО как ее скрывать по клику? Чтобы пользователь мог скрыть после прочтения? После перезагрузки оно снова бьет по глазамsmile

    Ответить20.Июл.2019 20:16 #
    • @ Лев

      Класс is-dismissible добавляет в блок крестик для скрытия.

      <div class="notice notice-success is-dismissible">
      	<p>Настройки обновлены!</p>
      </div>
      3
      Ответить12.Авг.2019 18:22 #
      • @ Алексей

        Не работает. Обновляю страницу и снова торчит уведомление smile

        Ответить25.Май.2020 13:29 #
        • campusboy3532 www.youtube.com/c/wpplus

          Так и есть. Выбор пользователя не запоминается из коробки. Его писать надо самостоятельно или использовать уже готовые решения, к примеру WPTRT Admin Notices.

          1
          Ответить25.Май.2020 16:33 #
  • Костя

    Привет! Подскажите, как правильно создать класс для отображения этих notice? Прикладываю свой вариант

    namespace Integration\Exceptions;
    
    class AdminNotice
    {
    
    	public const UPDATE_NAG = 'update_nag';
    	public const ERROR = 'error';
    	public const WARNING = 'warning';
    	public const INFO = 'info';
    	public const SUCCESS = 'success';
    
    	private static $instance;
    
    	public static function getInstance()
    	{
    		if (!self::$instance) {
    			self::$instance = new self();
    		}
    		return self::$instance;
    	}
    
    	public function addNotice( string $message, string $type )
    	{
    		\add_action('admin_notices', $this->renderNotice( $message, $type ) );
    	}
    
    	public function addNetworkNotice( string $message, string $type )
    	{
    		\add_action('network_admin_notices', $this->renderNotice( $message, $type ) );
    	}
    
    	private function renderNotice( string $message, string $type )
    	{
    		echo '<div class="notice notice-'. $type .'">'. $message .'</div>';
    	}
    
    	public static function getSelf()
    	{
    		return self::getInstance();
    	}
    
    }
    Ответить12.Май.2020 19:02 #