Alex
Алекс

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

Иногда для сайта на 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. Вывод материалов с пометками “важное”, “видео”, “фото”.

Якщо вам сподобався чи став у нагоді текст, ви завжди можете віддячити! На каву

Приєднатися до обговорення

87 коментарів

  1. Здравствуйте, это можно реализовать на любом шаблоне?

  2. спасибо, использовал вашу функцию, все работает замечательно.
    Но не могу в подсветить красным всю новость, подсвечивается только время. Подскажите пожалуйста где копать?

    1. где-то тэг закрыт, видимо, лишний. дайте ссылочку, я гляну на самом сайте. так тяжело говорить

    1. У Вас стиль для ссылки на новость стоит важнее, чем стиль .important
      Поэтому, если вы стиль .important используете только в ленте новостей, то попробуйте так:
      .important > a {
      color: #C00;
      }

  3. все работает, еще раз огромное спасибо вам за помощь))
    Вы наверное один из первых кто показал как сделать именно такую ленту новостей. По крайней мере больше нигде в инете я этого не нашел.

  4. Очень помогли спасибо. Извините, буду очень признателен, если посмотрите еще раз. Дело в том, что подключил функцию на новом домене vilne.city и здесь почему-то не работает. Может быть из-за того что шаблон подключил сегодня, но новости там с разными датами?

  5. Уже разобрался. Все новости за исключением одной были 2013 года. Я отредактировал случайную новость с датой в этом году и уже работает. Извините за письмо и еще раз спасибо за такую фунцию)

  6. Идеально как раз то что надо, одна проблема, у меня при установке ничего. пусто в том месте где должны выводится новости. Код ставил в разные места, результат один. Как проверить в чем проблема? Сайт http://dumka.org.ua код вывода добавил и в сайтбар, и просто в код, и в текст, нигде ничего не выводится(

  7. А Вы всё правильно делаете? Расскажите, как Вы делаете – шаг за шагом.

  8. Скопировал верхний код, вставил в functions.php текущей темы(пробовал вставлять в начале и вконце). Потом пытался в разные места вставлять код под названием “как-то так” в разные места, а именно в текствое воле виджетов, поле добавление html кода в теме(типа виджета темы) и просто в файл футер в код. На экране пусто в тех местах

  9. “как-то так” надо непосредственно вставлять в sidebar.php, в виджетах такое не делается :)

    1. Ну вот, перед закрывающимся тегом aside можно вызывать функцию:

  10. А в какое место function.php вставлять? Вставляю код, а блокирует файл.

    1. желательно в конце, перед символами ?> (если такие в конце файла есть) но можно в любом месте. какую ошибку выдаёт?

      1. Ни какую, просто вообще не отображается сайт. А в админки, во “Внешний вид” пропадают все функции темы.

        1. Попробовал побаловаться на локалке, вставил в конце как Вы говорите. Вот что выдает на на домене: Parse error: syntax error, unexpected ‘}’ in Z:\home\si\www\wp-content\themes\mh-magazine-lite\functions.php on line 542

        2. это говорит о том, что код неправильно вставлен. высылайте на s-business@bigmir.net файл, могу посмотреть, что не так

  11. Станислав, спасибо! Извините, а Вы не подскажите, как сделать так, чтобы лента начиналась с дня недели, к примеру так:
    “26.01.2015
    23:00 Где-то кто-то сказал о чём-то
    22:00 Например вообще новость
    21:00 Статья какая-то”
    и называлась там свежие или последние новости?

    1. Немного не понял вопрос. Вроде бы так и отображается.

  12. )) нет, сейчас так:
    “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