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. это говорит о том, что код неправильно вставлен. высылайте на [email protected] файл, могу посмотреть, что не так

  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
    23:00 Где-то кто-то сказал о чём-то
    22:00 Например вообще новость
    21:00 Статья какая-то”

    1. Артем, подсветка производится по ID меток (тэгов). Например, материал имеет метку “важно”, ID которой равен 33, тогда в функции мы передаём параметр №2 = 33
      <?php get_articles_feed( 15, 33, false, ‘-4,-5’ ); ?>

  13. Привет!

    Классная лента выходит. А не подскажешь, как сделать так, чтобы Лента выглядела так:

    СЕГОДНЯ
    09:00 Что-то произошло где-то дико далеко
    05:00 Рано утром какая-то новость появилась
    00:01 Полуночный материал

    ВЧЕРА
    23:00 Где-то кто-то сказал о чём-то
    22:00 Например вообще новость
    21:00 Статья какая-то

    03.09.2015
    23:00 Где-то кто-то сказал о чём-то
    22:00 Например вообще новость
    21:00 Статья какая-то

    Заранее большое спасибо!

    1. Коля, нужно заменить 38-ю строку на такое:

             
      <?php if ( get_the_time('d.m.Y', $theid) == date('d.m.Y') ) $theday = 'Сегодня'; elseif ( get_the_time('d.m.Y', $theid) == date('d.m.Y', strtotime('-1 day')) ) $theday = 'Вчера'; else $theday = get_the_time('d.m.Y', $theid); echo $theday; ?>
  14. Стас, спасибо. Мне кажется, я где-то тут торможу: “Затем узнаём ID этого тега и вызываем эту функцию с указанным ID, предварительно в таблице стилей задав классу .important нужный цвет (у меня это выглядит так: .important { color:#c00; } ).” Не пойму где и после чего задать.

    1. Артем, всё у тебя правильно. Разве что дужка после скобочки лишняя. Этот стиль вносится в основную таблицу style.css

  15. Тогда не пойму. Нашел ID тега. Задал и в функции, и в таблице стилей. Не получается) Стас, к примеру, новость на сайте 19.18, Вс. 13/09 – задал ей тег “эксклюзив”, id тега 181, задал в функции. Задал в style.css – .important { color:#000; } , задал в самом конце перед закрытием.
    Неработает)))

    1. пришли ещё пример, посвежее, пожалуйста

  16. Добрый день, спасибо за хак, но помогите плз решить такую проблему: в боковой колонке лента выводится ок, стили работают: http://dyvys.info/polityka/etapy-vyborchoji-kampaniji.html

    Когда пытаюсь вставить боковую колонку (есть такой инструмент в теме) в конструктор страницы, ничего не выводится: http://dyvys.info/test

    ЛМ

    1. с премиум-темами всегда какие-то проблемы. скорее всего, она сама прописывает стили. где должен стоять вывод новостей в тестовой странице?

    1. ЛМ, могу лишь сказать, что судя по коду, там выводится текстовый виджет класса textwidget.

  17. Добрый день! Сутки уже пытаюсь в свой код вывода новостей прикрутить очень нужные функции для сайта, это: 1. параметр для выделения новости с тегом и 2. разбивка на дни. Посмотрите пожалуйста, вот сайт ukreal.info и вот код https://onedrive.live.com/redir?resid=163F538EBEAFBF2B!24589&authkey=!ANWbIaxT3LjBH-c&ithint=file%2cphp. И еще не совсем понимаю как это по тегу? например теги к записи: порошенко, кролик, юлька… а мне нужно при выводе заголовка прикрутить иконку фото, так мне тег “фото” к общим добавлять получается, т.е. получится: порошенко, кролик, юлька, фото…? правильно мыслю или нет?) Помогите плиз разобраться

  18. По сниппету видно, что разбивка на дни не ведётся. А по тег принцип такой: вызываете функцию с id тега из новости, которую надо подсветить. Например, есть у вас новость “Яценюка схватили за яйца”, у неё прописаны тэги, скажем, “Яценюк, скандал, Верховная рада”. Если нам нужно подсветить все новости с тэгом “скандал”, то берём его id и вызываем функцию с этим номером. В вашем случае функция совсем без параметров. А надо ставить параметры, как написано выше в метриале: category_poslednienews(20,30,true,’-4,-5′) где второй параметр является id нужного тега.

    1. Спс, с тегом понятно, буду сегодня еще пробовать, а вот как именно разбивку на дни к моему коду прикрутить, с этим у меня проблема. Я пробовал ваш код полностью вставить, но тут тоже проблема, миниатюры не получается добавить и с таба вылазит полностью почему то хотя шоткод вставляю в тот же блок в котором мой стоял)

  19. Спасибо огромное. Есть вопрос, здесь в ленте выводится фиксированное число новостей. Как организовать бесконечную прокрутку? Или хотя бы задав в ленте например 50, видеть на сайте 10 а остальные иметь возможность скролить?

  20. Стас, обратно к Вам обращаюсь. Тема годичной давности: “Тогда не пойму. Нашел ID тега. Задал и в функции, и в таблице стилей. Не получается)… — задал ей тег «эксклюзив», id тега 181, задал в функции. Задал в style.css — .important { color:#000; } , задал в самом конце перед закрытием. Неработает)))”. И так по сей день) К примеру новость – http://samizdat.ks.ua/ohranu-hersonskogo-gorispolkoma-neset-nevidimyiy-post/. Может, чо подскажите?

    1. Попробуйте заменить .important { color:#000; } на .important a { color:#000; }

  21. Проблема возникает именно с тегами, у меня на проекте необходимо вывести несколько маркеров возле постов, например возле фото – картинку фотоаппарат, а возле видео – относительно камеру. В стилях я то сделаю, а как поступить с привязкой нескольких классов разным тегам.

    1. Тут проще не по тегам привязывать, а сделать пользовательскую таксономию. Создать таксономию “Вид материала”, добавить в неё нужные виды материалов – “фото”, “видео”… и т.д. и при добавлении записи на сайт выбирать нужный вид материала. Дальше перед выводом напиример, заголовка в ленте новостей, проверять, задан ли ей вид материала и если задан, то выводить материал с определенным стилем. Как-то так. Я уже так делал. Могу покопаться и найти. Будет время – выложу сюда.

      1. это конечно так, но проблема заключается именно в том, что есть новостной сайт, и там необходимо приписывать типа “гарячо” “криминал” “новости” “интервью” и т.д.

      2. То що вирішення даного питаня можливе?

        1. можливе, звісно. якщо саме за тегами визначати стиль, то можна

      3. Стас, а Выложите пожалуйста как реализовать это на сайте. Будем очень благодарны))) Спасибо.

        1. Вот это!
          Тут проще не по тегам привязывать, а сделать пользовательскую таксономию. Создать таксономию “Вид материала”, добавить в неё нужные виды материалов – “фото”, “видео”… и т.д. и при добавлении записи на сайт выбирать нужный вид материала. Дальше перед выводом напиример, заголовка в ленте новостей, проверять, задан ли ей вид материала и если задан, то выводить материал с определенным стилем. Как-то так. Я уже так делал. Могу покопаться и найти. Будет время – выложу сюда.

  22. Все отлично работает, но есть не понятная проблемка с віводом на главной! В категориях и в постах вывожу во вкладках, все четко, а на главной блок с выводимыми заголовками просто выпрыгивает из таба под самый хэдер. Никакие позиционные стили не добавлял, что это может быть, подскажите плиз.

    1. Это нужно смотреть, так тяжело гадать.

    1. а как на главной выводите? шорткодом? можете включить сейчас?

        1. сбросьте код главной страницы. мне кажется, вы где-то пропустили

            1. боюсь, нужен весь код. скорее всего где-то закрывающийся див пропущен

                    1. так а где же здесь вызывается шорткодом функция?) может, у вас отдельно есть шаблон главной страницы? или там index.php…

    1. стоп, что-то я запутался. выводит же во вкладке “Последнее”. или нужно ещё куда-то вывести?

      1. На всех страницах корректно выводит, как и задумано, во вкладке Последнее. А на главной выскакивает весь этот блок из вкладки под хэдер в другой .row и корректно себе отображается, но растянут на всю ширину контейнера).

      2. Стас, спасибо за желание помочь! Я изначально догадывался, что скорее всего дело в том, что html код с шорткодами вывожу из html редактора. И заметил, что в моих рабочих скриптах вывода последних записей все, что выводится на экран, заносится в переменную и потом return переменная, а в вашем через echo. Решил пойти другим путем, создал страницу шаблон и весь код для главной вложил в нее, а шорткоды уже прописал так , ну и соответственно создал пустую страницу и подключил к ней данный файл шаблона и заработало все четко! надеюсь поймете, объяснил, как смог) Еще раз спасибо!

        1. ну вот, всё оказалось просто) хотя я, например, шорткоды не использую. разве что в сторонних плагинах

          1. Не понимаю, как можно без шорткодов обойтись? ведь удобно и html код меньше, легче правки делать. А я стараюсь меньше плагинов сторонних задействовать, только по сео, для бэкапа и TinyMCE для редактора. А остальное ручками) А, что касается моей проблемы, это изначально мой косяк, из редактора не стоило выводить ничего, не все реализовать можно, только шаблоном, в него любой php код и шорткод всунуть можно, ну теперь все путем, удачи и вам!!!

  23. Добрый день. Действительно ваш материал очень хороший и похода такое больше нигде не описано. Подскажите пожалуйста как реализовать такой вывод новостей на этом сайте http://vpressa.com.ua Буду очень вам благодарен за помощь или совет. Спасибо

  24. Здравствуйте, подскажите как сделать чтобы выводить иконку фото и видео, может както к тегу подкрутить?

    1. Да, можно в записях прописывать тег “видео”, например. Затем проверять, есть ли в записи этот тег и выводить иконку.
      Но это, похоже, тема для другого материала. Как-нибудь напишу, что к чему.

  25. Здравствуйте, отличная функция!
    Не могли бы вы мне помочь. Как нужно её исправить, чтобы посты объединялись по дате, только у меня дата указанна не как в новостях в прошлом, а в будущем времени, это как афиша.

  26. Как все это дело можно впихнуть в шорткод? не подскажете?

    1. Никак. В этой функции не предусмотрен шорткод

  27. Спасибо большое! Но у меня проблема: если вывести ленту на странице записи (в стандартный single.php) перед самой записью, то слетает цикл – лента работает, а вот публикации нет, выводятся сплошным списком, а не одна конкретная.
    В то же время, если в шаблоне разместить ленту после цикла публикации, то все ок.

  28. Функцию нужно вызывать вне цикла вывода публикации

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

*
*
*