web-dev-qa-db-ja.com

どこのようにしてwp_localize_scriptにボール値を渡ろうか

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"の文字列をもたらします。

2
neilgee

残念ながら、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,
    });
});
5
bonger