web-dev-qa-db-fra.com

Dans l'archive des tags - affiche le nombre de messages pour chaque catégorie à laquelle ils appartiennent

Je vais essayer d'être aussi explicite et concis que possible. Supposons que j'ai un site pour les livres. J'ai trois catégories nommées aventure , romance et fantaisie . Ensuite, j'ai une balise appelée old books . En haut de cette archive de balises, je dois afficher des informations de comptage. Exemple :

OLD BOOKS

There are a total of 88 old books available.
   18 books are from adventure category.
   50 books are from romance category.
   20 books are from fantasy category.

J'ai résolu le premier avec $wp_query->found_posts; qui me donne le nombre total de livres dans l'archive de balises. Maintenant, comment puis-je obtenir le compte pour le reste des livres. Une solution ou une carte routière serait très bien, sinon dites-moi quelles fonctions ou quels exemples devrais-je étudier?.

Je m'attends également à ce que le nombre change de manière dynamique au fur et à mesure des changements. Je publierai mes mises à jour sous peu car je me bats pour trouver une solution.

3
gurung

Je me suis souvenu qu’une fois j’avais dû faire la même chose et écrit une requête SQL personnalisée… c’était pénible, comme le disait @Rarst.

Cependant, je vais poster la fonction que j'ai écrite, et il n'y a pas grand chose à expliquer, est une requête SQL complexe où il y a l'intersection de 2 contrôles pour obtenir tous les termes d'une taxonomie spécifique qui sont associés à post ayant un terme spécifique. dans une autre taxonomie:

function tax_mix_count( $term, $tax, $to_count, $post_type = '' ) {
  if ( ! did_action( 'wp_loaded' ) && current_filter() !== 'wp_loaded' ) {
    return new WP_Error('too-early', 'Call tax_mix_count() after wp_loaded');
  }
  if ( ! taxonomy_exists( $tax ) || ! taxonomy_exists( $to_count ) ) {
    return new WP_Error('invalid-tax', 'Pass valid taxonomy names to tax_mix_count()');
  }
  $by = is_numeric( $term ) ? 'term_id' : 'slug';
  $term_obj = get_term_by( $by, $term, $tax );
  if ( empty( $term_obj ) || is_wp_error( $term_obj ) ) {
    return new WP_Error( "invalid-term", "Pass valid {$tax} term to tax_mix_count()" );
  }
  global $wpdb;
  $pt_where = '';
  if ( is_string( $post_type ) && post_type_exists( $post_type )  ) {
    $pt_where = $wpdb->prepare(' AND p.post_type = %s', $post_type );
  }
  $query = "
    SELECT t.term_id FROM {$wpdb->term_taxonomy} tt
    INNER JOIN {$wpdb->terms} t ON tt.term_id = t.term_id
    INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
    INNER JOIN {$wpdb->posts} p ON (p.ID = tr.object_id) 
    INNER JOIN {$wpdb->term_relationships} tr2 ON (p.ID = tr2.object_id)
    INNER JOIN {$wpdb->term_taxonomy} tt2 ON (tt2.term_taxonomy_id = tr2.term_taxonomy_id) 
    WHERE tt.taxonomy = %s
      AND p.post_status = 'publish'{$pt_where}
      AND tt2.taxonomy = %s AND tt2.term_id = %d";
  $c = $wpdb->get_col( $wpdb->prepare( $query, $to_count, $tax, $term_obj->term_id ) );
  if ( empty( $c ) ) return false;
  return array_count_values( $c );
}

Comme vous pouvez le constater, il est possible d’utiliser différentes taxonomies et pas seulement les balises et les catégories.

  • Le premier argument, $term peut être un identifiant de terme ou un slug de terme.
  • Le deuxième argument est la taxonomie à laquelle le terme appartient.
  • Le troisième argument est la taxonomie à compter.
  • Le quatrième argument (optionnel) est le type de message pour limiter le nombre.

Il est possible de ne transmettre aucun type de publication aussi bien si les deux taxonomies sont utilisées par un seul type de publication personnalisé ou si on souhaite compter tous les types de publication.

Notez que si un CPT non valide est transmis, il est ignoré sans renvoyer d'erreur.

La fonction vérifie également si le hook 'wp_loaded' a déjà été activé, car avant cela, les taxonomies et les types de publication ne sont pas enregistrés. Par conséquent, les vérifications de taxonomie ou de type de publication échouent.

Comment utiliser:

$category_old_books = tax_mix_count( 'old', 'post_tag', 'category', 'books' );

if ( $category_old_books === FALSE ) {
  '<p>Posts in "old" tag are not associated with categories.</p>';
} elseif ( is_array( $category_old_books ) ) {
  foreach( $category_old_books as $id => $count ) {
    $term = get_term( $id, 'category' );
    $url = add_query_arg( array('tag'=>'old'), get_term_link($term,'category') );
    printf(
     _n(
       '%d book is from <a href="%s">%s</a> category',
       '%d books are from <a href="%s">%s</a> category.',
       $count,
       'your_textdomain'
      ),
      $count, esc_url( $url ), esc_html( $term->name )
    );
    echo '<br>';
  }
}

Bien sûr, remplacez 'your_textdomain' par votre vrai domaine de texte;)

2
gmazzap