web-dev-qa-db-ja.com

OOP プラグインとメニュー - 未定義関数register_setting()の呼び出し

WordPressのドキュメンテーションはオブジェクト指向のコードに斑点があるようです。私はいくつかのプラグインを設定しています、そして最初のものは設定とメニューページを登録するべきです。 register_setting()またはadd_settings_field()呼び出しに対して "undefined"を投げています。これらは他のところに行くべきですか?

管理者設定ページも作成されていませんか。助けてくれてありがとう。

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

プラグイン(またはテーマ)がロードされたときに関数が正しく存在しないため、これらは未定義です。管理領域インクルードはまだ発生していません。

設定フィールドを登録したい場合は、admin_initにフックするのが最善です。

要するに、こうすることでクラスを修正できます。

<?php
class mySettings {

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

    // other stuff here
}

またはこれ:

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

ファイルがWordPressに含まれる順序についてです。 WPがどこへ行くのかさえわからなくなる前に、プラグインとテーマは早い段階でロードされます。そのため、後で(admin_initinitのように)接続して、レジスター設定や投稿タイプなどを実行します。

余談ですが、私はこのようなクラスを構成するのが好きです。

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

アクションやフィルタをコンストラクタから除外しているので、テストが簡単になります。 ... WPT26_Awesome::init();ですべてを始めることができます。これは このテーマに関するチュートリアル です。

6
chrisguitarguy