web-dev-qa-db-ja.com

確実にアクセスする方法 WP テーマフォルダ内のカスタムクラス内の関数

カスタムテーマを作成しています。管理パネルでメタボックスの作成を処理するためのヘルパークラスを作成したいと思います。私のクラスはこのように宣言されています:

namespace ci\wp;

Metaboxes::init();

class Metaboxes {

    private static $instance;
    private static $post;

    private static $metaboxesPath = TEMPLATEPATH . "/config/metaboxes/";

    static function init() {
        global $post;
        self::$post = &$post;
        add_action( 'add_meta_boxes', [ __CLASS__, 'addMetabox' ], 10, 5 );
    }

    // ADD METABOX
    static function addMetabox($id, $title, $post_type, $position, $priority) {
        if (file_exists(self::$metaboxesPath.$id.'.php')) {
            require_once(self::$metaboxesPath.$id.'.php');
            add_meta_box($id, $title, 'do_'.$id, $post_type, $position, $priority);
        }
    }

[...]

問題は、addMetaboxメソッドを使いたいときに\ci\wp\Metaboxes::addMetabox('front_page_slide_settings', 'Slide settings', 'page', 'normal', 'high');を書くことで、次のエラーが出ることです。

Fatal error: Uncaught Error: Call to undefined function ci\wp\add_meta_box() in [...]

クラス内でadd_actionを使用する方法をいくつか試しましたが、静的クラス、インスタンス化時にadd_actionが実行されるシングルトン、またはコンストラクタでadd_actionが実行される通常のクラスの場合は関係ありません。

それを機能させる方法はありますか?何がおかしいのですか?

3
NoviQ

あなたがこれを直接実行するとき、あなたは実際にそれが定義される前にadd_meta_box()関数を呼んでいます:

\ci\wp\Metaboxes::addMetabox(
    'front_page_slide_settings', 
    'Slide settings', 
    'page', 
    'normal', 
    'high'
);

どこで実行するかについては触れませんが、早すぎるか、add_meta_box()が定義されていないフロントエンドで実行します。

add_meta_box()関数はこのファイル内で定義されています。

/** WordPress Template Administration API */
require_once(ABSPATH . 'wp-admin/includes/template.php');

後で問題のあるコードを実行するようにしてください。 Metaboxes::init()呼び出し内で行うのと同様に、add_meta_boxesアクション内で。

例として、コアのinitアクションは、 テンプレート管理API がロードされる前に起動します。

4
birgire

助けてくれてありがとう。私は逃したものを正確に把握します。

私は単にadmin_initにフックされている関数内でaddMetabox静的メソッドへのすべての呼び出しをラップするのを忘れていました。私がそれをした後、すべては予想通りに動作します。 Metaboxesクラスの中でadd_meta_boxesにフックする必要さえありません。


更新:新しいメタを保存するなど他のことをすばやく行う方法を見つけるためにしばらく時間をかけた後、そのような方法を使用してそのようなことを単純化しようとすると実際にそれらがより複雑になることがわかりました。 admin_initフックにメタボックスを追加すると、その時点では投稿varにデータがないため、編集された投稿IDを確認することができません。学んだ教訓。

0
NoviQ