Za pomocą wp_query można zamówić według taksonomii?

49

Moje pytanie jest proste: używam WP_Query do pobierania niektórych postów typu niestandardowego filtrujących według taksonomii za pomocą tax_query.

Teraz moim problemem jest to, że chciałbym zamówić taksonomię, ale z dokumentacji i wyszukiwania w Internecie nie mogę znaleźć rozwiązania.

Kolejność w WP_Query pozwala zamówić przez kilka pól, nawet niestandardowe pola meta, ale nie obsługuje taksonomii.

Jakieś wskazówki we właściwym kierunku?

Dziękuję wam wszystkim.

yeope
źródło

Odpowiedzi:

12

Nie, nie można zamawiać według taksonomii, ponieważ z pewnego rodzaju punktu widzenia nie ma to większego sensu.

Taksonomie to sposoby grupowania rzeczy. Tak więc sensem posiadania taksonomii na postach byłoby naprawdę określenie w tej taksonomii warunków, które są wspólne dla postów. Gdyby taksonomia zawierała terminy, które były używane tylko na jednym poście, to uczyniłoby to taksonomię trochę bezcelową. A jeśli warunki byłyby udostępniane tak, jak powinny, to ich uporządkowanie nie przyniosłoby nic szczególnie przydatnego.

W takiej sytuacji powinieneś używać post-meta. Możesz zamówić pocztą meta i jest ona unikalna dla każdego postu.

Edycja: Powiedział, że możesz zamówić według taksonomii, tworząc niestandardowe zapytanie SQL za pomocą filtra, po prostu nie możesz tego zrobić z niezmodyfikowanego WP_Query: http://scribu.net/wordpress/sortable-taxonomy-columns.html

Jeśli jednak musisz uciekać się do takich działań, struktura projektu danych jest w pierwszej kolejności niewłaściwa. „Warunki” w taksonomii nie są rzeczywistymi „danymi”. Same terminy nie mają żadnego wewnętrznego znaczenia, są jedynie etykietami dla określonej grupy, którą opisują. Jeśli traktujesz je jako znaczące dane, masz podstawową wadę projektową.

Taksonomie grupują rzeczy, przypisując im warunki. To zgrupowanie jest sednem taksonomii, warunki są po prostu ładnymi twarzami w grupowaniu. Jeśli masz znaczące metadane do przypisania do postu, powinieneś zamiast tego użyć do tego meta postu. I można to zamówić, ponieważ post meta używa zarówno kluczy, jak i wartości do przechowywania informacji. Dzięki taksonomii tak naprawdę przechowujesz tylko klucze, a ich wartości stanowią posty pogrupowane według tego terminu.

Na dłuższą metę będzie łatwiej, jeśli zastosujesz odpowiednie podejście. Chociaż nie mówię, że nie można zrobić czegoś dziwnego z taksonomią, po prostu utrudniasz sobie życie na dłuższą metę, niewłaściwie go wykorzystując.

Otto
źródło
Cześć Otto, dziękuję za odpowiedź. Rozumiem, o co ci chodzi, a może idę z tym źle. W moim przykładzie strona z programami telewizyjnymi, mam taksonomię dla serii 1, serii 2, serii 3 itd. Więc mogę pogrupować wszystkie różne programy telewizyjne według numerów seriali. Potem mam to samo dla odcinków, odcinka 01, odcinka 02 itd. Chciałbym, aby wyświetlać listę wszystkich odcinków, które należy uporządkować według odcinków i serii. Przeanalizuję, a następnie opublikuję pola meta i niestandardowe. Dziękuję Otto.
jutro
@yeope twoja taksonomia powinna być serią, a twoje terminy powinny być serią 1, serią 2 itd. W przypadku odcinków zakładam, że seria zawiera wiele odcinków, więc mogłaby używać tej samej taksonomii, „serii”, a jeśli są one hierarchiczne, to odcinek 1, odcinek 2 itd. miałby nadrzędny termin „seria x”. Następnie możesz zapytać całą serię, aby epizody były zgodne z oczekiwaniami.
Chris_O,
@Chris_O Rozumiem, możesz tam być na pieniądze! Jedyny problem, jaki widzę, to konieczność powtarzania terminów „Odcinek 1”, „Odcinek 2” dla każdej serii. Nie mogę też grupować wszystkich odcinków 1, w zależności od serii, ale myślę, że jest na to sposób. Dziękuję Chris_O
yeope
2
Używanie taksonomii do odcinków nie ma większego sensu, ponieważ grupowanie jest bezwartościowe. Pomyśl o tym, jeśli masz „odcinek 1” jako termin, wówczas grupujesz odcinek 1 z każdym innym odcinkiem 1 z każdego innego programu telewizyjnego. Numery odcinków i seriali mają większy sens jako post_meta, ponieważ są specyficzne dla tego konkretnego programu i nie są przydatne jako grupa. Nazwa programu telewizyjnego byłaby przydatna jako termin w taksonomii programu telewizyjnego, ponieważ wtedy grupujesz program jako całość.
Otto
1
Następnie Otto opublikował ciekawy post na blogu: Kiedy (nie) używać niestandardowej taksonomii .
Jan Fabry
47

