Zähle Einträge von benutzerdefinierten Taxonomie-Begriffen nach Jahr

Ich möchte Statistik-ähnliche Tabellen mit der Anzahl der Posts in bestimmten benutzerdefinierten Taxonomie-Begriffen erstellen und diese nach Jahr zusammen mit der Gesamtzahl der Postsendungen aus diesem Jahr anzeigen.

Beispielsweise:

2014

| _Taxonomy Term A: 8 Beiträge

| _ Taxonomie Begriff B: 12 ​​Beiträge

Gesamtzahl der Stellen im Jahr 2014: 20 Stellen

Die function muss offensichtlich Folgendes tun:

  • Zähle Beiträge von meinem benutzerdefinierten Beitragstyp, die 2014, 2013, … veröffentlicht wurden (Gesamtzählung pro Jahr)
  • Zählen Sie die Beiträge in jedem Taxonomiebegriff von meiner benutzerdefinierten Taxonomie auf der jährlichen Basis

Um eine dynamische Liste für die Jahre zu erstellen, habe ich ein Snippet verwendet, das ich irgendwo gefunden habe und es sieht so aus:

function posts_by_year() { // array to use for results $years = array(); // get posts from WP $posts = get_posts(array( 'numberposts' => -1, 'orderby' => 'post_date', 'order' => 'ASC', 'post_type' => 'my-custom-post-type', 'post_status' => 'publish' )); // loop through posts, populating $years arrays foreach($posts as $post) { $years[date('Y', strtotime($post->post_date))][] = $post; } // reverse sort by year krsort($years); return $years; } 

In meiner benutzerdefinierten Seitenvorlage verwende ich:

  $posts) : ?> 

// the code that I need to display the post counts per year

Meine Frage ist:

Wie erstelle ich die wp_query, um die Anzahl der Post pro Taxonomie pro Jahr ausgeben zu können? Ich wäre so froh, wenn mir jemand dabei helfen würde.

PS: Ich habe bereits eine Tabelle, die ALLE veröffentlichten Posts von meinem benutzerdefinierten post-type pro Taxonomie-Begriff zählt, ich fand Hilfe hier und benutzte den Code von deflime.

Bearbeiten:

