如何获取搜索结果列表中的类别总数?

时间:2017-09-11 作者:Adam Pearlman

我想在一组搜索结果中显示类别的总数。

例如,“在3个类别中找到10个帖子。”(假设每个帖子只有一个类别。)

现在,我的解决方案是遍历循环,捕获数组中每个帖子的类别,然后计算唯一值:

<?php
    $categories_in_search_results = array();
    if (have_posts()) : 
        while (have_posts()) : the_post();
            array_push($categories_in_search_results, get_the_category()[0]->name);
        endwhile; 
    endif; 
    wp_reset_postdata();
    $total_categories_in_search_results = count(array_unique($categories_in_search_results));
?>
WordPress是否提供了一种更干净的方法来实现这一点,或者是否有更有效的方法?

1 个回复
SO网友:Krzysiek Dróżdż

我担心WP core中没有功能可以根据给定的帖子列表获取唯一类别的数量。。。

让我们先看看你的代码。。。这里面有一些问题。。。

这里不需要使用典型的循环-它会导致许多后台操作(设置全局变量等)。使用foreach会更有效。

如果有多个类别具有相同的名称(例如不同的父类别),则可能返回错误的结果。

有没有更有效的方法?是的,有(特别是,如果返回了许多帖子),您可以使用自定义SQL仅通过一个查询获取类别计数。。。方法如下:

global $wp_query;
global $wpdb;
$post_ids = implode( \',\', wp_list_pluck( $wp_query->posts, \'ID\' ) );
$total_categories_in_search_results = $wpdb->get_var( "
    SELECT COUNT(DISTINCT tt.term_taxonomy_id) FROM
        {$wpdb->term_taxonomy} tt
        INNER JOIN {$wpdb->term_relationships} tr ON ( tt.term_taxonomy_id = tr.term_taxonomy_id )
    WHERE
        tt.taxonomy = \'category\'
        AND tr.object_id IN ({$post_ids})
" );

结束