Przyjęta odpowiedź na to pytanie jest niedopuszczalna. Nielogiczne jest zakładanie, że zamówienie podatkowe „nie ma sensu”. Odpowiedź, której udzielił, nie ma sensu.

Zastanów się nad typem postu w menu. Następnie masz niestandardowy podatek „FoodCategories”. Podatek FoodCategories obejmuje terminy „śniadanie”, „lunch” i „kolacja”. Jeśli prześlesz zapytanie przy użyciu parametru tax_query, masz teraz zestaw wyników ze wszystkimi warunkami, jednak są one uporządkowane według daty publikacji.

Aby uzyskać z nich prawidłową kolejność względem ich warunków, a następnie odpowiednio wyświetlić w interfejsie użytkownika, dzieląc posty na różne kategorie, musisz przejrzeć zestaw wyników, a następnie wysłać zapytanie do poszczególnych postów w zestaw wyników, aby znaleźć jego warunki i porównać je z bieżącym, przefiltrować do tablicy i kontynuować przez cały czas. Następnie musisz ponownie przejść przez nową tablicę do wyświetlenia. To nie jest produktywne.

Byłoby miło, gdyby WP miał opcję „tax__in” według opcji, tak jak robi to „post__in”, ale ponieważ tak nie jest, musisz albo wykonać powyższy absurdalny proces; samodzielnie dostosuj zapytanie za pomocą filtrów „posts_orderby” i „posts_join”, aby odpowiednio dostosować metodę orderby i dodać termin do zestawu wyników; lub musisz utworzyć nowe zapytanie dla każdego filtrowanego terminu w sekcjach HTML w odniesieniu do tych terminów.

Najbardziej wydajna byłaby zmiana ciągu zapytania za pomocą filtrów. Najłatwiej byłoby wykonać trzy oddzielne zapytania. Interfejs API WP powinien obsługiwać zamawianie według podatków lub dowolnych restrykcyjnych parametrów zapytań. Jeśli ograniczasz zapytanie w oparciu o określone warunki, istnieje duże prawdopodobieństwo, że wielu będzie musiało zamówić według tych samych warunków.

Aryan Duntley
źródło
2
Przepraszam, ale się mylisz. Również uporządkowanie według taksonomii nie ma w twoim przypadku żadnego sensu. Co chcesz pokazać Najpierw wszystkie śniadania, potem wszystkie obiady, a potem obiady? Powinieneś wybrać, co chcesz i kolejność, w jakiej chcesz, ale taksonomia to tylko etykieta grupująca. To nie są „dane”, które należy zamawiać. Jeśli tak, to nie powinien być terminem w taksonomii, zamiast tego należy uczynić go post-meta.
Otto,
15
No dalej, oczywiście będą pewne przypadki, w których będziesz chciał zamawiać posty według terminów taksonomicznych. Innym przykładem jest typ postu filmowego z taksonomią oceny. Na liście filmów bardzo łatwo jest wyobrazić sobie ludzi, którzy chcą zamówić listę filmów według oceny, aby wszystkie filmy z oceną G, a następnie z PG itd. Były wyświetlane na górze. (W tym i przykładzie posiłku można je uporządkować według term_id zamiast nazwy.) Istnieje duża szara strefa przypadków, w których prawdopodobnie najlepiej jest Ci posłużyć taksonomia, a nie meta, ale prawdopodobnie pomocne jest również zamówienie tej taksonomii -zdolny.
SeventhSteel
2
Oceny PG i G i takie są dobrym wyborem taksonomicznym, z tym wyjątkiem, że są to dane dotyczące konkretnych filmów. Zatem są meta. To dane, a nie kategorie. Posiadanie ograniczonej liczby wyborów nie stanowi taksonomii. Jeśli potrzebuje sortowania według, albo uczyń go meta, albo wymuś sortowanie według taksonomii za pomocą kodu specyficznego dla taksonomii. BTW, NC17 jest po PG. Tak czy inaczej, potrzebujesz kodu, żeby to zrobić.
Otto,
Wiem, że spóźniłem się na przyjęcie z tym komentarzem, ale wpadłem na to. Porządkowanie według taksonomii może mieć sens w niektórych sytuacjach. Mamy oferty pracy dla jednego projektu jako typ postu, a następnie państwo i miasto, w którym praca jest taksonomią. Chcemy, aby można je było łatwo grupować (pokazywać wszystkie stanowiska w państwie lub wszystkie miejsca w mieście), aby taksonomia była najlepszym rozwiązaniem. Jednocześnie istnieje ogólne poszukiwanie pracy, w którym chcemy posortować je najpierw według tytułu, następnie według stanu, a następnie według miasta.
Dennis Puzak
Kolejny przypadek użycia: klient ma kilka artykułów, z których każdy ma kategorię. Klient chce mieć stronę z listą wszystkich artykułów, które można sortować alfabetycznie, według daty lub według kategorii. Kategorie można również filtrować, ale alfabetyczne wyświetlanie wszystkich artykułów według kategorii nie jest aż tak szalone z przypadku użycia i często się pojawia.
Wilson Biggs
15

