WordPress как на ладони
wordpress jino

load-(page_hook) хук-событие . WP 2.1

Срабатывает на отдельной странице админ-панели. На какой именно странице сработает хук указывается в (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:

Фрагменты кода хука load-(page_hook)

Фрагмент из: wp-admin/admin.php VER 4.9.1
...
		 *
		 * 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.' ) );
		}

...
load-(page_hook) Комментариев нет

    Здравствуйте, !

    Ваш комментарий
    Предпросмотр