Wp_query kullanarak taksonomi sipariş etmek mümkün mü?


49

Sorum basit, wp_Query kullanıyorum tax_query kullanarak bir taksonomi tarafından filtrelenen bazı özel tip mesajları almak için.

Şimdi benim sorunum taksonomiyi sipariş etmek istiyorum, ancak dokümantasyon ve web'de arama yapmaktan bir çözüm bulamıyorum.

WP_Query'deki düzen, özel meta alanları bile olsa bir sürü alana göre sıralamanıza izin verir, ancak taksonomiyi desteklemiyor gibi görünmektedir.

Doğru yönde işaret eden var mı?

Hepinize teşekkür ederim.

Yanıtlar:


12

Hayır, taksonomiyle sipariş vermek mümkün değildir, çünkü belli bir bakış açısıyla, aslında pek bir anlam ifade etmemektedir.

Taksonomi, işleri birlikte gruplamanın bir yoludur. Dolayısıyla, görevler üzerinde bir taksonomiye sahip olmanın amacı, direkler arasında paylaşılan bu taksonomide terimlerin olması olacaktır. Bir taksonomide her birinin yalnızca bir yayında kullanılan terimleri varsa, o zaman bu taksonomiyi anlamsız kılar. Terimler olması gerektiği gibi paylaşıldıysa, sipariş vermek özellikle yararlı bir şey üretmezdi.

Böyle bir durumda kullanmanız gereken şey post meta. Yazılan meta ile sipariş verebilirsiniz ve her yazılan için benzersizdir.

Düzenleme: Dedi ki, bir filtre kullanarak özel bir SQL sorgusu yaparak taksonomiye göre sipariş verebilirsiniz, sadece değiştirilmemiş bir WP_Query'den yapamazsınız: http://scribu.net/wordpress/sortable-taxonomy-columns.html

Bununla birlikte, bu tür bir şeyi yapmak için başvurmak zorunda kalırsanız, veri tasarım yapınız her şeyden önce yanlıştır. Taksonomideki "Terimler" gerçek "veri" değildir. Terimlerin kendilerinin doğal bir anlamı yoktur, sadece tanımladıkları gruplama için etiketlerdir. Onlara anlamlı veriler olarak davranıyorsanız, bunun altında yatan bir tasarım kusurunuz vardır.

Taksonomiler, şeyleri kendilerine atayarak gruplandırır. Bu gruplandırma, tüm taksonomilerin noktasıdır, terimler gruplaşmanın sadece güzel yüzleridir. Bir gönderiye atamak için anlamlı meta verileriniz varsa, bunun yerine post meta kullanmanız gerekir. Ayrıca sipariş verebilirsiniz , çünkü post meta bilgi depolamak için hem anahtarları hem de değerleri kullanır. Bir taksonomide, gerçekten sadece anahtarları saklıyorsunuz, değerleri o terim tarafından gruplanmış mesajlar.

Doğru yaklaşımı kullanırsanız uzun vadede işler daha kolaydır. Taksonomi ile garip bir şey yapamayacağımı söylememe rağmen, uzun vadede yanlış kullanarak kendin için işleri daha da zorlaştırıyorsun.


Merhaba Otto, cevap için teşekkür ederim. Amacını anlıyorum ve belki bununla yanlış yoldan gidiyorum. Örneğimde bir dizi tv şovunda seri 1, seri 2, seri 3 gibi taksonomilere sahibim. Böylece tüm farklı dizileri seri numarasına göre gruplandırabilirim. Daha sonra bölümler, Bölüm 01, Bölüm 02, vb. İçin de aynı şey var. İstediğim bölümlerin ve bölümlerin sıralarına göre sıralanacak tüm bölümlerin bir listesini gösterirken. Meta ve özel alanları yazıp analiz edeceğim. Teşekkürler Otto.
yeope,

@yeope taksonominiz seri olmalı ve terimleriniz seri 1, seri 2 vb. olmalıdır. Bölümlerde, bir dizinin birden fazla bölüm içerdiğini farz ediyorum, böylece aynı taksonomiyi, "seri" yi kullanabilecekler ve hiyerarşikse bölüm 1, 2. bölüm vb. ana "x serisi" olur. Ardından, bir diziyi, gerektiği yerde olacak şekilde düşen bölümlerle sorgulayabilirsiniz.
Chris_O

@ Chris_O Görüyorum, orada para olabilir! Görebildiğim tek sorun, her bölüm için "Bölüm 1", "Bölüm 2" terimlerini tekrarlamak zorunda olmak. Ayrıca, tüm bölümler 1'i diziye bağlı olarak gruplayamamak da mümkün değil, ancak bunun muhtemelen bir yolu olduğunu düşünüyorum. Thank you Chris_O
yeope

