Menggunakan wp_query apakah mungkin untuk menata taksonomi?

49

Pertanyaan saya sederhana, saya menggunakan WP_Query untuk mengambil beberapa penyaringan posting jenis kustom oleh taksonomi menggunakan tax_query.

Sekarang masalah saya adalah saya ingin mengatur taksonomi, tetapi dari dokumentasi dan pencarian di web saya tidak dapat menemukan solusi.

Orderby di WP_Query memungkinkan Anda memesan oleh sekelompok bidang bahkan bidang meta khusus tetapi tampaknya tidak mendukung taksonomi.

Adakah petunjuk di arah yang benar?

Terima kasih semua.

ya
sumber

Jawaban:

12

Tidak, tidak mungkin memesan berdasarkan taksonomi, karena dari sudut pandang tertentu, itu sebenarnya tidak masuk akal.

Taksonomi adalah cara untuk mengelompokkan berbagai hal bersama. Jadi titik memiliki taksonomi pada posting akan benar-benar memiliki ketentuan dalam taksonomi yang dibagi antara posting. Jika taksonomi memiliki istilah yang hanya digunakan pada satu posting masing-masing, maka itu akan membuat taksonomi semacam sia-sia. Dan jika persyaratan dibagikan seperti seharusnya, maka memesan dengan itu tidak akan menghasilkan sesuatu yang sangat berguna.

Apa yang harus Anda gunakan dalam situasi seperti ini adalah pos meta. Anda dapat memesan melalui pos meta, dan unik untuk setiap pos.

Sunting: Dikatakan, Anda dapat memesan dengan taksonomi dengan membuat kueri SQL khusus menggunakan filter, Anda tidak dapat melakukannya dari WP_Query yang tidak dimodifikasi: http://scribu.net/wordpress/sortable-taxonomy-columns.html

Namun, jika Anda harus melakukan hal semacam ini, maka struktur desain data Anda salah sejak awal. "Ketentuan" dalam taksonomi bukanlah "data" aktual. Istilah itu sendiri tidak memiliki makna yang melekat, mereka hanya label untuk pengelompokan tertentu yang mereka gambarkan. Jika Anda memperlakukannya sebagai data yang bermakna, maka Anda memiliki cacat desain yang mendasarinya.

Taksonomi mengelompokkan berbagai hal dengan memberikan persyaratan kepada mereka. Pengelompokan itu adalah inti dari taksonomi, persyaratannya hanya wajah-wajah cantik di pengelompokan. Jika Anda memiliki metadata bermakna untuk ditetapkan ke suatu pos, maka Anda harus menggunakan meta pos untuk itu. Dan Anda dapat memesannya, karena meta pos menggunakan kunci dan nilai untuk menyimpan informasi. Dengan taksonomi, Anda benar-benar hanya menyimpan kunci, dengan nilainya menjadi pos yang dikelompokkan bersama oleh istilah itu.

Hal-hal lebih mudah dalam jangka panjang jika Anda menggunakan pendekatan yang benar untuk itu. Meskipun saya tidak mengatakan bahwa Anda tidak dapat melakukan sesuatu yang aneh dengan taksonomi, Anda hanya membuat segalanya lebih sulit untuk diri Anda sendiri dalam jangka panjang dengan menggunakannya secara salah.

Otto
sumber
Halo Otto, terima kasih atas jawabannya. Saya mengerti maksud Anda dan mungkin saya salah jalan dengan ini. Dalam contoh saya sebuah situs acara tv, saya memiliki taksonomi untuk seri 1, seri 2, seri 3 dll. Jadi saya dapat mengelompokkan semua acara tv yang berbeda dengan nomor seri. Kemudian saya memiliki hal yang sama untuk episode, Episode 01, Episode 02, dll. Yang saya inginkan adalah ketika menampilkan daftar semua episode untuk dipesan berdasarkan episode dan seri. Saya akan menganalisis kemudian mengirim meta dan bidang khusus. Otto terima kasih.
ya
@ ya, taksonomi Anda harus seri dan istilah Anda harus seri 1, seri 2 dll. Dengan episode saya mengasumsikan seri berisi beberapa episode sehingga bisa menggunakan taksonomi yang sama, "seri" dan jika mereka hirarkis maka episode 1, episode 2 dll akan memiliki istilah induk "seri x". Lalu, Anda dapat meminta seluruh rangkaian agar episode-episode tersebut jatuh sesuai dengan yang seharusnya.
Chris_O
@ Chris_O, begitu, Anda mungkin mendapatkan uang di sana! Satu-satunya masalah yang bisa saya lihat adalah kenyataan harus mengulangi istilah "Episode 1", "Episode 2" untuk setiap seri. Juga tidak bisa mengelompokkan semua episode 1 tidak tergantung pada seri, tapi saya pikir mungkin ada jalan lain. Terima kasih Chris_O
yeope
2
Sebenarnya, menggunakan taksonomi untuk episode tidak masuk akal, karena pengelompokan itu tidak berharga. Pikirkan tentang hal ini, jika Anda memiliki "episode 1" sebagai sebuah istilah, maka Anda mengelompokkan episode 1 dengan setiap episode 1 dari setiap acara TV lainnya. Nomor episode dan seri lebih masuk akal sebagai post_meta, karena mereka spesifik untuk acara tertentu, dan tidak berguna sebagai grup. Nama acara TV akan berguna sebagai istilah dalam taksonomi acara tv, karena Anda akan mengelompokkan acara secara keseluruhan.
Otto
1
Otto mengikuti ini dengan posting blog yang menarik: Kapan (tidak) menggunakan Taksonomi Kustom .
Jan Fabry
47

Jawaban yang diterima untuk pertanyaan ini tidak dapat diterima. Tidak masuk akal untuk berasumsi bahwa pemesanan dengan pajak "tidak masuk akal". Jawaban yang dia berikan tidak masuk akal.

Pertimbangkan memiliki jenis posting menu. Maka Anda memiliki pajak khusus "FoodCategories". Pajak FoodCategories memiliki ketentuan "Sarapan", "Makan Siang", dan "Makan Malam". Jika Anda mengirim permintaan menggunakan param tax_query, Anda sekarang memiliki hasil yang ditetapkan dengan semua persyaratan, namun mereka dipesan berdasarkan tanggal posting.

Untuk mendapatkan urutan yang benar dari ini, relatif terhadap persyaratannya, dan kemudian ditampilkan di ujung depan secara tepat dengan memisahkan posting ke dalam berbagai kategori mereka, Anda harus mengulang melalui set hasil, kemudian meminta setiap posting individu dalam hasil ditetapkan untuk menemukan istilah itu dan membandingkannya dengan istilah saat ini, memfilter ke dalam array dan melanjutkan seluruh. Maka Anda harus mengulang lagi melalui array baru untuk tampilan. Ini tidak produktif.

Akan lebih baik jika WP memiliki opsi orderby "tax__in" seperti halnya opsi "post__in", tetapi karena WP tidak melakukannya, Anda juga harus melakukan proses konyol di atas; sesuaikan sendiri kueri dengan filter 'posts_orderby' dan filter 'posts_join' untuk menyesuaikan metode orderby dan menambahkan istilah ke set hasil, masing-masing; atau Anda harus membuat kueri baru untuk setiap istilah yang Anda filter dalam bagian html relatif terhadap istilah tersebut.

Yang paling efisien adalah mengubah string kueri dengan cara filter. Yang paling mudah adalah dengan melakukan tiga pertanyaan terpisah. WP API harus menangani pemesanan dengan pajak, atau parameter kueri pembatasan apa pun. Jika Anda membatasi kueri berdasarkan kondisi tertentu, ada kemungkinan besar bahwa banyak orang akan perlu memesan dengan kondisi yang sama.

Aryan Duntley
sumber
2
Maaf, tapi kamu salah. Memesan berdasarkan taksonomi juga tidak masuk akal dalam kasus Anda. Apa yang ingin kamu perlihatkan? Semua Sarapan pertama, diikuti oleh semua Makan Malam, lalu semua Makan Siang? Anda harus memilih apa yang Anda inginkan dan urutan yang Anda inginkan, tetapi taksonomi hanyalah label pengelompokan. Bukan "data" yang berarti yang harus Anda pesan. Jika ya, maka itu bukan istilah dalam taksonomi, Anda harus menjadikannya sebagai post-meta.
Otto
15
Ayo, tentu saja akan ada beberapa contoh di mana Anda ingin memesan posting dengan istilah taksonomi. Contoh lain adalah jenis posting Film dengan taksonomi Peringkat. Dalam daftar film, sangat mudah untuk membayangkan orang-orang yang ingin memesan daftar film berdasarkan peringkat sehingga semua film berperingkat-G, kemudian peringkat-PG, dll. Muncul di bagian atas. (Dalam contoh ini dan makanan, mereka dapat dipesan dengan term_id bukan nama.) Ada area besar berwarna abu-abu di mana Anda mungkin paling baik dilayani oleh taksonomi dan bukan meta, tetapi mungkin juga membantu agar taksonomi itu dipesan. -sanggup.
SeventhSteel
2
Peringkat PG dan G dan semacamnya adalah pilihan taksonomi yang baik, kecuali bahwa itu adalah data tentang film tertentu. Jadi, mereka meta. Itu data, bukan kategori. Hanya memiliki sejumlah pilihan tidak membuat taksonomi. Jika perlu disortir, maka buatlah meta, atau paksakan sortir berdasarkan taksonomi melalui kode spesifik taksonomi. BTW, NC17 datang setelah PG. Jadi, Anda perlu kode untuk melakukan pemesanan itu.
Otto
Saya tahu saya terlambat ke pesta dengan komentar ini, tetapi hanya menabrak ini. Memesan dengan taksonomi bisa masuk akal dalam beberapa situasi. Kami memiliki daftar pekerjaan pada satu proyek sebagai jenis posting dan kemudian Negara dan Kota di mana pekerjaan itu adalah taksonomi. Kami ingin mereka mudah dikelompokkan (tampilkan semua pekerjaan di negara bagian atau tampilkan semua pekerjaan di kota) sehingga taksonomi adalah solusi terbaik. Pada saat yang sama ada pencarian pekerjaan umum di mana kami ingin mengurutkannya berdasarkan judul, kemudian oleh negara, kemudian oleh kota.
Dennis Puzak
Kasus penggunaan lain: Seorang klien memiliki banyak artikel, masing-masing memiliki kategori. Klien ingin ada halaman yang mencantumkan semua artikel, yang dapat diurutkan berdasarkan abjad, berdasarkan tanggal, atau berdasarkan kategori. Kategori juga dapat difilter, tetapi mendaftar semua artikel berdasarkan kategori secara alfabet tidak terlalu gila dengan kasus penggunaan dan Anda melihatnya cukup sering muncul.
Wilson Biggs
15

