入力配列からのデータに基づいてフォームフィールドを構築する一連のクラスを得ました。このクラスは、次の種類のフォームフィールドを構築できます。
EDIT:このクラスはwp_register_script/_style
&wp_enqueue_script/_style
を使ってスクリプトとスタイルをロードします。アクションを含む関数は、add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue' ) );
のようにクラス内にフックされています。
(functions.php
の内側)
// meta box callback function
function test_meta_box_cb()
{
$input_args = array(
'type' => 'color'
,'id' => 'color-id'
,'label' => 'Input Colorpicker Label'
,'opt_name' => 'abc_xyz'
,'value' => '009ee0'
);
new FormClass( $input_args, true );
}
// add the meta box
function add_test_meta_box()
{
add_meta_box( 'test_box', __('TestBox'), 'test_meta_box_cb', 'post', 'advanced', 'high' );
}
add_action( 'add_meta_boxes', 'add_test_meta_box' );
このように、私のwp_enqueue_script
とwp_enqueue_style
の呼び出しは機能しません。フォームフィールドはレンダリングされますが、スクリプトやスタイルは表示されません。
これまでのところ、問題をワードプレスのコアアーキテクチャまで突き止めることができました。
do_action('add_meta_boxes', $post_type, $post)
が呼ばれるまで、WPはコールバック関数の中で何が起こるのか疑問に思いません(insideedit-form-advanced.php)。do_action('admin_enqueue_scripts', $hook_suffix);
を含む)ずっと後に行われます。wp_enqueue_style
とwp_register_style
を使いたいですか?私は私のクラスアーキテクチャを書き直すことを私に強いる人を含むあらゆる答えに寛容です。
注:このクラスをさまざまなシナリオで使用する必要があるため、add_meta_box
関数と一緒に閉じるためにまとめるのはよくありません。私はメタボックスとスタイル/スクリプト部分の呼び出しを分割する抽象化レイヤを作ることに近いですが、なぜ私はコア関数の上に別のレイヤを追加したいのでしょうか?
あなたの問題はスクリプト、styles inside を追加することです。そして、クラスインスタンスはフックadd_meta_box
が起動されたときに作成されるので、その時点ではwp_enqueue_script/style
は既に終了しています。
あなたのための解決策は、スクリプト、styles outside 関数とクラスを追加することです。メタボックスはページの編集時にのみ使用されるので、次のようにすることができます。
// the editing pages are actually post.php and post-new.php
add_action('admin_print_styles-post.php', 'custom_js_css');
add_action('admin_print_styles-post-new.php', 'custom_js_css');
function custom_js_css() {
wp_enqueue_style('your-meta-box', $base_url . '/meta-box.css');
wp_enqueue_script('your-meta-box', $base_url . '/meta-box.js', array('jquery'), null, true);
}
実際、私は メタボックスクラスWP を作成しました。これは別のアプローチを使用します。あなたのようにフォームフィールドのフォームクラスを書く代わりに、私のクラスはメタボックスのラッパーです。で、それを見てみる価値があります。
あなたはスクリプトをwp_enqueue_scripts
アクションに、そしてあなたのスタイルをwp_print_styles
アクションに本当にフックするべきです。あなたの関数の中で、実際にwp_enqueue_script()
やwp_enqueue_style()
を使う前に、自分のメタボックスを使ってページにいることを確認してください。
たとえば、私のプラグインの1つには、次のものがあります。
public static function enqueue_scripts_and_styles() {
if( is_admin() ) {
wp_enqueue_script( 'media-upload' );
wp_enqueue_script( 'thickbox' );
wp_enqueue_style( 'thickbox' );
} else {
wp_enqueue_style( 'wp-publication-archive-frontend', WP_PUB_Arch_INC_URL . '/front-end.css', '', '2.0', 'all' );
}
}
そしてそれをinit
にフックします(他のすべてのスクリプトとスタイルがエンキューされる直前に起動します)。
現在の形式では、コードはオブジェクトを一種の関数呼び出しに変換します(作成され、何かをし、死にます)。そのような使い方は、オブジェクトが作成され破棄されるよりもずっと前にオブジェクトに何かをさせたいのであれば、うまくいきません。
メタボックスコンテンツの中にオブジェクトを作成する代わりに、次のようにします。