Ich habe zwei benutzerdefinierte Beitragstypen "Land" und "Stadt" und eine gemeinsame Taxonomie "Flagge".
Wenn ich benutze:
<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');
Ich erhalte eine Liste aller Begriffe in der Taxonomie, möchte die Liste jedoch auf den Beitragstyp "Land" beschränken.
Wie kann ich es tun?
Verwenden der neuen Lösung
<?php
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
$childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($childTerms as $childTerm) {
echo $childTerm->name.'<br />';
}
}
?>
Ich kann $ childTerm-> name nicht ausgeben. Warum?
custom-post-types
taxonomy
terms
user1443216
quelle
quelle
Antworten:
Ich fürchte, das ist von Haus aus (noch?) Nicht möglich. Siehe diesen Trac: http://core.trac.wordpress.org/ticket/18106
In ähnlicher Weise spiegelt die Anzahl der Posts auf der Taxonomie-Administrationsseite alle Post-Typen wider . (
Ich bin mir ziemlich sicher, dass es dafür auch ein Trac-Ticket gibt) http://core.trac.wordpress.org/ticket/14084Siehe auch diesen verwandten Beitrag .
Neue Lösung
Nachdem ich den folgenden Artikel geschrieben habe, habe ich einen viel besseren Weg (zumindest in dem Sinne, dass Sie mehr tun können) gefunden, die im
get_terms()
Aufruf bereitgestellten Filter zu verwenden . Sie können eine Wrapper-Funktion erstellen, dieget_terms
einen Filter verwendet und (bedingt) hinzufügt, um die SQL-Abfrage zu bearbeiten (um sie nach Post-Typ einzuschränken).Die Funktion akzeptiert die gleichen Argumente wie
get_terms($taxonomies, $args)
.$args
Nimmt das zusätzliche Argument,post_types
das ein Array von Post-Typen annimmt.Aber ich kann nicht garantieren, dass alles "wie erwartet" funktioniert (ich denke, die Zählung aufzufüllen). Es scheint nur mit der Standardeinstellung
$args
für zu funktionierenget_terms
.Verwendung
Ursprüngliche Umgehung
Inspiriert von dem obigen Trac-Ticket (getestet, und es funktioniert bei mir)
Verwendung
oder
quelle
$args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);
. Ich werde dies bearbeiten, um Abfragezeichenfolgen zu ermöglichen ...$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
?wpse57444_get_terms()
$args
ist das zweite Argument. Dort haben Sie geradewpse57444_get_terms( 'flag', array( 'country', 'city' ) );
@ stephen-harris Antwort oben hat nur teilweise bei mir funktioniert. Wenn ich versucht habe, es zweimal auf der Seite zu verwenden, hat es nicht funktioniert. Auch die Idee, solche MySQL-Abfragen zu vergraben, beunruhigt mich. Ich denke, es ist besser, Kernmethoden zu verwenden, um eine Lösung zu finden und Konflikte mit zukünftigen WP-Updates zu vermeiden. Hier ist meine Lösung, basierend auf einem Kommentar # 7 zum Trac-Ticket, auf das er verweist
Verwendung:
Dies funktioniert nur für einen Beitragstyp und eine Taxonomie, da ich das benötige, aber es wäre nicht zu schwierig, dies zu ändern, um mehrere Werte zu akzeptieren.
Es wurde auf diesem Trac-Thread erwähnt, dass dies möglicherweise nicht gut skaliert, aber ich arbeite in einem ziemlich kleinen Maßstab und hatte keine Probleme mit der Geschwindigkeit.
quelle
Zwei benutzerdefinierte Beitragstypen "Land" und "Stadt" und eine gemeinsame Taxonomie "Flagge". Sie möchten die Liste auf den Beitragstyp "Land" beschränken.
Hier ist eine einfachere Lösung:
quelle
[edit] Dies ist ein Kommentar zu der hervorragenden Antwort von Stephen Harris.
Bei Verwendung mit mehreren Beitragstypen wie diesem werden keine Begriffe zurückgegeben
$flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));
. Dies liegt daran, dass $ wpdb-> prepare die Zeichenfolge $ post_types_str so lange bereinigt, wiep.post_type IN('country,city')
es sein solltep.post_type IN('country','city')
. Siehe dieses Ticket: 11102 . Verwenden Sie die Lösung aus diesem Thema, um dies zu umgehen : /programming//a/10634225quelle
Ich habe auch versucht, die Antwort von @Stephen Harris zu verwenden, aber die Abfrage, die ich benötigte, war als einzelne Abfrage und unter Verwendung der Filterelemente ziemlich schwer zu schreiben.
Darüber hinaus musste ich diese Funktion auch mehrmals auf derselben Seite verwenden und das Problem lösen, bei dem die
wpse_filter_terms_by_cpt
Funktion außerhalb der Wrapper-Funktion deklariert wurde .Trotzdem passt die Antwort von @Mark Pruce meiner Meinung nach aus den gleichen Gründen besser, wie er sagte, obwohl Sie eine weitere Abfrage (und die zugehörige Schleife) durchführen müssen, um die Argumente für die
wp_get_object_terms
Funktion vorzubereiten .quelle