web-dev-qa-db-ja.com

メタボックスコールバック関数からスクリプトとスタイルをロードする

場合:

入力配列からのデータに基づいてフォームフィールドを構築する一連のクラスを得ました。このクラスは、次の種類のフォームフィールドを構築できます。

  • 入力(基本、非表示、パスワード)
  • テキストエリア
  • 無線
  • チェックボックス
  • 選択する
  • カラーピッカー
  • デートピッカー
  • ファイルアップロード

EDIT:このクラスはwp_register_script/_stylewp_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_scriptwp_enqueue_styleの呼び出しは機能しません。フォームフィールドはレンダリングされますが、スクリプトやスタイルは表示されません。

問題の状況とバックトレース:

これまでのところ、問題をワードプレスのコアアーキテクチャまで突き止めることができました。

  • do_action('add_meta_boxes', $post_type, $post)が呼ばれるまで、WPはコールバック関数の中で何が起こるのか疑問に思いません(insideedit-form-advanced.php)。
  • その呼び出しはadmin-header.phpが呼び出された(do_action('admin_enqueue_scripts', $hook_suffix);を含む)ずっと後に行われます。
  • そのため、スクリプトとスタイルはロードできません(私が間違っていない場合)。

質問:

  1. メタボックスフォームフィールドが呼び出される前にどのようにスタイルを読み込むことができますか?
  2. どのように私は同じスタイルシートを何度も何度も繰り返すのを避けることができます - 私はwp_enqueue_stylewp_register_styleを使いたいですか?

私は私のクラスアーキテクチャを書き直すことを私に強いる人を含むあらゆる答えに寛容です。

注:このクラスをさまざまなシナリオで使用する必要があるため、add_meta_box関数と一緒に閉じるためにまとめるのはよくありません。私はメタボックスとスタイル/スクリプト部分の呼び出しを分割する抽象化レイヤを作ることに近いですが、なぜ私はコア関数の上に別のレイヤを追加したいのでしょうか?

2
kaiser

あなたの問題はスクリプト、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 を作成しました。これは別のアプローチを使用します。あなたのようにフォームフィールドのフォームクラスを書く代わりに、私のクラスはメタボックスのラッパーです。で、それを見てみる価値があります。

4
Anh Tran

あなたはスクリプトを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にフックします(他のすべてのスクリプトとスタイルがエンキューされる直前に起動します)。

2
EAMann

現在の形式では、コードはオブジェクトを一種の関数呼び出しに変換します(作成され、何かをし、死にます)。そのような使い方は、オブジェクトが作成され破棄されるよりもずっと前にオブジェクトに何かをさせたいのであれば、うまくいきません。

メタボックスコンテンツの中にオブジェクトを作成する代わりに、次のようにします。

  1. 少し早くオブジェクトを作成します。
  2. スクリプトを処理するにはオブジェクトのメソッドを使います。
  3. 別のオブジェクトのメソッドをメタボックスコールバックとして使用します。
1
Rarst