nesneyi / JSON'u wp_localize_script'e geçir


15

Bir nesne hazır bilgisi içeren bir çalışma javascript var. Ama ben yerelleştirmek gerekir ve ben accp için wp_localize_script () almak ve doğru biçimi çıktı böylece yeniden yazmak nasıl anlamaya ytrying.

Yerelleştirilmemiş (dinamik olmayan) sürüm şöyle görünür:

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

Şimdi, php (bazı wp_settings dayalı) tarafından oluşturulan bu değerleri olması için ben oradan alabilir, böylece wp_localize_script kullanmak istiyorum:

var layoyt_config = my_localized_data.layoyt_config;

Ve bu veriyi o nesne özelliğine almak için bunu yapabileceğimi düşündüm, ama belli ki:

$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);

Bu PHP ayrıştırma hatasına neden olacağı için, wp_localize_script bunu nesne gösterimine dönüştürecek şekilde json'u dizi sözdizimine yeniden yazmaya çalıştım, ama bu da benim için çalışmıyor:

$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);

Ve bu php ayrıştırıcı rağmen sorunsuz çalışır, my_localized_data.layout_config bir String "Array" haline gelir gibi, benim sayfa kaynağında beklenen çıktı almıyorum, İşte çıktı:

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

Peki .. Bunu nasıl yapabilirim (ya da sadece nesnemi 'gibi farklı değişkenlere' düzleştirmem 'gerektiğini kabul etmek zorunda mıyım:

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

Yanıtlar:


15

Gerçekten de, wp_localize_script()basittir , sadece değerlerin etrafına tırnak ekler ve içerikten kaçar ve hepsinin dize olmasını bekler.

Bununla birlikte, l10n_print_afterdizinin herhangi bir parazit olmadan yazdırılacak anahtarı vardır . Dizeler geçtikten sonra rasgele kod yürütmek için kullanılabilir. Ekstra verilerinizi iletmek için kullanabilirsiniz.

$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);

Bunun gibi bir kodla karşılaşacaksınız:

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

Çok yararlı, ben virgül değil, json_encode sonra bir noktalı virgül demek düşünüyorum rağmen, ben doğru mu?
kovshenin

1
@kovshenin: İyi yakaladın! Ben düzelttim, ama bir düzenleme olarak teklif olsaydı bunun için +2 temsilcisi alırsınız.
Jan Fabry

Bu soruyu kaçırmak istemeyin, ancak bu soru / cevaba wordpress.stackexchange.com/questions/53842 (burada herkesin işaretçisi varsa) aramak için bir referans olarak verildi . Teşekkürler!
Zach

1

Feragatname - JS güvenlik konularında derinliğim dışındayım.

İlk olarak, istediğiniz çıktıyı eşleştirmek için yuvalama düzeyine göre kapalısınız. Nesne adı, yerelleştirme çağrısında parametre olarak gider (dizi anahtarı yerine):

$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);

Ancak değişken hala dizi olduğunda yöntem işlemez, çünkü lsve rshala kırık WP_Scripts->print_scripts_l10n().

En iyisi, aşağıdaki filtreyi düzeltmek için gelebilir (yukarıdaki gibi - üretimde kullanmak için ne kadar güvenli olacağından emin değilim, ancak genel fikir vermek için):

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;
}

Ana nesne adının wp_localize_script çağrısında 2dn parametresi olarak gittiğini anlıyorum, ancak bunu zaten yapıyorum, yerelleştirilmiş nesne adımın 'my_localized_data' olması gerekiyordu, bu nesnenin çoğu sahip olduğu çeşitli özelliklere sahip olacak düz dize değerleri, ancak çok boyutlu bir nesne olarak bu özelliklerden birine ihtiyacım var.
mikkelbreum

Bu, değişiklik yapılmadan wp_localize_script kapsamı dışında görünüyor. Çok boyutlu dizileri işleyemez. Şimdi farklı bir yöntemle geldim, burada localazed çok boyutlu obejct'imi html data- * değeri olarak saklıyorum. Bu iyi çalışıyor, ancak ek sorular bırakın: wordpress.stackexchange.com/questions/8684
mikkelbreum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.