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

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

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

  1. Павел says:
    02.02.2015 в 21:02

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

    • Стас says:
      08.02.2015 в 17:12

      Да, шаблон тут вообще не при чём.

  2. Павел says:
    09.02.2015 в 20:53

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

    • Стас says:
      09.02.2015 в 21:10

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

  3. Павел says:
    09.02.2015 в 22:56

    http://hromadske.wphost.pp.ua/
    Вот здесь, спасибо вам большое)

    • Стас says:
      10.02.2015 в 9:12

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

  4. Павел says:
    10.02.2015 в 10:49

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

    • Стас says:
      10.02.2015 в 11:09

      спасибо, что был полезным)

  5. Павел says:
    12.02.2015 в 18:39

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

  6. Павел says:
    12.02.2015 в 18:42

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

  7. Vectorseo says:
    22.04.2015 в 0:26

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

  8. Стас says:
    22.04.2015 в 8:12

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

  9. Vectorseo says:
    23.04.2015 в 0:25

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

  10. Стас says:
    23.04.2015 в 13:52

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

  11. Vectorseo says:
    25.04.2015 в 22:03

    Я уже где только его не вставлял. Не получается ничего вывести( фал сайдбар у меня выглядит так
    http://www.floomby.ru/s2/GUSUXf/full/

    • Стас says:
      27.04.2015 в 12:31

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

  12. Артем says:
    19.08.2015 в 10:20

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

    • Стас says:
      19.08.2015 в 10:31

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

      • Артем says:
        19.08.2015 в 10:55

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

        • Артем says:
          19.08.2015 в 11:00

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

        • Стас says:
          19.08.2015 в 11:00

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

  13. Артем says:
    19.08.2015 в 11:34

    Отослал)

  14. Артем says:
    19.08.2015 в 12:12

    Спасибо огромное!

  15. Ира says:
    19.08.2015 в 21:58

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

    • Стас says:
      19.08.2015 в 22:28

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

  16. Ира says:
    20.08.2015 в 8:59

    )) нет, сейчас так:
    «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 Статья какая-то»

  17. Артем says:
    31.08.2015 в 23:29

    Стас, а можно детальней по подсветки, а то чот ни как(

    • Стас says:
      05.09.2015 в 8:51

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

  18. Коля says:
    05.09.2015 в 15:17

    Привет!

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

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

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

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

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

    • Стас says:
      08.09.2015 в 8:48

      Коля, нужно заменить 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; ?>
  19. Артем says:
    14.09.2015 в 0:58

    Стас, спасибо. Мне кажется, я где-то тут торможу: «Затем узнаём ID этого тега и вызываем эту функцию с указанным ID, предварительно в таблице стилей задав классу .important нужный цвет (у меня это выглядит так: .important { color:#c00; } ).» Не пойму где и после чего задать.

    • Стас says:
      14.09.2015 в 1:12

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

  20. Артем says:
    14.09.2015 в 7:58

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

    • Стас says:
      21.09.2015 в 7:58

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

  21. lesia mazanik says:
    14.10.2015 в 11:12

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

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

    ЛМ

    • Стас says:
      14.10.2015 в 11:54

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

  22. lesia mazanik says:
    14.10.2015 в 22:24

    Лента новостей должна выводиться в блоке ОСТАННІ НОВИНИ, см. скриншот http://dyvys.info/wp-content/uploads/2015/10/Skrinshot-2015-10-14-22.jpg

    Я подозреваю, что конструктор страницы в этой теме как-то меняет вывод боковой, но не могу понять, как, где фиксить.

    Спасибо,
    ЛМ

    • Стас says:
      15.10.2015 в 8:30

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

  23. Юрий says:
    11.12.2015 в 13:11

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

  24. Стас says:
    11.12.2015 в 13:20

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

    • Юрий says:
      11.12.2015 в 13:35

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

  25. Сергей says:
    04.02.2016 в 16:16

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

  26. Артем says:
    04.04.2016 в 15:51

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

    • Стас says:
      04.04.2016 в 16:50

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

  27. Артем says:
    04.04.2016 в 18:54

    Стас, спасибо огромное — зароботало!!!

  28. Anatolii says:
    10.04.2016 в 15:20

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

    • Стас says:
      10.04.2016 в 18:07

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

      • Anatolii says:
        11.04.2016 в 17:26

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

      • Anatolii says:
        13.04.2016 в 10:57

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

        • Стас says:
          18.04.2016 в 13:48

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

      • Ярослав says:
        28.06.2017 в 23:14

        Можно подробнее

      • Андрей says:
        28.10.2017 в 12:08

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

        • Андрей says:
          28.10.2017 в 12:10

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

  29. Юрий says:
    09.09.2016 в 20:02

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

    • Стас Пономарёв says:
      11.09.2016 в 17:34

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

  30. Юрий says:
    12.09.2016 в 9:20

    Стас, посмотрите? сайт ukreal info. По ссылке сам код https://1drv.ms/t/s!Aiu_r76OUz8WhYVod8kvF9yh5l-9Cw

  31. Юрий says:
    12.09.2016 в 20:11

    HTML только, тот, что из редактора?

  32. Юрий says:
    12.09.2016 в 23:45

    вот код главной, я выше уже давал ссылку, может вы пропустили https://1drv.ms/t/s!Aiu_r76OUz8WhYVtLvSZ0FZcGvu1Vg

    • Стас Пономарёв says:
      13.09.2016 в 7:54

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

      • Юрий says:
        13.09.2016 в 9:03

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

      • Юрий says:
        13.09.2016 в 12:52

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

        • Стас Пономарёв says:
          13.09.2016 в 13:13

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

          • Юрий says:
            13.09.2016 в 13:24

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

  33. Тарас says:
    22.10.2016 в 15:55

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

  34. Дмитрий says:
    07.08.2017 в 22:17

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

    • Стас Пономарёв says:
      07.08.2017 в 23:56

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

  35. Ольга says:
    26.09.2017 в 10:57

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

  36. Богдан says:
    03.11.2018 в 16:44

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

    • Стас Пономарёв says:
      04.11.2018 в 8:48

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

  37. Богдан says:
    05.11.2018 в 20:11

    Можете глянуть сайт, у меня http://new.manevychi.com/ футер слетает почему то((

  38. Богдан says:
    05.11.2018 в 20:16

    https://gyazo.com/b960fbac34a0e11ea87792e3cb69678e вот так должно быть

  39. Татьяна says:
    15.02.2020 в 16:31

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

  40. Стас Пономарёв says:
    25.02.2020 в 22:27

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

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

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