2
Bölümler için bir taksonomi kullanmak aslında anlamlı değildir, çünkü gruplama değersizdir. Bir terim olarak "bölüm 1" e sahipseniz, bölüm 1'i diğer TV şovlarının diğer bölüm 1'iyle gruplandırıyorsanız düşünün. Bölüm ve seri numaraları post_meta olarak daha mantıklıdır, çünkü belirli bir gösteriye özgüdürler ve grup olarak kullanışsızdırlar. TV şovunun adı, televizyon şovu taksonomisinde bir terim olarak kullanışlıdır, çünkü o zaman şovu bir bütün olarak gruplandırıyorsunuzdur.
Otto,

1
Otto bunu ilginç bir blog yazısı ile takip etti: Ne zaman (ne zaman) Özel Taksonomi kullanılmalı .
Jan Fabry

47

Bu soru için kabul edilen cevap kabul edilemez. Vergi ile sipariş vermenin "bir anlam ifade etmediğini" varsaymak mantıksızdır. Verdiği cevap mantıklı değil.

Bir menü yazı tipini düşünün. O zaman özel bir "FoodKategoriler" vergisi var. FoodKategoriler vergisi "Kahvaltı", "Öğle Yemeği" ve "Akşam Yemeği" şartlarına sahiptir. Tax_query paramını kullanarak bir sorgu gönderirseniz, şimdi tüm terimlerle bir sonuç kümesine sahipsiniz, ancak bunlar posta tarihine göre sıralanıyor.

Bunlardan doğru sırasını almak için, koşullarına göre ve ardından gönderileri çeşitli kategorilere ayırarak ön ucunda uygun bir şekilde görüntülemek için, sonuç kümesinde dolaşmanız ve ardından içinde her bir postayı sorgulamanız gerekir. Sonuç terimlerini bulmak ve mevcut terim ile karşılaştırmak için ayarlayın, bir diziye filtre uygulayın ve devam edin. Sonra tekrar görüntülemek için yeni dizi boyunca döngü gerekir. Bu verimli değil.

WP "post__in" olan bir "tax__in" siparişi seçeneğine sahip olsaydı iyi olurdu, ama yapmadığınız için yukarıdaki saçma işlemi yapmanız gerekiyor; sırasıyla sipariş yöntemini ayarlamak ve terim sonuç kümesine eklemek için sorguyu 'posts_orderby' filtresi ve 'posts_join' filtresi aracılığıyla kendiniz özelleştirin; veya bu terimlere göre html bölümlerinde filtrelemekte olduğunuz her terim için yeni bir sorgu yapmanız gerekir.

En verimli sorgu dizesini filtreler yoluyla değiştirmek olacaktır. En kolay üç ayrı sorgu yapmak olacaktır. WP API, vergi veya herhangi bir kısıtlayıcı sorgu parametresiyle sipariş işlemeyi gerçekleştiriyor olmalıdır. Bir sorguyu belirli koşullara göre kısıtlıyorsanız, birçoğunun aynı koşullara göre sıralaması gerekebilecek yüksek bir olasılık vardır.


2
Üzgünüz, ama yanılıyorsunuz. Taksonomiyle sipariş vermek de sizin durumunuz için bir anlam ifade etmiyor. Ne göstermek istersin Önce tüm Kahvaltılar, ardından tüm Yemekler, ardından tüm Öğle Yemeği? Ne istediğinizi ve istediğiniz sırayı seçmelisiniz, ancak taksonomi sadece bir gruplandırma etiketidir. Sipariş vermeniz gereken, anlamlı "veri" değildir. Eğer öyleyse, o zaman taksonomide bir terim olmamalı, bunun yerine onu bir meta-meta yapmalısınız.
Otto

15
Hadi, elbette, taksonomi terimine göre sipariş vermek isteyebileceğiniz bazı durumlar olacak. Başka bir örnek, Derecelendirme taksonomisine sahip bir Film yayını türüdür. Bir film listesinde, derecelendirmeye göre bir film listesi sipariş etmek isteyen insanları hayal etmek çok kolaydır, böylece tüm G dereceli, ardından PG dereceli vb. Filmler en üst sırada yer alır. (Bu ve yemek örneğinde, ad yerine term_id tarafından sipariş edilebilirler.) Muhtemelen en iyi taksonomi ile hizmet verdiğiniz ve meta değil en iyi hizmet verdiğiniz geniş bir gri alan alanı var, ancak bu taksonominin düzen olması da muhtemelen yardımcı olacaktır. -yapabilmek.
SeventSteel

