Intereting Posts
Предотвращение повторной отправки данных на странице обновления Условные теги не работают Как использовать плагин WP REST API и плагин OAuth Server для регистрации и входа? Получить URL из тега shortcode Как вы навсегда удаляете боковые панели Как восстановить / установить wordpress страницу html? Ошибка подачи RSS-канала при остановке разбора шаблона страницы ошибка разбивки на страницы в таксономии: предупреждение: деление на ноль Запросить настраиваемое метазначение – просмотр и метаданные даты Добавление определенного содержимого страницы с одной страницы на другую автоматически Пользователи Получить текущее название archive.php Создать короткий код для отображения определенного сообщения в текущей текущей позиции Отключить визуальный редактор на одной конкретной странице Локальный короткий код с использованием пользовательских полей WordPress

Количество сообщений в день (день / месяц / год) с начала блога

Я хочу повторить количество сообщений в месяц с начала создания блога, и в течение месяцев, где не было сообщений echo '0'.

Это результат, который я хочу:

1 января, 3 февраля, 8 марта, 3 апреля …

Любая помощь будет большой. Дейв

Лучше всего использовать $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; } в <?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 как плагин .

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

Поэтому в основном вам нужно вставить следующий код в файл 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; ?> 

Спасибо за вашу помощь, Крис и Варун. Кажется, я сделал это, в основном используя пример Криса, и взяв небольшой код от Варунса.

Вот что я закончил. Я не уверен, что это самый эффективный способ сделать это, это скорее доказательство концепции для меня, но если у кого-то есть способ сделать это чище, то, пожалуйста, дайте мне знать.

Спасибо всем.

 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;