load-(page_hook)
Срабатывает на отдельной странице админ-панели. На какой именно странице сработает хук указывается в (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() { /* Выводим страницу плагина */ }
Список изменений
С версии 2.1.0 | Введена. |
Где вызывается хук
do_action( "load-{$page_hook}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
Где используется хук в WordPress
add_action( 'load-plugins.php', 'wp_plugin_update_rows', 20 ); // After wp_update_plugins() is called.
add_action( 'load-themes.php', 'wp_theme_update_rows', 20 ); // After wp_update_themes() is called.
add_action( "load-{$page}", array( $this, 'admin_load' ) );
add_action( "load-{$page}", array( $this, 'take_action' ), 49 );
add_action( "load-{$page}", array( $this, 'handle_upload' ), 49 );
add_action( 'load-plugins.php', 'wp_update_plugins' );
add_action( 'load-update.php', 'wp_update_plugins' );
add_action( 'load-update-core.php', 'wp_update_plugins' );
add_action( 'load-themes.php', 'wp_update_themes' );
add_action( 'load-update.php', 'wp_update_themes' );
add_action( 'load-update-core.php', 'wp_update_themes' );