การใช้ wp_query เป็นไปได้หรือไม่ที่จะสั่งการ taxonomy?


49

คำถามของฉันเรียบง่ายฉันใช้ WP_Query เพื่อดึงข้อมูลการโพสต์แบบกำหนดเองบางประเภทโดย taxonomy โดยใช้ tax_query

ตอนนี้ปัญหาของฉันคือฉันต้องการสั่งซื้อทางอนุกรมวิธาน แต่จากเอกสารและการค้นหาในเว็บฉันไม่สามารถหาวิธีแก้ปัญหาได้

orderby ใน WP_Query ช่วยให้คุณสามารถสั่งซื้อโดยกลุ่มของเขตข้อมูลแม้กระทั่งเขตข้อมูลเมตาที่กำหนดเอง แต่ดูเหมือนจะไม่สนับสนุน taxonomy

ตัวชี้ใด ๆ ในทิศทางที่ถูกต้อง?

ขอบคุณทุกคน.

คำตอบ:


12

ไม่มันเป็นไปไม่ได้ที่จะเรียงลำดับตามอนุกรมวิธานเนื่องจากจากมุมมองบางประเภทซึ่งไม่สมเหตุสมผลจริงๆ

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

สิ่งที่คุณควรใช้ในสถานการณ์เช่นนี้คือโพสต์เมตา คุณสามารถสั่งซื้อโดยโพสต์เมตาและมันไม่ซ้ำกันสำหรับแต่ละโพสต์

แก้ไข: ที่กล่าวว่าคุณสามารถสั่งซื้อโดยอนุกรมวิธานโดยการทำแบบสอบถาม SQL กำหนดเองโดยใช้ตัวกรองคุณก็ไม่สามารถทำมันได้จาก WP_Query แปร: http://scribu.net/wordpress/sortable-taxonomy-columns.html

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

Taxonomies จัดกลุ่มสิ่งต่าง ๆ โดยการกำหนดเงื่อนไขให้ การจัดกลุ่มนั้นเป็นจุดรวมของ taxonomies เงื่อนไขเป็นเพียงใบหน้าสวยในการจัดกลุ่ม หากคุณมีเมทาดาทาที่มีความหมายในการกำหนดให้กับโพสต์คุณควรใช้เมตาโพสต์แทน และคุณสามารถสั่งซื้อได้เนื่องจากโพสต์เมตาใช้ทั้งคีย์และค่าในการจัดเก็บข้อมูล ด้วย taxonomy คุณจะจัดเก็บคีย์เท่านั้นโดยค่าของพวกเขาคือการโพสต์จัดกลุ่มไว้ด้วยกันตามคำนั้น

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


สวัสดีอ็อตโตขอบคุณสำหรับคำตอบ ฉันเห็นประเด็นของคุณและฉันอาจไปผิดทางกับเรื่องนี้ ในตัวอย่างเว็บไซต์ของรายการทีวีของฉันฉันมีอนุกรมวิธานสำหรับซีรีส์ 1, ซีรี 2, ซีรี 3 และอื่น ๆ ดังนั้นฉันสามารถจัดกลุ่มรายการทีวีที่แตกต่างกันทั้งหมดตามหมายเลขซีรี่ส์ จากนั้นฉันก็มีเหมือนกันสำหรับตอน, ตอนที่ 01, ตอนที่ 02, ฯลฯ สิ่งที่ฉันต้องการคือเมื่อแสดงรายการตอนทั้งหมดที่จะจัดเรียงตามตอนและชุด ฉันจะวิเคราะห์จากนั้นโพสต์เมตาและฟิลด์ที่กำหนดเอง ขอบคุณ Otto
yeope

@yeope อนุกรมวิธานของคุณควรเป็นอนุกรมและเงื่อนไขของคุณควรเป็นซีรีส์ 1, ซีรีส์ 2 เป็นต้นด้วยตอนที่ฉันสมมติว่าซีรีส์มีหลายตอนดังนั้นมันจึงสามารถใช้อนุกรมวิธานเดียวกันได้ "ซีรีส์" ตอนที่ 2 เป็นต้นไปจะมีคำว่า parent "series x" จากนั้นคุณสามารถค้นหาทั้งชุดตามลำดับตอนที่ควรจะอยู่
Chris_O

@Chris_O ฉันรู้ว่าคุณอาจมีเงิน! ปัญหาเดียวที่ฉันเห็นคือข้อเท็จจริงของการต้องทำซ้ำคำว่า "ตอนที่ 1", "ตอนที่ 2" สำหรับแต่ละชุด ยังไม่สามารถจัดกลุ่มตอนที่ 1 ทั้งหมดไม่ได้ขึ้นอยู่กับซีรีส์ แต่ฉันคิดว่าอาจมีวิธีแก้ไขอยู่บ้าง ขอบคุณ Chris_O
Yeope

