web-dev-qa-db-ja.com

ブール値とinitを持つwp_localize_script

wp_localize_scriptに問題があります。booleanintを変数として取得できません

wp_enqueue_script( 'helloworld' , 'helloworld.js', false, '1.0.0', true);

$site_config = array();

$site_config['boo'] = (bool)true;
$site_config['number'] = (int)1;

wp_localize_script( 'helloworld' , 'site_config' , $site_config );

なぜ私が手に入れたのか:

var site_config = {"boo":"1","number":"1"};

どうして:

var site_config = {"boo":true,"number":1};
  • Wordpress 4.6(最新)
  • PHP 5.6.10

修正しませんか? https://core.trac.wordpress.org/ticket/25280 、何か間違ったことや足りないことがありますか?

2
l2aelba

私はこんなに長い間やっています:

wp_add_inline_script('helloworld','var site_config ='.json_encode($site_config));
1
l2aelba

なぜの部分:

なぜの部分はWP_Scripts::localize()メソッドの中にあります:

foreach ( (array) $l10n as $key => $value ) {
    if ( !is_scalar($value) )
        continue;

    $l10n[$key] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8');
}

(string)キャストに注意してください。

回避策:

最新のパッチ は、is_scalar()is_string()に置き換え、(string)キャストを削除することを提案しています。それはうまくいくでしょう。カスタムラッパーで。しかし、コアwp_scripts()->localize()メソッドは将来変更される可能性があるので、これがここに行く方法ではないと思います。

私はまた、メソッドを通じてデータを修正するのはハックすぎると思います。

wp_scripts()->get_data( $handle, 'data' )

そして

wp_scripts()->add_data( $handle, 'data', $data )

正しく行えば、wp_scripts()->localize() ;-)のための重複したラッパーを書くことになるかもしれません。

より柔軟な回避策は、 コア関数 を使用することです。

wp_add_inline_script( $handle, $data, $position )` 

動的非文字列値を追加します。

2
birgire

ブール値がtrueの場合は常に1が返され、ブール値がfalseの場合はが返されます。 returnemptyなので、trueの場合は1になります。

以下のコードは私のローカルプロジェクトでテストされています。正確にコピー&ペースト

//Add it in **functions.php**
function load_localize_scripts() {
    wp_enqueue_script('localize_script', get_template_directory_uri() . '/js/localize_script.js', array(), '1.0.0', true );
    wp_localize_script('localize_script', 'localize_scripts_vars', array(
                        'boolean' => true, // it will return 1 
                        'integer' => 10 // it will always return integre
            )
    );
}
add_action('wp_enqueue_scripts', 'load_localize_scripts');

//Add this in **localize_script.js**
jQuery(document).ready(function() {
    var site_config;
    if (localize_scripts_vars.boolean == '1') {
        site_config = {"boolean":'true',"number":localize_scripts_vars.integer};
        console.log(site_config);
    } else if (localize_scripts_vars.boolean == '' || localize_scripts_vars.boolean == NULL) {
        site_config = {"boolean":'false',"number":localize_scripts_vars.integer};
        console.log(site_config);
    };
});

あなたもconsol結果を見ることができます
enter image description here

1
Faisal Ramzan