it-swarm.com.de

OOP Plugin und Menü - Aufruf der undefinierten Funktion register_setting ()

WordPress-Dokumentation scheint auf objektorientierten Code fleckig. Ich richte ein paar Plugins ein und das erste sollte Einstellungen und eine Menüseite registrieren. Es wirft "undefiniert" für die Aufrufe register_setting() oder add_settings_field(). Sollten diese woanders hingehen?

Ich sehe auch nicht, dass die Seite mit den Administratoreinstellungen erstellt wird. Danke für jede Hilfe.

<?php
//$c = new mySettings();
class mySettings {

    public function __construct() {
        $this->add_hooks();
        $this->register_settings();
    }
    public function add_hooks() {
        add_action('admin_menu', array($this, 'admin_menu'));
        add_action('admin_init', array($this, 'register_settings'));
    }
    public function register_settings() {
        //exit('register_settings'. microtime());
        register_setting('mySettings', 'mySettings', null);
        add_settings_field('myUrl', 'API URL', array($this, 'myUrl_callback'), 'my');
        add_settings_field('myOauthUrl', 'API Host', array($this, 'myOauthUrl_callback'), 'my');
        add_settings_field('myClientId', 'API Client Id', array($this, 'myClientId_callback'), 'my');
        add_settings_field('mySharedSecret', 'API Shared Secret', array($this, 'mySharedSecret_callback'), 'my');
    }
    public function admin_menu() {
        exit('admin_menu'. mircotime());
        add_options_page('my API Settings', 'my Settings', 'manage_options', 'my-my', array($this, 'settings_page'));
    }
    public function settings_page() {
        if (!current_user_can('manage_options')) {
            wp_die(__('You do not have sufficient permissions to access this page.'));
        }
        print '<h2>my API Settings</h2><form action="options.php" method="post">';
        print settings_fields('mySettings');
        print do_settings_sections('mySettings_selections');
        print submit_button() .'</form>';
    }
    public function myUrl_callback() {
        $options = get_option('mySettings');
        $option = isset($options['myUrl']) ? $options['myUrl'] : '';
        print '<input id="myUrl" name="mySettings[myUrl]" type="text" value="' . $option . '" />';
    }

}
1
s6712

Sie sind undefiniert, da die Funktionen beim Laden von Plugins (oder Themes) nicht vorhanden sind - die Admin-Bereich-Includes sind noch nicht aufgetreten.

Wenn Sie Einstellungsfelder registrieren möchten, ist es am besten, sich in admin_init einzuhängen, um dies zu tun.

Kurz gesagt, Sie können Ihre Klasse folgendermaßen reparieren:

<?php
class mySettings {

    public function __construct() {
        $this->add_hooks();
    }

    // other stuff here
}

Oder dieses:

<?php
//$c = new mySettings();
class mySettings {

    public function __construct() {
        add_action('admin_menu', array($this, 'admin_menu'));
        add_action('admin_init', array($this, 'register_settings'));
    }

    // other stuff here
}

Es geht nur um die Reihenfolge, in der Dateien in WordPress aufgenommen werden. Plugins und Themes werden frühzeitig geladen, bevor WP überhaupt weiß, wohin es geht. Aus diesem Grund schließen Sie sich später an (wie admin_init oder init), um beispielsweise Registrierungseinstellungen oder Beitragstypen vorzunehmen.

Nebenbei möchte ich Klassen wie diese strukturieren:

<?php
class WPT26_Awesome
{
    private static $ins = null;

    public static function init()
    {
        // for themes: add_action('after_setup_theme', array(self::instance(), '_setup'));
        add_action('plugins_loaded', array(self::instance(), '_setup'));
    }

    public static function instance()
    {
        // create a new object if it doesn't exist.
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    public function _setup()
    {
        // other calls to `add_action` here.
    }
}

Hält Aktionen/Filter aus dem Konstruktor heraus, was das Testen etwas erleichtert. Sie starten alles mit ... WPT26_Awesome::init();. Hier ist ein Tutorial zu diesem Thema.

6
chrisguitarguy