Работает ли admin_print_scripts-$hook_suffix для вложенных путей к отдельным файлам?

11 февр. 2011 г., 12:32:55
Просмотры: 869
Голосов: 0

Можно ли использовать хук 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);  // Отладочный вывод
}
4
Комментарии

Можно ли увидеть код, который вы используете для регистрации страниц плагина, а именно вызовы add_menu_page и add_submenu_page (или их эквиваленты)?

t31os t31os
12 февр. 2011 г. 11:05:54

Добавил. Я понимаю, что это нестандартный подход и что я не использую add_menu_page(). Это потому, что я не хочу, чтобы эти страницы отображались в меню. Я осознаю связанные с этим проблемы. http://wordpress.stackexchange.com/questions/7812/what-is-the-recommended-way-to-create-plugin-administration-forms

codecowboy codecowboy
12 февр. 2011 г. 13:56:06

Дело в том, что вы не можете иметь зарегистрированные страницы, которых нет в меню. В любом случае вы потеряете часть функциональности, если просто добавите страницы в соответствующие массивы, потому что ядро WordPress ожидает, что зарегистрированные страницы в какой-то степени существуют в массивах $menu и $submenu.. Могу я предложить вам изучить функции add_menu_page и add_submenu_page, чтобы увидеть, что они делают с входящими данными (это даст вам представление о том, как WordPress обрабатывает страницы, зарегистрированные с помощью этих функций - т.е. в какие массивы он добавляет данные и т.д.)

t31os t31os
14 февр. 2011 г. 17:03:37

Я добавил пример кода и дополнительные комментарии к своему ответу.

t31os t31os
14 февр. 2011 г. 18:22:07
Все ответы на вопрос 1
0

Думаю, вопрос заключается в том, правильно ли этот код возвращает имя хука для данной страницы.

Вот простая функция, которую можно использовать для вывода суффикса хука на каждой странице админки. Он будет отображаться в красном блоке ошибок (чтобы было легко заметить) только для администраторов.

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-функцию, в обоих случаях проверку прав доступа можно обойти (что, очевидно, нежелательно).

11 февр. 2011 г. 12:50:24