Tak, ale jest to dość zaangażowane ...

Dodaj do funkcji.php w swoim motywie:

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

Jest to frankensteined z niektórych znalezionych rzeczy i rzeczy, które zrobiłem sam. Wyjaśnienie jest dość trudne, ale sedno jest z tym uruchomionym, możesz umieścić? Orderby = (kwerenda taksonomiczna var) i order = ASC (lub DESC), a ona od razu zacznie!

Drew Gourley
źródło
Dziękuję Drew, spróbuję uruchomić ten SQL, muszę trochę edytować, ale może działać. Moim jedynym problemem jest to, że mogę iść w złym kierunku, jak wskazał Otto. Dziękuję Drew. EDYCJA- Nie ma potrzeby edycji Widzę, gdzie trzeba
ulepszyć
Jeśli złapałeś go w ciągu ostatnich dwóch minut, to nie zadziała, śmiało i złap go teraz, naprawiłem to. Został ustawiony dla dwóch określonych taksonomii, poprawiłem kod, aby działał na wszystkich zarejestrowanych taksonomach.
Drew Gourley,
Dziękuję raz jeszcze. Na wszelki wypadek wypróbowałem twoje rozwiązanie i to działa. Także jeśli ktoś chce z niego skorzystać, musisz zmienić add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );na add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );Dziękuję :)
od
Tak, teraz jest to naprawione w bloku kodu, wziąłem to z projektu, nad którym pracuję i zapomniałem zmienić nazwę funkcji, mimo że zmieniłem ją na haku.
Drew Gourley,
1
Czy wiesz, czy można zamówić taksonomie według ID zamiast nazwy? Próbuję uzyskać ten sam wynik, uporządkując grupy taksonomii według ID
Javier Villanueva
9

Spóźniam się tutaj na tę grę, ale istnieje prostszy sposób na zrobienie tego w WordPressy.

Zbuduj zapytanie podatkowe jak zwykle.

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

Skonfiguruj argumenty dla query_posts lub WP_Query

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

Przed wykonaniem wywołania query_posts / WP_Query, podłącz do filtra sortowania i zastąp go

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

nie zapomnij później usunąć filtra ...

to działa b / c tax_query tworzy dla ciebie złączenia itp. Musisz tylko złożyć zamówienie przez jedno z pól ze złączenia.

Francis Yaconiello
źródło
2
Masz pomysł, jak zamówić według nazwy zamiast term_taxonomy_id? zmiana term_taxonomy_id w porządku by_st_stement generuje błędy
tehlivi
To jest poprawna odpowiedź dla wszystkich zainteresowanych!
Mayra M,
2

Cóż, chciałbym przedstawić moje doświadczenie w sortowaniu niestandardowych typów postów według kategorii / taksonomii.

SIEĆ

  1. Strona internetowa biura podróży działająca na WordPress
  2. Główna treść niestandardowego typu postu o nazwie „ruta”
  3. Taksonomia z tą strukturą Rodzaj podróży> kontynent> kraj

WALIZKA

