web-dev-qa-db-fra.com

Compter les postes d'un type de poste donné ayant une taxonomie spécifique?

( Note du modérateur: Le titre d'origine était "Comment connaître le nombre de messages de type personnalisé ayant une taxonomie spécifique")

Je suis coincé avec la fonction wp_count_posts()!

J'ai créé des types d'articles personnalisés appelés 'artwork' pour afficher des œuvres dans une galerie. J'ai également créé une taxonomie personnalisée appelée 'artworkcat' pour trier chaque oeuvre dans une catégorie spécifique ('webdesign', 'logo', 'print').

J'aimerais utiliser la fonction wp_count_posts() pour savoir combien de publications j'ai à l'aide du type d'article personnalisé 'artwork', dans une catégorie spécifique.

Si ce n'est pas clair, je vous donne un exemple concret: j'aimerais savoir combien de messages j'ai dans ce type d'article 'artwork' personnalisé, avec la taxonomie 'artworkcat' appelée 'webdesign'.

Est-ce que wp_count_posts() fonctionne pour cela, en ajoutant quelques paramètres?

Merci pour l'aide !

3
Pierre

Somatic avait la réponse la plus nette, mais manquait une chose. Vous devez spécifier le nombre -1 pour qu'il les compte tous. Comme ça:

$args = array(
    'post_type' => 'artwork',
    'post_status' => 'published',
    'genre' => 'romantic',
    'numberposts' => -1
);
$num = count( get_posts( $args ) );

remplacez simplement genere par votre taxonomie slug et romantique par le terme spécifique.

3
Nick Powers

wp_count_posts() ne fonctionnera pas pour cela, il n'accepte pas de paramètre de taxonomie. Vous pouvez faire ce qui suit:

$taxonomy = 'artworkcat';
$term_slug = 'webdesign';
$post_type = 'artwork';

$term = get_term_by( 'slug', $term_slug, $taxonomy_type );

$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy
ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->posts.post_type = $post_type
AND $wpdb->term_taxonomy.taxonomy = $taxonomy
AND $wpdb->term_taxonomy.term_id = {$term->term_id};"));

Pour obtenir une liste de termes dans une taxonomie, utilisez get_terms() . Par exemple: get_terms('artworkcat')

2
sorich87

Le code de Sorich est génial si vous maîtrisez les requêtes SQL. Si vous préférez créer une requête simple, vous pouvez utiliser get_posts() pour renvoyer un tableau d'objets post correspondant aux paramètres de requête souhaités et les compter en même temps, en renvoyant une valeur. J'ai utilisé cela pour compter toutes sortes de combinaisons, car il est facile à modifier.

$args = array(
    'post_type' => 'artwork',
    'post_status' => 'any',
    'genre' => 'romantic'
);
$num = count( get_posts( $args ) );

Modifiez l'argument post_status en "publier" si vous souhaitez uniquement compter les éléments publiés.

Et si vous avez le plugin Query Multiple Taxonomies de scribu installé, vous pouvez ajouter plusieurs taxonomies aux arguments ...

2
somatic

Si votre taxonomie n'existe que pour le type de publication spécifique, utilisez simplement la fonction principale wp_count_terms.

0
WPExplorer

@ somatic's} _ answer est probablement le meilleur pour la plupart des sites; c'est certainement le plus simple. Et si vous êtes très à l'aise avec SQL, vous pouvez utiliser @ sorich87's answer. Ou vous pouvez utiliser ma solution hybride ci-dessous.

Une question très similaire a été posée la semaine dernière (lisez certainement la réponse à cette question avant de lire la réponse que je vous ai laissée ici)):

En prenant la réponse et en la modifiant légèrement, vous obtenez un appel qui ressemble à ceci:

$post_counts = CountPostsForPostTypeAndCategory::count('artwork','artworkcat');
foreach($post_counts as $post_counts) {
  echo "{$post_counts->term_name}: {$post_counts->post_count}<br/>";
}

Et voici la classe que vous pouvez copier dans le fichier functions.php de votre thème ou utiliser dans le fichier .php du plug-in que vous écrivez peut-être. Il est probablement excessif (et probablement trop complexe)} pour vos besoins, mais si vous voulez une solution hybride, vous devriez le vouloir et si vous avez beaucoup de messages (des centaines?)} _ cela fonctionnera mieux que de charger tous les articles dans un tableau juste pour pouvoir les compter:

class CountPostsForPostTypeAndCategory {
  static $term_ids;
  static $taxonomy;
  static function count($post_type,$taxonomy) {
    self::$taxonomy = $taxonomy;

    add_action('posts_fields',array(__CLASS__,'posts_fields'));
    add_action('posts_where',array(__CLASS__,'posts_where'));
    add_action('posts_join',array(__CLASS__,'posts_join'));
    add_action('posts_groupby',array(__CLASS__,'posts_groupby'));

    $term_ids = get_terms($taxonomy,'fields=ids');
    $query = new WP_Query(array(
      'post_type' => $post_type,
      'posts_per_page' => '-1',
      'category__in' => $term_ids,
    ));

    remove_action('posts_fields',$array(__CLASS__,'posts_fields'));
    remove_action('posts_where',array(__CLASS__,'posts_where'));
    remove_action('posts_join',array(__CLASS__,'posts_join'));
    remove_action('posts_groupby',array(__CLASS__,'posts_groupby'));

    return $query->posts;
  }
  static function posts_where($where) {
    global $wpdb;
    $taxonomy = self::$taxonomy;
    $where = preg_replace("#({$wpdb->term_taxonomy}.taxonomy) = 'category'#","\\1 = '{$taxonomy}'",$where);
    return $where;
  }
  static function posts_join($join) {
    global $wpdb;
    $join .= " INNER JOIN {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id ";
    return $join;
  }
  static function posts_groupby($groupby) {
    global $wpdb;
    $groupby = " {$wpdb->posts}.post_type, {$wpdb->terms}.term_id";
    return $groupby;
  }
  static function posts_fields($field_list) {
    global $wpdb;
    $field_list =<<<SQL
{$wpdb->terms}.term_id,
{$wpdb->terms}.name AS term_name,
{$wpdb->terms}.slug AS term_slug,
COUNT(*) as post_count
SQL;
    return $field_list;
  }
}

Quelques choses à expliquer. WP_Query() ne nous permet pas de rechercher une liste d'identifiants de termes de taxonomie, mais nous interrogeons pour une liste d'identifiants de catégories. Mais quelles sont les catégories? Ils sont une taxonomie nommée 'category'? C’est pourquoi j’ai configuré WP_Query() pour interroger les ID de catégorie à l’aide de vos identificateurs de terme de taxonomie, mais ensuite, je remplace une chaîne par le crochet posts_where pour remplacer 'category' par '{$taxonomy}' ou, dans votre cas, par 'artworkcat'.

Toute la complexité apparente autour des add_action() et remove_action() est simplement destinée à vous permettre d'utiliser ces crochets uniquement lorsque vous en avez besoin et de ne pas les laisser traîner là où ils pourraient potentiellement affecter vos autres requêtes.

0
MikeSchinkel