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:
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 ' Taxonomy Term Percentage Count '; echo ' Posts total '.$total_posts.' '; 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 ' '.$term->name.' '.$percentage.'% '.$yearly_posts_per_term->post_count.' '; } // endforeach echo '
'; } //end of table } // end of year-based list
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 ' Taxonomy Term Percentage Count '; $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 ' '.$term_name.' '.$percentage.'% '.$count.' '; } echo ' Posts total '.$total_posts.' '; echo '
'; } // 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
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 ' Taxonomy Term Percentage Count '; $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 ' '.$term_name.' '.$percentage.'% '.$count.' '; } echo ' Posts total '.$total_posts.' '; echo '
'; } // 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.
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:
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 .
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 '
'; }
`