我认为这确实是一个问题,即代码是否为给定页面提供了正确的挂钩名称。
这里有一个简单的函数,可以用来在每个管理页面上输出钩子后缀,它将出现在一个红色的错误框中(因此很容易发现),仅供管理员使用。
add_action( \'admin_notices\', \'print_admin_pagehook\' );
function print_admin_pagehook() {
global $hook_suffix;
if( !current_user_can( \'manage_options\') )
return;
?>
<div class="error"><p><?php echo $hook_suffix; ?></p></div>
<?php
}
加载有问题的页面,并将框中显示的值与从发布的代码中得到的值进行比较。
Addition
Following on from my last comment, you can actually do something like this..
add_action( \'admin_menu\', \'testing_registered_pages\', 100 );
function testing_registered_pages() {
global $_registered_pages, $submenu;
$plugin_scripts = array(
\'Question Form\' => array( \'page\' => \'question_form\', \'callback\' => \'my_callback_1\' ),
\'Manage Questions\' => array( \'page\' => \'manage_questions\', \'callback\' => \'my_callback_2\' )
);
foreach( $plugin_scripts as $title => $my_pages ) {
$hookname = get_plugin_page_hookname("my-quiz/lib/admin/$my_pages[page]", \'my-quiz\' );
$_registered_pages[$hookname] = true;
$submenu[\'my-quiz\'][] = array( $title, \'manage_options\', "my-quiz/lib/admin/$my_pages[page]", $title );
add_action( $hookname, $my_pages[\'callback\'] );
}
}
// Remove the add_action to reference actual files, leave in place to use a callback function
。。。这种方法只有一个问题,那就是无法满足页面的功能需求。
获取此URL。
example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions
我们可以通过查询..来击败cap检查。。
example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions.php
如果我们将代码从早期切换为使用文件扩展名,例如。。
$plugin_scripts = array(
\'Question Form\' => array( \'page\' => \'question_form.php\', \'callback\' => \'my_callback_1\' ),
\'Manage Questions\' => array( \'page\' => \'manage_questions.php\', \'callback\' => \'my_callback_2\' )
);
。。并可以选择禁用回调,即使用真实文件。。
// add_action( $hookname, $my_pages[\'callback\'] );
。。这就给了我们。。
example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions.php
。。使用..仍有可能击败能力需求。。
example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions
无论您使用的是实际的文件还是回调函数,在这两种情况下都可以规避功能需求(如上所述)(显然这不是期望的行为)。