Статьи

Постоянные уведомления администратора WordPress: Часть 3

Добро пожаловать в нашу серию постоянных уведомлений администратора WordPress. Теперь мы в состоянии расширить возможности уведомлений администратора и контролировать их появление на странице.

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

Это особенно важно, так как пользовательские уведомления администраторов, реализованные в плагинах и темах, действительно полезны только тогда, когда вы можете навсегда отклонить их. Недостаточно просто добавить is-dismissible класс CSS.

До сих пор все уведомления администратора отображались сразу после загрузки страницы. В некоторых случаях это неудобно, и вы хотите, чтобы уведомление администратора отображалось после того, как вместо этого было инициировано определенное событие.

Как насчет того, чтобы мы хотели, чтобы пользовательское уведомление администратора отображалось на странице настроек плагина, которую мы создали ранее, но только после нажатия кнопки « Сохранить изменения» ?

Мы уже знаем из второй части, как ограничить уведомление администратора страницей настроек плагина. Давайте выясним, как мы можем запустить его после сохранения параметров плагина.

Начните с комментирования вызова функции add_action для plugin_admin_notice . Затем добавьте четвертый вызов add_action в init следующим образом:

1
add_action( ‘admin_notices’, array( $this, ‘conditional_plugin_admin_notice’ ) );

Всякий раз, когда параметры плагина сохраняются, в супер-глобальную переменную массива $_GET добавляется значение true . Мы можем использовать это, чтобы определить, нужно ли нам отображать уведомление администратора.

Добавьте новый метод conditional_plugin_admin_notice в Gwyer_Admin_Notices который выводит значение $_GET на экран.

1
2
3
4
5
6
7
8
/**
* Output an admin notice on the plugin options page when settings have been saved.
*/
public function conditional_plugin_admin_notice() {
  echo «<pre>»;
  print_r($_GET);
  echo «</pre>»;
}

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

Страница загрузки обычных параметров плагина

Теперь введите текст в поле « Введите текст» и нажмите « Сохранить изменения» . На этот раз мы видим, что для settings-updated установлено значение true , и мы можем это использовать.

В обновленном параметре установлено значение true

Замените conditional_plugin_admin_notice на:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
/**
* Output an admin notice on the plugin options page when settings have been saved.
*/
public function conditional_plugin_admin_notice() {
 
  $whitelist_admin_pages = array( ‘settings_page_admin-notices/plugin-options’ );
  $admin_page = get_current_screen();
  $current_user = wp_get_current_user();
 
  if( in_array( $admin_page->base, $whitelist_admin_pages ) && isset( $_GET[ ‘settings-updated’ ] ) && $_GET[ ‘settings-updated’ ] ):
    ?>
    <div class=»notice notice-success is-dismissible»><p>Plugin options just saved.
    <?php
  endif;
}

К настоящему времени этот код должен казаться вам знакомым. Тем не менее, было добавлено несколько новых функций. Во-первых, условное выражение было расширено, чтобы проверить наличие settings-update . Теперь уведомление администратора будет отображаться только в том случае, если мы находимся на странице параметров плагина и если для settings-updated установлено значение true .

Кроме того, текущее имя пользователя выводится, чтобы сделать уведомление администратора немного более личным.

Более личное сообщение администратора

Функция wp_get_current_user() возвращает информацию о текущем wp_get_current_user() в систему пользователе. Этот объект хранится в $current_user и содержит такие сведения, как электронная почта пользователя, идентификатор, имя, фамилия и отображаемое имя, которое является конкретным свойством, которое нас интересует.

Наконец, для некоторой дополнительной полноты мы предотвратили отображение уведомления администратора по умолчанию, поэтому наше пользовательское уведомление является единственным, видимым для пользователя. Чтобы достичь этого, мы просто добавили одну строку кода в conditional_plugin_admin_notice() для вывода CSS, чтобы скрыть нежелательное уведомление администратора.

1
echo «<style>#setting-error-settings_updated { display: none; }</style>»;

Окончательный результат при сохранении параметров плагина показан ниже.

Законченное уведомление администратора о том, что плагин был обновлен

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

Наше уведомление администратора может быть расширено еще несколькими способами. Одной из возможностей может быть ведение журнала, в котором сохраняются текущая дата / время вместе с пользовательской информацией каждый раз, когда сохраняются параметры плагина.

Или как получить уведомление администратора, показывающее, сколько раз параметры плагина были сохранены в этот день, неделю, месяц и т. Д.? Я уверен, что вы можете придумать и другие примеры!

Пришло время испачкать руки и погрузиться в более глубокий код, поскольку мы обращаем внимание на отказ от постоянных уведомлений администратора. До сих пор мы видели, как это можно сделать, только добавив CSS-класс .is-dismissible в наш контейнер div для уведомлений администратора. Это отклоняет уведомление администратора для текущей страницы, но практически не используется на практике, так как оно появляется снова при перезагрузке страницы администратора.

