web-dev-qa-db-de.com

Filtern Sie get_categories () nach dem Taxonomiebegriff in WordPress

Ich möchte eine Kategorie nur anzeigen, wenn sich ein (benutzerdefinierter) Beitrag in dieser Kategorie befindet UND region = $ name für diesen Beitrag.

So kann z.B. Ich habe einen benutzerdefinierten Beitrag (Typ "Unternehmen") mit dem Namen "Mamma Mia" in der Kinderkategorie "Pizzerien" (und in der Elternkategorie "Essen") und in der Region "Rotterdam" (benutzerdefinierte Taxonomie: "Region", benutzerdefiniert) Taxonomiebegriff: "rotterdam").

=> Kategorie "Pizzerien" (und Elternkategorie "Essen") anzeigen

Ich habe nur keine Ahnung, wie ich das erreichen soll. Ich würde mich über jede Hilfe bei diesem Rätsel freuen.

<?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. '<br/>'; 

    $args=array( 
      'orderby' => 'name', 
      'order' => 'ASC', 
      'child_of' => $catid 
      ); 
    $categories=get_categories($args); 
      foreach($categories as $category) {  
        echo '<a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a><br/>'; 
        }  

    } 
} 

// print_r($categories);  


?>
2
Henk Jan

es wird beabsichtigt, eine Liste von Kategorien anzuzeigen, jedoch nur die Kategorien, für die Posts vorhanden sind, in denen die benutzerdefinierte Taxonomieregion auf Rotterdam festgelegt ist

Dies geschieht im Query Multiple Taxonomies Plugin:

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

2
scribu

Allgemeine Idee - Fragen Sie nach bestimmten Beiträgen, sammeln Sie alle Kategorien, filtern Sie und lassen Sie sich von der Funktion in Form bringen.

Allgemeiner 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, werden anständige Abfragen für mehrere Taxonomien nur in WP 3.1 eingehen und dies könnte sehr intensiv werden, daher wird Zwischenspeicherung erforderlich sein (wahrscheinlich für jede region).

1
Rarst

Auf der Version von WordPress verwende ich die Version 3.1.2. Wenn Sie dem Array von Argumenten 'taxonomy' => 'taxonomy_term' hinzufügen, sollte dies funktionieren. Hier ist eine Änderung an Ihrem ursprünglichen Code, um die Taxonomie in das Array aufzunehmen. Sie kennen den Taxonomienamen nicht, den Sie verwenden möchten oder 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. '<br/>'; 

    $args=array( 
      'taxonomy' => 'taxonomy_term', 
      'orderby' => 'name', 
      'order' => 'ASC', 
      'child_of' => $catid 
      ); 
    $categories=get_categories($args); 
      foreach($categories as $category) {  
        echo '<a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a><br/>'; 
        }  

    } 
} 

// print_r($categories);  
?>
1
Jay Sauce
<?php $cat_id = $_GET["cat"];?>     
      <li id="category-active"><a><?php if ($cat_id){echo get_the_category_by_id($li_id);}else{ echo "Selectedcategory";}?></a></li>            <?php   $subcategories1 = wp_list_categories("title_li&child_of=$cat_id&hide_empty");
                wp_list_categories("title_li=&current_category="); ?>
                    </ul><?php ?>

danke für Ihre Hilfe.

aber ich denke, es ist kein foreach oder eine Schleife erforderlich, wir können ein Kind jeder Kategorie erhalten, indem wir diesen einfachen Code zuerst verwenden. $li_id die aktuelle Katzen-ID abrufen, und wir haben diese ID dynamisch an child_of=$cat_id übergeben und sie zeigt die ausgewählten Katzenkinder, die ich benutze in meiner Seitenleiste.

0
user2565

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

Hängen Sie im Administrator den Beitrag sowohl an "Pizzerien" als auch an "Essen" (indem Sie beide Kontrollkästchen aktivieren) oder an "Pizzerien"?

In letzterem Fall zeigt the_category() standardmäßig nicht "Food" an, sodass Sie die Kategoriehierarchie selbst ermitteln müssen.

0
TheDeadMedic

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

Hier ist meine Funktion, 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

0
jacobdubail

sie können die Taxonomie für benutzerdefinierte Posts mit einer kleinen Funktion 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 Funktion von wp-core nutzen:

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

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

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

0
bueltge

Ich danke Ihnen allen, dass Sie mir geholfen haben - das ist wirklich großartig. Ich möchte mit Ihnen teilen, was ich mir ausgedacht habe. Ich weiß, dass es nicht die klügste Lösung ist. Der Nachteil ist, dass eine übergeordnete Kategorie für eine Region angezeigt wird, an die kein benutzerdefinierter Beitrag für diese Region angehängt ist (für eine andere Region ist jedoch ein benutzerdefinierter Beitrag angehängt).

Ich verwende dies auf einer Regionsseite (Taxonomie-Archiv).

<?php
$categories = get_categories();
foreach ($categories as $cat)
{
    if($cat->parent < 1)
    {
        $cat_name = $cat->cat_name;                         
        $catid = get_cat_ID( $cat_name );

        echo '<div class="indexcolumn-top">';

        $img = $taxonomy_images_plugin->get_image_html( 'fullsize', $cat->term_taxonomy_id );
        if( !empty( $img ) )
            print $img;
        else 
            echo '<h2>' .$cat_name. '</h2>';

        $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 '<br/>';
        $output = array_unique($input);
        if (empty($output)):
            echo '<p>Geen bedrijven</p>';
            echo '</div>';
        else :
            echo '<ul class="port-box">';
            foreach ($output as $output) {
                $cat_name = get_cat_name($output);  
                echo '<li><a href="' . get_category_link($output) . '" title="' . sprintf( __( "View all posts in %s" ), $cat_name ) . '" ' . '>' . $cat_name .'</a></li>';                             
            }
            echo '</ul></div>';
        endif;
    }                                                   
}
?>
0
Henk Jan