Ich habe ein funktionierendes Stück Javascript, das ein Objektliteral enthält. Aber ich muss es lokalisieren, und ich bin gerade dabei, herauszufinden, wie ich es umschreiben kann, damit ich wp_localize_script () bekommen kann, um es zu akzeptieren und das korrekte Format auszugeben.
Die nicht lokalisierte (nicht dynamische) Version sieht folgendermaßen aus:
var layoyt_config = { 'header' : 1 , 'footer' : 1 , 'ls' : {'sb1':1} , 'rs' : {'sb1':1,'sb2':1} , 'align' : 'center' };
Um nun diese Werte von PHP erzeugen zu lassen (basierend auf einigen wp_settings) möchte ich wp_localize_script verwenden, also kann ich es von dort nehmen:
var layoyt_config = my_localized_data.layoyt_config;
Und um diese Daten in die Objekteigenschaft zu bekommen, dachte ich, ich könnte das tun, aber offensichtlich nicht:
$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);
Da dies zu PHP-Parse-Fehlern führen würde, habe ich versucht, die JSON-Syntax in Array umzuschreiben, da wp_localize_script das zurück in Objekt-Notation konvertiert, aber das funktioniert auch nicht für mich:
$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);
Und während dies reibungslos durch den PHP-Parser läuft, bekomme ich nicht die erwartete Ausgabe in meiner Seitenquelle, da my_localized_data.layout_config zu einem String “Array” wird, hier ist die Ausgabe:
/* */
Also .. Wie kann ich das tun (oder muss ich einfach akzeptieren, dass ich mein Objekt in diskrete Variablen “plattmachen” muss, wie:
lc_header = '1'; ls_ls_sb1 = '1'; etc...
In der Tat ist wp_localize_script()
einfach , es fügt nur Anführungszeichen um die Werte hinzu und entkernt den Inhalt, wobei erwartet wird, dass alle Zeichenfolgen sind.
Es gibt jedoch den l10n_print_after
Schlüssel des Arrays, der ohne jegliche Interferenz gedruckt wird. Es kann verwendet werden, um beliebigen Code auszuführen, nachdem die Strings übergeben wurden. Sie können damit Ihre zusätzlichen Daten weitergeben.
$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);
Sie werden mit Code wie folgt enden:
var my_localized_data = {}; // What is left of your array my_localized_data = {'layout_config': {'ls': {'sb1': 1}}}; // From l10n_print_after
Disclaimer – Ich bin in Sachen JS-Sicherheitsfragen hier völlig unerfahren.
Um die gewünschte Ausgabe zu erreichen, müssen Sie zunächst die Schachtelungsstufe wählen. Der Objektname wird als Parameter beim Aufruf von localize verwendet (anstelle des Array-Schlüssels):
$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);
Aber ls
und rs
sind immer noch kaputt, weil die WP_Scripts->print_scripts_l10n()
-Methode den Fall nicht behandelt, wenn die Variable array ist.
Am besten könnte ich damit anfangen, das zu beheben, das folgt Filter (wie oben – nicht sicher, wie sicher wäre, es in der Produktion zu verwenden, aber um eine allgemeine Idee zu geben):
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; }