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

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

Это - вывод, который я хочу:

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

Любая справка была бы большой. Dave

2
05.08.2012, 05:12
3 ответа

Так в основном то, что необходимо сделать, вставить следующий код в 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; ?>
2
19.02.2020, 22:26
  • 1
    Это - большой Varun. Но на примере я использую последнее сообщение, был в феврале, я все еще хотел бы иметь его, распечатывают 0 в течение каждого месяца вплоть до сих пор. Это возможно? –  davebowker 05.08.2012, 05:29
  • 2
    может Вы объяснять меня ясно меня с Вашим кодом и демонстрационным экранным шоу так, чтобы я мог помочь Вам лучше –  Varun Sridharan 05.08.2012, 06:58
  • 3
    Несомненно, я объясню: Скажите, что мои сообщения запускаются 1 год назад. Это составляет 12 месяцев, которые я хочу показать. Существует 5 общих количеств сообщений, разделенных за 3 месяца Jan, февраль, май. 2 в Jan, 2 в феврале, 1 в мае = 5. Ваш код выкладывает Jan 2, 2 февраля, 1 мая. То, что я хочу, является Jan 2, 2 февраля, март 0, апрель 0, 1 мая, июнь 0, и т.д. Hope, которая помогает. В основном просто Ваш код, который Вы имеете, распечатывая 0 в течение многих месяцев без сообщений. –  davebowker 05.08.2012, 07:08
  • 4
    хм извините, я думаю, что он не может быть сделан, но никакой способ, которым я попытаюсь помочь Вам –  Varun Sridharan 05.08.2012, 07:30
  • 5
    Chris выше подобно, но все еще 100% все же. Возможно, Ваш код и Chris мог быть объединен некоторым образом, чтобы сделать то, что Вы сделали, но считаете 0 в течение многих месяцев без сообщений? –  davebowker 05.08.2012, 19:48

Ваш лучший выбор состоит в том, чтобы, вероятно, использовать $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;
}
2
19.02.2020, 22:26
  • 1
    Это становится ближе, я думаю, Chris.Спасибо. В настоящее время Ваш код запускается от Jan и выполняет декабрь сезама. Это может быть изменено, чтобы получить текущий месяц и пойти 12 (или X) месяцы назад? Таким образом, с июля по июнь, например? –  davebowker 05.08.2012, 06:39
  • 2
    Посмотрите мое редактирование. Я сделал в течение прошлых 12 месяцев с текущего месяца. Это - просто вопрос добавления дополнительного, где пункт, который включает дату сообщения. –  chrisguitarguy 05.08.2012, 11:26
  • 3
    Это действительно близко, Chris спасибо. Всего одна ошибка, которую я вижу, - то, что это игнорирует количества последнего месяца и устанавливает их на 0. Вот пример кода, в настоящее время существует 2 сообщения в феврале, и 1 в январе, и он показывает февраль, как являющийся 0, как его игнорирование последнего месяца, который имеет результаты. Август 0 сентябрей 0 октябрей 0 ноябрей 0 декабрей 0 1 января февраль 0 мартов 0 апрелей 0 маев 0 июней 0 июлей 0 –  davebowker 05.08.2012, 17:35
  • 4
    кроме того, у меня был к модификации Ваш запрос wpdb, поскольку Ваш код показывал странные счета в различных месяцах, где не было никаких сообщений. Я удалил Object_k как включение и выключение, которое изменило значения. Вот то, с чем я закончил: "ВЫБЕРИТЕ МЕСЯЦ (post_date) как post_month, КОЛИЧЕСТВО (идентификатор) как post_count". "ОТ $wpdb-> отправляет, ГДЕ post_status = 'публикуют' И post_date МЕЖДУ DATE_SUB (ТЕПЕРЬ (), 12-МЕСЯЧНЫЙ ИНТЕРВАЛ) И ТЕПЕРЬ () И post_type = 'сообщение'". "GROUP BY post_month ORDER BY post_date DESC"); –  davebowker 05.08.2012, 17:38
  • 5
    Хороший вызов, забыл о post_type вещи. решение –  chrisguitarguy 05.08.2012, 19:34

Спасибо за Вашу справку, 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
19.02.2020, 22:26
  • 1
    , жаль о последнем, это хорошим человеком, которого я попытавшийся делать для Вас, но извините я не может делать так так или иначе, Вы делал умную работу –  Varun Sridharan 06.08.2012, 05:03

Теги

Похожие вопросы