get_terms mostrando el enlace a la categoría, incluso si todas las publicaciones son borradores

4

Tengo este código a continuación para mostrar los enlaces de mi taxonomía personalizada en mis publicaciones personalizadas. Quiero que muestre solo las categorías que han publicado publicaciones en ellos. Esto funciona principalmente, pero si puse todos los mensajes en una determinada categoría para redactar, todavía aparece como un enlace, pero cuando un usuario hace clic en el enlace, va a una página 404 porque no hay enlaces activos en él. ¿Cómo puedo hacer que solo muestre el enlace de una categoría si hay publicaciones PUBLICADAS y no solo si hay borradores o si la categoría no tiene publicaciones?

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

1 respuesta

2

get_terms() no tiene una función incorporada que excluye publicaciones de borrador porque solo mantiene un registro del término total de publicaciones adjunto. Hice una búsqueda rápida y encontré este fragmento de código, pero tenga cuidado :

  • Afecta a todas las funciones get_terms() en su sitio ( excluyo el área de administración )
  • Hay una consulta SQL en foreach loop: afectará el rendimiento
  • Más términos devolvieron == mayor rendimiento hit
  • No recomiendo probarlo en un sitio web en vivo
  • Puede salirse con la suya si su tráfico no es muy alto

Esta es probablemente la razón por la que no hay soporte nativo para eso, es una consulta en bucle o WordPress necesitaría realizar un seguimiento de los borradores y las publicaciones públicas, lo que tampoco es perfecto.

SOURCE

Esta es una solución muy intrincada y no la usaría yo mismo. También puede requerir algunas modificaciones.

Si está dispuesto a probarlo, agregue esto 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;
    }
}
    
respondido por el N00b 03.05.2016 - 08:03

Lea otras preguntas en las etiquetas