Filtern Sie get_categories () nach Taxonomiebegriffen in WordPress

Ich möchte eine Kategorie nur anzeigen, wenn ein (benutzerdefinierter) Beitrag in der Kategorie AND region = $ name für diesen Beitrag ist.

So habe ich zB einen benutzerdefinierten Beitrag (Typ “business”) mit dem Namen “Mamma Mia” in der Kategorie “pizzerias” (und in der Elternkategorie “food”) und in der Region “Rotterdam” (benutzerdefinierte Taxonomie: “region “, benutzerdefinierte Taxonomie Begriff:” Rotterdam “).

=> Anzeigekategorie “Pizzerien” (und Elternkategorie “Essen”)

Nur, ich habe keine Ahnung, wie ich das erreichen soll. Ich würde mich über jede Hilfe bei diesem Puzzle freuen.

$name); $categories = get_categories(); foreach ($categories as $cat) { if($cat->parent cat_name; $catid = get_cat_ID( $cat_name ); echo $cat_name. '
'; $args=array( 'orderby' => 'name', 'order' => 'ASC', 'child_of' => $catid ); $categories=get_categories($args); foreach($categories as $category) { echo 'term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'
'; } } } // print_r($categories); ?>

Solutions Collecting From Web of "Filtern Sie get_categories () nach Taxonomiebegriffen in WordPress"

Es ist beabsichtigt, eine Liste von Kategorien anzuzeigen, aber nur die Kategorien mit Posts, in denen der benutzerdefinierte Taxonomiebereich auf Rotterdam festgelegt ist

Dies geschieht im Plugin ” Mehrere Taxonomien abfragen”:

http://plugins.trac.wordpress.org/browser/query-multiple-taxonomies/trunk/core.php?rev=308185#L10

Allgemeine Idee – Abfrage für bestimmte Gruppe von Beiträgen, sammeln Sie alle ihre Kategorien, Filter, lassen Sie function sie in Form zu schlagen.

Generischer Code:

 $posts = get_posts(array( 'tag' => 'linux' )); $categories = array(); foreach( $posts as $post ) { $cats = get_the_category($post->ID); foreach($cats as $c) $categories[] = $c->term_id; } $categories = array_unique($categories); sort($categories); $categories = implode(',', $categories); $result = get_categories(array( 'include' => $categories )); 

Probleme sind – wie ich mich erinnere, anständige Abfragen für mehrere Taxonomien nur in WP 3.1 kommen und dies könnte sehr intensiv werden, so wird Caching (wahrscheinlich für jede region ).

Auf der Version von WordPress verwende ich, die Version 3.1.2 ist. Wenn Sie dem Array von Argumenten ‘taxonomy’ => ‘taxonomy_term’ hinzufügen sollten, sollte es funktionieren. Also hier ist eine Änderung an Ihrem ursprünglichen Code, um die Taxonomie in das Array aufzunehmen. Sie kennen den Taxonomie-Namen, den Sie verwenden möchten oder nicht, nicht:

 < ?php // $filter = array('region'=>$name); $categories = get_categories(); foreach ($categories as $cat) { if($cat->parent < 1) { $cat_name = $cat->cat_name; $catid = get_cat_ID( $cat_name ); echo $cat_name. '
'; $args=array( 'taxonomy' => 'taxonomy_term', 'orderby' => 'name', 'order' => 'ASC', 'child_of' => $catid ); $categories=get_categories($args); foreach($categories as $category) { echo 'name ) . '" ' . '>' . $category->name.'
'; } } } // print_r($categories); ?>

Vergib mir, wenn ich etwas verpasst habe, aber wäre es nicht so einfach wie?

 if (is_object_in_term($post->ID, 'region', 'rotterdam')) the_category(); // displays categories associated with current post 

In der Admin, fügen Sie den Beitrag sowohl zu “Pizzerias” und “Essen” (durch Ankreuzen der beiden Kontrollkästchen), oder nur “Pizzerien”?

Wenn Letzteres the_category() wird, zeigt the_category() standardmäßig nicht “Essen” an, also müssen Sie sich die Kategoriehierarchie selbst the_category() .

Sie können die Taxonomie für benutzerdefinierte Post mit einer kleinen function zurückgeben:

  function get_the_taxonomy( $taxonomy, $id = FALSE ) { global $post; $id = (int) $id; if ( !$id ) $id = (int) $post->ID; $categories = get_object_term_cache( $id, $taxonomy ); if ( FALSE === $categories ) { $categories = wp_get_object_terms( $id, $taxonomy ); wp_cache_add($id, $categories, $taxonomy . '_relationships'); } if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_name' ); else $categories = array(); foreach ( (array) array_keys( $categories ) as $key ) { _make_cat_compat( $categories[$key] ); } return $categories; } 

Sie können auch die function von wp-core verwenden:

 $taxonomys = get_the_term_list($id, YOUR_CUSTOM_POST_TYPE, '', ', ', '' ); 

und Sie können mit is_tax() nach Steuern is_tax() , siehe Codex für dieses bedingte Tag

Vielleicht hilft das, wenn ich dein Problem richtig verstehe. Entschuldigung für mein schlechtes Englisch.

Danke, dass Sie mir geholfen haben – das ist wirklich großartig. Ich würde gerne mit dir teilen, was ich mir ausgedacht habe. Ich weiß, es ist nicht die klügste Lösung. Der Nachteil ist, dass eine übergeordnete Kategorie für eine Region angezeigt wird, wenn für diese Region kein benutzerdefinierter Post angefügt ist (für eine andere Region ist jedoch ein benutzerdefinierter Post angefügt).

Ich verwende dies auf einer Region (Taxonomie-Archiv) Seite.

 < ?php $categories = get_categories(); foreach ($categories as $cat) { if($cat->parent < 1) { $cat_name = $cat->cat_name; $catid = get_cat_ID( $cat_name ); echo '
'; $img = $taxonomy_images_plugin->get_image_html( 'fullsize', $cat->term_taxonomy_id ); if( !empty( $img ) ) print $img; else echo '

' .$cat_name. '

'; $input = array(); $args=array( 'child_of' => $catid, 'orderby' => 'name', 'order' => 'ASC' ); $categories = get_categories($args); foreach ($categories as $cat) { $cat_name = $cat->cat_name; $catid = get_cat_ID( $cat_name ); $args = array( 'post_status' => 'publish', 'taxonomy_name' => 'region', 'taxonomy_term' => $name, ); $custom_posts = get_posts_by_taxonomy($args); if ($custom_posts): foreach ($custom_posts as $post): setup_postdata($post); $postcategory = get_the_category(); $postcat = $postcategory[0]->cat_name; if ($postcat == $cat_name): $category = get_the_category(); $input[] = $catid; endif; endforeach; endif; } echo '
'; $output = array_unique($input); if (empty($output)): echo '

Geen bedrijven

'; echo '
'; else : echo '
    '; foreach ($output as $output) { $cat_name = get_cat_name($output); echo '
  • ' . $cat_name .'
  • '; } echo '
'; endif; } } ?>
 < ?php $cat_id = $_GET["cat"];?> 
  • < ?php if ($cat_id){echo get_the_category_by_id($li_id);}else{ echo "Selectedcategory";}?>
  • < ?php $subcategories1 = wp_list_categories("title_li&child_of=$cat_id&hide_empty"); wp_list_categories("title_li=&current_category="); ?> < ?php ?>

    danke für Ihre Hilfe.

    aber ich denke, dass sie keine foreach oder irgendeine Schleife benötigen, können wir Kind irgendeiner Kategorie erhalten, indem Sie diesen einfachen Code zuerst verwenden $li_id erhalten die aktuelle $li_id und wir übertrugen diese ID dynamisch an child_of=$cat_id und zeigen die ausgewählten Katzenkinder an Ich verwende es in meiner Seitenleiste.

    Ich habe @ rarsts Antwort von oben angepasst, um 3 benutzerdefinierte Taxonomien zu verwenden. Ich möchte nur die Begriffe ausspucken, die an einen oder mehrere Beiträge in der Schleife angehängt sind.

    Hier ist meine function, die ich zu functions.php hinzugefügt habe:

     function dv_setup_sidebar_cats() { global $wp_query; $designers = array(); $sizes = array(); $colors = array(); foreach( $wp_query->posts as $post ) { $des = get_the_terms($post->ID, 'designer'); $siz = get_the_terms($post->ID, 'size'); $col = get_the_terms($post->ID, 'color'); foreach($des as $d) { $designers[] = $d->term_id; } foreach($siz as $s) { $sizes[] = $s->term_id; } foreach($col as $c) { $colors[] = $c->term_id; } } if ( !empty($designers) ) { $designers = array_unique($designers); sort($designers); $designers = implode(',', $designers); $dresult = get_categories(array( 'include' => $designers, 'taxonomy' => 'designer' )); } if ( !empty($sizes) ) { $sizes = array_unique($sizes); sort($sizes); $sizes = implode(',', $sizes); $sresult = get_categories(array( 'include' => $sizes, 'taxonomy' => 'size' )); } if ( !empty($colors) ) { $colors = array_unique($colors); sort($colors); $colors = implode(',', $colors); $cresult = get_categories(array( 'include' => $colors, 'taxonomy' => 'color' )); } $return = array( 'size' => $sresult, 'color' => $cresult, 'designer' => $dresult ); return $return; } 

    Hoffe das hilft jemand anderem.

    -J