add_option_page-Fähigkeit verhält sich seltsam

Ich versuche, eine class zu erstellen, um den neuen Einstellungen das Hinzufügen von Einstellungen zu erleichtern. Das Problem, das ich habe, ist, dass, obwohl ich die Variable über alle Stufen verfolgt habe, der String ‘manage_options’ dem Administrator nicht das Recht auf Änderung und Option zu gewähren scheint. Ich bekomme immer wieder “Sie haben keine ausreichenden Berechtigungen, um auf diese Seite zuzugreifen.” wenn ich versuche, auf die neue Einstellungsseite zuzugreifen.

Hier ist eine stark vereinfachte Version der class, der Erstellungsfunktion und ihres Aktionshakens.

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' ); 

Unbearbeitete Version hier

Solutions Collecting From Web of "add_option_page-Fähigkeit verhält sich seltsam"

admin_init wird aufgerufen, nachdem wp-admin/menu.php enthalten ist , so dass die Zugriffsüberprüfung bereits ausgeführt wurde und die Aktion admin_menu ausgetriggers wurde, wenn test_options() . Entfernen Sie den admin_init Hook und rufen Sie test_options() direkt auf oder suchen Sie nach einer anderen Möglichkeit, Ihren Code so zu strukturieren, dass der Hook admin_menu korrekt eingerichtet ist.

Sie könnten denken, dass es funktionieren könnte, weil Sie die Menüoption sehen, wenn Sie auf anderen Seiten sind. Dies liegt daran, dass das Menü gezeichnet wird, nachdem der Seitenzugriff überprüft wurde :

Das Menü ist eingezeichnet:

  • wp-admin/menu-header.php in Zeile 169
    • in wp-admin/admin-header.php in Zeile 143 enthalten
      • von verschiedenen Orten aufgenommen, aber immer nach wp-admin/admin.php Zeile 132
        • Das ist, nachdem admin_init in wp-admin/admin.php in Zeile 98 wp-admin/admin.php

Die Zugangskontrolle erfolgt jedoch in:

  • wp-admin/menu.php in Zeile 441
    • Das ist nachdem admin_menu in wp-admin/menu.php in Zeile 328 wp-admin/menu.php
      • welches in der wp-admin/admin.php in Zeile 93 enthalten ist

Sie sehen, dass das Hinzufügen von admin_init in admin_init OK ist, um in dem gezeichneten Menü enthalten zu sein, aber zu spät für die Zugriffsprüfung. Das ist Ihre aktuelle Situation, und Sie müssen dies ändern, indem Sie die Seite im Hook admin_menu oder früher hinzufügen.

Jan ist sowohl mit seiner Antwort als auch mit seiner Bemerkung zur ursprünglichen Frage genau richtig.

Hier ist ein Beispiel für die functionsweise des Codes, in seiner grundlegendsten Form …

 // 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 

Ich hoffe, das hilft…