オブジェクト/ JSONをwp_localize_scriptに渡す


15

オブジェクトリテラルを含むjavascriptの作業部分があります。しかし、ローカライズする必要があります。wp_localize_script()を取得して正しいフォーマットを出力できるように、それを書き換える方法を模索しています。

ローカライズされていない(動的ではない)バージョンは次のようになります。

var layoyt_config = {
    'header'        : 1 
,   'footer'        : 1
,   'ls'            : {'sb1':1}
,   'rs'            : {'sb1':1,'sb2':1}
,   'align'         : 'center'
};  

さて、これらの値をphpで生成するには(いくつかのwp_settingsに基づいて)wp_localize_scriptを使用したいので、そこから取得できます。

var layoyt_config = my_localized_data.layoyt_config;

そして、そのオブジェクトプロパティにそのデータを取得するために、私はこれを行うことができましたが、明らかにそうではありませんでした。

$data = array(
    'layout_config' => {
        'header' : 1
    ,   'footer' : 1
    ,   'ls' : {'sb1': 1}
    ,    'rs' : {'sb1': 1,'sb2': 1}
    ,    'align' : 'center'
    }
);
wp_localize_script('my-script-handle', 'my_localized_data', $data);

これによりPHPの解析エラーが発生するので、wp_localize_scriptがそれをオブジェクト表記に変換するため、jsonを配列構文に書き直そうとしましたが、これもうまくいきません:

$data = array(
    'layout_config' => array(
        'header' => 1
    ,   'footer' => 1
    ,   'ls' => array('sb1'=>1)
    ,    'rs' => array('sb1'=>1,'sb2'=>1)
    ,    'align' => 'center'
    )
);
wp_localize_script('my-script-handle', 'my_localized_data', $data);

そして、これはphpパーサーを通じてスムーズに実行されますが、my_localized_data.layout_configが文字列「配列」になるため、ページソースで期待される出力が得られません。出力は次のとおりです。

<script type='text/javascript'>
    /* <![CDATA[ */
    var wpkit_localized_data = {
    layout_config: "Array"
    };
    /* ]]> */
</script>

だから..これを行うにはどうすればよいですか(または、オブジェクトを次のような離散変数に「フラット化」する必要があることを受け入れる必要がありますか?

lc_header = '1';
ls_ls_sb1 = '1';
etc...

回答:


15

実際、wp_localize_script()シンプルで、値の周りに引用符を追加し、コンテンツをエスケープします。すべてが文字列であると想定しています。

ただし、l10n_print_after配列のキーがあり、干渉することなく印刷されます。文字列が渡された後、任意のコードを実行するために使用できます。これを使用して、追加のデータを渡すことができます。

$data = array(
    'layout_config' => {
      'ls' : {'sb1': 1}
    }
);
$reshuffled_data = array(
    'l10n_print_after' => 'my_localized_data = ' . json_encode( $data ) . ';'
);
wp_localize_script('my-script-handle', 'my_localized_data', $reshuffled_data);

次のようなコードになります。

var my_localized_data = {}; // What is left of your array
my_localized_data = {'layout_config': {'ls': {'sb1': 1}}}; // From l10n_print_after

非常に便利ですが、コンマではなくjson_encodeの後にセミコロンを意味すると思いますが、正しいですか?
コブシェニン

1
@kovshenin:良いキャッチ!私はそれを修正しましたが、編集として提案したなら、あなたはそれに対して+2の担当者を得たでしょう。
ヤンファブリー

この質問をハイジャックするつもりはありませんが、この質問/回答は、wordpress.stackexchange.com / questions / 53842を参照するためのリファレンスとして提供されました(誰かがここにポインタを持っている場合)。ありがとう!
ザック

1

免責事項-私はここでJSセキュリティに関することを深く考えていません。

まず、目的の出力に一致させるために、ネストレベルを設定します。オブジェクト名は、(配列キーの代わりに)ローカライズ呼び出しのパラメーターとして使用されます。

$data = array(
        'header' => 1
    ,   'footer' => 1
    ,   'ls' => array('sb1'=>1)
    ,    'rs' => array('sb1'=>1,'sb2'=>1)
    ,    'align' => 'center'
);
wp_localize_script('my-script-handle', 'layout_config', $data);

しかしls、メソッドは変数が配列の場合を処理しないrsため、まだ壊れWP_Scripts->print_scripts_l10n()ています。

次のフィルタを修正するために私が思いつくことができたのは最高です(上記のように-本番でそれを使用することがどれほど安全かはわかりませんが、一般的なアイデアを与えるため):

add_filter('js_escape','js_escape_nested', 10, 2);

function js_escape_nested($safe_text, $text) {

     if(is_array($text) )
         return str_replace( '"', "'", json_encode ($text) );

     return $safe_text;
}

メインオブジェクト名はwp_localize_scriptの呼び出しの2dnパラメーターとして入力されることを理解していますが、すでにそれを行っています。ローカライズされたオブジェクト名は「my_localized_data」であると想定され、プレーン文字列値ですが、これらのプロパティの1つが多次元オブジェクトである必要があります。
mikkelbreum

これは、変更せずにwp_localize_scriptの範囲外にあるようです。多次元配列を処理できません。これで、ローカライズされた多次元オブジェクトをhtml data- *値として保存する別の方法を思いつきました。これは正常に機能しますが、追加の質問を残します:wordpress.stackexchange.com/questions/8684
mikkelbreum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.