2
การใช้อนุกรมวิธานสำหรับตอนต่างๆนั้นไม่ค่อยสมเหตุสมผลนักเนื่องจากการจัดกลุ่มนั้นไร้ค่า ลองคิดดูถ้าคุณมีคำว่า "ตอนที่ 1" คุณจะจัดกลุ่มตอนที่ 1 กับตอนที่ 1 จากรายการทีวีอื่น ๆ หมายเลขตอนและซีรีส์มีความหมายมากกว่า post_meta เนื่องจากเป็นเนื้อหาเฉพาะของรายการนั้นและไม่เป็นประโยชน์ในกลุ่ม ชื่อรายการทีวีนั้นจะมีประโยชน์ในฐานะศัพท์ในอนุกรมวิธานรายการทีวีเพราะคุณจะรวมกลุ่มรายการทั้งหมดเข้าด้วยกัน
อ็อตโต

1
อ็อตโตตามมาด้วยบล็อกโพสต์ที่น่าสนใจ: เมื่อจะ (ไม่) ใช้อนุกรมวิธานที่กำหนดเอง
Jan Fabry

47

คำตอบที่ยอมรับสำหรับคำถามนี้ไม่เป็นที่ยอมรับ มันไม่มีเหตุผลที่จะคิดว่าการสั่งซื้อโดยภาษี "ไม่สมเหตุสมผล" คำตอบที่เขาให้นั้นไม่สมเหตุสมผล

พิจารณามีโพสต์เมนู จากนั้นคุณมีภาษีที่กำหนดเองของ "FoodCategories" ภาษี FoodCategories มีข้อกำหนด "อาหารเช้า", "อาหารกลางวัน" และ "อาหารค่ำ" หากคุณส่งข้อความค้นหาโดยใช้พารามิเตอร์ tax_query ตอนนี้คุณมีชุดผลลัพธ์พร้อมเงื่อนไขทั้งหมดอย่างไรก็ตามพวกเขาจะเรียงลำดับตามวันที่โพสต์

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

มันจะดีถ้า WP มีตัวเลือก orderby "tax__in" เช่นเดียวกับ "post__in" แต่เนื่องจากไม่มีคุณจะต้องทำกระบวนการไร้สาระข้างต้น ปรับแต่งแบบสอบถามด้วยตัวคุณเองโดยใช้ตัวกรอง 'posts_orderby' และตัวกรอง 'posts_join' เพื่อปรับวิธีการสั่งซื้อและเพิ่มคำลงในชุดผลลัพธ์ตามลำดับ หรือคุณต้องสร้างแบบสอบถามใหม่สำหรับแต่ละคำที่คุณกรองภายในส่วน html ที่เกี่ยวข้องกับคำเหล่านั้น

มีประสิทธิภาพมากที่สุดคือการเปลี่ยนสตริงแบบสอบถามโดยวิธีการกรอง วิธีที่ง่ายที่สุดคือทำแบบสอบถามสามแบบแยกกัน WP API ควรจัดการสั่งซื้อด้วยภาษีหรือพารามิเตอร์ข้อความค้นหาที่ จำกัด หากคุณกำลัง จำกัด การสืบค้นตามเงื่อนไขบางอย่างมีความเป็นไปได้สูงที่หลายคนจะต้องเรียงลำดับตามเงื่อนไขเดียวกัน


2
ขออภัย แต่คุณคิดผิด การสั่งซื้อโดย taxonomy ไม่ได้มีเหตุผลใด ๆ สำหรับคุณ คุณต้องการแสดงอะไร อาหารเช้าทั้งหมดก่อนตามด้วยดินเนอร์ทั้งหมดจากนั้นอาหารกลางวันทั้งหมดหรือไม่ คุณควรเลือกสิ่งที่คุณต้องการและลำดับที่คุณต้องการ แต่อนุกรมวิธานเป็นเพียงป้ายกำกับการจัดกลุ่ม "ข้อมูล" ไม่มีความหมายที่คุณควรสั่งซื้อ ถ้าเป็นเช่นนั้นมันไม่ควรเป็นคำศัพท์ในอนุกรมวิธานคุณควรทำให้มันเป็น post-meta แทน
อ็อตโต

