web-dev-qa-db-fra.com

Nombre de taxons par type de poste

Vous trouverez ci-dessous le code que j’utilise pour afficher le nombre/le nombre de balises post (taxonomie). Je souhaite pouvoir fractionner le nombre en fonction du type de message dans lequel la taxonomie figure (plutôt que le nombre total).

J'ai donc le type de message "post" par défaut, ainsi que "blogs" et "photos". Je veux que le nombre de taxonomie affiche quelque chose comme: x posts | x blogs | x photos

            <?php
            $tags = get_tags( array('name__like' => "a", 'order' => 'ASC') );
            foreach ( (array) $tags as $tag ) { ?>
                <li>                            
                    <a href="<?php echo get_tag_link( $tag->term_id ) ?>">          
                        <span class="name"><?php echo $tag->name ?></span>
                        <span class="number"><?php echo $tag->count ?></span>
                    </a>
                </li>
            <?php } ?>
3
Carpy

J'avais besoin d'obtenir le nombre de messages par type et par terme, alors j'ai créé cette petite fonction:

function get_term_post_count_by_type($term,$taxonomy,$type){
    $args = array( 
        'fields' =>'ids', //we don't really need all post data so just id wil do fine.
        'posts_per_page' => -1, //-1 to get all post
        'post_type' => $type, 
        'tax_query' => array(
            array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $term
            )
        )
     );
    $ps = get_posts( $args );
    if (count($ps) > 0){return count($ps);}else{return 0;}
}

et une fois que vous avez cette fonction, vous pouvez changer un peu votre code en ceci:

<?php
$ptypes = array('post','blog','pic'); //array with all of your post types
$tags = get_tags( array('name__like' => "a", 'order' => 'ASC') );
foreach ( (array) $tags as $tag ) { ?>
<li>                            
        <a href="<?php echo get_tag_link( $tag->term_id ) ?>">          
            <span class="name"><?php echo $tag->name ?></span>
        <span class="number">
            <?php 
                $count = 1;
                foreach($ptypes as $t){
                    echo get_term_post_count_by_type($tag,'post_tag',$t) . " " . $t;
                    if (count($ptypes) != $count){
                        echo " | ";
                        $count = $count + 1;
                    }
                }
            ?>
            </span>
    </a>
    </li>
<?php } ?>
3
Bainternet

Je pense qu'il est préférable de définir posts_per_page sur 1 pour ne pas charger dans tous vos messages (un seul), si vous avez des milliers de messages, ce n'est pas une façon très efficace de le faire.

La définition de 0 ne fonctionnera pas, car WP_Query vérifiera if ( empty( $q['posts_per_page'] ) ). 0 est empty(), donc WP_Query ne l'utilisera pas.

WP_Query fera un décompte des publications qui pourraient être trouvées afin de pouvoir être utilisé au lieu de sélectionner toutes les publications puis de les charger toutes en mémoire, ce qui rend cette fonction plus efficace que celle acceptée.

/**
 * Count number of any given post type in the term
 *
 * @param string $taxonomy
 * @param string $term
 * @param string $postType
 * @return int
 */
function count_posts_in_term($taxonomy, $term, $postType = 'post') {
    $query = new WP_Query([
        'posts_per_page' => 1,
        'post_type' => $postType,
        'tax_query' => [
            [
                'taxonomy' => $taxonomy,
                'terms' => $term,
                'field' => 'slug'
            ]
        ]
    ]);

    return $query->found_posts;
}
1
Jonathan

J'utilise ceci dans une boucle imbriquée pour chaque terme:

$terms = get_the_terms( $post->ID , 'yourtaxonomynamehere' );
if($terms) {
    foreach( $terms as $term ) {
        echo $term->count;
    }
}
?>
1
Mike Averto