Làm cách nào tôi có thể tạo meta_query với một mảng là meta_field?


16

Dưới đây là các đối số cho truy vấn của tôi:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
        )
    )
);

Điều này hoạt động khi topicslà một chuỗi, nhưng không phải khi nó là một mảng. Tôi muốn truy vấn này hoạt động khi topicslà ví dụarray( 'sports', 'nonprofit', etc. )

Có cách nào để xây dựng các truy vấn meta với mảng là meta_key không?


Hãy làm rõ - bạn có nghĩa là giá trị được lưu trữ của "chủ đề" là một mảng? Hoặc giá trị được lưu trữ là một chuỗi và bạn muốn chuyển nhiều thuật ngữ cho truy vấn trong một mảng?
MathSmath

@MathSmath, ý tôi là giá trị được lưu trữ là một mảng.
mike23

Câu trả lời:


30

Cung cấp cho truy vấn một mảng các giá trị có thể

Nếu giá trị trong cơ sở dữ liệu là một chuỗi và bạn muốn cung cấp truy vấn một số giá trị:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => array ( 'sports', 'nonprofit', 'community' ),
            'compare' => 'IN'
        )
    )
);

Tìm kiếm một giá trị cụ thể trong một mảng dữ liệu được tuần tự hóa

Nếu giá trị trong cơ sở dữ liệu là một mảng của một số chủ đề và bạn muốn tìm kiếm một chủ đề trong mảng đó (Lưu ý rằng một mảng trong cơ sở dữ liệu có thể được truy xuất như vậy, nhưng nằm trong cơ sở dữ liệu ở dạng tuần tự, đó là một chuỗi cũng):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

Sử dụng 'THÍCH' làm giá trị so sánh không rõ ràng như một hướng dẫn như bạn có thể hy vọng, nhưng đó là lựa chọn tốt nhất để đi cùng.

Bên cạnh đó, chỉ có tùy chọn khác của bạn là truy xuất tất cả các bài đăng có "chủ đề" meta_key được đặt và lặp lại theo cách thủ công hoặc nói cách khác, kiểm tra giá trị trong vòng lặp và hiển thị các bài đăng trong điều kiện đã nói.


14

Để thoát khỏi phản ứng của Julian, vì đó là một mảng được tuần tự hóa, nếu bạn tình cờ lưu trữ thứ gì đó như id người dùng (đó là trường hợp của tôi), bạn có thể cần xử lý nó một chút khác nhau.

Bài đăng meta đã được lưu như sau:

array( "1", "23", "99");

Vì vậy, có họ là số nguyên nhưng thông qua update_post_metahọ đã được lưu dưới dạng chuỗi.

'meta_query' => array(
            array(
                    'key'     => 'my_meta_key',
                    'value'   => serialize( strval( 1 ) ),
                    'compare' => 'LIKE'
                )
            )

Vì vậy, bạn thực sự đang thực hiện một so sánh THÍCH với phiên bản chuỗi nối tiếp của những gì bạn đang tìm kiếm. Tôi đã dành một vài giờ tốt để cố gắng làm cho một cái gì đó như thế này hoạt động và cho đến nay đây là điều tốt nhất tôi có thể nghĩ ra.


serialize (strval (1)) đã giải quyết vấn đề của tôi, Cảm ơn
Behzad

Đã qua câu trả lời cũ này tình cờ ngày hôm nay. Tôi thích sự bổ sung của bạn. +1
Julian Pille

Tôi cũng đã bắt gặp điều này, điều của tôi là tôi cần nhận được tất cả các bài đăng mà user_id không ở trong mảng, nhưng giải pháp trên không hoạt động nên tôi đã thực hiện như sau: 'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) ) Bởi vì khi tuần tự hóa tất cả các giá trị được lưu như sau: ' :giá trị;'
Bobz

4

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_querybằng cách thêm một relationvà 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 '.


Đây phải là câu trả lời được chọn, đáng tin cậy nhất
Amin

2

Tôi sẽ đi cho câu trả lời của Julian. Tuy nhiên, tôi muốn cải thiện điều đó bởi vì sử dụng meta_query đó, bạn sẽ gặp một trường hợp như thế này

giá trị của bạn là

array('sports','movies', 'sports2');

khi bạn tìm kiếm

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

sau đó kết quả sẽ trả về cả 'sport' và 'sport2'.

Để khắc phục điều đó, hãy thay đổi meta_query args thành

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports";',
            'compare' => 'LIKE'
        )
    )
);

Đó là bởi vì giá trị được tuần tự hóa trong cơ sở dữ liệu và mỗi mục sẽ được phân tách bằng dấu chấm phẩy. Như vậy, ở trên args sẽ hoạt động

Nếu các mục trong giá trị là số, bạn chỉ cần xóa dấu ngoặc kép "

$args = array(
        'post_type' => 'news',
        'meta_query' => array(
            array(
                'key' => 'topics',
                'value' => '1;',
                'compare' => 'LIKE'
            )
        )
    );

1

Tôi đã cố gắng với một cái gì đó tương tự ngày hôm nay. Tôi phải truy vấn trường quan hệ ACF (Trường tùy chỉnh nâng cao) với nhiều người dùng (mảng) có liên quan.

Sau khi cập nhật trường qua php, truy vấn không hoạt động. Sau khi cập nhật nó thông qua giao diện người dùng ACF, truy vấn đã hoạt động.

Vấn đề là, mã php của tôi đặt các giá trị mối quan hệ thành giá trị int, UI đặt nó thành giá trị chuỗi. Để đảm bảo cả hai công việc tôi sử dụng truy vấn này ngay bây giờ (phù hợp với ví dụ ở đây):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'topics',
            'value' => '1;',  // works for int-array
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'topics',
            'value' => '"1"',  // works for string-array
            'compare' => 'LIKE'
        ),
    )
);
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.