web-dev-qa-db-fra.com

Filtrez get_categories () pour le terme de taxonomie dans WordPress

Je souhaite afficher une catégorie uniquement si une publication (personnalisée) se trouve dans cette catégorie ET région = nom de cette publication.

Donc, par exemple J'ai un message personnalisé (type "entreprise") nommé "Mamma Mia" dans la catégorie enfant: "pizzerias" (et dans la catégorie parent "alimentation"), et dans la région "Rotterdam" (taxonomie personnalisée: "région", personnalisée taxonomie terme: "rotterdam").

=> afficher la catégorie "pizzerias" (et la catégorie parente "aliments")

Seulement, je ne sais pas comment y parvenir. J'apprécierais toute aide sur ce puzzle.

<?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

l'intention est d'afficher une liste de catégories, mais uniquement celles contenant des publications où la région de taxonomie personnalisée est définie sur Rotterdam.

Ceci est fait dans le Query Multiple Taxonomies plugin:

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

2
scribu

Idée générale - interroger un ensemble spécifique d’articles, rassembler toutes leurs catégories, filtrer, laisser la fonction les battre.

Code générique:

$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
));

Les problèmes sont - si je me souviens bien, les requêtes décentes pour plusieurs taxonomies ne viendront que dans WP 3.1 et cela pourrait devenir très intensif, donc il faudra mettre en cache (probablement pour chaque region).

1
Rarst

Sur la version de wordpress que j'utilise, il s'agit de la version 3.1.2. Si vous deviez ajouter 'taxonomy' => 'taxonomy_term' dans le tableau des arguments, cela devrait fonctionner. Donc, voici une modification de votre code d'origine pour inclure la taxonomie dans le tableau. Je ne connais pas le nom de taxonomie que vous essayez d'utiliser ou pas:

<?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 ?>

merci de votre aide.

mais je pense qu’ils n’ont pas besoin de foreach ni de boucle, nous pouvons obtenir des enfants de toutes les catégories en utilisant ce code simple en premier $li_id obtenir l’identifiant du chat actuel et nous avons passé cet identifiant à child_of=$cat_id et le montrer au chat sélectionné que j’utilise dans la barre latérale de mon site.

0
user2565

Pardonnez-moi si j'ai oublié quelque chose, mais ne serait-ce pas aussi simple que cela;

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

Dans l’administrateur, joignez-vous le message à la fois aux "pizzerias" et aux "aliments" (en cochant les deux cases), ou juste aux "pizzerias"?

Si ce dernier, the_category() n'affiche pas "Aliments" par défaut, vous devrez donc saisir la hiérarchie des catégories vous-même.

0
TheDeadMedic

J'ai adapté la réponse de @ rarst ci-dessus à l'utilisation de 3 taxonomies personnalisées. Je veux seulement cracher les termes qui sont attachés à un ou plusieurs des messages de la boucle.

Voici la fonction que j'ai ajoutée à functions.php:

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;

}

J'espère que ceci aide quelqu'un d'autre.

-J

0
jacobdubail

vous pouvez retourner le taxonomie pour un post personnalisé avec une petite fonction:

    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;
    }

Aussi, vous pouvez utiliser la fonction de wp-core:

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

et vous pouvez demander la taxe avec is_tax(), voir codex pour cette balise conditionnelle

Peut-être que cela aide si je comprends bien votre problème. Désolé pour mon mauvais anglais.

0
bueltge

Merci à tous de m'aider - c'est vraiment génial. Je voudrais partager avec vous ce que je suis venu avec. Je sais que ce n'est pas la solution la plus intelligente. L'inconvénient est qu'une catégorie parent est affichée pour une région, lorsqu'aucune publication personnalisée n'y est associée pour cette région (mais qu'un message personnalisé est associé pour une autre région).

J'utilise ceci sur une page de région (archive de taxonomie).

<?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