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

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

Настройка нашего плагина

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

Я предполагаю, что у вас уже есть в разработке локальный WP сайт. Если нет, обратитесь к ссылкам в первой части этой серии уроков.

Создайте новую папку плагина с именем admin_notices внутри /wp-content/plugins/, а затем создайте файл admin_notices.php, который будет основным файлом плагина.

Откройте admin_notices.php в своем любимом редакторе и добавьте базовую структуру плагина:

<?php

/*
Plugin Name: Admin Notices
Description: Display your own custom admin notices.
Version: 0.1
Author: David Gwyer
Author URI: http://www.wpgoplugins.com
*/

class Gwyer_Admin_Notices {

/**
* Register hooks.
*/
public function init() {
// Add code here…
}
}

$gwyer_admin_notices = new Gwyer_Admin_Notices();
$gwyer_admin_notices->init();

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

Я назвал класс Gwyer_Admin_Notices, чтобы сделать его как можно более уникальным. Таким образом, маловероятно, что он будет конфликтовать с существующими именами классов.

Начнем с отображения основного уведомления администратора, а затем будем расширять его, чтобы сделать его более полезным. Чтобы создать уведомление администратора, добавьте хук admin_notices к функции init():

add_action( ‘admin_notices’, array( $this, ‘test_notice’ ) );

Хук включает функцию обратного вызова test_notice, которая будет использоваться для вывода уведомления администратора.

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

/**
* Output a test admin notice.
*/

public function test_notice() {
?>
<div class=»notice notice-error»><p>Yoo hoo, big summer blow out.</p></div>
<?php
}

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

Давайте также добавим примеры других типов уведомлений администратора, которые мы можем отобразить, включая отклоняемый тип, добавив is-dismissible CSS класс. Добавьте их в метод test_notice() под блоком div существующего уведомления администратора:

<div class=»notice notice-warning»><p>Toto, I’ve a feeling we’re not in Kansas anymore.</p></div>
<div class=»notice notice-success»><p>You had me at «hello».</p></div>
<div class=»notice notice-info»><p>Of all the gin joints in all the towns in all the world, she walks into mine.</p></div>
<div class=»notice notice-success is-dismissible»><p>Nobody puts Baby in a corner.</p></div>

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

«Отклоняемое» уведомление — в данном случае означает только для текущей страницы. Наличие постоянных уведомлений администратора не очень гибкое, поэтому позже мы подробно рассмотрим различные способы эффективного отклонения уведомлений администратора.

Хуки для уведомлений администратора

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

Вот четыре доступных хука:

*В настоящее время для этих хуков нет официальной документации.

Итак, где бы вы обычно использовали all_admin_notices, user_admin_notices и network_admin_notices? И чем они отличаются от admin_notices?

Ранее я сказал, что хук admin_notices отображает уведомления на всех страницах администрирования, но это не совсем так. Если вы посмотрите на admin-header.php в ядре WordPress, вы увидите, что admin_notices, network_admin_notices и user_admin_notices являются взаимоисключающими. То есть, только один из этих хуков запускается на странице администрирования WordPress.

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

Во-первых, is_network_admin() проверяет, находитесь ли вы на странице сетевого администрирования (например, любая страница администратора, основанная на /wp-admin/network/ URL). Если это так, запускается хук network_admin_notices.

В противном случае, is_user_admin() проверяет, находитесь ли вы на странице администрирования пользователей (например, любая страница администратора на основе /wp-admin/user/ URL). Если это так, то срабатывает хук user_admin_notices.

И, как вы могли догадаться, если оба is_network_admin() и is_user_admin() возвращают false, то запускается хук admin_notices.

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

Надо уточнить, что для любой страницы администрирования WordPress гарантированно запускается только хук all_admin_notices. Из трех других хуков только один будет срабатывать в зависимости от страницы администратора, на которой вы сейчас находитесь.

