Zählpfosten eines gegebenen Posttyps mit einer bestimmten Taxonomie?

( Anmerkung des Moderators: Der ursprüngliche Titel lautete “Wie kann ich die Anzahl der benutzerdefinierten Posts kennen, die eine bestimmte Taxonomie haben?”)

Ich bin mit der function wp_count_posts() !

Ich habe benutzerdefinierte Post-Typen namens 'artwork' , um Kunstwerke in einer Galerie anzuzeigen. Ich habe auch eine benutzerdefinierte Taxonomie namens 'artworkcat' , um jedes Kunstwerk in eine bestimmte Kategorie ( 'webdesign' , 'logo' , 'print' ) zu sortieren.

Ich möchte mit wp_count_posts() wissen, wie viele Posts ich in einer bestimmten Kategorie mit dem benutzerdefinierten Beitrag 'artwork' .

Wenn das nicht klar ist, gebe ich Ihnen ein praktisches Beispiel: Ich würde gerne wissen, wie viele Beiträge ich in diesem benutzerdefinierten Beitragstyp 'artwork' , mit der ‘artworkcat’ Taxonomie namens ‘webdesign’.

functioniert wp_count_posts() dafür, einige Parameter hinzu?

Danke für die Hilfe !

Solutions Collecting From Web of "Zählpfosten eines gegebenen Posttyps mit einer bestimmten Taxonomie?"

Somatisch hatte die sauberste Antwort, vermisste aber eine Sache. Sie sollten die Anzahl der Posts -1 angeben, damit sie alle zählen. So was:

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

Ersetzen Sie einfach Genere mit Ihrer Taxonomie Slug und Romantik mit dem spezifischen Begriff.

wp_count_posts() funktioniert dafür nicht, es akzeptiert keinen Taxonomieparameter. Sie können Folgendes tun:

 $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};")); 

Verwenden Sie get_terms() um eine Liste von Begriffen innerhalb einer Taxonomie zu erhalten. ZB: get_terms('artworkcat')

Sorichs Code ist großartig, wenn Sie SQL-Abfragen manipulieren können. Wenn Sie lieber eine einfache Abfrage get_posts() , können Sie get_posts() , um ein Array von Post-Objekten zurückzugeben, die mit den gewünschten Abfrageparametern übereinstimmen, und sie gleichzeitig zählen und einen Wert zurückgeben. Ich habe dies verwendet, um alle möglichen Kombinationen zu zählen, da es einfach zu ändern ist.

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

Ändern Sie den Parameter post_status arg in “publish”, wenn Sie nur veröffentlichte Elemente zählen möchten.

Und wenn Sie das Plugin “Query Multiple Taxonomies” von scribu installiert haben, können Sie den Argumenten mehrere Taxonomien hinzufügen …

@ somatic’s Antwort ist wahrscheinlich die beste für die meisten Seiten; Es ist sicherlich das Einfachste. Und wenn Sie mit SQL sehr vertraut sind, können Sie die Antwort von @ sorich87 verwenden . Oder Sie können meine Hybridlösung unten verwenden.

Es gab eine sehr ähnliche Frage, die letzte Woche gestellt wurde (lies unbedingt die Antwort auf diese Frage, bevor du die Antwort liest, die ich für dich hinterlassen habe):

  • Gesamtzahl der Beiträge nicht in ausgewählten Kategorien?

Nimmt man die Antwort und ändert sie leicht, bekommt man einen Anruf, der so aussieht:

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

Und hier ist die class, die Sie in die functions.php Datei Ihres Themas kopieren oder in der .php Datei eines Plugins verwenden können, das Sie vielleicht schreiben. Es ist wahrscheinlich übertrieben (und wahrscheinlich übermäßig komplex) für Ihre Bedürfnisse, aber für den Fall, dass Sie eine Hybrid-Lösung wollen, sollte es Ihnen wünschen, dass Sie wollen, und wenn Sie viele Beiträge (Hunderte?) Haben, wird es besser als das Laden aller Beiträge in ein Array nur um sie zählen zu können:

 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 =< <terms}.term_id, {$wpdb->terms}.name AS term_name, {$wpdb->terms}.slug AS term_slug, COUNT(*) as post_count SQL; return $field_list; } } 

Ein paar Dinge zu erklären. WP_Query() lässt uns nicht nach einer Liste von Taxonomie-Term-IDs WP_Query() , aber wir können nach einer Liste von Kategorien-IDs suchen. Aber was sind Kategorien? Sie sind eine Taxonomie namens 'category' ? Deshalb WP_Query() ich WP_Query() , um nach Kategorie-IDs mit den Taxonomie-Begriff-IDs zu posts_where , aber dann ersetze ich im posts_where Hook eine Zeichenfolge, um 'category' durch '{$taxonomy}' oder in deinem Fall durch 'artworkcat' .

All die offensichtliche Komplexität um add_action() und remove_action() besteht lediglich darin, dass Sie diese Hooks nur dann verwenden können, wenn Sie sie brauchen und sie nicht remove_action() lassen, wo sie möglicherweise Ihre anderen Abfragen beeinflussen könnten.