web-dev-qa-db-fra.com

Compter les publications ayant un terme de taxonomie spécifique attaché

Lors de la mise à niveau de notre portefeuille, je recherche quelque chose qui indique le nombre de messages dans une catégorie (actuelle) d'un type de message.

Exemple: j'ai une catégorie avec 'caractéristiques'. Chaque fonctionnalité possède sa propre description, une page relative aux applications et au blog.

Je vais chercher la catégorie actuelle avec:

<?php $cat_id = get_query_var('cat'); ?>

et obtenir des messages avec:

 <?php query_posts("post_type=apps&cat=$cat_id&showposts=3");?>

Comment est-il possible de compter les publications de post_type = apps et category = $ cat_id?

Je suis désolé de mon manque d’expérience PHP/WP. Est-ce que quelqu'un sait comment faire fonctionner ces 2 choses?

Merci d'avance.

2
rwzdoorn

API publique pour le sauvetage

category est une taxonomie déjà intégrée. Par conséquent, il est assez facile de compter son terme avec get_terms( $tax, array( /* args */ ) );

$terms = get_terms( 'category', array(
    'fields' => 'count',
) );

Cela fera une requête COUNT (*) assez rapide afin que vous n'ayez pas à vous soucier des performances.

Solution alternative

Vous pouvez également faire un appel normal à get_terms(), puis modifier la selects avec le filtre:

// The core filter:
apply_filters( 'get_terms_fields', $selects, $args )

// Example callback:
add_action( 'get_terms_fields', 'wpse105174_get_terms_fields_cb', 10, 2 );
function wpse105174_get_terms_fields_cb( $selects, $args )
{
    return array( 't.term_id', 'COUNT(*)' );
}

... où $selects est un tableau (qui sera implosé dans une chaîne séparée par des virgules).

Rendre encore plus rapide

Vous pouvez ensuite modifier davantage la requête et la limiter à certaines catégories spécifiques (termes/taxons) avec un WHERE t.slug = whatever

// The core filter:
apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );

// Example callback:
add_action( 'terms_clauses', 'wpse105174_terms_clauses_cb', 10, 3 );
function wpse105174_terms_clauses_cb( $pieces, $taxonomies, $args )
{
    $pieces['where'] = " WHERE t.slug = whatever";
    // Or do some `str_replace`, `preg_replace`, whatever fits in here

    return $pieces;
}

Vous pouvez également définir le $pieces['join'] = ''; si vous n'avez pas besoin d'accéder à la table term_taxonomy-.

Cachez-le

Enfin, vous pouvez utiliser l’API Transients pour enregistrer vos résultats (sous forme de tableau sérialisé) dans la base de données. Ainsi, vous n’avez pas à interroger le nombre à chaque fois que vous en avez besoin.

8
kaiser

Le nombre de messages est mis en cache dans l'objet catégorie pour des choses comme celle-ci. Dans cette catégorie, quelque chose comme ceci devrait être plus simple:

$category = get_queried_object();
// $category->count has count

Si vous essayez de récupérer toutes les publications de la catégorie via cette boucle, vous devez utiliser posts_per_page=-1, -1 pour tout et posts_per_page est un remplacement plus récent de showposts.

Pour créer des liens vers les archives de catégories, vous pouvez utiliser get_category_link() function.

2
Rarst

J'ai eu quelques problèmes au début, mais cela fonctionne pour moi:

<?php $posts = get_posts("post_type=apps&cat=$cat_id"); 
$count = count($posts); 
 echo "$count"; 
?>
1
rwzdoorn