Das ist Pieter Goosens Ausschnitt mit meinen Änderungen:

 $oldest = get_posts( 'post_type=my-custom-post-type&post_status=publish&posts_per_page=1&order=ASC' ); $oldest_date = $oldest[0]->post_date; $first_date = date('Y', strtotime($oldest_date)); $todays_date = date('Y'); $year_range = range($todays_date, $first_date); foreach ($year_range as $year) { // dynamic year-based tables echo '

' . $year . '

'; $terms = get_terms('my-custom-taxonomy'); $total_posts = 0; if ( !empty( $terms ) && !is_wp_error( $terms ) ) { // table body echo ' '; echo ' '; echo ' '; foreach ( $terms as $term ) { // setup table per taxonomy term $args = array( 'posts_per_page' => -1, 'post_type' => 'my-custom-post-type', 'post_status' => 'publish', 'year' => $year, 'tax_query' => array( array( 'taxonomy' => 'my-custom-taxonomy', 'field' => 'slug', 'terms' => $term->slug ), ), ); $total_posts += $term->count; // Get %, round to 2 decimal places $percentage = round( (($yearly_posts_per_term->post_count / $total_posts)*100), 2 ); // will add up to 100 at the end? $total_check += $percentage; $yearly_posts_per_term = new WP_Query($args); echo ' '; } // endforeach echo '
Taxonomy Term Percentage Count
Posts total '.$total_posts.'
'.$term->name.'
'.$percentage.'%
'.$yearly_posts_per_term->post_count.'
'; } //end of table } // end of year-based list

Solutions Collecting From Web of "Zähle Einträge von benutzerdefinierten Taxonomie-Begriffen nach Jahr"

BEARBEITEN 2

Hier ist eine weitere Version des Codes in EDIT 1 . Dieser Code ist viel schneller. Hier ist mein Test zwischen dem Code in EDIT 1 und EDIT 2

  • EDIT 1 databaseabfragezeit = +/- 0.25 und databaseabfragen = 69

  • EDIT 2 database Abfragezeit = +/- 0.07 und databaseabfragen = 29

Hier ist der Code

 < ?php $oldest = get_posts( 'post_type=post&post_status=publish&posts_per_page=1&order=ASC' ); $oldest_date = $oldest[0]->post_date; $first_date = date('Y', strtotime($oldest_date)); $todays_date = date('Y'); $year_range = range($todays_date, $first_date); foreach ($year_range as $year) { // dynamic year-based tables echo '

' . $year . '

'; $terms = get_terms('category'); $term_slugs = array(); if ( !empty( $terms ) && !is_wp_error( $terms ) ) { // table body foreach ( $terms as $key=>$term){ $term_slugs[$key] = $term->slug; } echo ' '; echo ' '; $posts_count = array(); // Holds all term post counts in an array $terms_array = array(); // Holds all term names in an array $args = array( 'posts_per_page' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'year' => $year, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $term_slugs, 'include_children' => false ), ), ); $yearly_posts_per_term = new WP_Query($args); $posts_count[] = $yearly_posts_per_term->post_count; //Collects post counts and send them to an array if($yearly_posts_per_term->have_posts()): while($yearly_posts_per_term->have_posts()): $yearly_posts_per_term->the_post(); $terms = get_the_terms( $post->ID, 'category' ); if ( $terms && ! is_wp_error( $terms ) ) { foreach ( $terms as $term ) { $terms_array[] = $term->slug; } } endwhile; endif; } $total_posts = array_sum($posts_count); //Use array_sum to add up all the separate post counts $result = array_count_values($terms_array); foreach ($result as $term_name=>$count) { $percentage = round( (($count / $total_posts)*100), 2 ); //Calculate the percentages of each term post cound to total year post count echo ' '; } echo ' '; echo '
Taxonomy Term Percentage Count
'.$term_name.'
'.$percentage.'%
'.$count.'
Posts total '.$total_posts.'
'; } // end of year-based list ?>

Dies ergibt dieselbe Ausgabe wie die Tabelle in EDIT 1 , außer dass keine leeren Begriffe angezeigt werden, sondern nur Begriffe mit Posts angezeigt werden

Bildbeschreibung hier eingeben

BEARBEITEN 1

Aus der bearbeiteten Frage folgt der Strip des neuen Codes. Ich musste hier ein oder zwei Dinge vercasting und einige Elemente neu arrangieren, um das zu erreichen. Die große Herausforderung bestand darin, die Prozentsätze zu berechnen, da die Variablen, die für die Berechnung verwendet wurden, in separaten foreach Schleifen lebten. Variablen innerhalb von foreach Schleifen leben nur innerhalb dieser foreach , nicht außerhalb

Die großen Änderungen am Code (von meiner ursprünglichen Antwort, @deflime-Code und Ihrem integrierten Code) sind von Ihrer Bearbeitung

  • Die zwei Tabellen, die die Gesamtzahl der Beiträge und die Prozentsätze und Bezeichnungen enthalten, wurden direkt unterhalb der $terms foreach Schleife nach außen foreach

  • Die Termnamen und Posts wurden von jedem Term in ein Array außerhalb der $terms foreach Schleife geschrieben

  • Scrapped @defime-Code, entfernt $total_posts = 0; und nur beibehalten und modifiziert $percentage = round( (($yearly_posts_per_term->post_count / $total_posts)*100), 2 );

  • Verwendete array_sum , um die Gesamtanzahl der Posts für das Jahr aus dem Array der array_sum pro Term zu erhalten

  • Verwendete array_combine , um ein assoziatives Array mit den Begriffs- und Beitragszahlen aus jedem Begriff zu erstellen

  • Schließlich verwendete ich eine foreach Schleife, um jeden Term-Namen und die zugehörige Post-Zählung zu erhalten, um diese wieder in die Tabelle einzutragen

Hier ist der endgültige Code

 < ?php $oldest = get_posts( 'post_type=post&post_status=publish&posts_per_page=1&order=ASC' ); $oldest_date = $oldest[0]->post_date; $first_date = date('Y', strtotime($oldest_date)); $todays_date = date('Y'); $year_range = range($todays_date, $first_date); foreach ($year_range as $year) { // dynamic year-based tables echo '

' . $year . '

'; $terms = get_terms('category'); if ( !empty( $terms ) && !is_wp_error( $terms ) ) { // table body echo ' '; echo ' '; $posts_count = array(); // Holds all term post counts in an array $term_names = array(); // Holds all term names in an array foreach($terms as $term) { $term_names[] = $term->name; //Collects term names and send them to an array $args = array( 'posts_per_page' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'year' => $year, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $term->slug, 'include_children' => false ), ), ); $yearly_posts_per_term = new WP_Query($args); $posts_count[] = $yearly_posts_per_term->post_count; //Collects post counts and send them to an array } // endforeach unset($term); } $total_posts = array_sum($posts_count); //Use array_sum to add up all the separate post counts $combine = array_combine($term_names,$posts_count); //Use array_combine to combine term names and post counts into assosiative array foreach ($combine as $term_name=>$count) { $percentage = round( (($count / $total_posts)*100), 2 ); //Calculate the percentages of each term post cound to total year post count echo ' '; } echo ' '; echo '
Taxonomy Term Percentage Count
'.$term_name.'
'.$percentage.'%
'.$count.'
Posts total '.$total_posts.'
'; } // end of year-based list ?>

Bitte beachten Wie in meiner ursprünglichen Antwort habe ich den Post-Typ zum Testen in post und Taxonomie in category geändert.

Ihr Endergebnis ist eine Tabelle, die so aussieht. Bitte beachten Sie, dass alle meine Begriffe in Afrikaans sind, als ich es auf meiner Testseite in Afrikaans getestet habe.

Bildbeschreibung hier eingeben

ORIGINAL ANTWORT

Dies ist ein sehr grober Entwurf einer Idee, die ich hatte, um dies zu tun. Ich habe kein HTML-Markup eingefügt und den Post-Typ- post und die eingebaute Taxonomie- category , um den Code zu testen.

So habe ich die komplette Abfrage aufgebaut

  • Ermitteln Sie zunächst das Datum des ältesten Posts (sollte der erste Post sein) auf der Website. Dies geschieht durch eine einfache get_posts Abfrage. Ändern Sie es nach Ihren Bedürfnissen

     $oldest = get_posts( 'post_status=publish&posts_per_page=1&order=ASC' ); $oldest_date = $oldest[0]->post_date; 
  • Als nächstes streichen Sie das zurückgegebene Datum, um nur das Jahr ab dem Post-Datum zu erhalten. Verwenden strtotime() function strtotime() , um das Jahr in einen Unix-Zeitstempel umzuwandeln

     $first_date = date('Y', strtotime($oldest_date)); 
  • Geben Sie das aktuelle Datum zurück, Sie möchten nur das Jahr. Verwenden Sie die function date()

     $current_date = date('Y'); 
  • Geben Sie beide Datumsangaben an die function range() , um einen Zeitraum zwischen den beiden Datumsangaben zu drucken

     $year_range = range($current_date, $first_date); 
  • Fügen Sie diese Bereiche wieder in eine foreach loop , um Ihre Beiträge in jahresbasierten Listen zu erhalten

  • Ich habe get_terms() um eine Liste aller verfügbaren Begriffe der betreffenden Taxonomie zu erhalten

     $terms = get_terms('category'); 
  • Nun müssen alle diese Informationen mit WP_Query in eine tax_query werden

     $args = array( 'posts_per_page' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'year' => $year, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $term->slug ), ), ); $posts = new WP_Query($args); 
  • Schließlich möchten Sie den Begriff Namen und die Anzahl der Beiträge pro Begriff zurückgeben

     echo $term->name . '(' . $posts->post_count . ')'; 

Jetzt alles zusammen !!

 < ?php $oldest = get_posts( 'post_status=publish&posts_per_page=1&order=ASC' ); $oldest_date = $oldest[0]->post_date; $first_date = date('Y', strtotime($oldest_date)); $current_date = date('Y'); $year_range = range($current_date, $first_date); foreach ($year_range as $year) { echo $year; $terms = get_terms('category'); if ( !empty( $terms ) && !is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $args = array( 'posts_per_page' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'year' => $year, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $term->slug ), ), ); $posts = new WP_Query($args); echo $term->name . '(' . $posts->post_count . ')'; } } } ?> 

