Sửa đổi trang phân loại để loại trừ các mục trong phân loại trẻ em


18

Tôi tìm thấy câu hỏi này:

Có cách nào để sử dụng $ query-> set ('tax_query' trong bộ lọc pre_get_posts không?

có vẻ như chỉ ra rằng có, bạn có thể thay đổi truy vấn phân loại trên kho lưu trữ phân loại thông qua pre_get_posts (). vì vậy tôi đã đưa ra

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {  
  if( is_tax() ) {
     $wp_query->tax_query->queries[0]['include_children'] = 0;
  }
}

cũng như

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {
   if( is_tax() ) {
        $tax_query = $wp_query->get( 'tax_query' );
        $tax_query->queries[0]['include_children'] = 0;
    $wp_query->set( 'tax_query', $tax_query );  
    }    
}

để cố gắng đặt tham số include_children thành false ... và chỉ về mọi kết hợp của hai tôi có thể nghĩ ra. Tuy nhiên, cho đến nay, kho lưu trữ phân loại vẫn hiển thị các mục trong thuật ngữ con

và bài kiểm tra sau đây dường như chỉ THÊM các truy vấn thuế bổ sung thay vì ghi đè chúng ... điều này làm tôi bối rối.

function dummy_test( $wp_query){
$tax_query = array(
             'relation' => 'OR',
             array(
               'taxonomy' => 'tax1',
               'terms' => array( 'term1', 'term2' ),
               'field' => 'slug',
             ),
             array(
               'taxonomy' => 'tax2',
               'terms' => array( 'term-a', 'term-b' ),
               'field' => 'slug',
             ),
           );


$wp_query->set( 'tax_query', $tax_query );

);
add_action('pre_get_posts','dummy_test');

KHÔNG nên ghi đè giá trị hiện tại?


Xin hãy xem câu trả lời này . Điều đó sẽ mang lại cho bạn hơn nữa.
kaiser

cảm ơn, nhưng đó là khá nhiều những gì tôi đã cố gắng. var_dumps / print_rs của $ wp_query toàn cầu đang hiển thị rằng truy vấn thuế mới ngoài truy vấn hiện tại thay vì ... ít nhất là trên trang phân loại của tôi.
đạp xe vào

Vâng, mã đó có nghĩa là để thêm vào truy vấn.
kaiser

vì vậy không có cách nào để điều chỉnh / ghi đè truy vấn hiện có? b / c điều tôi muốn là thay đổi tham số include_children
helgatheviking 23/212

Câu trả lời:


22

Tôi biết đây là một câu hỏi cũ, nhưng nó hơi khó hiểu và hy vọng sẽ giúp được ai đó. Lý do mà `$ query-> set không hoạt động là vì truy vấn đã được phân tích cú pháp và bây giờ chúng ta cũng cần cập nhật đối tượng tax_query. Đây là cách tôi đã làm nó:

function my_tax_query( $query ) {
    $package_id = 12345;
    $tax_query = array(
        'taxonomy' => 'package_id',
        'terms'    => array( $package_id ),
        'field'    => 'slug',
        'operator' => 'IN',
    );
    $query->tax_query->queries[] = $tax_query; 
    $query->query_vars['tax_query'] = $query->tax_query->queries;
}
add_action( 'pre_get_posts', 'my_tax_query' );

Ngọt!! Tôi đã kiểm tra điều này và có thể điều chỉnh mã của bạn để hoạt động cho tất cả các nguyên tắc phân loại, đó là câu hỏi ban đầu. +1 (tôi sẽ cung cấp cho bạn nhiều ưu đãi hơn nếu tôi có thể)
xe đạp vào

Tôi đã rất ngạc nhiên và bị tổn thương khi thấy rằng phương pháp này cũng hoạt động cho các truy vấn ngày.
David

14

Kể từ Wordpress 3.7, một hành động mới có tên parse_tax_queryđã được thêm chính xác cho mục đích này.

function kia_no_child_terms($wp_query) {  
  $wp_query->tax_query->queries[0]['include_children'] = 0;
}
add_action('parse_tax_query', 'kia_no_child_terms');

Móc này sửa đổi các giá trị của cả queryQuars và tax_query. Sử dụng pre_get_postsphương pháp dẫn đến các truy vấn phân loại trùng lặp, ít nhất là đối với tôi.

Trước 3.7, bạn phải sử dụng pre_get_postshành động thay thế, như chi tiết trong các câu trả lời khác.


Trong trường hợp của tôi, điều này có vẻ hơi quá xa và có tác dụng phụ ngoài ý muốn ... nó ngăn các menu con điều hướng của tôi hiển thị.
Manu

2
@Manu - bạn hoàn toàn chính xác. Ví dụ được cung cấp rất đơn giản và chỉ hiển thị các biến có liên quan. Trong kịch bản thực tế, bạn sẽ kiểm tra $wp_query, sử dụng thẻ mẫu hoặc cả hai hoặc một số logic khác để xác định xem có nên sửa đổi truy vấn ở vị trí đầu tiên không.
leepowers

5

Tôi không thể làm điều này để làm việc với bất kỳ sự kết hợp nào của pre_get_postshoặc parse_query. Tôi có thể làm điều đó tương đối dễ dàng bằng cách xóa sạch đối tượng truy vấn sau khi nó được thực hiện. Tôi không thích nó bởi vì sau đó tôi đang chạy truy vấn hai lần, nhưng tôi hết sức cố gắng để trở nên "hiệu quả".

function kia_no_child_taxonomies(){

    if(is_tax()){
        $args = array(
            'tax_query' => array(
                array(
                    'taxonomy' => get_query_var('taxonomy'),
                    'field' => 'slug',
                    'terms' => get_query_var('term'),
                    'include_children' => FALSE
                )
            )
        );
        query_posts($args); 
    }
}

 add_action('wp','kia_no_child_taxonomies');

Vì vậy, cho đến khi ai đó đi kèm với một câu trả lời tốt hơn, đây là phương pháp duy nhất tôi tìm thấy cho đến nay.

CHỈNH SỬA:

Điều chỉnh câu trả lời từ @Tanner Moushey, cuối cùng tôi đã có thể thực hiện công việc này để loại trừ tất cả các thuật ngữ con khỏi kho lưu trữ phân loại trên pre_get_postsmóc mà không có truy vấn kép không hiệu quả.

function kia_no_child_taxonomies( $query ) {

    if( is_tax() ):

    $tax_obj = $query->get_queried_object();

   $tax_query = array(
                    'taxonomy' => $tax_obj->taxonomy,
                    'field' => 'slug',
                    'terms' => $tax_obj->slug,
                    'include_children' => FALSE
            );
   $query->tax_query->queries[] = $tax_query;
   $query->query_vars['tax_query'] = $query->tax_query->queries;

   endif;

}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies' );

Cái này sai. Bạn không nên sử dụng query_posts, sử dụng pre_get_posts hoặc yêu cầu thay thế.
kovshenin

Điều đó không hữu ích. tại sao không đăng câu trả lời sau đó nếu bạn biết cách làm cho pre_get_posts hoạt động trong trường hợp này? Tôi rõ ràng đã đăng trong câu hỏi của mình rằng tôi đã thử nó, nhưng đi đến kết luận rằng bạn không thể sửa đổi đối tượng tax_Query thông qua bộ lọc đó
helgatheviking

Xin lỗi, nên có ích hơn. Vì vậy, truy vấn thuế thực được tạo (với parse_tax_query) sau khi pre_get_posts được kích hoạt và trong WP_Tax_Query thực tế, chứa tất cả các truy vấn thuế được kết hợp từ các biến truy vấn (bao gồm cả truy vấn tax_query var), vì vậy trong trường hợp của bạn, nó sẽ phân tích cú pháp truy vấn tax_query của bạn sau đó nối thêm bất cứ thứ gì khác có sẵn thông qua các vars truy vấn, chẳng hạn như thể loại, tag__in và các thứ khác. Bạn có thể sử dụng pre_get_posts để xóa các vars truy vấn hiện có trước khi thêm vars của riêng bạn.
kovshenin

Cảm ơn đã giải thích tốt hơn. Rõ ràng đây là cũ, vì vậy tôi đã chuyển sang giải pháp tôi có. Tôi không bao giờ có thể sửa đổi các include_childrentham số thông qua pre_get_postshook. À
xe đạp

Vâng tôi đã tìm ra, đã không ở đây trong một thời gian dài;)
kovshenin

2

Đối với những người như tôi bị mắc kẹt với vấn đề này, tôi tìm thấy một cái gì đó hữu ích. Tôi đã sử dụng hệ thống ưu tiên

    function kia_no_child_taxonomies( $query ) {

if( is_tax() ):

$tax_obj = $query->get_queried_object();
$tax_query = array(
                'taxonomy' => $tax_obj->taxonomy,
                'field' => 'slug',
                'terms' => $tax_obj->slug,
                'include_children' => FALSE);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
return $query;
endif;

}
 add_action( 'pre_get_posts', 'kia_no_child_taxonomies',0 );

Truy vấn của tôi không được bao gồm trong kết quả và tìm kiếm đã bị hỏng với các loại trừ của tôi. Hy vọng điều này sẽ giúp.

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.