web-dev-qa-db-fra.com

OOP Plugin et Menu - Appelez la fonction non définie register_setting ()

La documentation WordPress semble inégale sur le code orienté objet. Je suis en train de configurer quelques plugins et le premier devrait enregistrer les paramètres et une page de menu. Il jette "non défini" pour les appels register_setting() ou add_settings_field(). Ceux-ci devraient aller ailleurs?

Je ne vois pas non plus la page de configuration de l'administrateur créée? Merci pour toute aide.

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

Ils ne sont pas définis car les fonctions n'existent pas lorsque les plugins (ou les thèmes) sont chargés - la zone d'administration incluse ne s'est pas encore produite.

Si vous souhaitez enregistrer des champs de paramètres, il est préférable de vous connecter à admin_init pour le faire.

En bref, vous pouvez corriger votre classe en procédant comme suit:

<?php
class mySettings {

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

    // other stuff here
}

Ou ca:

<?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
}

C'est à peu près l'ordre dans lequel les fichiers sont inclus dans WordPress. Les plugins et les thèmes sont chargés très tôt, avant que WP ne sache même pas où il va. C'est pourquoi vous vous connectez plus tard (comme admin_init ou init) pour faire des choses comme les paramètres de registre ou les types de publication.

En passant, j'aime bien structurer les classes comme ceci:

<?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.
    }
}

Conserve les actions/filtres en dehors du constructeur, ce qui peut rendre les choses un peu plus faciles à tester. Vous démarrez tout avec ... WPT26_Awesome::init();. Voici un tutoriel sur le sujet.

6
chrisguitarguy