Работает ли admin_print_scripts-$hook_suffix для вложенных путей к отдельным файлам?
Можно ли использовать хук admin_print_scripts-$hook_suffix
для хука, созданного следующим образом: $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );
?
.. где $code_page
это somefilename.php
.
Я пробовал это сделать, но похоже не работает. Думаю, проблема может быть в пути к файлу?
ОБНОВЛЕНИЕ
Приведенный выше код регистрирует 'admin_page_my-quiz/lib/admin/question_form', но это работает только на странице, если сделать:
<a href="<?php echo admin_url('admin.php?page=my-quiz/lib/admin/question_form.php&question=edit&question='.$question->ID); ?>" class='edit'>
<?php _e('Редактировать', 'my-locale'); ?>
</a>
Мне нужно добавить .php в конце, чтобы ссылка работала, иначе получаю ошибку 'у вас нет прав доступа'.
Функция @t31os выводит 'nmsi-quiz/lib/admin/question_form.php', что не совпадает с 'admin_page_my-quiz/lib/admin/question_form'
Это работает - add_action( 'admin_print_scripts-'.'my-quiz/lib/admin/question_form.php', array($this,'enqueue_my_js'));
Запрошенный код:
$plugin_scripts = array('question_form.php', 'manage_questions.php');
foreach($plugin_scripts as $code_page) {
$hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );
$_registered_pages[$hookname] = true;
// fb($hookname); // Отладочный вывод
}

Думаю, вопрос заключается в том, правильно ли этот код возвращает имя хука для данной страницы.
Вот простая функция, которую можно использовать для вывода суффикса хука на каждой странице админки. Он будет отображаться в красном блоке ошибок (чтобы было легко заметить) только для администраторов.
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
}
Загрузите страницу, с которой у вас возникли проблемы, и сравните значение в блоке с тем, что возвращает ваш код.
Дополнение
Продолжая мой предыдущий комментарий, можно сделать следующее...
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'] );
}
}
// Удалите add_action для ссылки на реальные файлы, оставьте для использования callback-функции
...но есть одна проблема с этим подходом – возможность обойти проверку прав доступа для страниц.
Возьмем этот URL:
example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions
Мы можем обойти проверку прав, запросив:
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' )
);
...и опционально отключить callback-функции (используя реальный файл):
// 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
Независимо от того, используете ли вы реальный файл или callback-функцию, в обоих случаях проверку прав доступа можно обойти (что, очевидно, нежелательно).
