Anzahl der Posts pro Tag / Monat / Jahr seit Beginn des Blogs

Ich freue mich auf die Anzahl der Beiträge pro Monat seit dem Blog zu echo, und für Monate, wo es keine Beiträge Echo ‘0’ gab.

Dies ist die Ausgabe, die ich möchte:

1. Januar, 3. Februar, 8. März, 3. April, …

Jede Hilfe wäre großartig. Dave

Solutions Collecting From Web of "Anzahl der Posts pro Tag / Monat / Jahr seit Beginn des Blogs"

Ihre beste Wette ist wahrscheinlich, $wpdb direkt zu verwenden. Sie können COUNT und GROUP BY , um die Dinge zu vereinfachen.

Eine Abfrage könnte etwa so aussehen:

 < ?php global $wpdb; $res = $wpdb->get_results("SELECT MONTH(post_date) as post_month, count(ID) as post_count from {$wpdb->posts} WHERE post_status = 'publish' GROUP BY post_month", OBJECT_K); 

Das bringt dich fast den ganzen Weg dorthin. wpdb Sie sicher, dass Sie sich die generischen Ergebnisse der wpdb Dokumente wpdb .

Um Sie den Rest des Weges dorthin zu bringen, werden Sie wahrscheinlich einen Bereich von 1-12 durchlaufen müssen, Monatsnamen erstellen und prüfen, ob die Ergebnisse diesen Monat enthalten.

