Home News

Load-(page_hook) — Срабатывает на отдельной странице админ-панели. На какой именно странице сработает хук указывается в (page_hook). Хук не передает никаких данных. Хук-событие WordPress

01.09.2018

Срабатывает на отдельной странице админ-панели. На какой именно странице сработает хук указывается в (page_hook). Хук не передает никаких данных.

Обычно этот хук не используется напрямую и достаточно зарегистрировать страницу в админ-панели, с помощью функций добавления меню: add_theme_page() , add_menu_page() , add_options_page() , add_submenu_page() ... т.е. всех функций add_*_page().

Каждая функция добавления меню и производные от них функции: add_*_page(), например add_options_page() возвращают специальный код, называемый "Page Hook Suffix". Этот код нужно использовать в (page_hook), чтобы выполнять действия только на нужной странице, а не везде в админке.

load-(page_hook) срабатывает на определенной странице плагина, после хуков: init, admin_menu, admin_init, current_screen, но до вывода контента самой страницы, т.е. до хуков: admin_print_styles, admin_print_scripts, admin_head, admin_notices.

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

add_action( 'admin_menu', 'test_load'); function test_load() { $hook_suffix = add_management_page( 'Test', 'Test', 8, 'testload'); add_action( "load-$hook_suffix", 'my_load_function' ); // Так, полное название хука будет "load-tools_page_testload". // А в функции my_load_function() мы будем использовать код, // который будет работать только на нашей созданной странице Test. }

Название суффикса (page_hook) можно также получить с помощью функции get_plugin_page_hook( $plugin_page, $parent_page )

Почти идентичный load-(page_hook) хук - просто $page_hook - он срабатывает чуть позже и выполняет туже задачу.

Если WP не сможет получить $page_hook через функцию get_plugin_page_hook(), то будет выполняться хук 'load-($plugin_page)', где $plugin_page это название плагина - basename().

Во всех остальных случаях выполняется хук 'load-($pagenow)' где $pagenow - глобальная переменная, хранит название текущего php файла, например: 'post-new.php', 'admin.php'.

Использование

add_action( 'load-edit.php', 'post_listing_page' ); function post_listing_page() { // код для страницы админки edit.php (список постов) }

Примеры

#1 Пример использования

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

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

<?php add_action('admin_menu', 'my_plugin_menu'); // Здесь мы может проверить все ли опции плагина сконфигурированы. Например, можем проверить существуют ли опции плагина. Если нет, то добавим хук, который их установит // Сейчас хук всегда активен! add_action( 'admin_notices', 'my_plugin_admin_notices' ); function my_plugin_menu() { // Регистрируем страницу настроек плагина и получаем её суффикс $hook_suffix = add_options_page('My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options'); // Используем полученный суффикс, чтобы выполнить действия только для нашей страницы add_action( 'load-' . $hook_suffix , 'my_load_function' ); } function my_load_function() { // Тут все будет работать только для нашей страницы настроек плагина. Поэтому тут не показываем сообщение (удаляем вышедобавленный хук remove_action( 'admin_notices', 'my_plugin_admin_notices' ); } function my_plugin_admin_notices() { echo "<div id='notice' class='updated fade'><p>Вы не настроили плагин. Сделайте же это!</p></div>\n"; } // страница настроек плагина function my_plugin_options() { if( ! current_user_can('manage_options') ) { wp_die( __('You do not have sufficient permissions to access this page.') ); } echo '<div class="wrap">'; echo '<p>Здесь HTML код настроек.</p>'; echo '</div>'; } ?>

#2 Подключаем скрипт плагина только на его страницах

add_action( 'admin_init', 'my_plugin_admin_init' ); add_action( 'admin_menu', 'my_plugin_admin_menu' ); function my_plugin_admin_init() { /* Регистрируем наш скрипт. */ wp_register_script( 'my-plugin-script', plugins_url('/script.js', __FILE__) ); } function my_plugin_admin_menu() { /* Регистрируем страницу нашего плагина */ $page = add_submenu_page( 'edit.php', // Родительская страница меню __( 'Мой плагин', 'myPlugin' ), // Название пункта меню __( 'Мой плагин', 'myPlugin' ), // Заголовок страницы 'manage_options', // Возможность, определяющая уровень доступа к пункту 'my_plugin-options', // Ярлык (часть адреса) страницы плагина 'my_plugin_manage_menu' // Функция, которая выводит страницу ); /* Используем зарегистрированную страницу для загрузки скрипта */ add_action( 'admin_print_scripts-' . $page, 'my_plugin_admin_scripts' ); } function my_plugin_admin_scripts() { /* * Эта функция будет вызвана только на странице плагина, подключаем наш скрипт */ wp_enqueue_script( 'my-plugin-script' ); } function my_plugin_manage_menu() { /* Выводим страницу плагина */ }

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

В файле: /wp-admin/admin.php

... * * The dynamic portion of the hook name, `$page_hook`, refers to a mixture of plugin * page information including: * 1. The page type. If the plugin page is registered as a submenu page, such as for * Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'. * 2. A separator of '_page_'. * 3. The plugin basename minus the file extension. * * Together, the three parts form the `$page_hook`. Citing the example above, * the hook name used would be 'load-settings_page_pluginbasename'. * * @see get_plugin_page_hook() * * @since 2.1.0 */ do_action( "load-{$page_hook}" ); if (! isset($_GET['noheader'])) require_once(ABSPATH . 'wp-admin/admin-header.php'); /** * Used to call the registered callback for a plugin screen. * * @ignore * @since 1.5.0 */ do_action( $page_hook ); } else { if ( validate_file( $plugin_page ) ) { wp_die( __( 'Invalid plugin page.' ) ); } ...
rss