2
PG ve G puanları ve benzeri, belirli filmler hakkındaki veriler dışında, iyi bir taksonomi tercihidir. Böylece, onlar meta. Onlar veri, kategori değil. Sadece sınırlı sayıda seçeneğe sahip olmak taksonominin yapmaz. Buna göre sıralaması gerekirse, meta yapmasını sağlayın veya taksonomiye özgü bir kod kullanarak taksonomiye göre sıralamayı zorlayın. BTW, NC17, PG'den sonra gelir. Yani, yine de bu siparişi yapmak için koda ihtiyacınız var.
Otto

Bu yorumla partiye geç kaldığımı biliyorum, ancak buna çarptı. Taksonomiyle sipariş vermek bazı durumlarda anlamlı olabilir. Bir proje üzerinde post tip olarak iş ilanlarımız var, ardından işin taksonomisi olduğu Eyalet ve Şehir. Kolayca gruplanabilir olmalarını istiyoruz (bir eyaletteki tüm işleri göster ya da bir şehirdeki tüm işleri göster) böylece taksonomi en iyi çözümdü. Aynı zamanda, ilk önce başlığa, sonra devlete, sonra şehre göre sıralamak istediğimiz genel iş arama var.
Dennis Puzak

Başka bir kullanım örneği: Bir müşterinin, her biri bir kategoriye sahip olan bir sürü makalesi vardır. Müşteri, alfabetik olarak, tarihe veya kategoriye göre sıralanabilen tüm makaleleri listeleyen bir sayfa olmasını istiyor. Kategoriler de filtrelenebilir, ancak tüm makaleleri kategoriye göre alfabetik olarak sıralamak bir kullanım durumunun o kadar da delice olmadığını ve çok sık ortaya çıktığını görürsünüz.
Wilson Biggs

15

Evet, ama oldukça karıştı ...

Temanızdaki functions.php dosyasına ekleyin:

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

Bu, bazı bulduklarım ve kendim yaptığım bazı şeylerden frankensteined. Açıklamak oldukça zor, ama sonuç şu ki, bu işlem devam ediyor, sen?


Teşekkürler Drew, ben gidip o SQL'i çalıştırmaya çalışacağım, biraz düzenlemeliyim ama işe yarayabilir. Şu andaki tek sorunum, Otto'nun işaret ettiği gibi yanlış yönlere gidiyorum olabilir. Teşekkürler Drew. EDIT- Düzenlemeye gerek yok Tweaking'in nerede olduğunu görebiliyorum :) Teşekkür ederim
yeope

Son iki dakika içinde yakaladıysanız, işe yaramaz, devam edin ve şimdi alın, düzeltdim. İki özel taksonomi için ayarlanmış, kayıtlı tüm taksonomiler üzerinde çalışmak için kodu geliştirdim.
Drew Gourley,

tekrar teşekkürler. Sadece çözümünüzü denedim diye çalışır. Ayrıca eğer bir başkası kullanmak istiyorsa add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );, add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );teşekkür etmelisin :)
yeope

Evet, bu kod bloğunda düzeltildi, bunu üzerinde çalıştığım bir projeden aldım ve kancayı değiştirdiğim halde fonksiyonun adını değiştirmeyi unuttum.
Drew Gourley

1
Taksonomilerin isim yerine kimliğe göre sıralanmasının mümkün olup olmadığını biliyor musunuz? Taksonomi gruplarını ID'ye göre sipariş ederken aynı sonucu almaya çalışıyorum
Javier Villanueva

9

Buradaki oyuna geç geliyorum, ancak bunu yapmanın daha basit ve WordPressy yolu var.

Normal olarak vergi sorgunuzu oluşturun.

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

Argümanlarınızı query_posts veya WP_Query için ayarlayın

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

Query_posts / WP_Query çağrınızı yapmadan önce, sipariş filtresine takın ve geçersiz kılın

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

Daha sonra filtreyi çıkarmayı unutma ...

Bu b / c çalışır, tax_query sizin için birleştirme vs. yaratır, sadece birleştirme alanlarından birini sipariş etmeniz yeterlidir.


2
Term_taxonomy_id yerine ada göre nasıl sipariş verileceği hakkında bir fikriniz var mı? orderby_statement olarak term_taxonomy_id değiştirme hataları atıyor
tehlivi

Bu ilgilenen herkes için doğru cevap!
Mayra M

2

Özel gönderi türlerini kategori / taksonomiye göre sıralama konusundaki deneyimimi göstermek istiyorum.

  1. WordPress'te çalışan bir seyahat acentesi web sitesi
  2. Özel posta türü üzerinde 'ruta' adı verilen ana içerik
  3. Bu yapıyla taksonomi Seyahat türü> kıta> ülke

DOSYA

