私は、ブログが始まって以来、月ごとの投稿数をエコーしたいと思っています。投稿がなかった月の場合は、エコー '0'を返します。
これは私が欲しい出力です:
1月1日、2月3日、3月8日、4月3日、...
どんな助けでも素晴らしいでしょう。デイブ
ですから、基本的にあなたがする必要があるのはあなたのテーマのsidebar.phpファイルかあなたがカスタムWordPressアーカイブを表示したい他のファイルに次のコードを貼り付けることです。
<?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 } ?>
<li class="archive-year"><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/"><?php echo $month->year; ?></a></li>
<?php } ?>
<li><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>"><span class="archive-month"><?php echo date("F", mktime(0, 0, 0, $month->month, 1, $month->year)) ?></span></a></li>
<?php $year_prev = $year_current;
if(++$limit >= 18) { break; }
endforeach; ?>
注:表示される月数を変更したい場合は、現在の$ limit値が18に設定されている19行目を変更する必要があります。
私たちのCSSはこのように少し見えました:
.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;}
毎月の投稿数を表示したい場合は、上記のコードの12行目から16行目の間に、次のコードを追加する必要があります。
<?php echo $month->post_count; ?>
あなたの最善の策はおそらく$wpdb
を直接使うことでしょう。作業を簡単にするためにCOUNT
とGROUP BY
を使うことができます。
クエリは次のようになります。
<?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);
それはあなたがそこにほとんどの方法を取得します。 wpdb
のドキュメントの 一般的な結果 のセクションを必ず見てください。
それ以外の部分は、1〜12の範囲でループして月名を作成し、結果にその月が含まれているかどうかを確認します。
これは、ショートコードとして実装された例です。
<?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 = '<ul>';
foreach(range(1, 12) as $m)
{
$month = date_i18n('F', mktime(0, 0, 0, $m, 1));
$out .= sprintf(
'<li>%s %d</li>',
$month,
isset($res[$m]) ? $res[$m]->post_count : 0
);
}
$out .= '</ul>';
return $out;
}
最後のforeach
ループは注意を払うためのものです。 1〜12の範囲をループし、それぞれに適切な月名を作成して、投稿数が存在するかどうかを確認します。その番号を使用している場合、またはそれ以外の場合は0を印刷します。
そのショートコード をプラグイン として。
EDIT過去12か月間の表示件数。
これにはもう少し複雑なクエリが必要ですが、概念は同じです。投稿数を取得し、月ごとにグループ化します。今回は、投稿日の昇順で並べ替えます。そこから、現在の日付に基づいて月番号の配列を作成するだけです。
例(やはりショートコードとして)
<?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 = '<ul>';
foreach($looper as $m)
{
$month = date_i18n('F', mktime(0, 0, 0, $m, 1));
$out .= sprintf(
'<li>%s %d</li>',
$month,
isset($res[$m]) ? $res[$m]->post_count : 0
);
}
$out .= '</ul>';
return $out;
}
ChrisとVarun、ありがとう。私はほとんどChrisの例を使用し、Varunsからも少しコードを取ってそれを行ったようです。
これが私が最後になったものです。それがこれを行う最も効率的な方法であるかどうか、私にとってはより多くの概念実証であるかどうかわかりませんが、誰かがそれをよりクリーンにする方法がある場合は、教えてください。
皆さんありがとう。
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 .= '</ul>';
echo $out;