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 108
add_action( 'admin_notices', 'default_password_nag' );
wp-admin/includes/admin-filters.php 109
add_action( 'admin_notices', 'new_user_email_admin_notice' );
wp-admin/includes/admin-filters.php 119
add_action( 'admin_notices', 'update_nag', 3 );
wp-admin/includes/admin-filters.php 120
add_action( 'admin_notices', 'paused_plugins_notice', 5 );
wp-admin/includes/admin-filters.php 121
add_action( 'admin_notices', 'paused_themes_notice', 5 );
wp-admin/includes/admin-filters.php 122
add_action( 'admin_notices', 'maintenance_nag', 10 );
wp-admin/includes/admin-filters.php 123
add_action( 'admin_notices', 'wp_recovery_mode_nag', 1 );
wp-admin/includes/admin-filters.php 146
add_action( 'admin_notices', array( 'WP_Privacy_Policy_Content', 'notice' ) );
wp-admin/includes/misc.php 1427
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' );
12 комментов
Полезные 3 Все
  • А как вывести такую штуку при условии, например, только на странице редактирования записи? smile

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

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

      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
      Ответить3.9 года назад #
      • Kama7631

        Вы все правильно сделали, но я бы рекомендовал использовать более стабильную фнукцию: 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
        Ответить3.9 года назад #
  • Вадик

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

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

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

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

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

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

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

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

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

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

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

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

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

    1
    Ответить9 мес назад #
  • @ Алексей

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

    Ответить3 мес назад #
    • @ Лев

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

      <div class="notice notice-success is-dismissible">
      	<p>Настройки обновлены!</p>
      </div>
      2
      Ответить3 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться