web-dev-qa-db-ja.com

Foreachループを使ってfunction.phpにスクリプトをエンキューする最もエレガントな方法

Wp_register_scriptを実行し、ラベルとディレクトリを管理するためにforeachループを使用してエンキューする方法はあるのでしょうか。

例えば、

function wbs_app_components(){
$scripts_list=array(
            'jquery' => ToDir('/jquery/jquery.js', $LIBRARY_DIR),
            'bootstrap-jquery' => ToDir('/bootstrap/js/bootstrap.js', $LIBRARY_DIR),
    }
foreach ($scripts_list as $key => $value){
            // print_r($key);echo ("<br>");
            // print_r($value);echo ("<br><br><br>");
            wp_register_script($key,$value);
        }
}

add_action( 'wp_enqueue_scripts', 'wbs_app_components');

しかし、面白いことに、スクリプトのどれも添付されておらず、エラーも報告されていないようです。

その理由は何だろうか

1
Ezeewei

スクリプトを登録するだけでなく、スクリプトをエンキューする必要もあります。ただし、条件付きでエンキューしないのであれば、スクリプトを登録せずに単純にエンキューすることができます。

私はこのようなことを試してみたい:(テストされていないとPHP5.4 +が必要です)

add_action( 'wp_enqueue_scripts', enqueue_scripts, 11 );
function enqueue_scripts()
{
    /**
     * Build an array of scripts to enqueue
     * key = script handle
     * value = path to the script without the get_template_directory_uri()
     */
    $scripts = [
        'script-1' => '/script.1.js',
        'script-2' => '/js/script.2.js',
        'script-3' => '/subfolder/script.3.js',
    ];
    foreach ( $scripts as $k=>$v )
        wp_enqueue_script( $k, get_template_directory_uri() . $v );
}

編集

答えへのコメントへの説明として、add_action()呼び出しはどこにでも行くことができます、それは同じテンプレートにある必要さえありません。関数宣言の上または下に行くことができます。クロージャについて考えるとき、これはもっと理にかなっているので、関数の上にadd_action()呼び出しを追加することを好みます。クロージャを使うとき、上のコードはこのようになります:

add_action( 'wp_enqueue_scripts', function ()
{
    /**
     * Build an array of scripts to enqueue
     * key = script handle
     * value = path to the script without the get_template_directory_uri()
     */
    $scripts = [
        'script-1' => '/script.1.js',
        'script-2' => '/js/script.2.js',
        'script-3' => '/subfolder/script.3.js',
    ];
    foreach ( $scripts as $k=>$v )
        wp_enqueue_script( $k, get_template_directory_uri() . $v );
}, 11 );

だから、あなたはそれを理解するだけでいいのです:-)

5
Pieter Goosen

あなたのファイルを別々にエンキューしたいけれどもそれでもなおそれらを登録することができるなら(あなたはおそらく病棟の後にそれを使用したいと思う)それからこれを使用してください:

$template_directory = get_template_directory_uri();
$array_of_js_files = array( 
    array(
        'script_handle1',
        $template_directory . '/your_directory/file1.js',
        array(), //any dependency your script has
        '1.0.0', // version number 1.0.0 is an example
        true // in footer or not
    ),
    array(
        'script_handle2',
        $template_directory . '/your_directory/file2.js',
        array(),
        '1.0.0',
        true
    )
);

$array_of_css_files = array( 
    array(
        'css_handle1',
        $template_directory . '/your_directory/file1.css',
        array(), //any dependency your css file has
        '1.0.0', // version number 1.0.0 is an example
        'screen' // media
    ),
    array(
        'css_handle2',
        $template_directory . '/your_directory/file2.css',
        array(),
        '1.0.0',
        'screen'
    )
);


foreach( $array_of_js_files as $data ){
    wp_register_script( $data[0], $data[1], $data[2], $data[3], $data[4] );
    wp_enqueue_script( $data[0] );
}

// to enqueue your script or css file later simply refer to your the handle you created

foreach( $array_of_css_files as $data ){
    wp_register_style( $data[0], $data[1], $data[2], $data[3], $data[4] );
    wp_enqueue_style( $data[0] );
}

上記のコードはテストされていませんが、動作するはずです。

0
MMK