Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress
Code

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

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Persisted WordPress Admin Notices.
Persisted WordPress Admin Notices: Part 2
Persisted WordPress Admin Notices: Part 4

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

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

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

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

Контроль появления уведомлений администратора

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

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

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

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

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

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

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

Normal Plugin Options Page Loading

Теперь введите текст в поле Enter some text и нажмите Save Changes. На этот раз мы видим, что settings-updated установлен в true, и мы можем его использовать.

The settings-updated value set to true

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

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

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

A more personal admin notice message

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

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

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

The finished admin notice to show the plugin has been updated

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

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

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

Эффективное отклонение постоянных уведомлений администратора

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

The one-off admin notice

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

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

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

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

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

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

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

Standard admin notice ready for customisation

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

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

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

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

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

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

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

Counter admin notice in action

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

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

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

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

Display an additional message on the final render

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

Сначала измените $counter_limit на 5 и добавьте новое свойство класса:

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

на

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

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

Reset admin notice counter

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

Admin notice counter successfully reset

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

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

Заключение

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

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

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.