Я бы посоветовал вам взглянуть на admin-header.php (ближе к концу файла), чтобы узнать, как WordPress решает, когда какой хук уведомлений администратора использовать.

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

Отображение уведомлений администратора на конкретных страницах

Теперь обратим наше внимание на отображение уведомлений администратора на определенных страницах. Во-первых, закомментируйте вызов add_action, чтобы наши тестовые уведомления больше не отображались.

Внутри init() добавьте новый вызов add_action(), который мы будем использовать для отображения уведомления администратора на одной конкретной странице администратора.

add_action( ‘admin_notices’, array( $this, ‘specific_admin_page’ ) );

Затем определите метод specific_admin_page() следующим образом:

/**
* Output an admin notice on a specific admin screen.
*/

public function specific_admin_page() {

$admin_page = get_current_screen();
?>
<div class=»notice notice-info»><p>Information: We are currently on the <strong><?php echo $admin_page->base; ?></strong> admin page.</p></div>
<?php
}

Сохраните изменения и просмотрите любую страницу в интерфейсе администратора WordPress. Я попробую страницу главной панели.

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

Функция get_current_screen() возвращает объект WP_Screen с информацией о текущей странице администратора. Свойство объекта, которое нам интересно, это WP_Screen->base, оно оценивает базовый тип текущей страницы. Попробуйте загрузить различные страницы администрирования WordPress, чтобы узнать, какие значения возвращаются для WP_Screen->base.

Мы можем использовать базовое значение, чтобы по условию загружать наше уведомление администратора только на странице панели управления. Значение, на которое нам нужно проверить, это dashboard. Давайте также покажем альтернативное уведомление администратора, если мы не на странице панели управления администратора. Замените свое определение specific_admin_page() на:

/**
* Output an admin notice on a specific admin screen.
*/
public function specific_admin_page() {

$admin_page = get_current_screen();

if( $admin_page->base == «dashboard» ) :
?>
<div class=»notice notice-success»><p>We made it! Welcome to the dashboard.</p></div>
<?php
else :
?>
<div class=»notice notice-error»><p>Where did you go? This isn’t the dashboard!</p></div>
<?php
endif;
}

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

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

И еще раз замените функцию specific_admin_pages(), на этот раз следующим кодом:

/**
* Output an admin notice on a specific admin screen.
*/
public function specific_admin_page() {

$whitelist_admin_pages = array( ‘dashboard’, ‘upload’, ‘edit-comments’ );
$admin_page = get_current_screen();

if( in_array( $admin_page->base, $whitelist_admin_pages ) ) :
?>
<div class=»notice notice-success»><p>We made it! This is the ‘<?php echo $admin_page->base; ?>’ admin page.</p></div>
<?php
else :
?>
<div class=»notice notice-error»><p>Not on your nelly! This page isn’t on my list.</p></div>
<?php
endif;
}

Вместо того, чтобы проверять одну страницу администратора, мы теперь проверяем, находится ли базовое имя текущей страницы администратора в массиве $whitelist_admin_pages. Когда мы переходим к панели управления, медиа-библиотеке или страницам администрирования комментариев, мы видим наше уведомление администратора об успехе.

И когда мы посещаем любую другую страницу администратора (не включенную в массив с нашим белым списком), мы видим альтернативное уведомление администратора.

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

Создайте новый файл с именем plugin-options.php внутри папки плагина admin-notices, добавленной нами ранее, и добавьте следующий код:

<?php