Ya, tapi itu cukup terlibat ...

Tambahkan ke functions.php dalam tema Anda:

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

Ini berasal dari beberapa hal yang ditemukan dan beberapa hal yang saya lakukan sendiri. Menjelaskan cukup sulit, tetapi intinya adalah dengan menjalankan ini, Anda dapat menempatkan? Orderby = (var taksonomi) & order = ASC (atau DESC) dan dia akan langsung pergi!

Drew Gourley
sumber
Terima kasih Drew, saya akan mencobanya dan mencoba menjalankan SQL itu, perlu mengedit sedikit, tetapi mungkin berhasil. Satu-satunya masalah saya sekarang, adalah saya mungkin pergi ke arah yang salah seperti yang ditunjukkan oleh Otto. Drew terima kasih. SUNTING- Tidak perlu mengedit Saya bisa melihat di mana perlu tweaking :) Terima kasih
ya
Jika Anda meraihnya dalam dua menit terakhir, itu tidak akan berhasil, silakan ambil sekarang, saya memperbaikinya. Itu ditetapkan untuk dua taksonomi tertentu, saya meningkatkan kode untuk bekerja pada semua taksonomi terdaftar.
Drew Gourley
Terima kasih sekali lagi. Kalau-kalau saya mencoba solusi Anda dan itu bekerja. Juga jika orang lain ingin menggunakannya, Anda perlu mengubahnya add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );menjadi add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );Terima kasih :)
yeope
Ya, ini sekarang diperbaiki dalam blok kode, saya mengambil ini dari proyek yang sedang saya kerjakan dan lupa untuk mengubah nama fungsi meskipun saya mengubahnya di hook.
Drew Gourley
1
Apakah Anda tahu jika dimungkinkan untuk memesan taksonomi dengan ID bukan nama? Saya mencoba untuk mendapatkan hasil yang sama dengan memesan kelompok taksonomi dengan ID
Javier Villanueva
9

Saya datang terlambat ke permainan di sini, tetapi ada cara WordPressy yang lebih sederhana untuk melakukan ini.

Buat permintaan pajak Anda seperti biasa.

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

Siapkan args Anda untuk query_posts atau WP_Query

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

Sebelum Anda melakukan panggilan query_posts / WP_Query Anda, sambungkan ke filter orderby dan timpa

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

jangan lupa untuk menghapus filter setelahnya ...

ini berfungsi b / c tax_query membuat gabungan dll untuk Anda, Anda hanya perlu memesan oleh salah satu bidang dari bergabung.

Francis Yaconiello
sumber
2
Adakah gagasan tentang cara memesan berdasarkan nama alih-alih term_taxonomy_id? mengubah term_taxonomy_id di orderby_statement menimbulkan kesalahan
tehlivi
Ini adalah jawaban yang tepat untuk siapa saja yang tertarik!
Mayra M
2

Baiklah, saya ingin memaparkan pengalaman saya dalam menyortir jenis posting khusus berdasarkan kategori / taksonomi.

WEB

  1. Situs web biro perjalanan yang berjalan di WordPress
  2. Konten utama pada jenis posting khusus yang disebut 'ruta'
  3. Taksonomi dengan struktur ini Tipe-perjalanan-> benua> negara

