แก้ไขหน้า Taxonomy เพื่อแยกรายการใน taxonomies เด็ก


18

ฉันพบคำถามนี้:

มีวิธีใช้ $ query-> set ('tax_query' ในตัวกรอง pre_get_posts หรือไม่

ซึ่งดูเหมือนจะบ่งบอกว่าใช่คุณสามารถเปลี่ยนการสืบค้น taxonomy ในคลัง taxonomy ผ่าน pre_get_posts () ดังนั้นฉันจึงมากับ

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;
  }
}

เช่นกัน

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 );  
    }    
}

เพื่อพยายามตั้งค่าพารามิเตอร์ include_children เป็น false ... และเพียงแค่เกี่ยวกับการรวมกันของทั้งสองฉันสามารถคิด อย่างไรก็ตามจนถึงตอนนี้การเก็บถาวรอนุกรมวิธานยังคงแสดงรายการในเทอมย่อย

และการทดสอบต่อไปนี้ดูเหมือนว่าจะเพิ่มการสอบถามภาษีเพิ่มเติมแทนที่จะเขียนทับพวกเขา ... ซึ่งทำให้ฉันสับสน

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');

SET ไม่ควรเขียนทับค่าปัจจุบันหรือไม่?


โปรดดูคำตอบนี้ ที่ควรนำพาคุณไปอีก
ไกเซอร์

ขอบคุณ แต่นั่นเป็นสิ่งที่ฉันได้ลองมาแล้ว var_dumps / print_rs ของ $ wp_query global กำลังแสดงว่าการสืบค้นภาษีใหม่นอกเหนือจากการสืบค้นที่มีอยู่แทนที่จะแทนที่ ... อย่างน้อยในหน้า taxonomy ของฉัน
helgatheviking

ใช่รหัสนั้นมีไว้เพื่อเพิ่มลงในแบบสอบถาม
ไกเซอร์

ดังนั้นจึงไม่มีวิธีปรับ / ลบล้างคิวรีที่มีอยู่หรือไม่ b / c สิ่งที่ฉันต้องการคือการเปลี่ยนพารามิเตอร์ include_children
helgatheviking

คำตอบ:


22