Arşiv kategori listesi sayfalarında, müşteri gönderilerin sıralanmasını istedi

  1. Kıta, her biri için rota sayısına göre sıralanmıştır.
  2. Ülke, alfabetik olarak sıralanmıştır.

ADIMLAR

Öncelikle , isteği şöyle değiştirilmiş olan değiştirilmemiş arşiv sayfası sorgusundan alıyorum:

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

İkinci olarak , Sequel Pro’daki sql kodunu veri tabanımdaki ihtiyaçlarıma göre ayarladım. Bununla çıkıyorum (evet, muhtemelen geliştirilebilir: MySQL hakkındaki bilgilerim olağanüstü değil):

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  

Üçüncüsü , üç farklı filtre ile işlev.php dosyasına sorguyu bağladım: posts_fields, posts_join ve posts_orderby

Functions.php içindeki kod:

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

Sonunda bazı koşullara göre pre_get_post kancasındaki filtreleri tetikledim.

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

Umarım bu birine yardım edebilir


Güzel iş, saçma sapan bir miktar taksonomi ile sıralamak için bu miktarda bir kod aldı. WP ile büyük sorun.
serraosays

2

Ele aldığım çok benzer bir problem yaşadım: Özel bir post-tip arşivi (dergi makaleleri) özel bir taksonomiyle (sorunlar) sipariş etmek istiyorum. Sitemde hiçbir zaman doğrudan SQL sorguları yapmam - ve genellikle bu diğer cevapları seviyorsanız - yaklaşımınızı yeniden düşünmeniz gerekir.

SORUNLAR:

1) Wordpress taksonomileri akıllı bir şekilde sipariş etmenize izin vermez.

2) WordPress sadece orderbypost-tip WP_Query'de (Otto tarafından yazıldığı gibi) taksonomilerin kullanılmasına izin vermez .

ÇÖZÜMLER:

1) Taksonomilerin sınıflandırılması en iyi haliyle , şu anda Özel Taksonomi Siparişi NE eklentisi ile gerçekleştirilir. Taksonomiyi WYSIWYG üzerinden sipariş etmenize izin verir, wp-adminki bunu nasıl yapmam değil ama daha iyi bir şey bulamadım.

Eklentiyi kurduğunuzda, burada yaptığım şeye benzer bir şey elde edersiniz. Seçeneği not edin Auto-sort Queries of this Taxonomy- bunu Custom Order as Defined Above; bu size ihtiyacınız olan emri verir. Ekran görüntüsü:

Özel Taksonomi Sipariş NE ekran

2) Sıralı bir taksonomiyle yerinde, artık her bir terimden geçen bir dizi WP_Query çağrısı oluşturarak, taksonomi tarafından sipariş edilen bir arşivi etkin bir şekilde oluşturabilirsiniz. get_terms()Tüm vergi terimlerinden oluşan bir dizi oluşturmak için kullanın ve ardından foreachher terimin üzerinde bir işlem yapın . Bu, WP_Queryher bir terim için belirli bir terim için tüm gönderileri döndürecek ve etkili bir şekilde taksonomi terimiyle sipariş edilen bir arşiv oluşturacak bir öğe oluşturur. Bunu gerçekleştirecek kod:

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

Bu sitedeki ilgili okumalar: Tüm gönderileri, özel bir taksonomiye göre gruplandırılmış özel bir yazı tipinde görüntüleyin


2

Buradaki tüm çözümlerin neden bu kadar üstün olduğunu bilmiyorum. Tamam, yarım yıl önce, ancak şu anda aşağıdaki kodu kullanıyorum ve çalışıyor:

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

Bu, CPT'nizin taksonomilerini öncelikle alfabetik sırayla ve bu taksonomi grupları içinde de alfabetik sıraya göre sıralar.


@yeope Neden bu kabul edilen cevap !? Tanrıya şükür ben kaydırdım
Juan Solano 23

1

İşte bu özel problem için kullandığım çözüm. Bu çözüm, hem pre_get_postsfiltre kullanmanın mümkün olmadığı hem de sorguda sayfalamaların mevcut olmadığı aşırı durumlar için geçerlidir (örneğin: 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);

Bunu, taksonomi, terim ve terim başına yazılan sayıma göre sıralanmış bir nav menüsü oluşturmak için kullandım.

Sadece yayınları istiyorsanız, sorguyu SELECT p.*ve olarak değiştirin.GROUP BY p.ID


0

Sorgudan önceki bir sorgu gibi, ancak çok fazla gönderi sorgulamıyorsak rahatsız olmaz ... Ana sorguyu değiştirmek, böylece şablonlara gidip yeni sorgular oluşturmamıza bile gerek yok. döngüler ...

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' );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.