
Иногда для сайта на 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 код вывода добавил и в сайтбар, и просто в код, и в текст, нигде ничего не выводится(
А Вы всё правильно делаете? Расскажите, как Вы делаете – шаг за шагом.
Скопировал верхний код, вставил в functions.php текущей темы(пробовал вставлять в начале и вконце). Потом пытался в разные места вставлять код под названием “как-то так” в разные места, а именно в текствое воле виджетов, поле добавление html кода в теме(типа виджета темы) и просто в файл футер в код. На экране пусто в тех местах
“как-то так” надо непосредственно вставлять в sidebar.php, в виджетах такое не делается :)
Я уже где только его не вставлял. Не получается ничего вывести( фал сайдбар у меня выглядит так
http://www.floomby.ru/s2/GUSUXf/full/
Ну вот, перед закрывающимся тегом aside можно вызывать функцию:
А в какое место function.php вставлять? Вставляю код, а блокирует файл.
желательно в конце, перед символами ?> (если такие в конце файла есть) но можно в любом месте. какую ошибку выдаёт?
Ни какую, просто вообще не отображается сайт. А в админки, во “Внешний вид” пропадают все функции темы.
Попробовал побаловаться на локалке, вставил в конце как Вы говорите. Вот что выдает на на домене: Parse error: syntax error, unexpected ‘}’ in Z:\home\si\www\wp-content\themes\mh-magazine-lite\functions.php on line 542
это говорит о том, что код неправильно вставлен. высылайте на s-business@bigmir.net файл, могу посмотреть, что не так
Отослал)
Спасибо огромное!
Не за что!
Станислав, спасибо! Извините, а Вы не подскажите, как сделать так, чтобы лента начиналась с дня недели, к примеру так:
“26.01.2015
23:00 Где-то кто-то сказал о чём-то
22:00 Например вообще новость
21:00 Статья какая-то”
и называлась там свежие или последние новости?
Немного не понял вопрос. Вроде бы так и отображается.
)) нет, сейчас так:
“09:00 Что-то произошло где-то дико далеко
05:00 Рано утром какая-то новость появилась
00:01 Полуночный материал
26.01.2015
23:00 Где-то кто-то сказал о чём-то
22:00 Например вообще новость
21:00 Статья какая-то”, а хочется так:
” СВЕЖИЕ НОВОСТИ
27.01.2015
09:00 Что-то произошло где-то дико далеко
05:00 Рано утром какая-то новость появилась
00:01 Полуночный материал
26.01.2015