15
C'mon แน่นอนจะมีบางกรณีที่คุณจะต้องการสั่งซื้อโพสต์ตามระยะเวลา taxonomy อีกตัวอย่างหนึ่งคือประเภทโพสต์ภาพยนตร์ที่มีอนุกรมวิธานจัดอันดับ ในรายการภาพยนตร์เป็นเรื่องง่ายมากที่จะจินตนาการว่าผู้คนต้องการสั่งซื้อรายการภาพยนตร์ตามการจัดอันดับเพื่อให้ได้รับการจัดอันดับ G ทั้งหมดตามลำดับ PG และภาพยนตร์อื่น ๆ จะปรากฏที่ด้านบน (ในตัวอย่างนี้และตัวอย่างอาหารที่พวกเขาสามารถสั่งซื้อโดย term_id แทนชื่อ) มีพื้นที่สีเทาขนาดใหญ่ที่คุณอาจจะได้รับการบริการที่ดีที่สุดโดยอนุกรมวิธานและไม่ใช่เมตา แต่อาจเป็นประโยชน์สำหรับอนุกรมวิธานนั้น -สามารถ.
SeventhSteel

2
การจัดอันดับ PG และ G และอื่น ๆ เป็นตัวเลือกอนุกรมวิธานที่ดียกเว้นว่าเป็นข้อมูลเกี่ยวกับภาพยนตร์เฉพาะ ดังนั้นพวกเขากำลังเมตา เป็นข้อมูลไม่ใช่หมวดหมู่ เพียงแค่มีตัวเลือกจำนวน จำกัด ก็ไม่ได้จัดทำ หากต้องการเรียงตามให้สร้างเป็น meta หรือบังคับให้เรียงลำดับตามอนุกรมวิธานผ่านรหัสเฉพาะอนุกรมวิธาน BTW, NC17 มาหลังจาก PG ดังนั้นคุณต้องใช้รหัสในการสั่งซื้อ
อ็อตโต

ฉันรู้ว่าฉันมางานปาร์ตี้ด้วยความคิดเห็นนี้ แต่เพิ่งชนเข้ากับสิ่งนี้ การสั่งซื้อทางอนุกรมวิธานสามารถทำให้เข้าใจได้ในบางสถานการณ์ เรามีรายการงานในหนึ่งโครงการเป็นประเภทโพสต์จากนั้นรัฐและเมืองที่งานเป็น taxonomies เราต้องการให้พวกเขาสามารถพิมพ์ได้อย่างง่ายดาย (แสดงงานทั้งหมดในรัฐหรือแสดงงานทั้งหมดในเมือง) ดังนั้นอนุกรมวิธานเป็นทางออกที่ดีที่สุด ในขณะเดียวกันก็มีการค้นหางานทั่วไปที่เราต้องการเรียงลำดับตามชื่อตามด้วยรัฐแล้วตามเมือง
Dennis Puzak

กรณีการใช้งานอื่น: ลูกค้ามีบทความจำนวนมากซึ่งแต่ละประเภทมีหมวดหมู่ ลูกค้าต้องการให้มีหน้ารายการบทความทั้งหมดซึ่งสามารถเรียงลำดับตัวอักษรตามวันที่หรือตามหมวดหมู่ หมวดหมู่ยังสามารถกรองได้ แต่การแสดงรายการบทความทั้งหมดตามหมวดหมู่ตามลำดับตัวอักษรนั้นไม่ได้เป็นเรื่องที่แย่มากในกรณีที่ใช้งานและคุณเห็นว่ามันปรากฏขึ้นบ่อยครั้ง
Wilson Biggs

15

ใช่ แต่มันค่อนข้างเกี่ยวข้อง ...

เพิ่มลงใน functions.php ในธีมของคุณ:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );

นี่คือคำสั่งที่ตรงไปตรงมาจากบางสิ่งที่พบและสิ่งที่ฉันทำเอง การอธิบายนั้นค่อนข้างยาก แต่สิ่งที่สำคัญที่สุดคือการทำงานนี้คุณสามารถใส่? orderby = (var tax query tax) & order = ASC (หรือ DESC) แล้วเธอจะเริ่มทันที!


ขอบคุณ Drew ฉันจะให้ไปและพยายามเรียกใช้ SQL นั้นต้องแก้ไขนิดหน่อย แต่มันอาจใช้งานได้ ปัญหาเดียวของฉันตอนนี้คือฉันอาจจะไปในทิศทางที่ผิดตามที่ Otto ชี้ ขอบคุณ Drew แก้ไข - ไม่จำเป็นต้องแก้ไขฉันสามารถดูว่ามันต้องมีการปรับแต่ง :) ขอบคุณ
yeope

