WordPress đang thoát khỏi dấu gạch chéo ngược từ chuỗi JSON trong post_meta


11

Tôi nghĩ rằng tôi đang làm cho cuộc sống của mình trở nên dễ dàng và có ý thức trong tương lai bằng cách lưu một số nội dung dưới dạng các bit của JSON trong các trường post_meta tùy chỉnh. Thật không may, WordPress không đồng ý và làm cho cuộc sống của tôi vô cùng khó khăn.

Tôi có một chuỗi JSON trông giống như thế này. Đây chỉ là một bit và chuỗi nhận xét chỉ là một số thực thể unicode giả. Toàn bộ điều được tạo ra w / json_encode .

{
    "0": {
        "name": "Chris",
        "url": "testdomain.com",
        "comment": "\u00a5 \u00b7 \u00a3 \u00b7 \u20ac \u00b7 \u00b7 \u00a2 \u00b7 \u20a1 \u00b7 \u20a2 \u00b7 \u20a3 \u00b7 \u20a4 \u00b7 \u20a5 \u00b7 \u20a6 \u00b7 \u20a7 \u00b7 \u20a8 \u00b7 \u20a9 \u00b7 \u20aa \u00b7 \u20ab \u00b7 \u20ad \u00b7 \u20ae \u00b7 \u20af \u00b7 \u20b9"
    }
}

Thật không may sau khi tôi lưu nó với update_post_meta, nó xuất hiện như thế này:

{
    "0": {
        "name": "Chris",
        "url": "testdomain.com",
        "comment": "u00a5 u00b7 u00a3 u00b7 u20ac u00b7 u00b7 u00a2 u00b7 u20a1 u00b7 u20a2 u00b7 u20a3 u00b7 u20a4 u00b7 u20a5 u00b7 u20a6 u00b7 u20a7 u00b7 u20a8 u00b7 u20a9 u00b7 u20aa u00b7 u20ab u00b7 u20ad u00b7 u20ae u00b7 u20af u00b7 u20b9"
    }
}

Và với các dấu gạch chéo bị tước, nó không thể json_decodequay lại nội dung hữu ích.

Bất kỳ ý tưởng tại sao WordPress có thể làm điều này, và nếu có một cách để tránh nó? Tôi không thể sử dụng cờ JSON_UNESCAPED_UNICODE vì đây là bản cài đặt PHP 5.3.x và tôi đã thử mã hóa htmlentitiestrước khi nội dung được chuyển đến json_encode, nhưng chỉ thu được một tập hợp con nhỏ của các thực thể UTF-8.

Cảm ơn trước!

(EDIT: FWIW, tôi biết rằng tôi chỉ có thể lưu một mảng trực tiếp vào post_meta và nó sẽ được tuần tự hóa và điều kỳ diệu sẽ xảy ra nhưng tôi chỉ thích ý tưởng lưu trữ dữ liệu dưới dạng JSON. Nếu không có giải pháp đơn giản, thanh lịch tôi sẽ hang động, nhưng tôi rất hy vọng có được một giải pháp thanh lịch dễ dàng!)

Câu trả lời:


8

Không có vẻ như có cách nào để tránh nó.

Hàm update_metadata (), chịu trách nhiệm chính trong việc lưu meta, rõ ràng chạy một dải slslash_deep () trên giá trị meta. Hàm này thậm chí sẽ tước các dấu gạch chéo từ các phần tử mảng, nếu giá trị là một mảng.

Có một bộ lọc chạy SAU gọi là sanitize_meta, mà bạn có thể nối vào. Nhưng tại thời điểm đó, dấu gạch chéo của bạn đã bị tước, do đó bạn không thể xác định một cách đáng tin cậy nơi chúng cần được thêm lại (hoặc ít nhất, tôi không biết bạn sẽ nói sự khác biệt như thế nào khi trích dẫn các dấu phân cách JSON hợp pháp so với bit của các giá trị).

Không thể nói lý do tại sao nó làm điều này, nhưng nó làm. Có lẽ bởi vì cuối cùng nó cũng chạy qua bản cập nhật wpdb->, cần các chuỗi không được thoát.

Như bạn sợ, có lẽ tốt hơn hết là bạn chỉ lưu trữ giá trị dưới dạng một mảng, sẽ được tuần tự hóa (như bạn đã nói). Nếu bạn muốn nó là JSON sau này, bạn có thể chạy nó thông qua json_encode ().


Tôi sợ điều đó, nhưng thật tốt khi biết tại sao nó lại xảy ra. Cảm ơn rất nhiều cho các phản ứng nhanh chóng!
Chris Van Patten

Điều này cũng không đúng, xem các câu trả lời khác :)
jave.web

