カスタムテーマを作成しています。管理パネルでメタボックスの作成を処理するためのヘルパークラスを作成したいと思います。私のクラスはこのように宣言されています:
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が実行される通常のクラスの場合は関係ありません。
それを機能させる方法はありますか?何がおかしいのですか?
あなたがこれを直接実行するとき、あなたは実際にそれが定義される前に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 がロードされる前に起動します。
助けてくれてありがとう。私は逃したものを正確に把握します。
私は単にadmin_init
にフックされている関数内でaddMetabox
静的メソッドへのすべての呼び出しをラップするのを忘れていました。私がそれをした後、すべては予想通りに動作します。 Metaboxesクラスの中でadd_meta_boxes
にフックする必要さえありません。
更新:新しいメタを保存するなど他のことをすばやく行う方法を見つけるためにしばらく時間をかけた後、そのような方法を使用してそのようなことを単純化しようとすると実際にそれらがより複雑になることがわかりました。 admin_initフックにメタボックスを追加すると、その時点では投稿varにデータがないため、編集された投稿IDを確認することができません。学んだ教訓。