Wie gesagt, dies kann verfeinert werden, also nehmen Sie diese Idee und Code und passen und ändern, wie Sie für richtig halten. Hoffe das hilft.

Es gibt eine viel einfachere Lösung als die, die Sie akzeptiert haben, indem Sie nur eine einzige Abfrage verwenden. Ich illustriere hier für den benutzerdefinierten Beitragstyp “Produkt” und die benutzerdefinierte Taxonomie “product_cat” (egory) in Woocommerce, nur weil ich zufällig eine handliche Installation habe, um es zu testen. Die $query ist:

 SELECT YEAR(p.post_date), t.name, COUNT(*), GROUP_CONCAT(p.ID), GROUP_CONCAT(p.post_title) FROM wp_posts p JOIN wp_term_relationships tr ON p.ID = tr.object_id JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN wp_terms t ON tt.term_id = t.term_id WHERE tt.taxonomy = 'product_cat' AND p.post_type = 'product' AND p.post_status='publish' GROUP BY YEAR(p.post_date), tt.term_taxonomy_id ORDER by YEAR(p.post_date) DESC, tt.term_taxonomy_id ASC 

In meiner Beispielinstallation ergibt dies:

Taxonomie-Statistiken pro Jahr

So gibt es zum Beispiel 10 Stellen von Kleidung in 2013 und 2 in 2012.