@ jave.web Đúng là bạn không thể tránh việc update_metadata () chạy các dấu gạch chéo trên chuỗi của bạn. Các câu trả lời khác cung cấp cách giải quyết (rất thông minh) về cơ bản là "thoát kép" chuỗi của bạn, để việc bóc tách không thể tránh khỏi sẽ loại bỏ các dấu gạch chéo đó nhưng vẫn giữ nguyên dấu gạch chéo ban đầu của bạn. Cá nhân tôi vẫn nói rằng cách "thanh lịch" để xử lý việc này là chỉ lưu trữ dữ liệu trong một mảng, không yêu cầu xử lý đặc biệt hoặc định dạng trước. Sau đó chuyển đổi nó thành json nếu và khi bạn cần. Nhưng đó chỉ là sở thích của tôi.
MathSmath

25

Có một cách thanh lịch để xử lý việc này!

Truyền chuỗi mã hóa JSON qua wp_slash(). Hàm đó sẽ thoát khỏi dấu gạch chéo hàng đầu của mỗi ký tự unicode được mã hóa, điều này sẽ ngăn không update_metadata()cho chúng tước.


Đây là một cách giải quyết cho một lỗi Wordpress nghiêm trọng. Cảm ơn rất nhiều!
netAction

2
Đây phải là câu trả lời được chấp nhận. Tôi gặp vấn đề với nội dung được nhập từ GitHub thông qua wp_insert_post trong đó đây là vấn đề chính khi xóa dấu gạch chéo khỏi các mẫu mã. Chạy chuỗi thông qua wp_slash trước khi gửi nó qua wp_insert_post đã thực hiện thủ thuật. Cảm ơn!
Matt Keys

Điều này vẫn còn hữu ích cho đến ngày hôm nay, tôi đã mất hàng giờ để tìm cách giải quyết cho việc này mà không có một manh mối nào cho đến khi tôi tìm thấy điều này. Nếu bạn muốn thêm câu trả lời này vào câu hỏi của tôi ở đây: stackoverflow.com/questions/61091853/ thì tôi sẽ đánh dấu nó là câu trả lời đúng. Cảm ơn bạn rất nhiều!
Jaypee

4

Bạn có thể gian lận để wordpress với một cái gì đó như thế này:

$cleandata = str_replace('\\', '\\\\', json_encode($customfield_data, true));

Đây rằng dễ dàng * giải pháp thanh lịch * ...


+1 Điều này đã tạo ra mánh khóe cho tình huống của tôi. nó khác một chút so với OP, nhưng tương tự.
Adam Spriggs

2

Hàm này thực hiện chuyển đổi bằng cách sử dụng preg numplace:

function preg_replace_add_slash_json($value) {
    return preg_replace('/(u[0-9a-fA-F]{4})/i', '\\\$1', $value);
}

Trước mỗi chuỗi "uXXXX" (X = 0..F, thập lục phân), nó thêm dấu gạch chéo ngược. Trước khi gửi DB, hãy gọi hàm này.


1

Một cách thú vị xung quanh điều này là mã hóa vào base64 xem ví dụ bên dưới.

$data = Array(0 => array('name' => 'chris' , 'URL' => "hello.com"));

$to_json = json_encode($data);

echo $to_json  . "<br />";
//echos [{"name":"chris","URL":"hello.com"}] 

$to_base64 =  base64_encode($to_json);

Echo $to_base64 . "<br />";
//echos W3sibmFtZSI6ImNocmlzIiwiVVJMIjoiaGVsbG8uY29tIn1d

$back_to_json =  base64_decode($to_base64);

Echo $back_to_json . "<br />";
//echos [{"name":"chris","URL":"hello.com"}]

$back_to_aray = json_decode($back_to_json);

print_r($back_to_aray) ;
//echos  Array ( [0] => stdClass Object ( [name] => chris [URL] => hello.com ))

1

Đối với bất kỳ ai vẫn đang vật lộn với việc lưu chuỗi unicode được mã hóa json thông qua wp_update_post , việc sau đây đã giúp tôi. Tìm thấy trong class-wp-rest-post-controller.php

// convert the post object to an array, otherwise wp_update_post will expect non-escaped input.
wp_update_post( wp_slash( (array) $my_post ) ); 

Đây là một ví dụ:

$objectToEncodeToJson = array(
  'my_custom_key' => '<div>Here is HTML that will be converted to Unicode in the db.</div>'
);

$postContent = json_encode($objectToEncodeToJson,JSON_HEX_TAG|JSON_HEX_QUOT);

$my_post = array(
  'ID'           => $yourPostId,
  'post_content' => $postContent
);

wp_update_post( wp_slash( (array) $my_post ) );

-1

Bạn có thể sử dụng hàm WordPress strslashes_deep ().

<?php stripslashes_deep($your_json);?>

Để tham khảo tại đây


BARBJANE'svẫn được gửi từ WordPress BARBJANE\'strừ khi tôi thiếu thứ gì đó ở đây ...
Si8
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.