Wp_localize_scriptにブール値を渡すための最善の方法は、すべてが文字列として解釈されるのを見ることができるからです。
プラグイン用のバックエンドユーザーオプションフォームがあります。値が返されたときにjQueryスクリプトに使用しています。そのうちの1つはブール値です。ブール値) "true"または "false"の場合、スクリプト内のそのパラメータは失敗します。
<?php
$options = get_option('ng_slicknavmenu');
// Add PHP plugin variables to the $params[] array to pass to jQuery
$data = array (
'ng_slicknav_menu' => $options['ng_slicknav_menu'],
'ng_slicknav_parent_links' => $options['ng_slicknav_parent_links'], // this is a boolean true/false
'ng_slicknav_speed' => $options['ng_slicknav_speed'] ,
);
// Pass PHP variables to jQuery script
wp_localize_script( 'slickinit', 'phpVars', $data );
これが私のjs initファイルで今やっている方法です
if( phpVars.ng_slicknav_parent_links === "true" )
$links = true;
else
$links = false;
jQuery(document).ready(function($){
ng_slicknav_speedInt = parseInt(phpVars.ng_slicknav_speed, 10);
jQuery(document).ready(function($) {
$(phpVars.ng_slicknav_menu).slicknav({
allowParentLinks: $links,
duration:ng_slicknav_speedInt,
});
});
});
しかしもっと良い方法はありますか?
からいくつかの解決策を試してみました。wp_localize_script でブール値を渡す.
'ng_slicknav_parent_links' => ($options['ng_slicknav_parent_links']) ? true : false,
そして
'ng_slicknav_parent_links' => (bool)$options['ng_slicknav_parent_links'],
しかし、答えはうまくいきません。両方に対する答えは、両方の値に対して不正確な "1"の文字列をもたらします。
残念ながら、wp_localize_script()
は渡された配列内のすべてのスカラー(単純型)を文字列にキャストし(そしてそれらに対してhtml_entity_decode()
を実行しますか?)、そのため、引用符で囲まれた回答で言及されたキャストは文字列化された "1"/""になります。真偽値、整数なら文字列。正確な値を要求するJavaScriptプラグインでは動作しません。
これを回避するには、引数を渡された配列内の配列に格納してください。そうすれば引数は乱されません。
$data = array (
'ng_slicknav' => array(
'menu' => $options['ng_slicknav_menu'],
'parent_links' => (bool) $options['ng_slicknav_parent_links'],
'speed' => (int) $options['ng_slicknav_speed'] ,
),
);
そして、あなたはそれらをあなたのJavaScriptで直接参照することができます。
jQuery(document).ready(function($) {
$(phpVars.ng_slicknav.menu).slicknav({
allowParentLinks: phpVars.ng_slicknav.parent_links,
duration:phpVars.ng_slicknav.speed,
});
});