Иногда для сайта на WordPress ставится задача выводить ленту новостей (например, в сайдбаре) с возможностью разграничения по дням и выделением цветом важных материалов. Когда-то для меня это было довольно тяжёлой задачей и я придумывал разные способы, пока не написал себе универсальную функцию для этого дела.
Итак, задача, если кто не понял, следующая:
1) выводить списком необходимое количество заголовков новостей, рядом указывать время
2) если список сегодняшних новостей заканчивается, начинать новый список – вчерашнего дня с обозначения вчерашней даты
3) выделять либо цветом либо шрифтом определённые новости (признак – специальный тег)
Должно получиться примерно так:
…
09:00 Что-то произошло где-то дико далеко
05:00 Рано утром какая-то новость появилась
00:01 Полуночный материал
26.01.2015
23:00 Где-то кто-то сказал о чём-то
22:00 Например вообще новость
21:00 Статья какая-то
…
Что ж, ничего особо заумного здесь нет. Даю свою функцию. Вставьте её в файл functions.php текущей темы и используйте на здоровье.
function get_articles_feed( $number = 20, $highlight = null, $time = true, $exclude=null ) {
/*
Параметры:
$number - переменная количества выводимых материалов (записей), по умолчанию - 20 шт.
$highlight - переменная с ID тега. Чтобы в списке материалов можно было выделять
какой-то, нужно указать здесь ID специального тега в этом материале. Например, в списке
материалов нам надо выделить новость красным. К этой новости мы добавляем тег, например,
"эксклюзив". Затем узнаём ID этого тега и вызываем эту функцию с указанным ID,
предварительно в таблице стилей задав классу .important нужный цвет (у меня это
это выглядит так: .important { color:#c00; } ). Если ничего не надо выделять, то
укажите в параметрах либо '' либо null
$time - переменная, отвечающая за вывод времени перед заголовком материала. Значение true -
выводит время, значение - false нет
$exclude - массив из ID категорий, материалы из которых выводить не нужно. Например, если Вы
не хотите выводить материалы из рубрик "Реклама" и "Спонсоры", то, узнав их ID, укажите их
при вызове этой функции в виде массива с отрицательными ID:
get_articles_feed( 15, '', false, '-4,-5' );
*/
$args = array(
'posts_per_page' => $number,
'ignore_sticky_posts' => 1, // не выводить закреплённые записи, 0 - выводить
'cat' => $exclude
);
query_posts( $args );
$checked = true; // перед циклом переключатель включен
date_default_timezone_set('Europe/Kiev'); // устанавливаем правильную зону
$now = date('d.m.Y',time()); // узнаём сегодняшний день
$comparedate = $now; // перед циклом дата для сравнения установлена текущая
while ( have_posts() ) : the_post();
$class = ''; // обнуляем переменную для класса выделенного материала
$theid = get_the_ID(); // ID материала заносим в переменную
// Разбивка на дни. Если не нужно отличать дни написания материалов, удалите следующие 8 строк
$posted = get_the_time( 'd.m.Y', $theid ); // узнаём, в какой день написан пост
$checked = ( strtotime($posted) < strtotime($comparedate) ) ? false : true; // выключить переключатель, если дата публткации давнее даты для сравнения
if ( strtotime($posted) < strtotime($comparedate) ) $yesterday = true; // если материал написан вчера
if ( $yesterday && !$checked ) { // если это вчера и переключатель не положительный ?>
</ul>
<div><strong><?php echo get_the_time('d.m.Y',$theid); ?></strong></div>
<ul>
<?php }
// конец разбивки на дни
$tag_ids = wp_get_post_tags( $theid, array( 'fields' => 'ids' ) ); // получаем ID всех тегов поста
$class = ( !empty( $highlight ) && in_array( $highlight, $tag_ids ) ) ? ' class="important"' : '' ; ?>
<li<?php echo $class ?>>
<?php if ($time) { ?><time datetime="<?php the_time('Y-m-d') ?>"><?php echo get_the_time( 'G:i', $theid ) ?></time><?php } ?>
<a href="<?php echo get_permalink( $theid ) ?>" title="Читать: <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
</li>
<?php $comparedate = $posted; // перед окончанием цикла дату для сравнения уравниваем с датой публикации
endwhile;
wp_reset_postdata(); // сброс параметров запроса к базе данных
}
Те же яйца, только сбоку на моём гитхабе:
https://github.com/StasPonomaryov/wordpress-news
Как использовать функцию? Для начала в нужном месте откройте список, потом вызовите функцию с нужными параметрами и закройте список. Пускай это будет даже файл sidebar.php. Как-то так:
<ul> <?php get_articles_feed( 15, 33, false, '-4,-5' ); ?> </ul>
В примере в качестве параметров указано:
- 15 – количество выводимых новостей в списке
- 33 – параметр для выделения новости с тегом, у которого ID равняется 33
- false – не выводить время рядом с заголовком
- ‘-4,-5’ – не выводить новости из категорий с ID 4 и 5
Не сомневаюсь, что код может быть улучшен и более продуман. Буду признателен, если кто-то поделится более элегантным решением.
UPD. Кому интересно, на основе этой функции я расписал WordPress. Вывод материалов с пометками “важное”, “видео”, “фото”.


Здравствуйте, это можно реализовать на любом шаблоне?
Да, шаблон тут вообще не при чём.
спасибо, использовал вашу функцию, все работает замечательно.
Но не могу в подсветить красным всю новость, подсвечивается только время. Подскажите пожалуйста где копать?
где-то тэг закрыт, видимо, лишний. дайте ссылочку, я гляну на самом сайте. так тяжело говорить
http://hromadske.wphost.pp.ua/
Вот здесь, спасибо вам большое)
У Вас стиль для ссылки на новость стоит важнее, чем стиль .important
Поэтому, если вы стиль .important используете только в ленте новостей, то попробуйте так:
.important > a {
color: #C00;
}
все работает, еще раз огромное спасибо вам за помощь))
Вы наверное один из первых кто показал как сделать именно такую ленту новостей. По крайней мере больше нигде в инете я этого не нашел.
спасибо, что был полезным)
Очень помогли спасибо. Извините, буду очень признателен, если посмотрите еще раз. Дело в том, что подключил функцию на новом домене vilne.city и здесь почему-то не работает. Может быть из-за того что шаблон подключил сегодня, но новости там с разными датами?
Уже разобрался. Все новости за исключением одной были 2013 года. Я отредактировал случайную новость с датой в этом году и уже работает. Извините за письмо и еще раз спасибо за такую фунцию)
Идеально как раз то что надо, одна проблема, у меня при установке ничего. пусто в том месте где должны выводится новости. Код ставил в разные места, результат один. Как проверить в чем проблема? Сайт http://dumka.org.ua код вывода добавил и в сайтбар, и просто в код, и в текст, нигде ничего не выводится(