显示类别链接的GET_TERMS,即使所有帖子都是草稿

时间:2016-05-03 作者:rudtek

下面的代码用于在自定义帖子上显示自定义分类法的链接。我希望它只显示在其中发布帖子的类别。这基本上是可行的,但如果我将某个类别中的所有帖子都放到草稿中,它仍然会显示为链接,但当用户单击该链接时,它会转到404页,因为上面没有活动链接
如果有已发布的帖子,而不是只有草稿或类别没有帖子,我如何使其仅显示类别的链接?

<?php
//list terms in a given taxonomy 
$args = array( \'hide_empty=0\' );
$terms = get_terms( \'product_category\', $args );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
    $count = count( $terms );
    $i = 0;
    $term_list = \'<div class="product-category-list">\';
    foreach ( $terms as $term ) {
        $i++;
        $term_list .= \'<a class="activeunderline" href="\' . esc_url( get_term_link( $term ) ) . \'" alt="\' . esc_attr( sprintf( __( \'View all post filed under %s\', \'my_localization_domain\' ), $term->name ) ) . \'">\' . $term->name . \'</a>\';
        if ( $count != $i ) {
            $term_list .= \' &middot; \';
        }
        else {
            $term_list .= \'</div>\';
        }
    }
    echo $term_list;
}   
?>  

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

get_terms() 没有内置的功能来排除草稿帖子,因为它只跟踪学期附加到的帖子总数。我快速搜索了一下,找到了这个片段,但是be warned:

它影响所有人get_terms() 网站上的功能(我排除了管理区域)

  • 中有一个SQL查询foreach 循环-它将影响性能返回更多术语== 更大的性能冲击我不建议在live网站上测试它,如果你的流量不是超高的话,你可能会侥幸逃脱。这可能就是为什么没有本地支持的原因——要么是循环查询,要么是WordPress需要跟踪草稿和公共帖子的数量,这也不完美。

    SOURCE

    这是一个非常粗糙的解决方案,我自己不会使用它。它可能也需要很少的修改。

    如果您愿意尝试,请将此添加到functions.php:

    <小时>

    // Make sure that we\'re not in admin area
    if( ! is_admin() ) {
    
        add_filter( \'get_terms\', \'hide_draft_terms\' );
    
        function hide_draft_terms( $terms, $taxonomies, $args ) {
    
    
            global $wpdb;
            $taxonomy = $taxonomies[0];
    
            if( ! is_array( $terms ) && count( $terms ) < 1 )
                return $terms;
    
            $filtered_terms = array();
    
            foreach ( $terms as $term ) {
    
                $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts p JOIN $wpdb->term_relationships rl ON p.ID = rl.object_id WHERE rl.term_taxonomy_id = $term->term_id AND p.post_status = \'publish\' LIMIT 1" );
    
                if ( intval( $result ) > 0 ) {
    
                    $filtered_terms[] = $term;
                }
            }
    
            return $filtered_terms;
        }
    }
    

  • 相关推荐

    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