有没有更好的方法来做到这一点而不重复查询?

时间:2016-12-11 作者:lasita

我正在构建一个插件,根据用户浏览的类别显示消息。为此,我想获取所有类别,我通过运行以下命令获取所有类别:

$all_categories = get_categories(array(\'hide_empty\' => false ));
$all_category_ids = array();
foreach($all_categories as $category)
{       
    array_push($all_category_ids, $category->term_id);    
}
然后,我将使用以下方法获取要隐藏的子类别:

$exclude_categories = get_categories(array( \'child_of\' => 55, \'hide_empty\' => false ));
$exclude_category_ids = array();    
foreach($exclude_categories as $ex_cat)
{
    array_push($exclude_category_ids, $ex_cat->term_id); 
}
然后我通过以下方式获得差异:

$to_show = array_diff($all_category_ids,$exclude_category_ids)
这完成了任务,但查询监视器插件显示通过运行get_categories() 两次

有没有更好的方法?

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

自从你第一次get_categories 调用会将所有术语加载到内存中,您只需在它们上循环,检查它们是否有ID为的祖先55, WordPress再也不会访问数据库了:

$terms = get_terms([
     \'taxonomy\'   => \'category\',
     \'hide_empty\' => false,
]);

foreach ( $terms as $k => $term ) {
    if ( in_array( 55, get_ancestors( $term->term_id, \'category\', \'taxonomy\' ) ) )
        unset( $terms[ $k ] );
}

相关推荐

GET_THE_TERMS与wp_GET_POST_TERMS中的奇怪结果

我正在尝试制作一个面包屑函数,但有一个小问题。。。使用时:$categories = get_the_terms( $post->ID, \'product_cat\' ); 我得到了一个循环中使用的类别数组,等等。唯一的问题是它是按字母顺序排列的。(我希望它按层次顺序排列。)经过一番挖掘,我发现了一种替代方法,即使用wp\\u get\\u post\\u terms(),但我肯定遗漏了一些东西,因为当我使用此方法时:$categories = wp_get_post_terms( $p