Вордпресс вывод записей. Вывод произвольных типов записей WordPress. #7. Прикрепленные файлы определенного поста

За вывод записей на WordPress у нас отвечает отдельный файл шаблона – single.php . Однако, это вывод одной записи внутри цикла, который определяется функциями бесплатного движка и не создает никакой сложности. Но как вывести записи wordpress на другой странице или же на главной странице?


get_posts()

В данном случае нам понадобится функция get_posts() . С ее помощью мы можем получить доступ ко всем постам по нужным нам критериям. Плюсов у этого метода достаточно много, одним из них является возможность сортировки постов по дате, наименованию, ID и др. Список всех аргументов достаточно большой, просмотреть вы его сможете в кодексе WordPress, а мы же рассмотрим на прямом примере только самый необходимый набор для выполнения поставленной задачи.

Итак, принцип работы функции:

$posts = get_posts($args);

Как вы понимаете, в переменной $args мы задаем все необходимые параметры вывода наших постов. В переменной posts мы получаем массив данных, который готов к выводу в цикле. После завершения цикла не забываем использовать функцию wp_reset_postdata() , которая позволит нам избежать багов на странице с дополнительными циклами, связанными с выводом записей. Наш код будет выглядеть следующим образом:

9 , "category" => 1, "orderby" => "date"); $myposts = get_posts($args); foreach($myposts as $post){ setup_postdata($post); ?>

">

Это уже полностью готовый код для вставки в нужное для вас место шаблона вашей темы. Немного поясню по поводу заданных аргументов. В параметре numberposts мы задаем количество выводимых записей, в category – указываем ID категории, а orderby у нас отвечает за сортировку по дате.

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

Для удобства посетителей, и для ускорения индексации статей поисковыми системами создаются карты (содержание) сайта, как в формате XML, так и в HTML. В XML-формате карта сайта подходит только для поисковых систем, а в HTML можно вывести все записи, и она ориентирована посетителей, но для поисковиков это тоже плюс.

Небольшое отступление от темы.
Решил сделать небольшой редизайн блога. Целый вечер редактировал стили сайдбара. Как видите, теперь он другого цвета + обновленная .
Сам шаблон блога теперь «нерезиновый» и имеет фиксированную ширину, а под каждым постом добавил социальные кнопки от Addthis. Вот такие дела

Вернемся к главному — списку всех статей блога на одной странице.

Хотел я сделать HTML-карту блога с помощью плагина , но мне он не понравился тем, что если запись принадлежит двум рубрикам, то названия записей повторяются, то есть получается такой эффект, как будто на блоге в несколько раз больше записей, чем на самом деле. Карта блога представляет из себя следующую структуру, (если записи выводить по рубрикам):



Дата записи / Название записи из рубрики 1
Дата записи / Название записи из рубрики 1 и рубрики 2 // повтор названия записи!

Или же можно вывести записи по меткам, но ситуация будет аналогичной при выводе записей по рубрикам, и по желанию можно вывести список страниц блога.

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

Итак, приступим.

Создаем копию файла темы page.php и переименовываем его во что-нибудь другое, например soderzhanie.php. После открываем в редакторе NotePad++ и изменяем код:

До редактирования код выглядит примерно так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

"" ) ) ; comments_template() ; endwhile ; } get_footer() ; ?>

"")); comments_template(); endwhile; } get_footer(); ?>

Оставляем только функции вывода header-a и footer-a, а content нам нафиг не нужен

Туда, где написано Здесь был Вася «Здесь будет код для вывода всех записей блога!» Вставляем следующий код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 "post" , "post_status" => "publish" , "posts_per_page" => - 1 , "caller_get_posts" => 1 if ($moi_zapros -> have_posts () ) : print "Все посты: пример" . "

Все записи блога:

    " ; while ($moi_zapros -> have_posts () ) : $moi_zapros -> the_post () ; ?>
  1. " target="_blank">
  2. ?>

"post", /* Отбираем только записи. */ "post_status" => "publish", /* И только опубликованные. */ "posts_per_page" => -1, /* Снимаем ограничение на количество показываемых записей на одну страничку. */ "caller_get_posts" => 1 /* Игнорируем особенности записей-липучек. */);$moi_zapros = null;$moi_zapros = new WP_Query($parametri); /* Формируем новый "нестандартный" запрос. */if ($moi_zapros->have_posts()): print "Все посты: пример". "