Hier ist ein Beispiel, das als Shortcode implementiert wurde:

 < ?php add_action('init', 'wpse60859_register_shortcode'); /** * Registers the shortcode * * @uses add_shortcode */ function wpse60859_register_shortcode() { add_shortcode( 'posts_per_month', 'wpse60859_shortcode_cb' ); } /** * The shortcode callback function. * * Usage: * [posts_per_month year="2012"] * * @uses date_i18n * @uses shortcode_atts */ function wpse60859_shortcode_cb($args) { global $wpdb; $args = shortcode_atts(array( 'year' => false ), $args); $year = absint($args['year']); // year is a no go? bail. if(!$year) return ''; $res = $wpdb->get_results($wpdb->prepare( "SELECT MONTH(post_date) AS post_month, count(ID) AS post_count from " . "{$wpdb->posts} WHERE post_status = 'publish' AND YEAR(post_date) = %d " . "GROUP BY post_month;", $year ), OBJECT_K); // We didn't get any results. Something might be wrong? if(!$res) return ''; // build the display $out = '
    '; foreach(range(1, 12) as $m) { $month = date_i18n('F', mktime(0, 0, 0, $m, 1)); $out .= sprintf( '
  • %s %d
  • ', $month, isset($res[$m]) ? $res[$m]->post_count : 0 ); } $out .= '
'; return $out; }

Die foreach Schleife am Ende ist die Aufmerksamkeit, auf die man achten sollte. Gehen Sie durch einen Bereich von 1-12, erstellen Sie für jeden einen passenden Monatsnamen und prüfen Sie, ob die Anzahl der Posts vorhanden ist. Wenn es diese Nummer verwendet oder 0 ausgibt.

Dieser Shortcode als Plugin .

EDIT Anzeige zählt für die letzten 12 Monate.

Dieser benötigt eine etwas komplexere Abfrage, aber das Konzept ist das gleiche: Erhalten Post-Zählungen, Gruppe für Monat. Diesmal Reihenfolge nach Postdatum aufsteigend. Von dort müssen wir nur ein Array von Monatszahlen basierend auf dem aktuellen Datum erstellen.

Beispiel (wieder als Shortcode)

 < ?php add_action('init', 'wpse60859_register_shortcode'); /** * Registers the shortcode * * @uses add_shortcode */ function wpse60859_register_shortcode() { add_shortcode( 'posts_per_month_last', 'wpse60859_shortcode_alt_cb' ); } /** * Callback for displaying the last twelve months of posts * * @uses $wpdb */ function wpse60859_shortcode_alt_cb() { global $wpdb; $res = $wpdb->get_results( "SELECT MONTH(post_date) as post_month, COUNT(ID) as post_count " . "FROM {$wpdb->posts} " . "WHERE post_date BETWEEN DATE_SUB(NOW(), INTERVAL 12 MONTH) AND NOW() " . "AND post_status = 'publish' " . "GROUP BY post_month ORDER BY post_date ASC", OBJECT_K ); $cur = absint(date('n')); if($cur > 1) { $looper = array_merge(range($cur, 12), range(1, $cur-1)); } else { $looper = range(1, 12); } $out = '
    '; foreach($looper as $m) { $month = date_i18n('F', mktime(0, 0, 0, $m, 1)); $out .= sprintf( '
  • %s %d
  • ', $month, isset($res[$m]) ? $res[$m]->post_count : 0 ); } $out .= '
'; return $out; }

Was Sie also tun müssen, ist den folgenden Code in die sidebar.php Datei Ihres Themes einzufügen oder in eine andere Datei, in der Sie benutzerdefinierte WordPress Archive anzeigen möchten.

 < ?php global $wpdb; $limit = 0; $year_prev = null; $months = $wpdb->get_results("SELECT DISTINCT MONTH( post_date ) AS month,YEAR( post_date ) AS year, COUNT( id ) as post_count FROM $wpdb->posts WHERE post_status = 'publish' and post_date < = now( ) and post_type = 'post' GROUP BY month , year ORDER BY post_date DESC"); foreach($months as $month) : $year_current = $month->year; if ($year_current != $year_prev){ if ($year_prev != null){ ?> < ?php } ?> 
  • < ?php echo $month->year; ?>
  • < ?php } ?>
  • month, 1, $month->year)) ?>">< ?php echo date("F", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>
  • < ?php $year_prev = $year_current; if(++$limit >= 18) { break; } endforeach; ?>

    Hinweis: Wenn Sie die Anzahl der angezeigten Monate ändern möchten, müssen Sie Zeile 19 ändern, bei der der aktuelle $ Grenzwert auf 18 gesetzt ist.

    Unser CSS sah ein bisschen so aus:

     .widget-archive{padding: 0 0 40px 0; float: left; width: 235px;} .widget-archive ul {margin: 0;} .widget-archive li {margin: 0; padding: 0;} .widget-archive li a{ border-left: 1px solid #d6d7d7; padding: 5px 0 3px 10px; margin: 0 0 0 55px; display: block;} li.archive-year{float: left; font-family: Helvetica, Arial, san-serif; padding: 5px 0 3px 10px; color:#ed1a1c;} li.archive-year a{color:#ed1a1c; margin: 0; border: 0px; padding: 0;} 

    Wenn Sie jetzt die Anzahl der Posts in jedem Monat anzeigen möchten, müssen Sie dieses Bit irgendwo zwischen Zeile 12 – 16 des obigen Codes hinzufügen:

     < ?php echo $month->post_count; ?> 

    Danke für deine Hilfe, Chris und Varun. Ich habe es anscheinend getan, indem ich hauptsächlich Chris ‘Beispiel benutzt habe und auch ein wenig Code von Varuns genommen habe.

    Hier ist, womit ich endete. Ich bin nicht sicher, ob es die effizienteste Art ist, dies zu tun, es ist eher ein Beweis für ein Konzept für mich, aber wenn jemand einen Weg hat, es sauberer zu machen, dann lass es mich wissen.

    Danke allen.

     global $wpdb; $res = $wpdb->get_results( "SELECT MONTH(post_date) as post_month, COUNT(ID) as post_count " . "FROM {$wpdb->posts} " . "WHERE post_date BETWEEN DATE_SUB(NOW(), INTERVAL 12 MONTH) AND NOW() AND post_type = 'post' " . "AND post_status = 'publish' " . "GROUP BY post_month ORDER BY post_date DESC", OBJECT_K ); $postCount= 0; $len = count($looper); $cur = absint(date('n')); if($cur > 1) { $looper = array_merge(range($cur+1, 12), range(1, $cur)); } else { $looper = range(1, 12); } $out = '0,'; $postCount= '0'; $len = count($looper); foreach($looper as $m) { $month = date_i18n('F', mktime(0, 0, 0, $m, 1)); $out .= sprintf( '%s %d', $month, //'', isset($res[$m]) ? $res[$m]->post_count : 0 ); if ($postCount!= $len-1) { $out .= ','; } $postCount++; } //$out .= ''; echo $out;