
Иногда для сайта на 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. Вывод материалов с пометками "важное", "видео", "фото".
Пожертвовать мне на кофе 3USD:
87 комментариев