ฉันรู้ว่านี่เป็นคำถามเก่า แต่มันค่อนข้างสับสนและหวังว่าจะช่วยใครซักคน เหตุผลที่ `$ query-> set ไม่ทำงานเป็นเพราะแบบสอบถามได้ถูกวิเคราะห์แล้วและตอนนี้เราจำเป็นต้องอัปเดตวัตถุ tax_query ด้วย นี่คือวิธีที่ฉันทำ:

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' );

หวาน!! ฉันตรวจสอบสิ่งนี้แล้วและสามารถปรับรหัสของคุณให้เหมาะกับ taxonomies ทั้งหมดซึ่งเป็นคำถามเดิม +1 (ฉันจะเพิ่มจำนวนผู้
โหวต

ฉันรู้สึกประหลาดใจและมั่นใจว่าวิธีนี้ใช้ได้กับการค้นหาวันที่ด้วย
David

14

ในฐานะของ Wordpress 3.7 มีการparse_tax_queryเพิ่มการกระทำใหม่ที่มีชื่อตรงกับวัตถุประสงค์นี้

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');

เบ็ดนี้แก้ไขค่าของทั้ง query_vars และ tax_query การใช้pre_get_postsวิธีดังกล่าวทำให้มีการสืบค้นอนุกรมวิธานซ้ำซ้อนอย่างน้อยสำหรับฉัน

ก่อนหน้า 3.7 คุณต้องใช้การpre_get_postsกระทำแทนดังรายละเอียดในคำตอบอื่น ๆ


ในกรณีของฉันดูเหมือนจะไกลเกินเอื้อมและมีผลข้างเคียงโดยไม่ได้ตั้งใจ ... มันป้องกันไม่ให้เมนูย่อยการนำทางของฉันปรากฏขึ้น
มนู

2
@Manu - คุณถูกต้องอย่างสมบูรณ์ ตัวอย่างที่มีให้นั้นง่ายมากและแสดงตัวแปรที่เกี่ยวข้องเท่านั้น ในสถานการณ์จริงที่คุณต้องตรวจสอบ$wp_queryให้ใช้เทมเพลตแท็กหรือทั้งสองอย่างหรือตรรกะอื่น ๆ เพื่อพิจารณาว่าควรแก้ไขเคียวรีตั้งแต่แรกหรือไม่
leepowers

5

ฉันไม่สามารถรับการทำงานที่มีการรวมกันของใด ๆหรือpre_get_posts parse_queryฉันสามารถทำได้ง่าย ๆ โดยกำจัดวัตถุแบบสอบถามหลังจากที่ทำเสร็จแล้ว ฉันไม่ชอบเพราะแล้วฉันก็เรียกใช้แบบสอบถามสองครั้ง แต่ตอนท้ายฉันก็มีความพยายามที่จะ "มีประสิทธิภาพ"

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');

ดังนั้นจนกว่าจะมีใครมาพร้อมกับคำตอบที่ดีกว่านี้เป็นวิธีเดียวที่ฉันได้พบจนถึง

แก้ไข:

การปรับคำตอบจาก @Tanner Moushey ในที่สุดฉันก็สามารถทำงานนี้เพื่อแยกคำศัพท์ย่อยทั้งหมดออกจากการเก็บถาวรอนุกรมวิธานบนpre_get_postshook โดยไม่ต้องใช้การสืบค้นสองครั้งที่ไม่มีประสิทธิภาพ

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' );

นี่เป็นสิ่งที่ผิด คุณไม่ควรใช้ query_posts ใช้ pre_get_posts หรือคำขอแทน
kovshenin

นั่นไม่เป็นประโยชน์ ทำไมไม่โพสต์คำตอบถ้าคุณรู้วิธีทำให้ pre_get_posts ทำงานในกรณีนี้ เห็นได้ชัดว่าฉันโพสต์ในคำถามของฉันที่ฉันลองใช้ แต่มาถึงข้อสรุปที่ว่าคุณไม่สามารถแก้ไขวัตถุ tax_Query ผ่านตัวกรองนั้น
helgatheviking

ขออภัยควรมีประโยชน์มากกว่านี้ ดังนั้นแบบสอบถามภาษีจริงถูกสร้างขึ้น (พร้อม parse_tax_query) หลังจาก pre_get_posts ถูกไล่ออกและใน WP_Tax_Query จริงซึ่งมีแบบสอบถามภาษีทั้งหมดรวมกันจากตัวแปรแบบสอบถาม (รวมถึงแบบสอบถามแบบสอบถาม tax_query) ในกรณีของคุณแยกวิเคราะห์แบบสอบถาม tax_query ของคุณและ จากนั้นทำการต่อท้ายสิ่งอื่นใดที่มีให้บริการผ่าน vars แบบสอบถามเช่นหมวดหมู่ tag__in และอื่น ๆ คุณสามารถใช้ pre_get_posts เพื่อลบ vars แบบสอบถามที่มีอยู่ก่อนเพิ่มของคุณเอง
kovshenin

ขอบคุณสำหรับคำอธิบายที่ดีกว่า เห็นได้ชัดว่านี่คือรุ่นเก่าดังนั้นฉันจึงไปต่อกับวิธีแก้ปัญหาที่ฉันมี ฉันไม่สามารถแก้ไขinclude_childrenพารามิเตอร์ผ่านทางpre_get_postshook ได้ อ่า
helgatheviking

ใช่ฉันคิดว่าไม่เคยอยู่ที่นี่มานานแล้ว)
kovshenin

2

สำหรับผู้ที่ชอบฉันติดอยู่กับปัญหานี้ฉันพบสิ่งที่มีประโยชน์ ฉันใช้ระบบลำดับความสำคัญ

    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 );

ข้อความค้นหาของฉันไม่รวมอยู่ในผลลัพธ์และการค้นหาใช้งานไม่ได้เนื่องจากการยกเว้นของฉัน หวังว่าจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.