class Gwyer_Plugin_Options {

/**
* Register hooks.
*/
public function init() {
add_action( ‘admin_init’, array( $this, ‘register_plugin_settings’ ) );
add_action(‘admin_menu’, array( $this, ‘create_admin_menu_page’ ) );
}

public function create_admin_menu_page() {

// Create new top-level menu
add_options_page(‘Admin Notices’, ‘Admin Notices’, ‘manage_options’, __FILE__, array( $this, ‘render_options_page’ ) );
}

public function register_plugin_settings() {
register_setting( ‘admin-notices-plugin-settings’, ‘text-option’ );
}

public function render_options_page() {
?>
<div class=»wrap»>
<h1>Admin Notices Plugin</h1>

<form method=»post» action=»options.php»>
<?php settings_fields( ‘admin-notices-plugin-settings’ ); ?>
<?php do_settings_sections( ‘admin-notices-plugin-settings’ ); ?>
<table class=»form-table»>
<tr valign=»top»>
<th scope=»row»>Enter some text</th>
<td><input type=»text» name=»text-option» value=»<?php echo esc_attr( get_option( ‘text-option’ ) ); ?>» /></td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}
}

$gwyer_plugin_options = new Gwyer_Plugin_Options();
$gwyer_plugin_options->init();

В верхней части admin-notices.php (непосредственно над объявлением класса) подключите класс параметров плагина в основной файл плагина с помощью строки:

require_once(dirname(__FILE__) . ‘/plugin-options.php’ );

Я не буду вдаваться в подробности о том, как работает код в plugin-options.php, поскольку из этого может получиться целое отдельное руководство! Если вы хотите освежить свои знания, я бы рекомендовал взглянуть на страницу WordPress Codex на добавление страниц параметров плагина.

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

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

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

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

Чтобы добавить нашу страницу параметров в массив, нам нужно знать базовое имя. Внутри specific_admin_page() измените блок div с уведомлением об ошибке администратора на следующее:

<div class=»notice notice-error»><p>Not on your nelly! This ‘<?php echo $admin_page->base; ?>’ page isn’t on my list.</p></div>

Мы по-прежнему получаем такое же уведомление об ошибке администратора, как и раньше, но на этот раз оно включает в себя базовое имя, которое нам нужно, которое выглядит так: settings_page_admin-notices/plugin-options. Это не то имя, которое мы могли бы легко угадать, поэтому стоило потратить время на его получение!

Добавьте базовое имя в массив $whitelist_admin_pages, который теперь должен выглядеть так:

$whitelist_admin_pages = array(
‘settings_page_admin-notices/plugin-options’,
‘dashboard’,
‘upload’,
‘edit-comments’
);

Обновите страницу параметров плагина, чтобы увидеть обновленное уведомление администратора.

Теперь, когда мы знаем базовое имя страницы параметров плагина, мы можем легко создать уведомление администратора, которое отображается только на этой странице администрирования. Удалите settings_page_admin-notices/plugin-options из массива $whitelist_admin_pages и закомментируйте второй вызов функции add_action в init(). Затем добавьте третье действие, которое мы будем использовать для нашей страницы параметров плагина, только для уведомлений администратора. Теперь функция init() должна выглядеть так:

/**
* Register hooks.
*/
public function init() {
//add_action( ‘admin_notices’, array( $this, ‘test_notice’ ) );
//add_action( ‘admin_notices’, array( $this, ‘specific_admin_page’ ) );
add_action( ‘admin_notices’, array( $this, ‘plugin_admin_notice’ ) );
}

Давайте теперь отредактируем функцию обратного вызова plugin_admin_notice(). Добавьте этот новый метод в класс Gwyer_Admin_Notices:

/**
* Output an admin notice on the plugin options page.
*/
public function plugin_admin_notice() {

$whitelist_admin_pages = array( ‘settings_page_admin-notices/plugin-options’ );
$admin_page = get_current_screen();

if( in_array( $admin_page->base, $whitelist_admin_pages ) ) :
?>
<div class=»notice notice-info»><p>Welcome to the Admin Notices plugin page!</p></div>
<?php
endif;
}

Это очень похоже на specific_admin_page(), за исключением того, что мы удалили условное выражение. Кроме того, мы добавили кнопку Отклонить, добавив CSS класс is-dismissible, поэтому уведомление администратора также может быть закрыто.

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

Вывод

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

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

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

Источник: code.tutsplus.com