Übergeben Sie das Objekt / JSON an wp_localize_script

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... 

Solutions Collecting From Web of "Übergeben Sie das Objekt / JSON an wp_localize_script"

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