หากคุณคว้ามันภายในสองนาทีที่ผ่านมามันไม่ทำงานไปข้างหน้าและคว้ามันตอนนี้ฉันซ่อมมัน มันถูกตั้งค่าสำหรับ taxonomies เฉพาะสองฉันปรับปรุงรหัสให้ทำงานกับ taxonomies ที่ลงทะเบียนทั้งหมด
Drew Gourley

ขอบคุณอีกครั้ง. ในกรณีที่ฉันลองโซลูชันของคุณและมันก็ใช้ได้ นอกจากนี้หากใครบางคนต้องการที่จะใช้มันคุณจะต้องเปลี่ยนadd_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );ไปadd_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );ขอบคุณ :)
yeope

ใช่ตอนนี้ได้รับการแก้ไขแล้วในบล็อครหัสฉันใช้สิ่งนี้จากโครงการที่ฉันกำลังทำงานและลืมเปลี่ยนชื่อฟังก์ชั่นแม้ว่าฉันจะเปลี่ยนมันในเบ็ด
Drew Gourley

1
คุณรู้หรือไม่ถ้าเป็นไปได้ที่จะสั่งให้ taxonomies ตาม ID แทนชื่อ? ฉันกำลังพยายามที่จะได้ผลลัพธ์เดียวกันกับการสั่งซื้อกลุ่มอนุกรมวิธานโดย ID
Javier Villanueva

9

ฉันมาช้าที่เกม แต่มีวิธี WordPressy ที่ง่ายกว่าในการทำเช่นนี้

สร้างแบบสอบถามภาษีของคุณเหมือนปกติ

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

ตั้งค่า args ของคุณสำหรับ query_posts หรือ WP_Query

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);

ก่อนที่คุณจะทำการเรียก query_posts / WP_Query ของคุณให้ขอตัวกรอง orderby และแทนที่มัน

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');

อย่าลืมลบตัวกรองหลังจากนั้น ...

มันใช้งานได้ b / c tax_query สร้างการรวม ฯลฯ สำหรับคุณคุณเพียงแค่ต้องสั่งซื้อจากหนึ่งในเขตข้อมูลจากการเข้าร่วม


2
แนวคิดเกี่ยวกับวิธีการสั่งซื้อโดยใช้ชื่อแทน term_taxonomy_id? เปลี่ยน term_taxonomy_id ใน orderby_statement จะพ่นข้อผิดพลาด
tehlivi

นี่คือคำตอบที่ถูกต้องสำหรับทุกคนที่สนใจ!
Mayra M

2

ฉันต้องการแสดงประสบการณ์ของฉันในการจัดเรียงประเภทโพสต์ที่กำหนดเองตามหมวดหมู่ / อนุกรมวิธาน

เว็บ

  1. เว็บไซต์ บริษัท ตัวแทนท่องเที่ยวที่ทำงานบน WordPress
  2. เนื้อหาหลักในประเภทโพสต์ที่กำหนดเองที่เรียกว่า 'ruta'
  3. อนุกรมวิธานกับโครงสร้างนี้ประเภทของการเดินทาง> ทวีป> ประเทศ

กรณี

ในหน้ารายการหมวดหมู่ที่เก็บถาวรไคลเอนต์ต้องการให้เรียงลำดับตาม

  1. ทวีปเรียงตามจำนวนเส้นทางในแต่ละเส้นทาง
  2. ประเทศเรียงตามลำดับตัวอักษร

ขั้นตอน

ก่อนอื่นฉันรับการร้องขอจากการสืบค้นเพจเก็บถาวรที่ไม่ได้แก้ไขซึ่งเกิดขึ้นเป็นเช่นนี้:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

ประการที่สองฉันแก้ไขโค้ด sql ใน Sequel Pro กับฐานข้อมูลเพื่อให้สอดคล้องกับความต้องการของฉัน ฉันออกมาด้วยสิ่งนี้ (ใช่อาจปรับปรุงได้: ความรู้ของฉันเกี่ยวกับ MySQL ไม่โดดเด่น):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  

ประการที่สามฉันขอแบบสอบถามเกี่ยวกับไฟล์ functions.php ที่มีสามตัวกรอง: posts_fields, posts_join และ posts_orderby

รหัสใน functions.php:

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }

ในที่สุดฉันก็เรียกใช้ตัวกรองจากเบ็ด pre_get_post ตามเงื่อนไขบางประการ

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');

หวังว่านี่จะช่วยใครซักคน


เยี่ยมมากไร้สาระที่เอารหัสนี้มาเรียงลำดับตามอนุกรมวิธาน ปัญหาใหญ่กับ WP
serraosays

2

