get_terms mostrando o link para a categoria, mesmo que todas as postagens sejam rascunhos

4

Eu tenho este código abaixo para mostrar links para minha taxonomia personalizada em minhas postagens personalizadas. Eu quero mostrar apenas as categorias que publicaram posts nelas. Isso funciona principalmente, mas se eu colocar todos os posts em uma determinada categoria para o rascunho, ele ainda aparece como um link, mas quando um usuário clica no link ele vai para uma página 404 porque não há links ativos nele. Como posso mostrar apenas o link de uma categoria se houver publicações PUBLICADAS e não apenas rascunhos ou se a categoria não tiver postagens?

<?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;
}   
?>  
    
por rudtek 03.05.2016 / 06:16

1 resposta

2

get_terms() não tem recurso interno que exclui mensagens de rascunho porque ele controla apenas o total de termos a que o termo está vinculado. Fiz uma pesquisa rápida e encontrei este snippet, mas esteja avisado :

  • Afeta todas as funções get_terms() no seu site ( excluí a área de administração )
  • Há uma consulta SQL em foreach loop - isso afetará o desempenho
  • Mais termos retornaram == maior impacto no desempenho
  • Eu não recomendo testá-lo no site ao vivo
  • Você pode se safar se o tráfego não for muito alto

Esta é provavelmente a razão pela qual não há suporte nativo para isso - é um loop de consulta ou o WordPress precisaria controlar os rascunhos e a contagem de postagens públicas que também não é perfeita.

SOURCE

Esta é uma solução muito hacky e eu não usaria isso sozinho. Pode também requerer poucas modificações.

Se você estiver disposto a testá-lo, adicione isso a 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;
    }
}
    
por N00b 03.05.2016 / 08:03