Итак, как мы можем это исправить? Мы рассмотрим несколько различных способов отклонения постоянных уведомлений администратора, в том числе:

  • Одноразовое уведомление администратора, которое исчезает после одного просмотра.
  • Счетчик уведомлений администратора, который исчезает после определенного количества просмотров.
  • Важное замечание администратора, которое остается после обновления страницы.
  • Отказ от пользовательских действий (уведомление администратора удалено после выполнения определенного действия).

Прежде чем приступить к реализации каждого из этих примеров, убедитесь, что все вызовы add_action() в Gwyer_Admin_Notices::init() закомментированы. Затем добавьте новый файл dismissible-admin-notices.php в admin_notices плагина admin_notices . Откройте этот новый файл и добавьте новое определение класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
 
class Gwyer_Dismissible_Admin_Notices {
 
    /**
    * Register hooks.
    */
    public function init() {
        // add_action() calls will go here…
    }
}
 
$gwyer_dismissible_admin_notices = new Gwyer_Dismissible_Admin_Notices();
$gwyer_dismissible_admin_notices->init();

В admin_notices.php добавьте еще один вызов require_once() для импорта нашего нового класса:

1
require_once(dirname(__FILE__) . ‘/dismissible-admin-notices.php’ );

Класс Gwyer_Dismissible_Admin_Notices будет содержать весь код, связанный с отклонением постоянных уведомлений администратора.

Первый способ, который мы рассмотрим, это как отобразить уведомление администратора только один раз, чтобы оно не появлялось при загрузке страницы. Вы можете использовать этот метод, чтобы уведомить пользователя, когда плагин или тема только что были активированы.

Давайте сделаем это для нашего плагина Admin Notices. Мы начнем с регистрации переходного параметра WordPress после активации плагина, срок действия которого истекает почти сразу.

В классе Gwyer_Dismissible_Admin_Notices добавьте вызов register_activation_hook() :

1
register_activation_hook( plugin_dir_path( __FILE__ ) . ‘admin-notices.php’, array( $this, ‘set_admin_notice_transient’ ) );

Функция register_activation_hook() требует, чтобы вы указали путь к основному файлу плагина, но в настоящее время мы находимся в dismissible-admin-notices.php . Поэтому мы не можем просто использовать магическую константу PHP __FILE__ мы использовали ранее, поскольку она всегда указывает на текущий файл PHP.

Вместо этого мы должны сами построить путь к основному файлу плагина, используя plugin_dir_path( __FILE__ ) . 'admin-notices.php' plugin_dir_path( __FILE__ ) . 'admin-notices.php' .

Когда плагин Admin Notices активирован, он запускает код, добавленный в set_admin_notice_transient класса set_admin_notice_transient , который мы определим далее.

1
2
3
public function set_admin_notice_transient() {
  set_transient( ‘admin-notice-transient’, true, 5 );
}

Этот метод создает новый переходный процесс под названием 'admin-notice-transient' со значением true , и срок его действия истекает через пять секунд.

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

Добавьте новый вызов add_action() для init() .

1
add_action( ‘admin_notices’, array( &$this, ‘display_admin_notice’ ) );

Затем добавьте функцию обратного вызова display_admin_notice в качестве нового метода класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public function display_admin_notice() {
 
       $current_user = wp_get_current_user();
       $whitelist_admin_pages = array( ‘plugins’ );
       $admin_page = get_current_screen();
 
       if( in_array( $admin_page->base, $whitelist_admin_pages ) && get_transient( ‘admin-notice-transient’ ) ) :
           ?>
           <div class=»updated notice»>
               <p>The <strong>Admin Notices</strong> plugin was just activated.
           </div>
           <?php
           delete_transient( ‘admin-notice-transient’ );
       endif;
   }

Как и в предыдущих примерах, уведомление администратора отображается только в том случае, если мы находимся на определенной странице — в данном случае это страница основных плагинов администратора. Но у нас есть дополнительное условие, что 'admin-notice-transient' должен также 'admin-notice-transient' , в противном случае уведомление администратора не будет отображаться.

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

Чтобы протестировать код, который мы только что добавили, перейдите на главную страницу плагинов и деактивируйте, а затем снова активируйте плагин Admin Notices.

Одноразовое уведомление администратора

Ключевым моментом здесь является переходная настройка 'admin-notice-transient' . Без этого уведомление администратора будет появляться каждый раз при загрузке страницы плагинов (после активации плагина), а это не то, что нам нужно.

Далее следует уведомление администратора, которое будет отображаться только определенное количество раз, после чего оно больше не будет отображаться. Кроме того, на этот раз он не будет ограничен какой-либо конкретной страницей администратора.

Прежде чем мы начнем, в классе Gwyer_Dismissible_Admin_Notices закомментируйте вызовы функций register_activation_hook() и add_action() . Теперь давайте настроим основное уведомление администратора, которое вскоре расширит функциональность.

Добавьте новый вызов add_action() в init() :

1
add_action( ‘admin_notices’, array( &$this, ‘display_admin_notice_counter’ ) );

А затем уточните функцию обратного вызова display_admin_notice_counter() :