Все записи блога:

    "; while ($moi_zapros->have_posts()) : $moi_zapros->the_post(); ?>
  1. " target="_blank">
  2. ";endif;wp_reset_query(); /* Сбрасываем нашу выборку. */?>

    Окончательный код файла soderzhanie.php:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 /** * Template name: Все посты // имя шаблона страницы */ $parametri = array ( "post_type" => "post" , /* Отбираем только записи. */ "post_status" => "publish" , /* И только опубликованные. */ "posts_per_page" => - 1 , /* Снимаем ограничение на количество показываемых записей на одну страничку. */ "caller_get_posts" => 1 /* Игнорируем особенности записей-липучек. */ ) ; $moi_zapros = null ; $moi_zapros = new WP_Query($parametri ) ; /* Формируем новый "нестандартный" запрос. */ if ($moi_zapros -> have_posts () ) : print "Все посты: пример" . "

    Все записи блога:

      " ; while ($moi_zapros -> have_posts () ) : $moi_zapros -> the_post () ; ?>
    1. " title="Постоянный линк для: " target="_blank">
    2. " ; endif ; wp_reset_query() ; /* Сбрасываем нашу выборку. */ ?>

    "post", /* Отбираем только записи. */ "post_status" => "publish", /* И только опубликованные. */ "posts_per_page" => -1, /* Снимаем ограничение на количество показываемых записей на одну страничку. */ "caller_get_posts" => 1 /* Игнорируем особенности записей-липучек. */);$moi_zapros = null;$moi_zapros = new WP_Query($parametri); /* Формируем новый "нестандартный" запрос. */if ($moi_zapros->have_posts()): print "Все посты: пример". "

    Все записи блога:

      "; while ($moi_zapros->have_posts()) : $moi_zapros->the_post(); ?>
    1. " title="Постоянный линк для: " target="_blank">
    2. ";endif;wp_reset_query(); /* Сбрасываем нашу выборку. */?>

      Я видел много сайтов на WordPress, у которых на главной странице отображается какая-нибудь статичная страница, а страница блога находится отдельно, например yourwebsite.com/blog .

      Как же это реализовать на своём собственной сайте? На самом деле существует два способа — один простой и один не очень, рассмотрим их оба.

      Способ 1. Использование index.php в качестве шаблона блога.

      Это стандартный способ, предусмотренный в WordPress. Скорее всего на тех сайтах, про которые я говорил в самом начале поста, используется именно он. Рассмотрим пошагово.

      Кстати, так как в разных темах содержимое файла index.php разное — оно может быть совсем не предназначено для блога, в таких случаях либо меняем сами свой index.php либо воспользуемся вторым способом, который я описал чуть ниже.

      Шаг 1. Создание страницы блога.

      Ну, что тут сказать, переходим в Страницы > Добавить новую, указываем какой-нибудь заголовок, например Блог и какой-нибудь URL, например blog, после этого сохраняем. Всё, с шагом 1 покончено.

      Шаг 2. Настраиваем отображение страниц в настройках.

      Переходим в Параметры > Чтение, настраиваем отображение нужной страницы на главной, а для страницы записей устанавливаем созданную в предыдущем шаге.

      Шаг 3. Последний шаг. Добавляем страницу в меню.

      Уже после завершения второго шага при переходе по адресу блога (у нас это yourwebsite.com/blog), у вас будет отображаться страница с записями, использующая шаблон файла index.php .

      Тем не менее можно также добавить эту страницу в меню сайта (если поддерживается темой разумеется). Для этого переходим в Внешний вид > Меню , слева в колонке выбираем нашу страницу блога и нажимаем кнопку «Добавить в меню»

      Способ 2. Использование собственного шаблона блога. Создание нескольких блогов на одном сайте WordPress.

      Этот способ позволяет создавать страницы блога, используя свой собственный шаблон. Этот способ отлично подходит, если вам требуется изменить параметры вывода постов. Можно создавать разные страницы с разными параметрами вывода.

      Шагов будет чуть побольше и они будут немного позаковырестей, чем в предыдущем методе. Итак, поехали.

      Шаг 1. Создание шаблона страницы

      Открываем папку с темой и создаем там файл произвольного названия, например blog-template.php . Внутрь файла вставляем:

      Шаг 2. Создаем страницу блога

      Этот шаг аналогичен первому шагу из начала поста. Итак, переходим в Страницы > Добавить новую, придумываем название и URL странице, и кроме всего прочего в атрибутах страницы указываем только что созданный нами шаблон.

      Сохраняем.

      Шаг 3. Плагин постраничной навигации

      Однозначно, что нам понадобится постраничная навигация. Скорее всего у вас уже используется какой-то плагин или функция навигации. Если же навигация не будет работать, рекомендую поставить WP_PageNavi — этот плагин работает отлично, я его протестировал, всё ок.

      Шаг 4. Шаблон страницы блога

      Это голый шаблон блога, без таких важных функций как get_header() , get_footer() и прочего. Просто в данный момент важно понять саму суть.

      /* * Template name: Блог */ $current_page = (get_query_var("paged" ) ) ? get_query_var("paged" ) : 1 ; // определяем текущую страницу блога $args = array ( "posts_per_page" => get_option("posts_per_page" ) , // значение по умолчанию берётся из настроек, но вы можете использовать и собственное "paged" => $current_page // текущая страница ) ; query_posts( $args ) ; $wp_query ->is_archive = true ; $wp_query ->is_home = false ; while (have_posts() ) : the_post() ; ?>

      /* содержимое поста */ ?>

      // функция постраничной навигации

      Всё, страница блога создана, вы можете таким образом создать различные страницы блогов с разными параметрами массива $args. Полный список параметров

      Получает записи (посты, страницы, вложения) из базы данных по указанным критериям. Можно выбрать любые посты и отсортировать их как угодно.

      Массив WP_Post объектов (записей). Каждый объект в массиве выглядит так:

      Array(=> object(WP_Post)#4692 (24) { ["ID"] => int(822) ["post_author"] => string(1) "1" ["post_date"] => string(19) "2016-07-07 10:28:57" ["post_date_gmt"] => string(19) "2016-07-07 07:28:57" ["post_content"] => string(6225) "Контент статьи" ["post_title"] => string(37) "Мертвое море (14 фото)" ["post_excerpt"] => string(15) "Цитата о статье" ["post_status"] => string(7) "publish" ["comment_status"] => string(4) "open" ["ping_status"] => string(4) "open" ["post_password"] => string(0) "" ["post_name"] => string(95) "mertvoe-more-14-foto" ["to_ping"] => string(0) "" ["pinged"] => string(0) "" ["post_modified"] => string(19) "2016-07-07 10:28:57" ["post_modified_gmt"] => string(19) "2016-07-07 07:28:57" ["post_content_filtered"] => string(0) "" ["post_parent"] => int(0) ["guid"] => string(0) "" ["menu_order"] => int(0) ["post_type"] => string(4) "post" ["post_mime_type"] => string(0) "" ["comment_count"] => string(1) "0" ["filter"] => string(3) "raw" } => object(WP_Post){ ... } => object(WP_Post){ ... })

      Использование

      get_posts($args);

      Шаблон использования

      // параметры по умолчанию $posts = get_posts(array("numberposts" => 5, "category" => 0, "orderby" => "date", "order" => "DESC", "include" => array(), "exclude" => array(), "meta_key" => "", "meta_value" =>"", "post_type" => "post", "suppress_filters" => true, // подавление работы фильтров изменения SQL запроса)); foreach($posts as $post){ setup_postdata($post); // формат вывода the_title() ... } wp_reset_postdata(); // сброс $args(строка/массив) Список аргументов, в соответствии с которыми будет получен результат.
      По умолчанию: предустановленные

      Аргументы параметра $args

      С версии WordPress 2.6, в дополнении к нижеописанным параметрам, get_posts() может принимать все те же параметры что и WP_Query .

      В get_posts() по умолчанию включен параметр suppress_filters (подавлять фильтры), который в query_posts() и WP_Query отключен - т.е. там фильтры работают. Включение suppress_filters отменяет все фильтры изменения SQL запроса, следующего типа: posts_* или comment_feed_* .

      suppress_filters не виляет на работу фильтра pre_get_posts - он будет работать независимо от того что указано в suppress_filters .

      Такое отключение фильтров по умолчанию, может ввести в замешательство, если есть плагины влияющие на вывод записей, через фильтры SQL запроса, например WPML. В таких случаях suppress_filters нужно отключить.

      В параметр "category" нужно передавать ID, а не название категории. Также "category" можно передать строку: ID через запятую.

      numberposts(число) Количество выводимых постов. Установить на 0 , чтобы ограничить вывод максимальным числом постов на страницу (устанавливается в настройках ВП) или поставить -1 чтобы убрать ограничения вывода (LIMIT).
      По умолчанию: 5 offset(число) Отступ от первого поста (записи). category(число/строка/массив)

      Из каких категорий выводить записи. Укажите ID категории из которой нужно получить посты или укажите, -3 вместо 3 , если нужно получить все записи, кроме записей из категории 3 (исключить категорию). Можно указать несколько ID через запятую ("3,5,12" или "-3,-5,-12").

      Смотрите описание параметра cat у WP_Query .

      В функциях WP_Query и query_posts() этот параметр отключен по умолчанию (равен false).
      По умолчанию: true

      Примеры

      #1. Вывод постов с отступом

      Если у вас на главной выводится один, последний пост, а нужно вывести еще 5 предыдущих из категории 1, то можно использовать такой код:

        5, "offset"=> 1, "category" => 1); $myposts = get_posts($args); foreach($myposts as $post){ setup_postdata($post); ?>
      • ">

      #2. Вывод постов с отступом, без нарушения основного цикла.

      Если была использована функция get_posts() и после нее нужно использовать стандартный цикл WordPress, то нужно сохранить глобальную переменную $post , делает это так:

        5, "offset"=> 1, "category" => 1); $myposts = get_posts($args); foreach($myposts as $post){ setup_postdata($post); ?>
      • ">

      #3. Возможность использовать специальные функции Цикла ВП

      Стандартно в цикле основанном на get_posts() невозможно использовать, например, функцию the_content() или the_date() . Эта проблема решается функцией setup_postdata() которой нужно передать переменную $post:

      3); $lastposts = get_posts($args); foreach($lastposts as $post){ setup_postdata($post); // устанавливаем данные?>

      ">

      Данные можно также получить через обращение к свойству объекта (объект->свойство_объекта). Например, для этого примера $post->ID будет равно ID поста, $post->post_content будет содержать контент записи. Свойство объекта это колонка таблицы БД posts. Название колонок можно посмотреть .

      Не забывайте, что на экран данные выводятся через php оператор echo:

      ID; ?>

      #4. Последние посты отсортированные по заголовку

      Получим последние посты отсортированные по заголовку в алфавитном порядке. Следующий пример выведет дату, заголовок и цитату поста:

      10, "order"=> "ASC", "orderby" => "title")); foreach ($postslist as $post){ setup_postdata($post); ?>


      #5. Случайные посты

      Получим 5 случайных постов, реализуется за счет параметра "orderby" => "rand" :

        5, "orderby" => "rand"); $rand_posts = get_posts($args); foreach($rand_posts as $post) : ?>
      • ">

      #6. Получить все прикрепленные файлы

      Используется за пределами Цикла WordPress. Следующий код выведет заголовок, ссылку и цитату прикрепленного файла:

      "attachment", "posts_per_page" => -1, "post_status" => null, "post_parent" => null); $attachments = get_posts($args); if ($attachments) { foreach ($attachments as $post) { setup_postdata($post); the_title(); the_attachment_link($post->ID, false); the_excerpt(); } } wp_reset_postdata(); ?>

      #7. Прикрепленные файлы определенного поста

      Код нужно использовать внутри Цикла WordPress, где переменная $post->ID:

      "attachment", "posts_per_page" => -1, "post_status" => null, "post_parent" => $post->ID); $attachments = get_posts($args); if ($attachments) { foreach ($attachments as $attachment) { echo apply_filters("the_title" , $attachment->post_title); the_attachment_link($attachment->ID , false); } } wp_reset_postdata(); ?>

      #8. Последние записи из той же рубрики

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

      term_id; $real_id = get_the_ID(); $args = array("cat" =>$cat_add_id); $posts = get_posts($args); foreach($posts as $post){ setup_postdata($post); if ($post->ID <> $real_id){ ?> ">

      Заметки

        С версии 2.6 изменен ряд передаваемых значений у параметра orderby - префикс post_ был удален, например, было post_title, стало просто title.

      • С версии 3.0 параметрам include и exclude можно передавать и массивы ID.

      Хотите дешево купить просмотры в Инстаграме на видео или ТВ-трансляцию, но не знаете, где? Попробуйте посетить сайт Doctor SMM , где Вам будет предложена одна из самых низких цен по рунету на просмотры. Торопитесь, так как предложение действует ограниченное время! К тому же здесь Вы сможете очень быстро приобрести ресурс с оптимальным, конкретно для Вашей страницы, скоростным режимом. Развивайте аккаунт быстро и легко!

      Заметки

      • Смотрите: WP_Query::parse_query()

      Список изменений

      С версии 1.2.0 Введена.

      Код get posts : wp-includes/post.php WP 5.2.3

      5, "category" => 0, "orderby" => "date", "order" => "DESC", "include" => array(), "exclude" => array(), "meta_key" => "", "meta_value" => "", "post_type" => "post", "suppress_filters" => true,); $r = wp_parse_args($args, $defaults); if (empty($r["post_status"])) { $r["post_status"] = ("attachment" == $r["post_type"]) ? "inherit" : "publish"; } if (! empty($r["numberposts"]) && empty($r["posts_per_page"])) { $r["posts_per_page"] = $r["numberposts"]; } if (! empty($r["category"])) { $r["cat"] = $r["category"]; } if (! empty($r["include"])) { $incposts = wp_parse_id_list($r["include"]); $r["posts_per_page"] = count($incposts); // only the number of posts included $r["post__in"] = $incposts; } elseif (! empty($r["exclude"])) { $r["post__not_in"] = wp_parse_id_list($r["exclude"]); } $r["ignore_sticky_posts"] = true; $r["no_found_rows"] = true; $get_posts = new WP_Query; return $get_posts->query($r); }

      Используя WordPress , как обычный блоговый движок с готовой темой, подобный вопрос у нас бы не возник. Мы просто не вмешиваемся в алгоритмы работы CMS , записи сами как-то выводятся. В каком случае вывод записей WordPress нас начинает интересовать?

      Тогда, когда мы собираемся из статичной HTML верстки сделать уникальную WordPress тему. А точнее, мы хотим предложить свои услуги по натяжки верстки на WordPress . Так вот, без умения выводить записи WordPress в любом месте сайта - вам будет никак не обойтись.

      Структура темы под WordPress

      Что представляет из себя тема WordPress ? Это набор файлов (шаблоны), состоящих из HTML кода вперемешку с PHP кодом. В любой теме, как минимум должны быть два файла: index.php и CSS файл стилей. HTML код - это и есть верстка уникального дизайна, а PHP код состоит из функций и тегов, уже описанных в ядре WordPress , файлы ядра мы никогда не трогаем.

      Запомните, что весь HTML код должен находится за пределами открывающих и закрывающих тегов PHP . Напротив, весь PHP код пишется только внутри тегов. Например выведем имя автора записи в цикле WordPress:

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

      Теги шаблонов вывода записей WordPress

      the_permalink
      the_title
      the_time
      the_content
      the_author
      the_excerpt
      the_category

      С помощью этих тегов шаблонов выводятся статьи на главной странице WordPress в шаблоне index.php .

      ">

      Выводим дату создания записи:

      Давайте выведем саму статью - контент, внутри тега div:



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



      Сюда помещаем, весь код выше. Мы находимся внутри цикла.



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

      Если посты есть, то в цикле while выполняется функция the_post , которая занимается выводом всех записей , до тех пор, пока они есть.

      Закончили цикл и условие.


      Цикл будет работать до тех пор, пока имеются записи, количество вывода записей на страницу задаётся в настройках блога. Если записей больше, то на страничке появятся элементы пагинации. Таким образом на блоге будут выведены все записи, и WordPress автоматически создаст страниц столько, сколько надо.

      Мы познакомились лишь с некоторыми функциями для построения темы для WordPress - это функции вывода записей . Однако здесь важно понять принцип, а не пытаться запомнить или заучить.

      Практика

      Рассмотрим вывод записей на примере темы Twenty Seventeen . Записи выводятся через тег шаблона get_template_part в цикле шаблона index.php , который передаёт в параметрах содержимое шаблона content.php .

      if (have_posts()) :
      /* Start the Loop */
      while (have_posts()) :
      the_post();
      get_template_part("template-parts/post/content", get_post_format());
      endwhile;
      endif; ?>

      В шаблоне content.php выводится заголовок поста с ссылкой на сам пост и контент.