我正在一个WooCommerce网站上工作,我的所有jQuery都在脚本标记的页脚中。我使用PHP筛选出任何特定页面所需的脚本。
但是,我想使用建议的使用wp\\u enqueue\\u脚本加载jquery的方法。问题是,除非我使用wp_localize_script
, 哪种方法有效。。。。主要地
我在函数中调用排队。php使用wp\\u enqueue\\u脚本挂钩,但在注册脚本时,某些php变量不可用。有些全局变量是,但当我尝试通过访问它们时,我的一些自定义变量是空的,这些自定义变量是在下面定义的localize_script
.
我希望这有点道理?如果是这样,我将如何正确地进行这项工作?
例如,假设一些PHP变量是在特定的页面模板中定义的。如果我使用上面提到的钩子将脚本排队,则无法访问这些变量。如何将能够访问页面上定义的所有PHP变量的脚本排入队列?
实际代码有点复杂,所以我会尽量简化:-
在我的功能中。php我有以下内容:-
function wp_enqueue_woocommerce_style(){
$array = array(
"var1" => <?php echo $var1 ?>,
"var2" => <?php echo $var2 ?>
);
wp_register_script(\'chroma_js\', get_template_directory_uri() . \'/js/chroma.js\', \'\', \'1.1\', TRUE);
wp_enqueue_script(\'chroma_js\');
wp_localize_script( "chroma_js", "php_vars", $array);
}
add_action( \'wp_enqueue_scripts\', \'wp_enqueue_woocommerce_style\',99 );
将我的脚本排入页脚。然而,这两个PHP变量是在我挂接到“woocommerce\\u before\\u single\\u product”的函数中定义的。当我尝试访问var1时(&A);var2在我的脚本中,它们没有定义。调用排队时已经定义的所有PHP变量都可以正常工作。因此,我不知道如何将这些变量传递给排队的脚本。
最合适的回答,由SO网友:Milo 整理而成
如果要在页脚中输出脚本,可以调用wp_localize_script
在脚本排队之后但在脚本输出之前的任何时间点wp_footer
优先级20。
function wp_enqueue_woocommerce_style(){
wp_enqueue_script(
\'chroma_js\',
get_template_directory_uri() . \'/js/chroma.js\',
\'\',
\'1.1\',
true
);
}
add_action( \'wp_enqueue_scripts\', \'wp_enqueue_woocommerce_style\' );
function wp_localize_woocommerce_style(){
$array = array(
\'var1\' => $var1,
\'var2\' => $var2
);
wp_localize_script( \'chroma_js\', \'php_vars\', $array );
}
add_action( \'wp_footer\', \'wp_localize_woocommerce_style\', 0 );
SO网友:Vasim Shaikh
<?php
// Register the script
wp_register_script( \'some_handle\', \'path/to/myscript.js\' );
// Localize the script with new data
$translation_array = array(
\'some_string\' => __( \'Some string to translate\', \'plugin-domain\' ),
\'a_value\' => \'10\'
);
wp_localize_script( \'some_handle\', \'object_name\', $translation_array );
// Enqueued script with localized data.
wp_enqueue_script( \'some_handle\' );
您可以访问JavaScript中的变量,如下所示:
<script>
// alerts \'Some string to translate\'
alert( object_name.some_string);
</script>
Note: The data in the resulting JavaScript call will be passed as text (see ticket #25280). If you are trying to pass integers you will need to call the JavaScript parseInt() function.
<script>
// Call a function that needs an int.
FinalZoom = map.getBoundsZoomLevel( bounds ) - parseInt( object_name.a_value, 10 );
</script>