Intereting Posts
Самый простой способ создать страницу пользовательских архивов? Создание собственного короткого кода – переменная echoeing php на основе переменной JS Используйте отдельную папку для загрузки для загрузки пользовательских сообщений Ошибка плагина при активации URL-адрес фрагмента в элементе навигации без специальной ссылки Как отобразить все категории, в которых находится сообщение Как изменить содержание сообщения? WordPress Multisite с доменами cPanel Addon и SSL Как выполнять поиск на основе местоположения пользователя и поиска и возвращать результаты на основе близости? Добавить PHP-код после заголовка на отдельных страницах сообщений? Как использовать пользовательскую предыдущую / следующую ссылку? Timepicker-addon не отображается – Datepicker отлично работает? Добавление отступов при создании эскиза Сессия постоянно сбрасывает переменную Новичок: несколько сайтов WP на Windwos 2012 IIS

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

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

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

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

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

Solutions Collecting From Web of "Количество сообщений в день (день / месяц / год) с начала блога"

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