web-dev-qa-db-fra.com

Trier les messages par nom de taxonomie personnalisée

Est-il possible de trier les articles (type d'article personnalisé) par catégorie/taxonomie (nom, desc)?

Par exemple, mes catégories seraient

  • Saison 2012
    • certains post
    • certains post
    • certains post
  • Saison 2011
    • certains post
    • certains post
    • certains post
  • Saison 2010
  • etc..
1
Iladarsda

Une solution serait-

$terms = get_terms('taxonomy-name');
foreach($terms as $term) {
    $posts = get_posts(array(
            'post_type' => 'custom_post_type_name',
            'tax_query' => array(
                array(
                    'taxonomy' => 'taxonomy-name',
                    'field' => 'slug',
                    'terms' => $term->slug
                )
            ),
            'numberposts' => -1
        ));
    foreach($posts as $post) {
        // do what you want to do with the posts here
    }
}
9
Mridul Aggarwal

Je sais que c’est une vieille question qui a déjà une excellente réponse, mais j’ai eu du mal à trouver quelque chose de très similaire pendant des heures et j’ai proposé une boucle alternative.

Vous pouvez également personnaliser un peu la solution (excellente) de Mridul si vous souhaitez que cela fonctionne sur la page d'archive pour une taxonomie. En d'autres termes, vous pouvez trier une archive de taxonomie personnalisée par une autre taxonomie à l'aide de cette solution.

Je partage cela parce que j'ai passé quatre heures à lutter contre ce problème aujourd'hui, et si quelqu'un d'autre essaie de créer des archives de taxonomie personnalisées triées selon une taxonomie différente, voici comment vous procédez. (En outre, ceci est ma première réponse sur StackExchange - soyez gentil s'il vous plait! :))

Cela commence exactement comme la solution de Mridul. Interrogez la taxonomie que vous souhaitez trier.

$terms = get_terms( array(
    'taxonomy' => 'custom_taxonomy_one',
    'parent' => 0, // This helped me eliminate repetitive taxonomies; you may want to skip this
) );

foreach($terms as $term) {
    echo '<h2>' . $term->name . '</h2>'; // Echo the name of the term

C'est là que cela diffère un peu de la réponse de Mridul. Vous souhaitez interroger deux taxonomies et vous assurer que la relation entre elles est définie sur "AND", ce qui signifie que les publications répertoriées répondent aux critères de leur appartenance aux deux taxonomies.

Dans ce cas, les publications dans "custom_post_type" doivent correspondre au slug du premier terme et au nom d'un autre. Espérons que le code a du sens pour tout le monde!

    $posts = get_posts(array(
            'post_type' => 'custom_post_type', // Get posts from custom post type
            'tax_query' => array(
                'relation' => 'AND', // posts must match both taxonomies
                array(
                    'taxonomy' => 'custom_taxonomy_one',
                    'field' => 'slug',
                    'terms' => $term->slug // match the slug for the term in the previous array
                ),
                array(
                    'taxonomy' => 'custom_taxonomy_two',
                    'field' => 'slug',
                    'terms' => 'custom_taxonomy_two_term_name'
                )
            ),
            'numberposts' => -1
        ));
    foreach($posts as $post) {
       // Do Yo Thang
    }
}
1
nathan_393

Boucle alternative, où tax = category et personnalisé post type = "results"

$args = array( 'taxonomy' => 'category' );
$terms = get_terms( 'category', $args);

//START FOR EACH LOOP
foreach ($terms as $term) {

            $post_type = 'results';
            $tax = 'category';
            $tax_terms = get_terms( $tax );
            if ($tax_terms) {
                foreach ($tax_terms  as $tax_term) {
                $args = array(
                    'post_type' => $post_type,
                    "$tax" => $tax_term->slug,
                    'post_status' => 'publish',
                    'posts_per_page' => -1,
                    'caller_get_posts'=> 1
                );



                $my_query = null;
                $my_query = new WP_Query($args);

                if( $my_query->have_posts() ) : ?>

                        // WHILE
                        <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?>

                        // Do stuff

                        <?php endwhile; ?>
                        // END WHILE


                <?php else : ?>
    <?php endif; wp_reset_query(); ?>

}
// END FOR EACH LOOP
0
Iladarsda