passa oggetto / JSON a wp_localize_script


15

Ho un pezzo funzionante di javascript che contiene un oggetto letterale. Ma devo localizzarlo e sto cercando di capire come riscriverlo in modo da poter ottenere wp_localize_script () per accedervi e produrre il formato corretto.

La versione non localizzata (non dinamica) è simile alla seguente:

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

Ora, per avere quei valori generati da php (basato su alcune impostazioni wp) voglio usare wp_localize_script, quindi posso prenderlo da lì:

var layoyt_config = my_localized_data.layoyt_config;

E per ottenere quei dati nella proprietà dell'oggetto ho pensato di poterlo fare, ma ovviamente no:

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

Poiché ciò causerà un errore di analisi PHP, ho provato a riscrivere il json nella sintassi dell'array, poiché wp_localize_script lo convertirà in notazione oggetto, ma anche questo non funziona per me:

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

E mentre questo funziona senza problemi attraverso il parser php, non ottengo l'output previsto nella mia sorgente di pagina, poiché my_localized_data.layout_config diventa una stringa "Array", ecco l'output:

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

Quindi .. Come posso fare questo (o devo solo accettare che devo 'appiattire' il mio oggetto in discreti vars come:

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

Risposte:


15

In effetti, wp_localize_script()è semplice , aggiunge solo virgolette attorno ai valori e sfugge al contenuto, aspettandosi che siano tutti stringhe.

Tuttavia, esiste la l10n_print_afterchiave dell'array, che verrà stampata senza alcuna interferenza. Può essere utilizzato per eseguire codice arbitrario dopo il passaggio delle stringhe. Puoi usarlo per trasmettere i tuoi dati extra.

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

Finirai con un codice come questo:

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

Molto utile, anche se penso che intendessi un punto e virgola dopo json_encode, non una virgola, ho ragione?
kovshenin,

1
@kovshenin: Buona cattura! L'ho corretto, ma se l'avessi proposto come una modifica avresti ottenuto +2 rep per questo.
Jan Fabry,

Non intendo dirottare questa domanda, ma è stata data questa domanda / risposta come riferimento per cercare wordpress.stackexchange.com/questions/53842 (nel caso in cui qualcuno abbia qualche puntatore qui). Grazie!
Zach,

1

Disclaimer - Sono fuori dal mio approfondimento sulle cose di sicurezza JS qui.

Innanzitutto, per abbinare l'output desiderato, il livello di annidamento viene disattivato. Il nome dell'oggetto va come parametro nella chiamata localize (anziché nella chiave dell'array):

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

Ma lse rsancora rotto a causa WP_Scripts->print_scripts_l10n()metodo non gestisce il caso quando la variabile è array.

Il meglio che potrei trovare per risolvere il seguente filtro (come sopra - non sono sicuro di quanto sarebbe sicuro usarlo in produzione, ma per dare un'idea generale):

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

Comprendo che il nome dell'oggetto principale viene inserito come parametro 2dn nella chiamata a wp_localize_script, ma, già lo faccio, il mio nome di oggetto localizzato dovrebbe essere "my_localized_data", quell'oggetto avrà una varietà di proprietà che la maggior parte di loro ha semplici valori di stringa, ma ho bisogno di una di queste proprietà per essere un oggetto multidimensionale.
mikkelbreum,

Questo sembra essere fuori dallo scopo di wp_localize_script senza modifiche. Non può gestire array multidimensionali. Ora ho escogitato un metodo diverso, in cui memorizzo il mio oggetto multidimensionale localizzato come valore html data- *. Funziona bene, ma lascia ulteriori domande: wordpress.stackexchange.com/questions/8684
mikkelbreum
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.