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 das get_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 weitere if
Anweisung hinzu und los geht's:
Die Funktion:
/* get terms limited to post type
@ $taxonomies - (string|array) (required) The taxonomies to retrieve terms from.
@ $args - (string|array) all Possible Arguments of get_terms http://codex.wordpress.org/Function_Reference/get_terms
@ $post_type - (string|array) of post types to limit the terms to
@ $fields - (string) What to return (default all) accepts ID,name,all,get_terms.
if you want to use get_terms arguments then $fields must be set to 'get_terms'
*/
function get_terms_by_post_type($taxonomies,$args,$post_type,$fields = 'all'){
$args = array(
'post_type' => (array)$post_type,
'posts_per_page' => -1
);
$the_query = new WP_Query( $args );
$terms = array();
while ($the_query->have_posts()){
$the_query->the_post();
$curent_terms = wp_get_object_terms( $post->ID, $taxonomy);
foreach ($curent_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$terms[] = $c;
}
}
}
wp_reset_query();
//return array of term objects
if ($fields == "all")
return $terms;
//return array of term ID's
if ($fields == "ID"){
foreach ($terms as $t){
$re[] = $t->term_id;
}
return $re;
}
//return array of term names
if ($fields == "name"){
foreach ($terms as $t){
$re[] = $t->name;
}
return $re;
}
// get terms with get_terms arguments
if ($fields == "get_terms"){
$terms2 = get_terms( $taxonomies, $args );
foreach ($terms as $t){
if (in_array($t,$terms2)){
$re[] = $t;
}
}
return $re;
}
}
Verwendung:
Wenn Sie nur eine Liste mit Term-IDs benötigen, gehen Sie wie folgt vor:
$terms = get_terms_by_post_type('tag','','snippet','ID');
Wenn Sie nur eine Liste mit Begriffsnamen benötigen, gehen Sie wie folgt vor:
$terms = get_terms_by_post_type('tag','','snippet','name');
Wenn Sie nur eine Liste von Termobjekten benötigen, dann:
$terms = get_terms_by_post_type('tag','','snippet');
Und wenn Sie zusätzliche Argumente von get_terms verwenden müssen, wie: orderby, order, hierarchical ...
$args = array('orderby' => 'count', 'order' => 'DESC', 'hide_empty' => 1);
$terms = get_terms_by_post_type('tag',$args,'snippet','get_terms');
Genießen!
Aktualisieren:
So korrigieren Sie die Anzahl der Begriffe für eine bestimmte Änderung des Beitragstyps:
foreach ($current_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$terms[] = $t;
}
}
zu:
foreach ($current_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$t->count = 1;
$terms[] = $t;
}else{
$key = array_search($t, $terms);
$terms[$key]->count = $terms[$key]->count + 1;
}
}