1
2
3
4
5
6
7
public function display_admin_notice_counter() {
    ?>
    <div class=»updated notice»>
        <p>Counter admin notice.</p>
    </div>
    <?php
}

Это отобразит стандартное уведомление администратора, которое будет появляться на каждой странице администратора WordPress.

Стандартное уведомление администратора готово к настройке

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

Мы хотим, чтобы уведомление администратора отображалось на любой странице администратора, поэтому значение счетчика должно сохраняться между загрузками страниц. Хороший способ сделать это — использовать опцию базы данных для хранения значения счетчика.

Добавьте свойство класса счетчика для хранения предельного значения счетчика:

1
public $counter_limit = 5;

Это будет использовано в ближайшее время для управления тем, сколько раз появится уведомление администратора. Внутри display_admin_notice_counter() обновите код следующим образом:

1
2
3
4
5
6
7
8
9
public function display_admin_notice_counter() {
       $counter = get_option( ‘admin_notice_counter’, 1 );
       ?>
       <div class=»notice notice-info»>
           <p>This admin notice has been displayed <?php echo $counter;
       </div>
       <?php
       update_option( ‘admin_notice_counter’, ++$counter );
   }

Перед отображением уведомления администратора мы извлекаем опцию счетчика, и возвращается значение по умолчанию, если оно еще не существует. После отображения уведомления администратора опция счетчика увеличивается на единицу и обновляется. Если он не существует, то будет создана новая опция для сохранения текущего значения.

Мы также обновили класс CSS, чтобы он был уведомлением администратора информации.

Попробуйте посетить различные страницы администратора и увидеть счетчик увеличивается с каждым разом.

Встречное уведомление администратора в действии

Код ++$counter является примером оператора предварительного увеличения . Добавляет значение в $counter перед сохранением в базу данных. Если бы мы использовали оператор постинкремента (т. Е. $counter++ ), то значение $counter сначала сохранялось, а затем увеличивалось, что не сработало бы.

Теперь $counter_limit чтобы уведомление администратора не появлялось слишком много раз. Добавьте это к display_admin_notice_counter() под объявлением для $counter :

1
2
3
if( $counter > $this->counter_limit ) {
    return;
}

Теперь, когда уведомление администратора отображается пять раз, оно не будет отображаться на последующих страницах администратора. Однако было бы неплохо отобразить сообщение в последний раз, когда появляется уведомление администратора, чтобы пользователь знал, что оно больше не появится. Расширьте условное выражение и выведите дополнительное сообщение:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public function display_admin_notice_counter() {
 
       $counter = get_option( ‘admin_notice_counter’, 1 );
       if( $counter > $this->counter_limit ) {
           return;
       } else if( $counter == $this->counter_limit ) {
           $extra_message = » It’s time to say goodbye now.»;
       }
       ?>
       <div class=»notice notice-info»>
           <p>This admin notice has been displayed <?php echo $counter;
       </div>
       <?php
       update_option( ‘admin_notice_counter’, ++$counter );
   }

Тем не менее, вы не увидите сообщение, если вы уже превысили лимит счетчика. Вы можете временно решить эту проблему, увеличив переменную $counter_limit .

Показать дополнительное сообщение на финальном рендере

В целях тестирования было бы лучше иметь возможность сбросить предел счетчика. Если вы знаете, как редактировать базу данных, вы можете войти в нее и изменить опцию напрямую, но это может быть утомительно делать несколько раз. Итак, давайте реализуем нашу собственную функцию сброса.

Во-первых, измените $counter_limit на 5 и добавьте новое свойство класса:

1
public $counter_reset = false;

Затем внутри init() замените

1
add_action( ‘admin_notices’, array( &$this, ‘display_admin_notice_counter’ ) );

с

1
$this->reset_counter_check();

Функция сброса должна либо отображать наше admin_notice_counter уведомление администратора, либо удалять admin_notice_counter базы данных admin_notice_counter и вместо этого отображать предупреждение администратора.

01
02
03
04
05
06
07
08
09
10
11
12
public function reset_counter_check() {
       if( !$this->counter_reset ) {
           add_action( ‘admin_notices’, array( &$this, ‘display_admin_notice_counter’ ) );
       } else {
           delete_option( ‘admin_notice_counter’ );
           ?>
           <div class=»notice notice-warning»>
               <p>Admin notice counter has been reset!
           </div>
           <?php
       }
   }

Чтобы использовать новую функцию сброса, просто измените $counter_reset на true и загрузите любую страницу администратора.

Сброс счетчика уведомлений администратора

Затем снова измените его на false .

Счетчик уведомлений администратора успешно сброшен

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

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

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

Затем мы перешли к двум отличным примерам отклонения постоянных уведомлений администратора. Это дает вам большую гибкость в том, как вы представляете уведомления администратора пользователю. В следующей и последней части этой серии руководств мы рассмотрим другие способы отклонения постоянных уведомлений администратора.

И, для забавы, мы создадим наши собственные типы уведомлений администратора и добавим украшения для значков.