博客开通后每(日/月/年)发帖数

时间:2012-08-05 作者:davebowker

我希望回复自博客开始以来每月的帖子数量,在没有帖子的几个月内回复“0”。

这是我想要的输出:

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

任何帮助都会很好。戴夫

3 个回复
SO网友:Varun Sridharan

因此,基本上您需要做的是将以下代码粘贴到主题的侧栏中。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; ?>
注意:如果要更改显示的月数,则需要更改第19行,其中当前的$限额值设置为18。

我们的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; ?>

SO网友:chrisguitarguy

您最好的选择可能是使用$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);
这让你大部分的路都走到了那里。请务必查看generic results 第节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;
}
Theforeach 最后的循环是需要注意的。在1-12范围内循环,为每个月创建一个正确的月份名称,然后查看是否存在post计数。如果它确实使用该数字,或者打印0。

那个短代码as a plugin.

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;
}

SO网友:davebowker

谢谢你的帮助,克里斯和瓦伦。我似乎主要是通过使用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;

结束

相关推荐

no emails for a user account

是否可以在没有电子邮件的情况下创建用户帐户。只是用户名?我看到有一个插件允许在一封电子邮件中包含多个作者。有人对其他方法有什么建议吗。我知道这并不理想,但我有一个用户谁将张贴代表多个用户。让用户通过gravatar为每个新作者验证他们的电子邮件是http://coffee2code.com/wp-plugins/allow-multiple-accounts/