load-(page_hook)
Срабатывает на отдельной странице админки. На какой именно странице сработает хук указывается в (page_hook).
Cрабатывает на определенной странице ДО вывода контента самой страницы. Т.е. до хуков: admin_print_styles, admin_print_scripts, admin_head, admin_notices.
Обычно этот хук используется в связке с фукнциями регистрации страницы add_menu_page() или add_submenu_page() и производных функций add_*_page() - add_options_page() и т.д.
Каждай такая функция после регистранции страницы возвращает $page_hook. Например, зарегистрируем страницу в раздел "Оptions" и получим хук для нашей новой страницы, который будет срабатывать только на ней:
add_action( 'admin_menu', 'test_load' );
function test_load() {
$page_hook = add_options_page( 'Test', 'Test', 8, 'testload' );
add_action( "load-$page_hook", 'my_load_function' );
// название хука будет: load-tools_page_testload
}Про аналогичный хук load-(pagenow).
Этот хук используйтеся для кастомных страниц зарегистрированных через группу функций add_menu_page() или add_submenu_page() и производные от них.
Но, если текущая страница админки - это страница ядра (а не кастомная), то на такой странице этот хук не сработает, а сработает аналогичных хук load-(pagenow). Где $pagenow - глобальная переменная, хранит название текущего php файла, например: 'post-new.php', 'admin.php'.
Про аналогичный хук load-(plugin_page).
Перез запуском хуков WP получает $page_hook через функцию get_plugin_page_hook(). Если по какой-то причине она не вернет результат, то вместо этого, сработает аналогичных хук load-(plugin_page). Где plugin_page = plugin_basename( $_GET['page'] ) - это название некущей страницы из GET параметра.
Использование
add_action( 'load-(page_hook)', 'wp_kama_load_page_hook_action' );
/**
* Function for `load-(page_hook)` action-hook.
*
* @return void
*/
function wp_kama_load_page_hook_action(){
// action...
}
- $page_hook(строка)
Уникальный идентификатор текущей страницы админки. Используется в названии хука.
Для кастомных страниц, добавленных через add_menu_page() или add_submenu_page(), создается уникальный
$page_hook, который возвращается функций регистрации и выглядит как:toplevel_page_mypluginmyplugin_page_settings.
Название (page_hook) можно также получить с помощью функции get_plugin_page_hook( $plugin_page, $parent_page )
Примеры
#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' );