web-dev-qa-db-ja.com

ブログが開始されてからの(日/月/年)あたりの投稿数

私は、ブログが始まって以来、月ごとの投稿数をエコーし​​たいと思っています。投稿がなかった月の場合は、エコー '0'を返します。

これは私が欲しい出力です:

1月1日、2月3日、3月8日、4月3日、...

どんな助けでも素晴らしいでしょう。デイブ

2
davebowker

ですから、基本的にあなたがする必要があるのはあなたのテーマの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; ?>
2
Varun Sridharan

あなたの最善の策はおそらく$wpdbを直接使うことでしょう。作業を簡単にするためにCOUNTGROUP 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;
}
2
chrisguitarguy

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;
1
davebowker