Một cải tiến nhỏ khác từ câu trả lời của @sMyles.
Tôi đã có trường hợp ID được lưu trữ cả dưới dạng chuỗi (chẳng hạn như khi được lấy từ đầu vào biểu mẫu) và dưới dạng số nguyên (ví dụ update_post_meta($post_id, authorized_users', array(get_current_user_id()));
). Đây giống như vấn đề nổi tiếng với việc wp_set_object_terms()
bạn có thể sử dụng ID thuật ngữ để đặt điều khoản, nhưng nếu bạn không đặt chúng dưới dạng số nguyên thì trước tiên bạn có khoảng 50% khả năng tạo thuật ngữ mới với các số đó làm tên của chúng thay thế.
Điều này có thể dẫn đến việc chúng được lưu trữ khá khác nhau trong một mảng được tuần tự hóa, như có thể thấy từ các trích đoạn của một trường hợp như vậy từ cơ sở dữ liệu của trang web thử nghiệm của tôi:
a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes
Cả hai điều trên, khi được cho ăn qua print_r()
sẽ hiển thị như
Array
(
[0] => 1
)
Để khắc phục điều này, tôi đã thực hiện một điều chỉnh nhỏ meta_query
bằng cách thêm một relation
và một phiên bản khác của truy vấn chuyển giá trị dưới dạng số nguyên thay vì chuỗi.
Đây là kết quả cuối cùng:
'meta_query' => array(
'relation' => 'OR', // Lets it know that either of the following is acceptable
array(
'key' => 'bcm_enm_authorized_users',
'value' => serialize(strval(get_current_user_id())), // Saved as string
'compare' => 'LIKE'
),
array(
'key' => 'bcm_enm_authorized_users',
'value' => serialize(intval(get_current_user_id())), // Saved as integer
'compare' => 'LIKE'
),
),
EDIT: Chỉ cần nhận ra rằng phương pháp này có thể có nguy cơ va chạm với các chỉ mục mảng, điều này có thể cho phép ai đó truy cập bất hợp pháp vào tài liệu nếu chúng không nằm trong mảng, nhưng ID người dùng của chúng xuất hiện dưới dạng chỉ mục. Như vậy, trong khi điều này hoạt động nếu bạn có vấn đề được thảo luận, thực tế tốt hơn là đảm bảo rằng bất kỳ giá trị nào bạn muốn tìm kiếm đều được truyền dưới dạng chuỗi trước khi lưu chúng để bạn có thể sử dụng phương pháp @sMstyle '.