Ich habe 2 benutzerdefinierte Beitragstypen "Lesezeichen" und "Snippets" und ein gemeinsames Taxonomie "Tag". Ich kann mit get_terms () eine Liste aller Begriffe in der Taxonomie erstellen, aber ich kann nicht herausfinden, wie ich die Liste auf den Beitragstyp beschränken kann. Was ich im Grunde suche, ist ungefähr so:
get_terms(array('taxonomy' => 'tag', 'post_type' => 'snippet'));
Gibt es einen Weg, dies zu erreichen? Ideen werden sehr geschätzt !!
Oh, ich bin in WP 3.1.1
custom-post-types
custom-taxonomy
terms
Gavin Hewitt
quelle
quelle
print_r(get_terms_by_post_type(array('category') , array('event') ));
ShowsWarning: Missing argument 2 for wpdb::prepare()
So etwas brauchte ich einfach für ein Projekt, an dem ich arbeite. Ich habe einfach eine Abfrage geschrieben, um alle Posts eines benutzerdefinierten Typs auszuwählen, und dann überprüft, welche Begriffe in meiner Taxonomie tatsächlich verwendet werden.
Dann habe ich alle Begriffe dieser Taxonomie verwendet
get_terms()
und dann habe ich nur die verwendet, die in beiden Listen enthalten waren, habe sie in eine Funktion eingepackt und war fertig.Aber dann brauchte ich mehr als nur die IDs: Ich brauchte die Namen, also fügte ich ein neues Argument mit dem Namen hinzu,
$fields
damit ich der Funktion mitteilen konnte, was zurückgegeben werden soll. Dann stellte ich fest, dass dasget_terms
viele Argumente akzeptiert und meine Funktion auf einfache Begriffe beschränkt war, die von einem Post-Typ verwendet werden. Also fügte ich eine weitereif
Anweisung hinzu und los geht's:Die Funktion:
Verwendung:
Wenn Sie nur eine Liste mit Term-IDs benötigen, gehen Sie wie folgt vor:
Wenn Sie nur eine Liste mit Begriffsnamen benötigen, gehen Sie wie folgt vor:
Wenn Sie nur eine Liste von Termobjekten benötigen, dann:
Und wenn Sie zusätzliche Argumente von get_terms verwenden müssen, wie: orderby, order, hierarchical ...
Genießen!
Aktualisieren:
So korrigieren Sie die Anzahl der Begriffe für eine bestimmte Änderung des Beitragstyps:
zu:
quelle
(array) $args
anstelle einer Liste von 4 $ Vars verwenden? Dies würde es Ihnen ermöglichen, sich nicht um die Reihenfolge zu kümmern, in der Sie die Argumente einwerfen, also so etwas wieget_terms_by_post_type( $args = array( 'taxonomies', 'args', 'post_type', 'fields' => 'all') )
und sie dann innerhalb der Funktion mit aufrufen$args['taxonomies']
. Dies würde Ihnen helfen, keine leeren Werte hinzuzufügen und sich nicht die Reihenfolge Ihrer Argumente merken zu müssen. Ich würde auch vorschlagen, einfache Anführungszeichen anstelle von doppelten zu verwenden. Ich habe gesehen, wie sie bis zu fünfmal schneller waren.'this is my mood: '.$value
immer"this is my mood: $value"
noch wegen der Lesbarkeit. Wenn es um Geschwindigkeit geht: Es ist nicht leicht - ich habe bis zu fünf Mal gemessen. Und wenn Sie in Ihrem gesamten Thema überall doppelte Anführungszeichen verwenden, werden diese schnell zusammengefasst, wenn Sie viele Anfragen haben. Wie dem auch sei, Sie haben das deutlich gemacht."
vs. neu gemessen'
und mich geirrt. Der Unterschied liegt weit außerhalb dessen, was jemand bemerken würde.Ich habe eine Funktion geschrieben, mit der Sie
post_type
das$args
Array an dieget_terms()
Funktion übergeben können:HT an @braydon zum Schreiben der SQL.
quelle
Tolle Frage und solide Antworten.
Der Ansatz von @jessica, den Filter terms_clauses zu verwenden, hat mir sehr gut gefallen, da er die Funktion get_terms auf sehr vernünftige Weise erweitert.
Mein Code ist eine Fortsetzung ihrer Idee, mit etwas SQL von @braydon, um Duplikate zu reduzieren. Es erlaubt auch ein Array von post_types:
Da get_terms keine Klausel für GROUPY BY hat, musste ich sie am Ende der WHERE-Klausel einfügen. Beachten Sie, dass ich die Filterpriorität sehr hoch eingestellt habe, in der Hoffnung, dass sie immer die letzte ist.
quelle
Ich war nicht in der Lage, die Argumente get_terms für Gavins Version des obigen Codes zu verwenden, habe es aber schließlich durch Ändern getan
zu
wie es in der ursprünglichen Funktion von Bainternet war.
quelle
@Bainternet: Danke! Ich musste die Funktion leicht ändern, da sie nicht funktionierte (einige Tippfehler). Das einzige Problem ist jetzt, dass die Termanzahl deaktiviert ist. Die Anzahl berücksichtigt nicht den Post-Typ, daher kann get_terms () hier nicht verwendet werden.
BEARBEITEN: Die Korrektur (en) wurden hinzugefügt. Aber irgendwie funktioniert es immer noch nicht für mich. Der Zähler zeigt immer noch den falschen Wert an.
quelle
print_r(get_terms_by_post_typea(array('event','category','',array()));
Dieser gibtWarning: Invalid argument supplied for foreach()
für die Linieforeach ($current_terms as $t){
Vermeiden Sie Duplikate:
quelle