ฉันมีปัญหาคล้ายกันมากที่ฉันจัดการ: ฉันต้องการสั่งซื้อไฟล์เก็บถาวรแบบโพสต์ที่กำหนดเอง (บทความในนิตยสาร) โดยอนุกรมวิธานที่กำหนดเอง (ปัญหา) ฉันไม่เคยทำแบบสอบถาม SQL โดยตรงในเว็บไซต์ของฉัน - และโดยปกติถ้าคุณเป็นเหมือนคำตอบอื่น ๆ - คุณต้องคิดใหม่แนวทางของคุณ

ปัญหา:

1) Wordpress ไม่อนุญาตให้คุณสั่งซื้อ taxonomies ด้วยวิธีที่ชาญฉลาด

2) Wordpress ไม่อนุญาตให้orderbyใช้ taxonomies กับโพสต์ประเภท WP_Query (ตามที่ Otto สะกด)

Solutions:

1) การเรียงลำดับ taxonomies สามารถทำได้ดีที่สุดโดยปลั๊กอินสั่งซื้อ Taxonomy ที่กำหนดเองในขณะนี้ ช่วยให้คุณสามารถสั่งอนุกรมวิธานผ่าน WYSIWYG wp-adminซึ่งไม่ใช่วิธีที่ฉันจะทำ แต่ฉันไม่พบอะไรที่ดีขึ้น

เมื่อคุณตั้งค่าปลั๊กอินคุณจะได้สิ่งที่คล้ายกับสิ่งที่ฉันทำที่นี่ จดบันทึกตัวเลือกAuto-sort Queries of this Taxonomy- ตั้งค่านี้เป็นCustom Order as Defined Above; สิ่งนี้ทำให้คุณได้รับคำสั่งที่คุณต้องการ ภาพหน้าจอ:

การแสดงผล Taxonomy Order NE กำหนดเอง

2) ด้วย taxonomy ที่เรียงลำดับคุณสามารถสร้างชุดของการเรียก WP_Query ที่ทำงานผ่านแต่ละคำศัพท์ได้อย่างมีประสิทธิภาพสร้างการเก็บถาวรที่เรียงลำดับโดย taxonomy อย่างมีประสิทธิภาพ ใช้get_terms()เพื่อสร้างอาร์เรย์ของข้อกำหนดด้านภาษีทั้งหมดจากนั้นเรียกใช้foreachคำศัพท์แต่ละคำ สิ่งนี้จะสร้างWP_Queryรายการคำแต่ละคำที่จะส่งคืนโพสต์ทั้งหมดสำหรับคำที่ระบุอย่างมีประสิทธิภาพการสร้างที่เก็บถาวรที่จัดเรียงตามคำศัพท์อนุกรมวิธาน รหัสที่จะทำให้สิ่งนี้เกิดขึ้น:

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }

การอ่านที่เกี่ยวข้องในเว็บไซต์นี้: แสดงโพสต์ทั้งหมดในประเภทโพสต์ที่กำหนดเองจัดกลุ่มตามอนุกรมวิธานที่กำหนดเอง


2

ฉันไม่แน่ใจว่าทำไมการแก้ปัญหาทั้งหมดในที่นี้ค่อนข้างมากเกินไป ตกลงเป็นครึ่งทศวรรษที่ผ่านมา แต่ฉันเพิ่งใช้รหัสต่อไปนี้ในขณะนี้และใช้งานได้:

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>

สิ่งนี้จะจัดเรียงอนุกรมวิธานของ CPT ของคุณก่อนโดยเป็นอนุกรมวิธานตามลำดับตัวอักษรและภายในกลุ่มอนุกรมวิธานเหล่านี้เรียงตามลำดับตัวอักษร


@yeope ทำไมคำตอบนี้ถึงได้รับการยอมรับ! ขอบคุณพระเจ้าที่ฉันเลื่อนไป
ฮวนโซลาโน

1

นี่คือวิธีแก้ปัญหาที่ฉันใช้สำหรับปัญหานี้โดยเฉพาะ วิธีการแก้ปัญหานี้สำหรับกรณีร้ายแรงซึ่งทั้งคู่ไม่สามารถใช้pre_get_postsตัวกรองและมีการแบ่งหน้าที่มีอยู่ในแบบสอบถาม (เช่น: WooCommerce):

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);

ฉันเคยใช้สิ่งนี้เพื่อสร้างเมนูการนำทางที่จัดเรียงตามอนุกรมวิธานคำและจำนวนการโพสต์ต่อคำ

หากคุณต้องการโพสต์เพียงแค่เปลี่ยนแบบสอบถามเป็นSELECT p.*และGROUP BY p.ID


0

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

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.