web-dev-qa-db-fra.com

get_terms montrant un lien vers la catégorie même si tous les articles sont des brouillons

j'ai ce code ci-dessous pour afficher des liens vers ma taxonomie personnalisée sur mes publications personnalisées. Je veux qu'il ne montre que les catégories qui ont publié des articles. Cela fonctionne généralement, mais si je mets tous les articles d'une certaine catégorie à brouillon, il apparaît toujours sous forme de lien, mais lorsqu'un utilisateur clique sur le lien, il passe à une page 404 car il ne contient aucun lien actif.
Comment puis-je simplement afficher le lien d’une catégorie s’il existe des publications PUBLISHED et non s’il n’ya que des brouillons ou si la catégorie n’a pas de publication?

<?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;
}   
?>  
3
rudtek

get_terms() ne possède pas de fonctionnalité intégrée qui exclut les brouillons, car il garde uniquement la trace du nombre total de messages attachés. J'ai fait une recherche rapide et trouvé cet extrait mais soyez averti :

  • Cela affecte toutes les fonctions get_terms() de votre site (j'ai exclu la zone d'administration).
  • Il y a une requête SQL dans la boucle foreach - cela affectera les performances
  • Plus de termes renvoyés == succès plus important
  • Je ne recommande pas de le tester sur le site Web en direct
  • Vous pourriez vous en tirer si votre trafic n'est pas très élevé

C’est probablement la raison pour laquelle il n’ya pas de support natif pour cela - c’est soit une requête en boucle, soit WordPress aurait besoin de suivre les brouillons et le nombre de posts publics, ce qui n’est pas parfait non plus.

LA SOURCE

C'est une solution très compliquée et je ne l'utiliserais pas moi-même. Cela pourrait également nécessiter quelques modifications.


Si vous voulez l'essayer, ajoutez ceci à 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;
    }
}
3
N00b