it-swarm.com.de

Taxonomie-Anzahl pro Beitragstyp

Unten ist der Code, den ich benutze, um die Anzahl der Post-Tags (Taxonomie) auszugeben. Ich möchte in der Lage sein, die Anzahl basierend auf dem Beitragstyp zu teilen, in dem die Taxonomie enthalten ist (anstatt der Gesamtzahl).

Also habe ich die Standardeinstellung "Post" Post-Typ sowie "Blogs" und "Bilder". Ich möchte, dass die Taxonomiezählung etwa wie folgt aussieht: x posts | x blogs | x Bilder

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

Ich musste die Anzahl der Posts pro Typ und Term ermitteln, also habe ich diese kleine Funktion erstellt:

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

und sobald Sie diese Funktion haben, können Sie Ihren Code ein wenig zu diesem ändern:

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

Ich denke, es ist besser, posts_per_page auf 1 zu setzen, um nicht alle Ihre Beiträge (sondern nur einen) zu laden. Wenn Sie Tausende von Beiträgen haben, ist dies keine sehr effiziente Methode.

Das Setzen auf 0 funktioniert nicht, da WP_Query if ( empty( $q['posts_per_page'] ) ) überprüft. 0 ist empty(), daher wird es von WP_Query nicht verwendet.

WP_Query zählt die gefundenen Posts, damit sie verwendet werden können, anstatt alle Posts auszuwählen und anschließend in den Speicher zu laden. Dadurch ist diese Funktion effizienter als die akzeptierte.

/**
 * 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

Ich benutze dies in einer verschachtelten Schleife für jeden Begriff:

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