truyền đối tượng / JSON cho wp_localize_script


15

Tôi đã có một đoạn javascript hoạt động có chứa một đối tượng theo nghĩa đen. Nhưng tôi cần bản địa hóa nó và tôi đang cố gắng tìm ra cách viết lại nó để tôi có thể lấy wp_localize_script () để tích lũy nó và xuất định dạng chính xác.

Phiên bản không được bản địa hóa (không động) trông như thế này:

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

Bây giờ, để có các giá trị được tạo bởi php (dựa trên một số wp_sinstall) tôi muốn sử dụng wp_localize_script, vì vậy tôi có thể lấy nó từ đó:

var layoyt_config = my_localized_data.layoyt_config;

Và để có được dữ liệu đó vào tài sản đối tượng đó, tôi nghĩ rằng tôi có thể làm điều này, nhưng rõ ràng là không:

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

Vì điều này sẽ gây ra lỗi phân tích cú pháp PHP, tôi đã cố gắng viết lại cú pháp json thành mảng, vì wp_localize_script sẽ chuyển đổi lại thành ký hiệu đối tượng, nhưng điều này cũng không hoạt động với tôi:

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

Và trong khi điều này chạy trơn tru qua trình phân tích cú pháp php, tôi không nhận được đầu ra mong đợi trong nguồn trang của mình, vì my_localized_data.layout_config trở thành Chuỗi "Mảng", đây là đầu ra:

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

Vì vậy, .. Làm thế nào tôi có thể làm điều này (hoặc tôi phải chấp nhận rằng tôi phải 'san phẳng' đối tượng của mình thành các lọ rời rạc như:

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

Câu trả lời:


15

Thật vậy, wp_localize_script()rất đơn giản , nó chỉ thêm các trích dẫn xung quanh các giá trị và thoát khỏi nội dung, hy vọng tất cả chúng là các chuỗi.

Tuy nhiên, có l10n_print_afterkhóa của mảng, sẽ được in mà không có bất kỳ sự can thiệp nào. Nó có thể được sử dụng để thực thi mã tùy ý sau khi các chuỗi được thông qua. Bạn có thể sử dụng nó để truyền dữ liệu bổ sung của bạn.

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

Bạn sẽ kết thúc với mã như thế này:

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

Rất hữu ích, mặc dù tôi nghĩ bạn có nghĩa là dấu chấm phẩy sau json_encode, không phải dấu phẩy, tôi có đúng không?
kovshenin

1
@kovshenin: Bắt tốt! Tôi đã sửa nó, nhưng nếu bạn đã đề xuất nó như là một chỉnh sửa, bạn sẽ nhận được +2 rep cho nó.
Jan Fabry

Đừng có ý định đánh cắp câu hỏi này, nhưng được đưa ra câu hỏi / câu trả lời này như một tài liệu tham khảo để xem wordpress.stackexchange.com/questions/53842 (trong trường hợp bất kỳ ai cũng có bất kỳ gợi ý nào ở đây). Cảm ơn!
Zach

1

Tuyên bố miễn trừ trách nhiệm - Tôi không hiểu sâu về công cụ bảo mật JS ở đây.

Đầu tiên, để phù hợp với đầu ra mong muốn của bạn, bạn tắt theo mức lồng nhau. Tên đối tượng đi như tham số trong cuộc gọi nội địa hóa (thay vì khóa mảng):

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

Nhưng lsrsvẫn bị hỏng vì WP_Scripts->print_scripts_l10n()phương thức không xử lý trường hợp khi biến là mảng.

Tốt nhất tôi có thể đưa ra để khắc phục bộ lọc theo sau (như trên - không chắc sẽ an toàn đến mức nào khi sử dụng nó trong sản xuất, nhưng để đưa ra ý tưởng chung):

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

Tôi hiểu rằng tên đối tượng chính là tham số 2d trong lệnh gọi wp_localize_script, nhưng, tôi đã làm điều đó, tên đối tượng được bản địa hóa của tôi được cho là 'my_localized_data', đối tượng đó sẽ có nhiều thuộc tính nhất giá trị chuỗi đơn giản, nhưng tôi cần một trong các thuộc tính này là một đối tượng đa chiều.
mikkelbreum

Điều này dường như nằm ngoài phạm vi của wp_localize_script mà không sửa đổi. Nó không thể xử lý các mảng đa chiều. Bây giờ tôi đã đưa ra một phương pháp khác, trong đó tôi lưu trữ obejct đa chiều cục bộ của mình dưới dạng giá trị html- *. Điều này hoạt động tốt, nhưng để lại câu hỏi bổ sung: wordpress.stackexchange.com/questions/8684
mikkelbreum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.