Sie müssen nur $wpdb->get_results($query) und $ wpdb-> prefix anstelle von ‘wp_’ verwenden), um diese Tabelle in ein Array oder Objekt zu übernehmen, die Prozentsätze zu berechnen und sie anzuzeigen. Die group_concat-Spalten werden hauptsächlich zum Debuggen hinzugefügt (daher möchten Sie sie wahrscheinlich entfernen), obwohl die IDs zum Beispiel auch nützlich für andere Verarbeitungen sind (indem Sie Werte in der Spalte in Arrays explodieren lassen).

Falls jemand nach einem einfacheren, kürzeren Code sucht, um nur ein bestimmtes Jahr anzuzeigen, anstatt eine Schleife zu verwenden, um alle Jahre ab dem Post anzuzeigen. Dies ist der Code Bildbeschreibung hier eingeben .

Dies beinhaltet auch einen Link zum Taxonomie-Archiv. `

  $terms = get_terms('your-taxonomy'); //grab the taxonomy name $year = 2015; // The year you want to pull the terms and count from if ( !empty( $terms ) && !is_wp_error( $terms ) ){ echo '
'; //class to apply css if you want echo '
    '; foreach ( $terms as $term ) { $args = array( //'posts_per_page' => -1, 'post_type' => 'post', // disable this line if you want to grap from all post types 'post_status' => 'publish', 'year' => $year, 'tax_query' => array( array( 'taxonomy' => 'your-taxonomy', 'field' => 'slug', 'terms' => $term->slug ), ), ); $post_year = new WP_Query($args); $term = sanitize_term( $term, 'your-taxonomy' ); $term_link = get_term_link( $term, 'your-taxonomy' ); //Get the links to the term archive page // If the term has no post, it does not display. You can remove the if statement from here if you want to display empty terms if ($post_year->post_count > 0 ) { echo '
  • ' . $term->name . '' .$post_year->post_count. '' . '
  • '; } // End of if $post_year->post_count } // End of Foreach term loop echo '
'; echo '
'; }

`