Функция add_option_page ведет себя странно

Я пытаюсь создать класс, чтобы упростить работу с новыми настройками. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я отслеживал переменную на всех ее этапах, строка «manage_options», похоже, не дает администратору права на изменение и вариант. Я продолжаю получать «У вас недостаточно прав для доступа к этой странице». когда я пытаюсь получить доступ к новой странице настроек.

Вот сильно упрощенная версия класса, функция создания и ее действие.

class optionObject{ var $user_level = 'manage_options'; function add_page() { add_options_page(menu_page_title, page_title, $this->user_level, menu_slug, array(&$this, 'do_page')); } function do_page(){ //do stuff to display page } } function test_options(){ $options = new optionObject(); add_action('admin_menu', $options->add_page()); } add_action('admin_init', 'test_options' ); 

Неотредактированная версия здесь

Solutions Collecting From Web of "Функция add_option_page ведет себя странно"

admin_init вызывается после admin_init wp-admin/menu.php , поэтому проверка доступа уже выполнена, и действие admin_menu к моменту test_options() . Удалите admin_init hook и вызовите test_options() напрямую или найдите другой способ структурирования вашего кода, чтобы крюк admin_menu настроен правильно.

Вы можете подумать, что это может сработать, потому что вы видите опцию меню, когда находитесь на других страницах. Это происходит потому, что меню отображается после проверки доступа к странице :

Меню нарисовано в:

  • wp-admin/menu-header.php в строке 169
    • включен в wp-admin/admin-header.php в строке 143
      • из разных мест, но всегда после строки wp-admin/admin.php 132
        • который после admin_init запускается в wp-admin/admin.php в строке 98

Проверка доступа, однако, выполняется в:

  • wp-admin/menu.php в строке 441
    • который после admin_menu запускается в wp-admin/menu.php в строке 328
      • который включен в wp-admin/admin.php в строке 93

Вы видите, что добавление пунктов меню в admin_init в порядке, чтобы быть включенным в рисованное меню, но слишком поздно для проверки доступа. Это ваша текущая ситуация, и вам нужно изменить это, добавив страницу в admin_menu или ранее.

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

Вот пример кода, работающего в самой базовой форме …

 // Either uncomment the constructor function or the line following the creation of the object, simply showing you two working methods class test_stuff { var $user_level = 'manage_options'; // PHP4 or PHP5 constructor, you choose - uncomment function line as appropriate //function test_stuff() { //function __construct() { // add_action( 'admin_menu', array( $this, 'add_new_page' ) ); //} function add_new_page() { add_options_page( 'somename', 'somename', $this->user_level, 'somepagename', array( $this, 'display_page' ) ); } function display_page() { echo 'Hello World!'; } } $test_stuff = new test_stuff(); //add_action( 'admin_menu', array( $test_stuff, 'add_new_page' ) ); // Alternative to using the constructor function 

Надеюсь, это поможет…