Я надеюсь повторять количество сообщений в месяц, так как блог начинался, и в течение многих месяцев, где не было никакого эха сообщений '0'.
Это - вывод, который я хочу:
1 января, 3 февраля, 8 марта, 3 апреля...
Любая справка была бы большой. Dave
Так в основном то, что необходимо сделать, вставить следующий код в 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; ?>
Примечание: Если Вы хотите изменить число отображенных месяцев, то необходимо изменить строку 19, где текущее значение $limit установлено к 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; ?>
Ваш лучший выбор состоит в том, чтобы, вероятно, использовать $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, создавая имена месяца и проверяя, чтобы видеть, включают ли результаты в том месяце.
Вот пример, реализованный как shortcode:
<?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.
Это shortcode как плагин.
ОТРЕДАКТИРУЙТЕ количества Дисплея в течение прошлых 12 месяцев.
Этот требует немного более сложного запроса, но понятие является тем же: получите количества сообщения, группу к месяцу. На этот раз, порядок возрастанием даты сообщения. Оттуда мы просто должны сделать массив чисел месяца на основе текущей даты.
Пример (снова как 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 = '<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;