回答:
さて、あなたはwp_localize_script()を持っていますが、それはデータを渡すためだけのものです。
そうでなければ、これを行うことができます:
function print_my_inline_script() {
if ( wp_script_is( 'some-script-handle', 'done' ) ) {
?>
<script type="text/javascript">
// js code goes here
</script>
<?php
}
}
add_action( 'wp_footer', 'print_my_inline_script' );
アイデアは、あなたがあなたのインラインスクリプトが印刷されているに頼るべきではないということですまさにそれは後でに依存しますが、スクリプトの後。
wp_add_inline_script()
ワードプレスjQueryを使ってwp_add_inline_script
インラインスクリプトにしないで、動的パラメーターを変数として渡します。Ottoは、これを効果的に行うための優れたガイドを作成しました。
WordPress 3.3はこれをさらに強力にします:https : //core.trac.wordpress.org/ticket/11520
この解決策は@scribuの回答に似ていますが、の形式に従い、wp_enquque_script()
依存関係がヘッダーに含まれている場合、ヘッダーにスクリプトを配置します。
/**
* Enqueue inline Javascript. @see wp_enqueue_script().
*
* KNOWN BUG: Inline scripts cannot be enqueued before
* any inline scripts it depends on, (unless they are
* placed in header, and the dependant in footer).
*
* @param string $handle Identifying name for script
* @param string $src The JavaScript code
* @param array $deps (optional) Array of script names on which this script depends
* @param bool $in_footer (optional) Whether to enqueue the script before </head> or before </body>
*
* @return null
*/
function enqueue_inline_script( $handle, $js, $deps = array(), $in_footer = false ){
// Callback for printing inline script.
$cb = function()use( $handle, $js ){
// Ensure script is only included once.
if( wp_script_is( $handle, 'done' ) )
return;
// Print script & mark it as included.
echo "<script type=\"text/javascript\" id=\"js-$handle\">\n$js\n</script>\n";
global $wp_scripts;
$wp_scripts->done[] = $handle;
};
// (`wp_print_scripts` is called in header and footer, but $cb has re-inclusion protection.)
$hook = $in_footer ? 'wp_print_footer_scripts' : 'wp_print_scripts';
// If no dependencies, simply hook into header or footer.
if( empty($deps)){
add_action( $hook, $cb );
return;
}
// Delay printing script until all dependencies have been included.
$cb_maybe = function()use( $deps, $in_footer, $cb, &$cb_maybe ){
foreach( $deps as &$dep ){
if( !wp_script_is( $dep, 'done' ) ){
// Dependencies not included in head, try again in footer.
if( ! $in_footer ){
add_action( 'wp_print_footer_scripts', $cb_maybe, 11 );
}
else{
// Dependencies were not included in `wp_head` or `wp_footer`.
}
return;
}
}
call_user_func( $cb );
};
add_action( $hook, $cb_maybe, 0 );
}
// Usage
enqueue_inline_script('test','alert(\'enqueue inline script test\');',array( 'jquery'));
注:これは匿名関数の使用を使用しますが、5.3より前のバージョンのPHPでは、これをクラスに簡単に変換できます。
WordPress 4.5以降ではwp_add_inline_script()を使用できます:
add_action( 'wp_enqueue_scripts', 'cyb_enqueue_scripts' );
function cyb_enqueue_scripts() {
wp_enqueue_script( 'myscript', 'url/to/myscript.js', array(), '1.0' );
wp_add_inline_script( 'myscript', 'Your inline javascript code gos here' );
}
私が見つけたより良い方法はwp_localize_script()
、@ scribuが示唆したように、を使用することです。
通常、スクリプトにPHP変数を提供する必要があるため、インラインJavascriptを使用することにしました。これはで解決できますwp_localize_script()
。例を示します。
$aFoo
いくつかのオプションを持つ配列があり、スクリプトに渡す必要があります。
$aFoo = array( 'option1' => $option1Value, 'option2' => $option2Value );
インラインスクリプトの使用:
<script>
var oFoo = {};
oFoo.option1 = <?php echo $aFoo['option1'] ?>;
oFoo.option2 = <?php echo $aFoo['option2'] ?>;
//do some stuff with oFoo
</script>
を使用してwp_localize_script()
:
wp_register_script( 'script_name', 'pathToScript/script.js', array( 'jquery' )); //if jQuery is not needed just remove the last argument.
wp_localize_script( 'script_name', 'object_name', $aFoo ); //pass 'object_name' to script.js
wp_enqueue_script( 'script_name' );
次に、次のpathToScript/script.js
ようになります。
var oFoo = {};
oFoo.option1 = object_name.option1;
oFoo.option2 = object_name.option2;
//do some stuff with oFoo (no PHP needed)
この方法では、インラインスクリプトはもう必要ありません。
スクリブは絶対に正しいです。とにかく、私はいくつかの情報を追加したい:
呼び出される頻度に関係なく、関数にスクリプトを1回出力させたい。これはコンテンツ関連の関数なので、フックを待つことはできません。私はこれを考え出すためにscribusの情報とWPコアのいくつかの読書を使用しました
function print_script_once() {
if(!wp_script_is('my-handle', 'done')) {
echo "<script>alert('once!');</script>";
global $wp_scripts;
$wp_scripts->done[] = 'my-handle';
}
}
add_action('get_footer', print_script_once);
この方法を使用すると、インラインスクリプトを1回印刷できます。私の場合、共有ボタンを作成する関数があり、すべてのボタンに対して1つのスクリプトを実行する必要があります。しかし、一度だけ。
echo
インラインスクリプトのアプローチは、二十セブンティーンのテーマは、少なくとも一点で、構築された方法です。そして、私もこのテクニックを使用しています。うまく機能し、さまざまな場所にフックすることができます。