it-swarm.com.de

die Funktion add_option_page verhält sich merkwürdig

Ich versuche, eine Klasse zu erstellen, um das Hinzufügen neuer Einstellungen zu vereinfachen. Das Problem ist, dass die Zeichenfolge 'manage_options' dem Administrator anscheinend nicht das Recht einräumt, Änderungen und Optionen vorzunehmen, obwohl ich die Variable über alle Phasen hinweg verfolgt habe. Ich erhalte immer wieder die Meldung "Sie haben nicht genügend Berechtigungen, um auf diese Seite zuzugreifen." wenn ich versuche, auf die Seite mit den neuen Einstellungen zuzugreifen.

Hier ist eine stark vereinfachte Version der Klasse, der Erstellungsfunktion und ihres Aktions-Hooks.

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

Unedited Version hier

1
Mild Fuzz

admin_init heißt , nachdem wp-admin/menu.php enthalten ist , daher hat die Zugriffskontrolle bereits ausgeführt und die Aktion admin_menu wurde ausgelöst , als Sie test_options() ausführen. Entfernen Sie den Hook admin_init 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, es könnte funktionieren, weil Sie die Menüoption sehen, wenn Sie sich auf anderen Seiten befinden. Dies liegt daran, dass das Menü gezeichnet wird, nachdem der Seitenzugriff überprüft wurde :

Das Menü ist eingezeichnet in:

Die Zugangskontrolle erfolgt jedoch in:

Sie sehen, dass das Hinzufügen von Menüelementen in admin_init OK ist, um in das gezeichnete Menü aufgenommen zu werden, aber zu spät für die Zugriffskontrolle. Das ist Ihre aktuelle Situation, und Sie müssen dies ändern, indem Sie die Seite in den Hook admin_menu oder früher einfügen.

1
Jan Fabry

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

Hier ist ein Beispiel für die Funktionsweise des Codes in seiner einfachsten 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

Hoffentlich hilft das...

1
t31os