Nhiều mối quan hệ cho nhiều tax_query trong WP_Query


10

Tôi muốn sử dụng WP_Query()lớp để lọc một số bài viết của tôi. Vấn đề tôi đang gặp phải bây giờ là xử lý truy vấn phân loại. Thông thường, WP_Query()chỉ xử lý một mối quan hệ cho tax_query()(hoặc AND hoặc OR), nhưng điều tôi cần là sử dụng hỗn hợp các mối quan hệ này trên tax_query(), làm thế nào để đạt được nó?
ví dụ

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

Tôi biết đoạn mã trên không hoạt động, tôi có cần sử dụng WP_Query()bộ lọc để làm không? Bất kỳ ý tưởng?

Câu trả lời:


10

Điều này có thể được thực hiện bằng cách sử dụng term_taxonomy_id chứ không phải sên, điều này sẽ bỏ qua một cách hiệu quả bất kỳ phân loại nào được chỉ định và chỉ cần nhìn vào trường term_taxonomy_id duy nhất. Điều này sẽ cho phép bạn thực sự có thể thực hiện một mối quan hệ hỗn hợp. Bạn muốn sử dụng mối quan hệ tổng thể của AND và đặt tất cả các thuật ngữ có liên quan HOẶC vào một mục bằng cách sử dụng toán tử IN. Trước tiên, bạn cần ánh xạ các thuật ngữ mong muốn vào term_taxonomy_ids của chúng.

$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );

foreach ( $taxes as $tax ) {
    $terms = get_terms( $tax );

    foreach ( $terms as $term )
        $tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}


$args['tax_query'] => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'taxonomy1',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy1'][$slug] )
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy3',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy3'][$slug] ),
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy4', // gets ignored
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

Lưu ý rằng trước 3.5, bạn cũng cần chỉ định 'include_children' => false. Xem vé Trac này để biết thêm: https://core.trac.wordpress.org/ticket/21228


6
Nhân tiện, xin vui lòng xin lỗi và cảnh báo tôi về bất kỳ sai lầm / không chính xác :) Gõ tất cả bằng một tay với một em bé khác.
helenhousandi

1
Nơi nào $slugđến từ ...?
vancoder

1
Chỉ cần một giữ chỗ trong mã. Tôi đoán đó là $ term1, v.v. trong câu hỏi ban đầu.
helenhousandi

Bạn đúng rồi! Phương pháp này dường như hoạt động. Tôi sẽ cho nó kiểm tra, và quay lại bỏ phiếu cho câu trả lời này nếu nó hoạt động. Cảm ơn
ron_dev

Dường như 'taxonomy' => 'taxonomy4', // gets ignoredkhông thể bỏ qua. Nếu tôi đặt văn bản ngẫu nhiên trong lĩnh vực này, không có kết quả được tìm thấy. Chỉ khi tôi gán tên phân loại thực, nó mới cho tôi kết quả. Bất cứ ý tưởng tại sao?
ron_dev

1

Tôi sử dụng tax_querynhư là meta_querycho nhiều hoặc / và toán tử như thế này


Đề nghị tốt hơn nhiều. Như nó đã được phát hành một thời gian sau câu trả lời trên.
FooBar
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.