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 .= ' · ';
}
else {
$term_list .= '</div>';
}
}
echo $term_list;
}
?>
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 :
get_terms()
de votre site (j'ai exclu la zone d'administration).foreach
- cela affectera les performances==
succès plus importantC’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.
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;
}
}