Na stronach z listami kategorii archiwów klient chciał posortować posty

  1. Kontynent, uporządkowany według liczby tras na każdej z nich.
  2. Kraj uporządkowany alfabetycznie.

KROKI

Najpierw wychwytuję żądanie z niezmodyfikowanej kwerendy strony archiwum, która wyglądała tak:

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

Po drugie , edytowałem kod SQL w Sequel Pro w bazie danych, aby spełnić moje potrzeby. Wychodzę z tym (tak, prawdopodobnie można to poprawić: moja wiedza na temat MySQL nie jest wybitna):

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  

Po trzecie , podłączyłem zapytanie do pliku functions.php za pomocą trzech filtrów: posts_fields, posts_join i posts_orderby

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

W końcu uruchomiłem filtry z haka pre_get_post zgodnie z pewnymi warunkami

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

Mam nadzieję, że to może komuś pomóc

Xavier Caliz
źródło
Dobra robota, niedorzeczne, że tyle kodu wymaga posortowania według taksonomii. Ogromny problem z WP.
serraosays
2

Miałem bardzo podobny problem, z którym miałem do czynienia: chcę zamówić niestandardowe archiwum typu post (artykuły w czasopismach) według niestandardowej taksonomii (numery). Nigdy nie robię bezpośrednich zapytań SQL w mojej witrynie - i zazwyczaj jeśli podobają Ci się inne odpowiedzi - musisz przemyśleć swoje podejście.

PROBLEMY:

1) Wordpress nie pozwala na zamawianie taksonomii w żaden inteligentny sposób.

2) Wordpress po prostu nie pozwala orderbyna stosowanie taksonomii po WP_Query typu post (jak to określił Otto).

ROZWIĄZANIA:

1) Sortowanie taksonomii najlepiej obecnie realizować poprzez wtyczkę NE Zamówienie taksonomii niestandardowej . Pozwala zamówić taksonomię przez WYSIWYG, w wp-adminktórej nie zrobiłbym tego, ale nie znalazłem nic lepszego.

Po skonfigurowaniu wtyczki otrzymasz coś podobnego do tego, co tutaj zrobiłem. Zanotuj opcję Auto-sort Queries of this Taxonomy- ustaw ją na Custom Order as Defined Above; dzięki temu otrzymasz potrzebne zamówienie. Zrzut ekranu:

Niestandardowe zamówienie taksonomii Wyświetlacz NE

2) Po zastosowaniu posortowanej taksonomii możesz teraz utworzyć serię wywołań WP_Query, które przebiegają przez każdy termin, skutecznie tworząc archiwum uporządkowane według taksonomii. Użyj, get_terms()aby utworzyć tablicę wszystkich warunków podatkowych, a następnie przeprowadź foreachnad każdym z nich. Spowoduje to utworzenie WP_Queryelementu dla każdego terminu, który zwróci wszystkie posty dla danego terminu, skutecznie tworząc archiwum uporządkowane według terminu systematyki. Kod, aby to się stało:

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

Podobne artykuły na tej stronie: Wyświetl wszystkie posty w niestandardowym typie wiadomości, pogrupowane według niestandardowej systematyki

serraosays
źródło
2

Nie jestem pewien, dlaczego wszystkie rozwiązania tutaj są w nadmiarze. OK, to jest pół dekady temu, ale aktualnie uruchamiam następujący kod i działa:

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

To posortuje taksonomie CPT najpierw według taksonomii w kolejności alfabetycznej oraz w obrębie tych grup taksonomii również według kolejności alfabetycznej.

użytkownik3135691
źródło
@yeope Dlaczego to zaakceptowana odpowiedź !? dzięki Bogu przewinąłem
Juan Solano
1

Oto rozwiązanie, którego użyłem w przypadku tego konkretnego problemu. To rozwiązanie jest przeznaczone do skrajnych przypadków, w których użycie pre_get_postsfiltru nie jest możliwe i istnieje paginacja na zapytanie (np .: 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);

Użyłem tego do stworzenia menu nawigacyjnego uporządkowanego według taksonomii, terminu i liczby postów na termin.

Jeśli chcesz po prostu posty, zmień zapytanie na SELECT p.*iGROUP BY p.ID

CodeShaman
źródło
0

To jest jak zapytanie przed zapytaniem, ale nie będzie przeszkadzało, jeśli nie będziemy pytać o zbyt wiele postów ... Chodzi o to, aby zmodyfikować główne zapytanie, abyśmy nie musieli nawet przechodzić do szablonów i generować nowych zapytań i pętle ...

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
źródło