WordPress函数:load-{$variable} action
WordPress后台页面,无论是核心自带的,还是插件加进去的,都会引入admin.php这个文件。了解adm…
WordPress后台页面,无论是核心自带的,还是插件加进去的,都会引入admin.php这个文件。了解admin.php的工作方式,就能轻松知道程序位于哪个后台界面。这篇文章要说很多,但其实就是在讲这件事:
怎么把下面这段代码用WordPress的方式说一遍:
1 2 3 |
if( isset( $_GET['page'] ) && $_GET['page'] == '插件A' ){ // 当前位于插件A的页面 } |
if( isset( $_GET[‘page’] ) && $_GET[‘page’] == ‘插件A’ ){
// 当前位于插件A的页面
}
插件页面的菜单模式
插件在WordPress后台创建页面时,可以成为顶级菜单的页面,也能跑去某个核心菜单下面当小弟。观察一下菜单链接格式,可以发现一些有趣的事。假设我们有个slug为“mypluginname”的插件。
如果创建一个顶级页面,页面链接是
1 |
admin.php?page=mypluginname |
admin.php?page=mypluginname
把插件页面放到“设置”选项卡下,则页面链接会变成:
1 |
options-general.php?page=mypluginname |
options-general.php?page=mypluginname
也就是说自定义的顶级菜单都要归admin.php亲自管理,放到核心菜单下的就由核心顶级菜单管理。
根据菜单模式判断方位
知道了菜单模式,就能判断当前是不是在post edit页面,或者是不是正在处理某个插件的POST请求。了解这个方法,只需要扒一扒admin.php的源代码,并格外注意以下的内容。
全局变量:
$plugin_page
$pagenow
$hook_suffix
$page_hook
Action Hooks:
load-{$page_hook}
load-{$plugin_page}
load-importer-{$importer}
load-{$pagenow}
先给action hooks的使用场景分个类,去掉importer这个显而易见的家伙:
在第三方插件页面触发的hooks:load-{$page_hook},load-{$plugin_page}
后台核心页面(如post pages等)触发的hooks:load-{$pagenow}
admin.php简化版 hooks触发顺序
下面是简化版的admin.php hooks触发顺序,以及简要说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
// Handle plugin admin pages. $plugin_page = wp_unslash( $_GET['page'] ); do_action( 'admin_init' ); if ( isset($plugin_page) ) { if ( $page_hook ) { /** * load-* hook 在后台插件界面运行时触发。 * * $page_hook是这个action的动态部分,该变量由以下几个参数构成: * * 1. The page type. 如果该插件的页面注册为子菜单,例如settings下,则page type就是'settings'。注册为顶级菜单,page type是'toplevel'。 * * 2. 接下来是一个分隔符: '_page_'. * 3. 最后是插件的slug (or pluginbasename ),这个slug在注册插件时指定,例如 * add_menu_page()的第三个参数$menu_slug。 * * 这三部分一起构成$page_hook的值,按照上面的例子,$page_hook的值就是 * 'load-settings_page_pluginbasename'. * */ do_action( "load-{$page_hook}" ); /** * 注册插件菜单时会传递一个输出页面内容的回调函数 * 这个hook就是给这个回调函数用的 * * 例如执行:add_menu_page('page title','menu title','manage_options', * 'callback_function','',6); * 会执行代码:add_action( $page_hook, 'callback_function') * * 换言之插件页面的内容就是在这个hook的位置输出的。 * */ do_action( $page_hook ); } else { /** * 添加菜单且使用文件输出插件页面内容时,会执行这个hook * 文章后面会详细说这个hook的用法 */ do_action( "load-{$plugin_page}" ); // 直接include指定的php文件显示插件页面 include(WP_PLUGIN_DIR . "/$plugin_page"); } } elseif ( isset( $_GET['import'] ) ){ /** * 在导入(import)界面加载前触发 * * `$importer`指导入插件的名字,例如使用Import WordPress插件时, * 动态名称是'wordpress' */ do_action( "load-importer-{$importer}" ); } else { /** * 这个hook用于wordpress自带的页面。 * * $pagenow是一个全局变量,指当前页面的filename, * 例如admin.php, 'post-new.php'。 * * 例如:要在post-new.php页面执行操作,使用load-post-new.php这个action * */ do_action( "load-{$pagenow}" ); } if ( ! empty( $_REQUEST['action'] ) ) { /** * Fires when an 'action' request variable is sent. * * The dynamic portion of the hook name, `$_REQUEST['action']`, * refers to the action derived from the `GET` or `POST` request. * * @since 2.6.0 */ do_action( 'admin_action_' . $_REQUEST['action'] ); } |
// Handle plugin admin pages.
$plugin_page = wp_unslash( $_GET[‘page’] );
do_action( ‘admin_init’ );
if ( isset($plugin_page) ) {
if ( $page_hook ) {
/**
* load-* hook 在后台插件界面运行时触发。
*
* $page_hook是这个action的动态部分,该变量由以下几个参数构成:
*
* 1. The page type. 如果该插件的页面注册为子菜单,例如settings下,则page
type就是’settings’。注册为顶级菜单,page type是’toplevel’。
*
* 2. 接下来是一个分隔符: ‘_page_’.
* 3. 最后是插件的slug (or pluginbasename ),这个slug在注册插件时指定,例如
* add_menu_page()的第三个参数$menu_slug。
*
* 这三部分一起构成$page_hook的值,按照上面的例子,$page_hook的值就是
* ‘load-settings_page_pluginbasename’.
*
*/
do_action( “load-{$page_hook}” );
/**
* 注册插件菜单时会传递一个输出页面内容的回调函数
* 这个hook就是给这个回调函数用的
*
* 例如执行:add_menu_page(‘page title’,’menu title’,’manage_options’,
* ‘callback_function’,”,6);
* 会执行代码:add_action( $page_hook, ‘callback_function’)
*
* 换言之插件页面的内容就是在这个hook的位置输出的。
*
*/
do_action( $page_hook );
} else {
/**
* 添加菜单且使用文件输出插件页面内容时,会执行这个hook
* 文章后面会详细说这个hook的用法
*/
do_action( “load-{$plugin_page}” );
// 直接include指定的php文件显示插件页面
include(WP_PLUGIN_DIR . “/$plugin_page”);
}
} elseif ( isset( $_GET[‘import’] ) ){
/**
* 在导入(import)界面加载前触发
*
* `$importer`指导入插件的名字,例如使用Import WordPress插件时,
* 动态名称是’wordpress’
*/
do_action( “load-importer-{$importer}” );
} else {
/**
* 这个hook用于wordpress自带的页面。
*
* $pagenow是一个全局变量,指当前页面的filename,
* 例如admin.php, ‘post-new.php’。
*
* 例如:要在post-new.php页面执行操作,使用load-post-new.php这个action
*
*/
do_action( “load-{$pagenow}” );
}
if ( ! empty( $_REQUEST[‘action’] ) ) {
/**
* Fires when an ‘action’ request variable is sent.
*
* The dynamic portion of the hook name, `$_REQUEST[‘action’]`,
* refers to the action derived from the `GET` or `POST` request.
*
* @since 2.6.0
*/
do_action( ‘admin_action_’ . $_REQUEST[‘action’] );
}
load-{$plugin_page}
load-{$plugin_page}这个hook不是任何时候都工作的,要了解它的使用方法,需要先明白add_menu_page()函数的两种使用场景。这个hook只在场景2下触发。
场景1:用回调函数创建插件页面内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function register_my_custom_menu_page(){ $hook = add_menu_page( 'page title', // 写在html head标签里的标题 'menu title', // 显示在后台菜单里的标题 'manage_options', // 访问权限 'custompage', // 插件页面的slug 'my_custom_menu_page', // 显示页面内容的回调函数 plugins_url( 'myplugin/images/icon.png' ), // 菜单图标 6 // 菜单显示位置 ); // 这里利用load-{$page_hook}这个hook,myfunc函数只会在该菜单对应的页面执行 add_action( "load-$hook", 'myfunc' ); } add_action( 'admin_menu', 'register_my_custom_menu_page' ); |
function register_my_custom_menu_page(){
$hook = add_menu_page(
‘page title’, // 写在html head标签里的标题
‘menu title’, // 显示在后台菜单里的标题
‘manage_options’, // 访问权限
‘custompage’, // 插件页面的slug
‘my_custom_menu_page’, // 显示页面内容的回调函数
plugins_url( ‘myplugin/images/icon.png’ ), // 菜单图标
6 // 菜单显示位置
);
// 这里利用load-{$page_hook}这个hook,myfunc函数只会在该菜单对应的页面执行
add_action( “load-$hook”, ‘myfunc’ );
}
add_action( ‘admin_menu’, ‘register_my_custom_menu_page’ );
之后定义my_custom_menu_page(),创建显示页面内容的代码。这种方式使用回调函数创建内容,要在这个页面执行某些代码而不在任何其它页面执行,要使用:
1 |
load-{$page_hook} |
load-{$page_hook}
场景2:用php文件创建内容
1 2 3 4 5 6 7 8 9 10 11 12 |
function register_my_custom_menu_page(){ add_menu_page( 'page title', // 写在html head标签里的标题 'menu title', // 显示在后台菜单里的标题 'manage_options', // 访问权限 'myplugin/myplugin-admin.php', // 插件的slug是一个真实存在的php文件 '', // 不使用回调函数 plugins_url( 'myplugin/images/icon.png' ), 6 ); } add_action( 'admin_menu', 'register_my_custom_menu_page' ); |
function register_my_custom_menu_page(){
add_menu_page(
‘page title’, // 写在html head标签里的标题
‘menu title’, // 显示在后台菜单里的标题
‘manage_options’, // 访问权限
‘myplugin/myplugin-admin.php’, // 插件的slug是一个真实存在的php文件
”, // 不使用回调函数
plugins_url( ‘myplugin/images/icon.png’ ),
6
);
}
add_action( ‘admin_menu’, ‘register_my_custom_menu_page’ );
这种方式下,页面内容由myplugin-admin.php文件创建,这个文件被admin.php直接include进来。这段话语义上也十分明确,既然插件slug是一个真实存在的地址,那就直接用吧,没有回调函数什么事情了。
但回调函数不存在,直接导致$page_hook变量值为空,于是按照代码逻辑就执行了:
1 |
do_action( "load-{$plugin_page}" ); |
do_action( “load-{$plugin_page}” );
实际感受一下
说了很多,实际看一下这些全局变量的值可能会更明白。
顶级菜单的例子:Contact From 7
1 2 3 4 5 6 |
// URL:http://domain.com/wp-admin/admin.php?page=wpcf7 $plugin_page = 'wpcf7'; $page_hook = 'toplevel_page_wpcf7'; $hook_suffix = 'toplevel_page_wpcf7'; $pagenow = 'admin.php'; |
// URL:http://domain.com/wp-admin/admin.php?page=wpcf7
$plugin_page = ‘wpcf7’;
$page_hook = ‘toplevel_page_wpcf7’;
$hook_suffix = ‘toplevel_page_wpcf7’;
$pagenow = ‘admin.php’;
次级菜单的例子:Adminimize
1 2 3 4 5 6 |
URL:http://yourdomain.com/wp-admin/options-general.php?page=adminimize-options $plugin_page = 'adminimize-options'; $page_hook = 'settings_page_adminimize-options'; $hook_suffix = 'settings_page_adminimize-options'; $pagenow = 'options-general.php'; |
URL:http://yourdomain.com/wp-admin/options-general.php?page=adminimize-options
$plugin_page = ‘adminimize-options’;
$page_hook = ‘settings_page_adminimize-options’;
$hook_suffix = ‘settings_page_adminimize-options’;
$pagenow = ‘options-general.php’;
本文转自:https://www.solagirl.net/wordpress-load-variable-action.html
这篇还没看明白…… 暂时记录在这里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 wper_net@163.com 删除。
还没有任何评论,赶紧来占个楼吧!