web-dev-qa-db-fra.com

Liste taxonomie/nombre de catégories montrant uniquement les publications publiées

Je veux montrer sur une liste de taxonomie avec les articles correspondants comptes d'articles publiés seulement. En vérifiant la documentation WP, il semble que je puisse presque le faire en utilisant la fonction get_terms https://developer.wordpress.org/reference/functions/get_terms/ mais je reçois tous les comptes y compris le projet et mis à la poubelle.

$taxonomy = 'item_category';
  $args =  array(
    'hide_empty' => false,
    'orderby'    => 'name',
    'order'      => 'ASC'
  );
$terms = get_terms( $taxonomy , $args );

foreach( $terms as $term ) {
  echo $term->name . ' - ' . $term->count . '<br/>';
}

Est-ce que WP a un argument intégré pour l'afficher à partir de la fonction get_terms parce que je ne le vois pas dans la documentation? Existe-t-il d'autres fonctions ou filtres que je peux essayer pour obtenir la sortie souhaitée?

1
Carl Alberto

Si la source est cochée, il semble que la seule façon de le faire consiste à filtrer le nombre de sorties pour chaque terme. Vous pouvez y parvenir en insérant ce filtre avant votre appel à get_terms. Notez que cela affichera désormais toujours le nombre d'éléments publiés, soyez donc prudent quant à son utilisation.

function get_terms_filter_published( $terms, $taxonomies, $args ) {
  global $wpdb;
  $taxonomy = $taxonomies[0];
  if ( ! is_array($terms) && count($terms) < 1 ) {
    return $terms;
  }

  $filtered_terms = array();
  $ctr = 0;
  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");
    $published_terms[ $ctr ] = $term;
    if ( intval($result) > 0 ) {
        $published_terms[ $ctr ] = $term;
    } else {
        // you can comment this out if you don't want to show empty terms
        $published_terms[ $ctr ]->count = 0;
    }
    $ctr++;
  }
  return $published_terms;
}

add_filter('get_terms', 'get_terms_filter_published', 10, 3);

$taxonomy = 'item_category';
$args =  array(
  'hide_empty' => false,
  'orderby'    => 'name',
  'order'      => 'ASC'
);
$terms = get_terms( $taxonomy , $args );

foreach( $terms as $term ) {
  echo $term->name . ' - ' . $term->count . '<br/>';
}
1
Carl Alberto