WordPress. Вывод материалов как на новостных сайтах

| 87 |

Иногда для сайта на WordPress ставится задача выводить ленту новостей (например, в сайдбаре) с возможностью разграничения по дням и выделением цветом важных материалов. Когда-то для меня это было довольно тяжёлой задачей и я придумывал разные способы, пока не написал себе универсальную функцию для этого дела.

Итак, задача, если кто не понял, следующая:
1) выводить списком необходимое количество заголовков новостей, рядом указывать время
2) если список сегодняшних новостей заканчивается, начинать новый список - вчерашнего дня с обозначения вчерашней даты
3) выделять либо цветом либо шрифтом определённые новости (признак - специальный тег)

focus

Должно получиться примерно так:

...
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>

В примере в качестве параметров указано:

  1. 15 - количество выводимых новостей в списке
  2. 33 - параметр для выделения новости с тегом, у которого ID равняется 33
  3. false - не выводить время рядом с заголовком
  4. '-4,-5' - не выводить новости из категорий с ID 4 и 5

Не сомневаюсь, что код может быть улучшен и более продуман. Буду признателен, если кто-то поделится более элегантным решением.

вывод новостей wordpress

UPD. Кому интересно, на основе этой функции я расписал WordPress. Вывод материалов с пометками "важное", "видео", "фото".

Если вам понравился или пригодился текст, вы всегда можете отблагодарить!

Пожертвовать мне на кофе 3USD:

87 комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *