Ist es mit wp_query möglich, nach Taxonomie zu bestellen?
10 Antworten
- Stimmen
-
- 2011-04-08
Nein,esistnichtmöglich,nach Taxonomie zubestellen,da dies unterbestimmten Gesichtspunkteneigentlichnicht viel Sinnmacht.
Taxonomien sind Möglichkeiten,Dinge zugruppieren. Der Sinneiner Taxonomiefür Postsbesteht also darin,Begriffein dieser Taxonomie zu haben,die zwischen Postsgeteilt werden. Wenneine Taxonomie Begriffe hätte,diejeweilsnurfüreinen Beitrag verwendet würden,wäre die Taxonomieirgendwie sinnlos. Und wenn die Begriffe sogeteilt würden,wie sie sein sollten,würdeeine Bestellungnach diesennichtsbesonders Nützlichesergeben.
Ineiner solchen Situation sollten Sie das Post-Meta verwenden. Sie könnennach Post-Metabestellen undesistfürjeden Posteinzigartig.
Bearbeiten: Das heißt,Sie könnennach Taxonomie ordnen,indem Sieeine benutzerdefinierte SQL-Abfragemithilfeeines Filterserstellen. Sie können dieseinfachnicht übereine unveränderte WP_Querytun: http://scribu.net/wordpress/sortable-taxonomy-columns.html
Wenn Siejedoch auf solche Dinge zurückgreifenmüssen,ist Ihre Datenentwurfsstrukturin erster Liniefalsch. "Begriffe"in der Taxonomie sind keinetatsächlichen "Daten". Die Begriffe selbst haben keineinhärente Bedeutung,sie sindnur Bezeichnungenfür diebestimmte Gruppierung,die siebeschreiben. Wenn Sie sie als aussagekräftige Datenbehandeln,liegt Ihnenein Konstruktionsfehler zugrunde.
Taxonomiengruppieren Dinge,indem sieihnen Begriffe zuweisen. Diese Gruppierungist der springende Punktbei Taxonomien. Die Begriffe sindnur hübsche Gesichterin der Gruppierung. Wenn Sie aussagekräftige Metadaten haben,die Sieeinem Beitrag zuweisen können,sollten Sie stattdessen das Beitrags-Meta dafür verwenden. Und dass Sie nach bestellen können,da Post-Meta sowohl Schlüssel als auch Werte zum Speichern von Informationen verwendet. Miteiner Taxonomie speichern Sie wirklichnur Schlüssel,deren Werte die Beiträge sind,dienach diesem Begriff zusammengefasst sind.
Auf lange Sicht sind die Dingeeinfacher,wenn Sie den richtigen Ansatz dafür verwenden. Ich sage zwarnicht,dass Siemit Taxonomienichts Seltsames anfangen können,aber Siemachenes sich auf lange Sichtnur schwerer,indem Sieesfalsch verwenden.
No, it is not possible to order by taxonomy, because from a certain type of standpoint, that doesn't actually make much sense.
Taxonomies are ways to group things together. So the point of having a taxonomy on posts would really be to have terms in that taxonomy that are shared between posts. If a taxonomy had terms that were only used on one post each, then that would make the taxonomy kind of pointless. And if the terms were shared like they should be, then ordering by it wouldn't produce anything particularly useful.
What you should be using in such a situation is the post meta. You can order by post meta, and it's unique to each post.
Edit: That said, you can order by taxonomy by making a custom SQL query using a filter, you just can't do it from a unmodified WP_Query: http://scribu.net/wordpress/sortable-taxonomy-columns.html
However, if you're having to resort to doing this sort of thing, then your data design structure is wrong in the first place. "Terms" in the taxonomy are not actual "data". The terms themselves have no inherent meaning, they're just labels for the particular grouping that they're describing. If you're treating them as meaningful data, then you have an underlying design flaw.
Taxonomies group things by assigning terms to them. That grouping is the whole point of taxonomies, the terms are just pretty faces on the grouping. If you have meaningful metadata to assign to a post, then you should be using the post meta for it instead. And that you can order by, because post meta uses both keys and values to store information. With a taxonomy, you're really only storing keys, with their values being the posts grouped together by that term.
Things are easier in the long run if you use the correct approach for it. While I'm not saying that you can't do something strange with taxonomy, you're just making things harder for yourself in the long run by using it wrong.
-
Hallo Otto,dankefür die Antwort.Ich verstehe Ihren Standpunkt undgehe vielleicht denfalschen Weg.Inmeinem Beispieleiner Websitemit Fernsehsendungen habeich Taxonomiefür Serie 1,Serie 2,Serie 3 usw. So kannich alle verschiedenen Fernsehsendungennach Seriennummergruppieren.Dann habeich dasgleichefür Episoden,Episode 01,Episode 02 usw. Ichmöchte,wennicheine Liste aller Episoden zeige,dienach Episode und Serie sortiert werden sollen.Ich werde dann Meta- undbenutzerdefinierte Felder analysieren und veröffentlichen.Danke Otto.Hello Otto, thank you for the answer. I see your point and maybe I am going the wrong way with this. In my example a site of tv shows, I have taxonomy for series 1, serie 2, serie 3 etc.. So I can group all the different tv shows by series number. Then I have the same for episodes, Episode 01, Episode 02, etc.. What I would like is when showing a list of all the episodes to be order by episode and serie. I will analyse then post meta and custom fields. Thank you Otto.
- 0
- 2011-04-08
- yeope
-
@yeope Ihre Taxonomie sollte Serie sein und Ihre Begriffe sollten Serie 1,Serie 2 usw. sein. Bei Episodengeheich davon aus,dasseine Seriemehrere Episodenenthält,sodass dieselbe Taxonomie,"Serie",verwendet werden kann. Wenn sie hierarchisch sind,dann Episode 1,Folge 2 usw. hätte den übergeordneten Begriff "Serie x".Dann könnten Sieeine ganze Reihe abfragen,um die Episoden dort anzuordnen,wo sie sollten.@yeope your taxonomy should be series and your terms should be series 1, series 2 etc. With episodes I'm assuming a series contains multiple episodes so it could use the same taxonomy, "series" and if they are hierarchal then episode 1, episode 2 etc would have the parent term "series x". Then you could query a whole series in order with the episodes falling in line where they should.
- 0
- 2011-04-08
- Chris_O
-
@Chris_O Ich verstehe,Sie könnten dort auf dem Geld sein!Daseinzige Problem,dasich sehen kann,ist die Tatsache,dass die Begriffe "Episode 1","Episode 2"fürjede Serie wiederholt werdenmüssen.Auchnichtin der Lage zu sein,alle Episoden 1 unabhängig von der Serie zugruppieren,aberich denke,esgibt wahrscheinlicheinen Weg,dies zu umgehen.Vielen Dank,dass Sie Chris_O@Chris_O I see, you might be on the money there! The only problem I can see is the fact of having to repeat the terms "Episode 1", "Episode 2" for each series. Also not being able to group all episodes 1 not depending on the series, but I think there is probably a way around it. Thank you Chris_O
- 0
- 2011-04-08
- yeope
-
Die Verwendungeiner Taxonomiefür Episodenmachteigentlich wenig Sinn,da die Gruppierung wertlosist.Denken Sie darübernach,wenn Sie "Episode 1" als Begriff haben,danngruppieren Sie Episode 1mit jeder zweiten Episode 1 ausjeder anderen TV-Show.Die Episoden- und Seriennummern sind alspost_meta sinnvoller,da sie spezifischfür diesebestimmte Show sind und als Gruppenichtnützlich sind.Der Name der TV-Show wäre als Begriffin einer TV-Show-Taxonomienützlich,da Sie dann die Show als Ganzesgruppieren.Using a taxonomy for episodes doesn't make much sense, actually, because the grouping is worthless. Think about it, if you have "episode 1" as a term, then you're grouping episode 1 with every other episode 1 from every other TV show. The episode and series numbers make more sense as post_meta, because they're specific to that particular show, and not useful as a group. The name of the TV show would be useful as a term in a tv-show taxonomy, because then you're grouping the show as a whole together.
- 2
- 2011-04-15
- Otto
-
Abereine Taxonomiefür die Serie _kinda_funktioniert,abernur,weil sie Showsin einer Staffel oder sogruppiert,obwohl Sie sie auchmit der Taxonomie der Fernsehsendung abfragenmüssten.Ineiner solchen Serientaxonomie wären Ihre Begriffe 1,2,3,was die Saisonnummer darstellt,in der sich die Showbefand. Siemöchten diese Informationenjedoch weiterhin als Postmetamehr,da Sie danachbestellenmöchten.Und da Sie auch Postmeta abfragen können,istesnicht wirklich sinnvoll,es als Taxonomie zu duplizieren.But a taxonomy for series _kinda_ works, but only because it groups together shows in a season or something, although you'd have to query it with the tv-show taxonomy as well. In such a series taxonomy, your terms would be 1, 2, 3, which represent the season number that the show was in. But you'd still want this info as postmeta more, since you want to order by it. And since you can query on postmeta too, it makes no real sense to duplicate it as a taxonomy.
- 0
- 2011-04-15
- Otto
-
@Otto,am Ende habeichmichfürbenutzerdefinierte Felderentschieden :) Esmachtemehr Sinn.@Otto, in the end I went with custom fields :) It made more sense.
- 0
- 2011-05-04
- yeope
-
Ottofolgtemit eineminteressanten Blog-Beitrag: [Wanneine benutzerdefinierte Taxonomie (nicht) verwendet werden soll] (http://ottopress.com/2011/when-to-not-use-a-custom-taxonomy/).Otto followed this up with an interesting blog post: [When to (not) use a Custom Taxonomy](http://ottopress.com/2011/when-to-not-use-a-custom-taxonomy/).
- 1
- 2011-05-05
- Jan Fabry
-
@otto Danke,dass du dasgeteilt hast. Esist wirklichgut,ein bisschenmehr über Taxonomien undihre Verwendung zu lesen.Insbesonderebin ich daraninteressiert,Ihre Gedanken zueiner Situation wie derim Beitrag [Sortierbare Taxonomiespalten] (http://scribu.net/wordpress/sortable-taxonomy-columns.html)beschriebenen zu kennen.Was wäre diebeste Lösung,wennichbeide Beiträgein einem Farbbereich abfragen,aber auchnach Farben sortierenmöchte?Vielleicht wäre dies ambesten als separate Frage ...@otto Thanks for sharing this, it's really good to read a little more into taxonomies and their usages. Specifically I'm interested in knowing your thoughts on a situation like that described in the [Sortable Taxonomy Columns](http://scribu.net/wordpress/sortable-taxonomy-columns.html) post. What would be the best solution when I want to both be able to query all posts in a colour range, but also want to sort by colour? Maybe this would be best as a separate question...
- 0
- 2013-12-20
- Gaffen
-
Wenn Sie danach sortierenmöchten,solltees wirklich Meta anstelleeiner Taxonomie sein.Das Sortierennach Taxonomiemacht realistischgesehennicht viel Sinn.If you want to sort by it, then it should really be meta instead of a taxonomy. Sorting by taxonomy doesn't make a whole lot of sense, realistically.
- 0
- 2013-12-21
- Otto
-
Vielen Dank an @Otto.Obwohlich Ihrer Aussagenicht zustimme: "Wenn Siejedoch auf solche Dinge zurückgreifenmüssen,ist Ihre Datenentwurfsstrukturin erster Liniefalsch." ... Es könntenützlich sein,auf die zurückgreifen zu könnenBeitragslistenach Kategorie Begriff auf der Admin-Seite ...Thank you @Otto. Though I disagree with your statement: "However, if you're having to resort to doing this sort of thing, then your data design structure is wrong in the first place."... It could be useful to be able to resort the post list by category term on the admin side...
- 0
- 2017-05-23
- ClemC
-
@ClemC Dasmachtnicht viel Sinn.Beiträge könnenmehrere Kategorien haben.Nach was sortierst du?Was sind Ihre sekundären Sortierkriterien,wenn zwei Beiträge dieselbe Kategorie haben?Dasist die Art von Problem,auf die Sie stoßen. Taxonomien sindnur Gruppierungen. Der "Begriff"istnurein hübsches Gesichtin dieser Gruppierung. Esistnicht der wichtige Teil.Der wichtige Teilist die Gruppe selbst.Sie würden Tiernamennicht alphabetischnachihrer linnäischen Taxonomie sortieren.Hilft dirnicht.@ClemC That doesn't make a lot of sense. Posts can have multiple categories. What are you sorting by? What is your secondary sort criteria when two posts have the same category? That's the sort of problem you run into, taxonomies are just groupings, the "term" is just a pretty face on that grouping, it's not the important part. The important part is the group itself. You would not sort animal names alphabetically by their Linnaean taxonomy. Doesn't help you any.
- 0
- 2017-05-24
- Otto
-
Hallo @Otto,du hasteinen Punkt.Ich habe den Fallmeines aktuellen Projekts als Referenzgenommen,derbesondersgenugist ... Ein CPT (Film),dernureinen einzigenbenutzerdefinierten Taxonmie- (Festival-) Begriffmit Optionsfeldern zur Auswahl zulässt.Die Standardreihenfolge der CPT-Listeistnach Begriff (Festival),wasin diesem speziellen Fall logischgenugist,nicht wahr?Ich kannmir keinenbesseren Ansatzfür das "Datendesign" vorstellen ... Ich habe "Festivals" als Taxonomieimplementiert,da dieeinzigen Daten,die siebenötigen,ihre Beschreibung sind und "Filme" logischgruppieren. PS: Entschuldigungfürmein Englisch.Hi @Otto, you have a point. I took as reference the case of my current project which is particular enough... A CPT (movie) allowing only a single custom taxonmy's (festival) term with radio buttons for its selection. The CPT list default order is by term (festival) which in this particular case is logic enough, no? I can't think of a better approach about the "data design"... I have implemented "festivals" as a taxonomy because the only data they need is their description and it's logically grouping "movies". PS: Sorry for my english.
- 0
- 2017-05-25
- ClemC
-
Ja,fairgenug,aber dannisteseine Gruppe.Siegruppieren Dinge.Wasbedeutet "sortierennach"in einem solchen Kontext dann?Wenn Sieeine Reihe von Dingenin derselben Gruppe haben,können Sie diese Gruppe "auswählen",und dasist sinnvoll,aber "sortieren"istetwas völlig anderes.Sie sortierennach Feldernmit unterschiedlichen Werten undnichtnach Feldernmit denselben Werten.Yes, fair enough, but then it is a group. You're grouping things together. What does "sort by" mean in such a context then? If you have a bunch of things in the same group, then you can "select by" that group, and that makes sense, but "sort" is something totally different. You sort by fields that have different values, not by fields that all have the same values.
- 0
- 2017-05-25
- Otto
-
Sorry @Otto,ichmerkeerstjetzt deine Antwort ... Ich stimme deinen semantischen Punkten und deiner Logik voll undganz zu.Aberin meinem Kontext wäre "Sortierennach" hauptsächlicheine **ergonomische ** Angelegenheit.** Visuell ** Das Gruppieren der Projektionennach "Festival" kann dem Benutzer wichtiggenug sein,umeinen visuellen Lebenslauf zuerhalten,der auf demfürihn wichtigsten Faktorbasiert,dies aufeinen Blick.Ichbin mir alsonicht sicher,obich dasirgendwie anderserreichen kann als durch "Sortieren",wasmeiner Meinungnach kein angemessener Begriffist ...Sorry @Otto, I only now notice your answer... I totally agree with your semantic points and logic. But in my context, "sorting by" would be mainly an **ergonomic** matter. **Visually** grouping the projections by "festival" may help importantly enough the user to get a visual resume based on the most important factor for him, this at a glance. Thus, not sure I can achieve this somehow else than by "sorting" which I agree is not an appropriate term...
- 0
- 2017-08-19
- ClemC
-
- 2014-07-28
Die akzeptierte Antwort auf diese Frageistnicht akzeptabel. Esist unlogisch anzunehmen,dasseine Bestellungnach Steuern "keinen Sinnergibt". Die Antwort,dieergab,macht keinen Sinn.
Erwägen Sieeinen Menüposttyp. Dann haben Sieeine benutzerdefinierte Steuer von "FoodCategories". Die FoodCategories-Steuerenthält die Begriffe "Frühstück","Mittagessen" und "Abendessen". Wenn Sieeine Abfragemit dem Parametertax_query senden,haben Siejetzteine Ergebnismengemit allen Begriffen,diejedochnach Postdatum sortiert sind.
Um aus diesen die richtige Reihenfolgein Bezug aufihre Begriffe zuerhalten und sie dannim Frontend angemessen anzuzeigen,indem die Beiträgein ihre verschiedenen Kategorien unterteilt werden,müssen Sie die Ergebnismenge durchlaufen und dannjedeeinzelne abfragen Posten Sieinnerhalb der Ergebnismenge,um die Begriffe zufinden undmit dem aktuellen Begriff zu vergleichen,filtern Siein ein Array undfahren Sie durchgehendfort. Dannmüssen Sie dasneue Arrayerneut durchlaufen,umes anzuzeigen. Diesistnichtproduktiv.
Es wäre schön,wenn WPeine Orderby-Option "tax__in" hätte,wieeine Option "post__in",aber da diesnicht der Fallist,müssen Sieentweder den obengenannten lächerlichen Prozess ausführen. Passen Sie die Abfrage selbst über die Filter 'posts_orderby' und 'posts_join' an,um die orderby-Methode anzupassen und den Begriff zur Ergebnismenge hinzuzufügen. oder Siemüssenfürjeden Begriff,nach dem Siein den HTML-Abschnitten relativ zu diesen Begriffenfiltern,eine neue Abfrage durchführen.
Ameffizientesten wärees,die Abfragezeichenfolgemithilfe von Filtern zu ändern. Ameinfachsten wärees,drei separate Abfragen durchzuführen. Die WP-API sollte die Bestellungnach Steuern oder restriktiven Abfrageparametern verarbeiten. Wenn Sieeine Abfragebasierend aufbestimmten Bedingungeneinschränken,bestehteine hohe Wahrscheinlichkeit,dass vielenach denselben Bedingungenbestellenmüssen.
The accepted answer for this question is unacceptable. It is illogical to assume that ordering by tax "doesn't make sense". The answer he gave doesn't make sense.
Consider having a menu post type. Then you have a custom tax of "FoodCategories". The FoodCategories tax has "Breakfast", "Lunch" and "Dinner" terms. If you submit a query utilizing the tax_query param, you now have a result set with all of the terms, however they are ordered by post date.
In order to get the correct order out of these, relative to their terms, and then to display on the front end appropriately by separating the posts into their various categories, you have to loop through the result set, then query each individual post within the result set to find it's terms and compare to the current term, filter into an array and continue throughout. Then you have to again loop through the new array for display. This is not productive.
It would be nice if WP had a "tax__in" orderby option as it does a "post__in" one, but since it does not, you either have to do the above ridiculous process; customize the query yourself by way of 'posts_orderby' filter and 'posts_join' filter in order to adjust the orderby method and add the term to the result set, respectively; or you have to make a new query for each term you are filtering for within the html sections relative to those terms.
The most efficient would be to change the query string by way of filters. The easiest would be to do three separate queries. The WP API should be handling ordering by tax, or any restrictive query parameters. If you are restricting a query based on certain conditions, there is a high probability that many will have need to order by those same conditions.
-
Entschuldigung,aber du liegstfalsch.Eine Bestellungnach Taxonomiemacht auchin Ihrem Fall keinen Sinn.Wasmöchtest du zeigen?Zuerst alle Frühstücke,dann alle Abendessen,dann alle Mittagessen?Sie sollten auswählen,was Siemöchten undin welcher Reihenfolge Sieesmöchten,aber die Taxonomieistnureine Gruppierungsbezeichnung.Es sind keine aussagekräftigen "Daten",nach denen Siebestellen sollten.Wenn dies der Fallist,solltees kein Begriffin einer Taxonomie sein,sondern Sie solltenihn stattdessen zueinem Post-Metamachen.Sorry, but you are wrong. Ordering by taxonomy doesn't make any sense in your case either. What do you want to show? All the Breakfasts first, followed by all the Dinners, then all the Lunches? You should select what you want and the order in which you want it, but the taxonomy is just a grouping label. It's not meaningful "data" that you should be ordering by. If it is, then it shouldn't be a term in a taxonomy, you should make it a post-meta instead.
- 2
- 2014-10-20
- Otto
-
Komm schon,natürlich wirdeseinige Fällegeben,in denen Sie Beiträgenach Taxonomie-Begriffbestellenmöchten.Ein weiteres Beispielistein Filmposttypmit einer Rating-Taxonomie.Ineiner Liste von Filmenistes sehr leicht vorstellbar,dass Personeneine Liste von Filmennach Bewertungbestellenmöchten,sodass alle Filmemit G-Bewertung,dannmit PG-Bewertung usw. oben angezeigt werden.(In diesem und dem Beispielfüreine Mahlzeit könnten sienachterm_id anstelle vonname sortiert werden.) Esgibt einegroße Grauzone von Fällen,in denen Sie wahrscheinlich ambesten voneiner Taxonomie undnicht von Metabedient werden,aberesist wahrscheinlich auch hilfreich,wenn diese Taxonomiebestellt wird-imstande.C'mon, of course there are going to be some instances in which you will want to order posts by taxonomy term. Another example is a Movie post type with a Rating taxonomy. In a list of movies, it's very easy to imagine people wanting to order a list of movies by rating so all G-rated, then PG-rated, etc. movies appear at the top. (In this and the meal example they could be ordered by term_id instead of name.) There's a large gray area of instances where you're probably best served by a taxonomy and not meta, but it's probably also helpful for that taxonomy to be order-able.
- 18
- 2015-03-10
- SeventhSteel
-
PG- und G-Bewertungen und dergleichen sindeine gute Wahlfür die Taxonomie,außer dasses sich um Daten zubestimmten Filmen handelt.Sie sind also Meta.Es sind Daten,keine Kategorien.Nureine begrenzte Anzahl von Auswahlmöglichkeiten zu haben,ist keine Taxonomie.Wennes sortiert werdenmuss,machen Sieesentwedermeta odererzwingen Sie die Sortierungnach Taxonomie übertaxonomiespezifischen Code.Übrigens kommt NC17nach PG.Siebenötigen also Code,um diese Bestellungtrotzdem ausführen zu können.PG and G ratings and such are a good taxonomy choice, except that they are data about specific movies. Thus, they're meta. They're data, not categories. Just having a limited number of choices does not a taxonomy make. If it needs sort by, then either make it meta, or force the sort by the taxonomy via taxonomy specific code. BTW, NC17 comes after PG. So, you need code to do that ordering anyway.
- 2
- 2015-11-10
- Otto
-
Ich weiß,dassichmit diesem Kommentar zu spät zur Party komme,aberichbin nur daraufgestoßen.Die Bestellungnach Taxonomie kannin einigen Situationen sinnvoll sein.Wir haben Stellenanzeigenfürein Projekt als Post-Typ und dann sind Bundesstaat und Stadt,in denen sich die Stellebefindet,Taxonomien.Wirmöchten,dass sie leicht zufassen sind (alle Jobsin einem Bundesstaat anzeigen oder alle Jobsin einer Stadt anzeigen),daher war Taxonomie diebeste Lösung.Gleichzeitiggibt eseine allgemeine Jobsuche,bei der wir sie zuerstnach Titel,dannnach Bundesland und dannnach Stadt sortierenmöchten.I know I'm late to the party with this comment, but just bumped into this. Ordering by taxonomy can make sense in some situations. We have job listings on one project as a post type and then State and City in which the job is are taxonomies. We want them to be easily grupable (show all jobs in a state or show all jobs in a city) so taxonomy was the best solution. At the same time there is general job search where we want to sort them first by title, then by state, then by city.
- 0
- 2018-10-23
- Dennis Puzak
-
Ein weiterer Anwendungsfall: Ein Kunde verfügt übereine Reihe von Artikeln,von denenjedereine Kategorie hat.Der Kundemöchteeine Seitemit allen Artikeln,die alphabetisch,nach Datum odernach Kategorie sortiert werden können.Kategorien können auchgefiltert werden,aber das alphabetische Auflisten aller Artikelnach Kategorienistnicht so verrücktnacheinem Anwendungsfall,und Sie sehen,dasser ziemlich oft auftaucht.Another use case: A client has a bunch of articles, each of which has a category. The client wants there to be a page listing all the articles, which can be sorted alphabetically, by date, or by category. Categories can also be filtered, but listing all the articles by category alphabetically is not that crazy of a use case and you see it pop up pretty often.
- 0
- 2019-06-06
- Wilson Biggs
-
- 2011-04-08
Ja,aberesist ziemlich kompliziert ...
Fügen Siein Ihrem Thema zufunctions.php hinzu:
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 );
Diesistfrankensteined voneinigen gefundenen Sachen undeinigen Sachen,dieich selbstgemacht habe. Das Erklärenist ziemlich schwierig,aber unter dem Strich können Sie? Orderby=(Taxonomie-Abfrage var) & order=ASC (oder DESC)eingeben und sie wird sofort loslegen!
Yes, but it is pretty involved...
Add to functions.php in your theme:
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 );
This is frankensteined from some found stuff and some stuff I did myself. Explaining is pretty tough, but the bottom line is with this running, you may put ?orderby=(taxonomy query var)&order=ASC (or DESC) and she'll take right off!
-
Vielen Dank,Drew,ich werdees versuchen und versuchen,diese SQL auszuführen,mussein wenigbearbeitet werden,aberes könntefunktionieren.Meineinziges Problemistjetzt,dassichmöglicherweisein diefalschen Richtungengehe,wie von Otto angegeben.Vielen Dank,Drew.EDIT- Keine Notwendigkeit zubearbeiten Ich kann sehen,woes die Optimierungbenötigt :) DankeThank you Drew, I will give a go and try to run that SQL, need to edit a bit, but it might work. My only problem now, is I might be going on the wrong directions as pointed by Otto. Thank you Drew. EDIT- No need to edit I can see where it needs the tweaking :) Thank you
- 0
- 2011-04-08
- yeope
-
Wenn Sieesin den letzten zwei Minutengepackt haben,wirdesnichtfunktionieren. Nehmen Sieesjetzt,ich habees repariert.Es wurdefür zwei spezifische Taxonomienfestgelegt. Ich habe den Code verbessert,ummit allen registrierten Taxonomien zu arbeiten.If you grabbed it within the last two minutes, it won't work, go ahead and grab it now, I fixed it. It was set for two specific taxonomies, I improved the code to work on all registered taxonomies.
- 0
- 2011-04-08
- Drew Gourley
-
vielen Danknochmal.Nurfür den Fall,dassich Ihre Lösung ausprobiert habe undesirgendwiefunktioniert.Auch wennjemand andereses verwendenmöchte,müssen Sie `add_filter ('posts_clauses','orderby_tax_clauses',10,2);`in `add_filter ('posts_clauses','todo_tax_clauses',10,2);` Danke:)thank you once again. Just in case I tried your solution and it kind of works. Also if someone else wants to use it you need to change `add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );` to `add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );` Thank you :)
- 0
- 2011-04-08
- yeope
-
Ja,diesistjetztim Codeblockbehoben. Ich habe dies auseinem Projekt übernommen,an demich arbeite,und vergessen,den Namen der Funktion zu ändern,obwohlichihnim Hookgeändert habe.Yes, this is now fixed in the code block, I took this from a project I'm working on and forgot to change the name of the function even though I changed it in the hook.
- 0
- 2011-04-09
- Drew Gourley
-
Wissen Sie,obesmöglichist,die Taxonomiennach ID anstelle des Namens zubestellen?Ich versuche,dasgleiche Ergebnis zuerzielen,indemich die Taxonomiegruppennach ID ordneDo you know if it's possible to order the taxonomies by ID instead of the name? I'm trying to get the same result ordering the taxonomy groups by ID
- 1
- 2013-07-16
- Javier Villanueva
-
- 2014-10-31
Ich komme hier zu spät zum Spiel,aberesgibt eineeinfachere WordPressy-Methode,um dies zutun.
Erstellen Sie Ihre Steuerabfrage wiegewohnt.
$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;
Richten Sie Ihre Argumentefür query_posts oder WP_Query
ein$args = array( 'post_type'=>'post', 'posts_per_page'=>12, 'paged'=>$paged, 'tax_query' => $tax_query, );
Bevor Sie Ihren Aufruf von query_posts/WP_Query ausführen,schließen Sie den orderby-Filter an und überschreiben Sieihn
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');
Vergessen Sienicht,den Filter anschließend zuentfernen ...
diesfunktioniertb/c dietax_queryerstellt die Joins usw.für Sie,Siemüssennurnacheinem der Felder aus dem Joinbestellen.
I'm coming late to the game here, but there is a simpler more WordPressy way of doing this.
Build out your tax query like normal.
$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;
Set up your args for query_posts or WP_Query
$args = array( 'post_type'=>'post', 'posts_per_page'=>12, 'paged'=>$paged, 'tax_query' => $tax_query, );
Before you make your query_posts / WP_Query call, hook into the orderby filter and override it
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');
don't forget to remove filter afterwards...
this works b/c the tax_query creates the joins etc for you, you just need to order by one of the fields from the join.
-
Haben Sieeine Idee,wie Sienach Namen anstattnachterm_taxonomy_idbestellen können?Das Ändern vonterm_taxonomy_idin orderby_statement löst Fehler ausAny idea on how to order by name instead of term_taxonomy_id? changing term_taxonomy_id in orderby_statement throws errors
- 2
- 2016-10-04
- tehlivi
-
Diesist die richtige Antwortfür alle Interessierten!This is the correct answer for anyone that is interested!
- 4
- 2018-06-21
- Mayra M
-
- 2017-07-06
Ichbin mirnicht sicher,warum alle Lösungen hier so ziemlich übertrieben sind.OK,esistein halbes Jahrzehnt her,aberichführegerade denfolgenden Code aus undesfunktioniert:
<?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); ?>
Hiermit werden die Taxonomien Ihres CPT zuerstnach seiner Taxonomiein alphabetischer Reihenfolge undinnerhalb dieser Taxonomiegruppen auchnach alphabetischer Reihenfolge sortiert.
I'm not sure why all solutions here are pretty much overkilling it. OK, it's half a decade ago, but I'm just running the following code currently and it works:
<?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); ?>
This will sort the taxonomies of your CPT first by it's taxonomy in alphabetical order and within these taxonomy groups als by alphabetical order.
-
@yeope Warumist das die akzeptierte Antwort?Gott sei Dank habeichgescrollt@yeope Why is this the accepted answer!? thank god I scrolled
- 0
- 2019-10-21
- Juan Solano
-
konnte dasnicht zum Laufenbringen.Können Sie aufeine Sitemit einer Erklärung dazu verweisen?[nichts hier] (https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters),das Ihren Code sichertcouldn't get this to work. can you point to a site with some explanation to that? [nothing here,](https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters) that backs your code up
- 1
- 2020-04-09
- honk31
-
- 2015-01-04
Nun,ichmöchtemeine Erfahrungbeim Sortierenbenutzerdefinierter Beitragstypennach Kategorie/Taxonomie offenlegen.
DAS WEB
- Eine Reisebüro-Website unter WordPress
- Hauptinhalt desbenutzerdefinierten Beitragstyps "Ruta"
- Taxonomiemit dieser Struktur Reisetyp> Kontinent> Land
DER FALL
Auf Seitenmit Archivkategorielisten wollte der Kunde,dass die Beiträgenach
sortiert werden- Der Kontinent,geordnetnach Anzahl der Routen aufjeder.
- Das Land,alphabetisch sortiert.
DIE SCHRITTE
Zuerst erhalteich die Anfrage von der unveränderten Archivseitenabfrage,die zufällig so aussah:
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
Zweitens habeich den SQL-Codein Sequel Pro anhand der Datenbankbearbeitet,ummeinen Anforderungen zuentsprechen. Ich komme damit heraus (ja,wahrscheinlich kannes verbessert werden:meine Kenntnisse über MySQL sindnicht herausragend):
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
Drittens habeich die Abfragein die Dateifunctions.phpmit drei Filterneingebunden:posts_fields,posts_join undposts_orderby
Der Codein 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; }
Schließlich habeich die Filter aus dempre_get_post-Hook unterbestimmten Bedingungen ausgelöst
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');
Hoffe,das kannjemandem helfen
Well, I’d like to expose my experience in sorting custom post types by category/taxonomy.
THE WEB
- A travel agency web site running on WordPress
- Main content on custom post type called ‘ruta’
- Taxonomy with this structure Type-of-travel > continent >country
THE CASE
In archive category list pages, the client wanted the posts to be sorted by
- The continent, ordered by number of routes on each one.
- The country, ordered alphabetically.
THE STEPS
First, I catch the request from the unmodified archive page query which happened to be like this:
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
Second, I edited the sql code in Sequel Pro against the database to conform my needs. I come out with this (yes, probably it can be improved: my knowledge on MySQL is not outstanding):
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
Third, I hooked the query on the functions.php file with three filters: posts_fields, posts_join and posts_orderby
The code in 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; }
Finally I triggered the filters from the pre_get_post hook according to some conditions
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');
Hope this can help somebody
-
Gute Arbeit,lächerlich,dass diese Menge an Codebenötigt wird,umetwasnacheiner Taxonomie zu sortieren.Riesiges Problemmit WP.Nice work, ridiculous that is took this quantity of code to sort something by a taxonomy. Huge problem with WP.
- 0
- 2017-07-20
- serraosays
-
- 2017-04-10
Ich hatteein sehr ähnliches Problem,mit demichmichbefasst habe: Ichmöchteein benutzerdefiniertes Post-Type-Archiv (Zeitschriftenartikel)nacheinerbenutzerdefinierten Taxonomie (Ausgaben)bestellen. Ichmacheniemals direkte SQL-Abfragen aufmeiner Website - undnormalerweisemüssen Sie Ihren Ansatz überdenken,wenn Sie diesen anderen Antworten ähnlich sind.
PROBLEME:
1) Mit Wordpress können Sie Taxonomiennicht aufintelligente Weisebestellen.
2) Wordpresserlaubteinfachnicht,dass
orderby
Taxonomienfür WP_Query vom Post-Typ verwendet (wie von Ottoformuliert).LÖSUNGEN:
1) Das Sortieren von Taxonomienerfolgt ambesten über Pluginfürbenutzerdefinierte Taxonomie-Bestellung NE im Moment. Sie können die Taxonomie über WYSIWYGin
wp-admin
bestellen. Das würdeichnichttun,aberich habenichts Besseresgefunden.Wenn Sie das Plugineinrichten,erhalten Sieetwas Ähnliches wie hier. Beachten Sie die Option
Auto-sort Queries of this Taxonomy
- setzen Sie diese aufCustom Order as Defined Above
; Dadurcherhalten Sie die Bestellung,die Siebenötigen. Screenshot:2) Miteiner sortierten Taxonomie können Siejetzteine Reihe von WP_Query-Aufrufenerstellen,diejeden Begriff durchlaufen,und soeffektivein nach Taxonomiegeordnetes Archiverstellen. Verwenden Sie
get_terms()
,umein Array aller Steuerbegriffe zuerstellen,undführen Sie dannfürjeden Begriffeinenforeach
aus. Dadurch wirdfürjedes BegriffselementeinWP_Query
erstellt,der alle Beiträgefüreinen bestimmten Begriff zurückgibt,wodurcheffektivein nach Taxonomiebegriffgeordnetes Archiverstellt wird. Code,um dies zuermöglichen:// 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; }
Verwandte Lektüre auf dieser Site: Alle Beiträgein anzeigen Einbenutzerdefinierter Beitragstyp,gruppiertnacheinerbenutzerdefinierten Taxonomie
I had a very similar problem that I dealt with: I want to order a custom post-type archive (magazine articles) by a custom taxonomy (issues). I never do direct SQL queries on my site - and usually if you are like these other answers - you need to rethink your approach.
PROBLEMS:
1) Wordpress doesn't allow you to order taxonomies in any intelligent way.
2) Wordpress just doesn't allow
orderby
to be use taxonomies on post-type WP_Query (as spelled out by Otto).SOLUTIONS:
1) Sorting taxonomies is best accomplished by the Custom Taxonomy Order NE plugin at the moment. It allows you to order the taxonomy via WYSIWYG in
wp-admin
which isn't how I would do it but I haven't found anything better.When you setup the plugin, you'll get something similar to what I've done here. Make note of the option
Auto-sort Queries of this Taxonomy
- set this toCustom Order as Defined Above
; this gets you the ordering you need. Screenshot:2) With a sorted taxonomy in place, you can now create a series of WP_Query calls that run through each term, effectively creating an archive ordered by the taxonomy. Use
get_terms()
to create an array of all tax terms, then run aforeach
over each term. This creates aWP_Query
for each term item that will return all posts for a given term, effectively creating an archive ordered by taxonomy term. Code to make this happen:// 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; }
Related reading on this site: Display all posts in a custom post type, grouped by a custom taxonomy
-
- 2017-03-24
Hierist die Lösung,dieichfür dieses spezielle Problem verwendet habe. Diese Lösungistfürextreme Fällegedacht,in denenesnichtmöglichist,einen
pre_get_posts
-Filter zu verwenden,undin der Abfrageeine Paginierung vorhandenist (z. B. 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);
Ich habe dies verwendet,umein Navigationsmenü zuerstellen,dasnach Taxonomie,Begriff und Anzahl der Beiträgepro Begriffgeordnetist.
Wenn Sienur die Beiträgemöchten,ändern Sie die Abfragein
SELECT p.*
undGROUP BY p.ID
Here's the solution I've used for this particular problem. This solution is for extreme cases where it is both not possible to use a
pre_get_posts
filter and there is existing pagination on the query (ie: 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);
I've used this to create a nav menu ordered by taxonomy, term, and count of posts-per-term.
If you simply want the posts then change the query to
SELECT p.*
andGROUP BY p.ID
-
- 2017-04-22
Esist wieeine Abfrage vor der Abfrage,aberes stört Sienicht,wenn wirnicht zu viele Beiträge abfragen ... Die Ideeist,die Hauptabfrage so zu ändern,dass wirnichteinmal zu Vorlagengehen und siegenerierenmüssenneue Abfragen und Schleifen ...
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' );
It's like a query before the query, but won't bother if we're not not querying too many posts... The idea is to modify the main query so we don't even need to go to templates and generate new queries and loops...
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' );
-
- 2020-04-09
Ichmöchtemeine Begriffemanuell sortieren,daher verwendeich dazuein Plugin. undichbin ein Fan des Filters
pre_get_posts
,also habeich das richtige Arbeitsbeispiel von Drew Gourleygenommen undes damit zum Laufengebracht. Dasist alsoein Sonderfall,aberichposteestrotzdem,fallsesjemandem hilft. Derfolgende Codegehtin functions.php oderein benutzerdefiniertes Plugin.Beginnen wir zuerstmit dem Filter. Wirbestellen denbenutzerdefinierten Beitragstyp
music
nachbenutzerdefinierter Taxonomiestyle
function so14306_pre_get_posts($query) { if (is_admin()) : return; endif; if ($query->is_main_query()) : if (is_post_type_archive('music')) : $query->set('orderby', 'style'); endif; endif; } add_action('pre_get_posts', 'so14306_pre_get_posts');
dann rufen wir den Filterpost_clauses auf:
function so14306_posts_clauses($clauses, $wp_query) { global $wpdb; if (isset($wp_query->query_vars['orderby']) && $wp_query->query_vars['orderby'] === 'style') { $orderby = $wp_query->query_vars['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 = '{$orderby}' OR taxonomy IS NULL)"; $clauses['groupby'] = "object_id"; $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.term_order ORDER BY {$wpdb->terms}.term_order ASC) ASC"; $clauses['orderby'] .= ", {$wpdb->posts}.post_name ASC"; } return $clauses; } add_filter('posts_clauses', 'so14306_posts_clauses', 10, 2);
Jetztmüssen Sienurnoch Ihre Taxonomienmit demfolgenden Plugin sortieren: Einfachebenutzerdefinierte Nachbestellung . Dieses Pluginistfür diese Lösung obligatorisch ,daes der Datenbank die Spalte
term_order
hinzufügt!und diese Zeile hier:
$clauses['orderby'] .= ", {$wpdb->posts}.post_name ASC"
ordnet die Postsnach Titel,daher lautet die vollständige Sortierung der obigen Lösung:taxonomyterm=> Post-Titel.i like to sort my terms manually, so i use a plugin to do so. and i'm a fan of the
pre_get_posts
filter, so i took the proper working example of Drew Gourley and made it work with that. so this is some kinda special case, but i'm posting this anyhow, in case it helps someone. following code goes into functions.php or a custom plugin.first lets start of with the filter. we order the custom post type
music
by custom taxonomystyle
function so14306_pre_get_posts($query) { if (is_admin()) : return; endif; if ($query->is_main_query()) : if (is_post_type_archive('music')) : $query->set('orderby', 'style'); endif; endif; } add_action('pre_get_posts', 'so14306_pre_get_posts');
then we call the post_clauses filter:
function so14306_posts_clauses($clauses, $wp_query) { global $wpdb; if (isset($wp_query->query_vars['orderby']) && $wp_query->query_vars['orderby'] === 'style') { $orderby = $wp_query->query_vars['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 = '{$orderby}' OR taxonomy IS NULL)"; $clauses['groupby'] = "object_id"; $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.term_order ORDER BY {$wpdb->terms}.term_order ASC) ASC"; $clauses['orderby'] .= ", {$wpdb->posts}.post_name ASC"; } return $clauses; } add_filter('posts_clauses', 'so14306_posts_clauses', 10, 2);
now all you need to do, is sort your taxonomies with the following plugin: Simple Custom Post Order. This plugin is mandatory for this solution, since it adds the column
term_order
to the database!and this line here:
$clauses['orderby'] .= ", {$wpdb->posts}.post_name ASC"
orders the posts by title, so the full sorting of the above solution is: taxonomy term => post title.
Meine Frageisteinfach: Ich verwende
WP_Query
,umeinige benutzerdefinierte Beiträge abzurufen,dienacheiner Taxonomiemithilfe vontax_query
gefiltert werden.Jetztistmein Problem,dassich
durch
die
Taxonomie
bestellenmöchte,aber aufgrund der Dokumentation und Sucheim Web kannich keine Lösungfinden.Mit
orderby
inWP_Query
können Sienacheiner Reihe von Feldernbestellen,auchnachbenutzerdefinierten Metafeldern,aberes scheint keine Taxonomie zu unterstützen.Irgendwelche Zeigerin die richtige Richtung?
Vielen Dank an alle.