KASUS

Di halaman daftar kategori arsip, klien ingin posting diurutkan berdasarkan

  1. Benua, dipesan berdasarkan jumlah rute di masing-masing rute.
  2. Negara, dipesan berdasarkan abjad.

LANGKAH LANGKAH

Pertama , saya menangkap permintaan dari permintaan halaman arsip yang tidak dimodifikasi yang kebetulan seperti ini:

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

Kedua , saya mengedit kode sql di Sequel Pro terhadap database untuk memenuhi kebutuhan saya. Saya keluar dengan ini (ya, mungkin itu bisa diperbaiki: pengetahuan saya tentang MySQL tidak beredar):

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  

Ketiga , saya mengaitkan kueri pada file functions.php dengan tiga filter: posts_fields, posts_join, dan posts_orderby

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

Akhirnya saya memicu filter dari kait pre_get_post sesuai dengan beberapa kondisi

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

Semoga ini bisa membantu seseorang

Xavier Caliz
sumber
Kerja bagus, konyol yang mengambil jumlah kode ini untuk mengurutkan sesuatu berdasarkan taksonomi. Masalah besar dengan WP.
serraosays
2

Saya memiliki masalah yang sangat mirip dengan yang saya tangani: Saya ingin memesan arsip jenis tulisan khusus (artikel majalah) dengan taksonomi khusus (masalah). Saya tidak pernah melakukan query SQL langsung di situs saya - dan biasanya jika Anda menyukai jawaban lain ini - Anda perlu memikirkan kembali pendekatan Anda.

MASALAH:

1) Wordpress tidak memungkinkan Anda untuk memesan taksonomi dengan cara yang cerdas.

2) Wordpress tidak memungkinkan orderbyuntuk menggunakan taksonomi pada post-type WP_Query (seperti dijabarkan oleh Otto).

SOLUSI:

1) Menyortir taksonomi paling baik dilakukan oleh plugin Custom Taxonomy Order NE saat ini. Ini memungkinkan Anda untuk memesan taksonomi melalui WYSIWYG wp-adminyang bukan bagaimana saya akan melakukannya tetapi saya belum menemukan yang lebih baik.

Ketika Anda mengatur plugin, Anda akan mendapatkan sesuatu yang mirip dengan apa yang saya lakukan di sini. Perhatikan opsi Auto-sort Queries of this Taxonomy- atur ini ke Custom Order as Defined Above; ini membuat Anda memesan yang Anda butuhkan. Tangkapan layar:

Tampilan Pesanan Taksonomi Kustom NE

2) Dengan taksonomi diurutkan, Anda sekarang dapat membuat serangkaian panggilan WP_Query yang dijalankan melalui setiap istilah, secara efektif membuat arsip yang dipesan oleh taksonomi. Gunakan get_terms()untuk membuat larik semua istilah pajak, lalu jalankan foreachsetiap istilah. Ini menciptakan WP_Queryuntuk setiap item istilah yang akan mengembalikan semua posting untuk istilah yang diberikan, secara efektif membuat arsip yang dipesan oleh istilah taksonomi. Kode untuk mewujudkan ini:

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

Bacaan terkait di situs ini: Tampilkan semua posting dalam jenis posting khusus, dikelompokkan berdasarkan taksonomi khusus

serraosay
sumber
2

Saya tidak yakin mengapa semua solusi di sini cukup berlebihan. Oke, sudah setengah dekade yang lalu, tapi saya baru saja menjalankan kode berikut dan berfungsi:

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

Ini akan mengurutkan taksonomi CPT Anda terlebih dahulu dengan taksonomi dalam urutan abjad dan dalam kelompok taksonomi ini juga berdasarkan urutan abjad.

pengguna3135691
sumber
@ Ya Kenapa ini jawaban yang diterima !? Terima kasih Tuhan aku menggulir
Juan Solano
1

Inilah solusi yang saya gunakan untuk masalah khusus ini. Solusi ini untuk kasus-kasus ekstrem di mana keduanya tidak mungkin menggunakan pre_get_postsfilter dan ada pagination pada kueri (yaitu: 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);

Saya menggunakan ini untuk membuat menu nav yang dipesan berdasarkan taksonomi, istilah, dan jumlah posting per istilah.

Jika Anda hanya ingin posting maka ubah kueri menjadi SELECT p.*danGROUP BY p.ID

CodeShaman
sumber
0

Ini seperti kueri sebelum kueri, tetapi tidak akan mengganggu jika kita tidak meminta terlalu banyak posting ... Idenya adalah untuk memodifikasi kueri utama sehingga kita bahkan tidak perlu pergi ke templat dan menghasilkan kueri baru dan loop ...

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' );
Marcelo Viana
sumber