Вывод постов на странице, постраничная навигация
Прежде чем я покажу готовый код, давайте подробнее рассмотрим, что имеется ввиду в заголовке и когда это лучше применять.
Вывести посты на странице в WordPress — это значит создать шаблон страницы (page template) и забацать туда цикл, query_posts.
Для чего нужно такое вытворять? Рассмотрим несколько вариантов:
- представьте, что вам нужно вывести на одной странице записи сразу из нескольких категорий
query_posts('post_type=artwork');
Вообще можно скомбинировать любые условия, используя эту статью. Параметры, которые описаны для WP_Query также подойдут и для query_posts.
Теперь я думаю порядок действий вам понятен? Создаете шаблон страницы, пихаете наверх query_posts, потом цикл, потом постраничную навигацию…
Кстати о ней. Просто так она не будет работать. Как это исправить?
Пожалуй стоит описать порядок действий более подробно.
- Создать шаблон страницы.
- Определить номер текущей страницы.
- Использовать query_posts с необходимым набором аргументов, при этом не забыв включить в него номер текущей страницы.
- Добавить цикл.
- Добавить функцию постраничной навигации, например wp_pagenavi().
А теперь полностью готовый код:
/* * Template name: Моя галерея */ $current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; $params = array( 'posts_per_page' => 7, // количество постов на странице 'post_type' => 'artwork', // тип постов 'paged' => $current_page // текущая страница ); query_posts($params); $wp_query->is_archive = true; $wp_query->is_home = false; while(have_posts()): the_post(); /* в тело цикла вставьте HTML одного анонса записи, например: */
endwhile; wp_pagenavi(); // функция постраничной навигации
Это конечно же обобщенный пример, поэтому не забудьте про get_header() и get_footer(), если они у вас используются.
Плагин постраничной навигации WP-PageNavi
В предыдущем примере я использовал функцию wp_pagenavi() . Она отвечает за постраничную навигацию и является составляющей частью плагина WP-PageNavi (русское название: Список страниц).
Если вы используете данный код как есть и при этом у вас не установлен WP-PageNavi, то вероятнее всего вы получите ошибку.
Плагин очень легко устанавливается через админку сайта и так же легко настраивается — так что для этих целей рекомендую использовать именно его.
Миша
Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.
Пишите, если нужна помощь с сайтом или разработка с нуля.
get_posts() │ WP 1.2.0
Эта функция — аналог query_posts(). Отличается тем, что она не вмешивается в глобальный запрос WP, а создает отдельный экземпляр класса WP_Query. Подробнее читайте здесь.
Возвращает
- Пустой массив, если не удалось получить записи.
- Массив WP_Post объектов (записей). Каждый объект в массиве выглядит так:
array( [0]=> 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" > [1] => object(WP_Post) < . >[2] => object(WP_Post) < . >)
Шаблон использования
// параметры по умолчанию $my_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 запроса ) ); global $post; foreach( $my_posts as $post ) < setup_postdata( $post ); // формат вывода the_title() . >wp_reset_postdata(); // сброс
Использование
$args(строка/массив) Список аргументов, в соответствии с которыми будет получен результат.
По умолчанию: предустановленные
Аргументы параметра $args
Ниже приведен не полный список параметров. Весь список возможных параметров смотрите в WP_Query. Эта функция является оберткой для WP_Query, поэтому может принимать все теже параметры.
- numberposts (число)
- posts_per_page (число)
- offset (число)
- category (число/строка/массив)
- category_name (строка)
- tag (строка)
- include (строка/число/массив)
- exclude (строка/число)
- meta_key и meta_value (строка)
- meta_query (массив)
- date_query (массив)
- post_type (строка/массив)
- post_mime_type (строка/массив)
- post_status (строка)
- post_parent (число)
- nopaging (логический)
- orderby (строка)
- order (строка)
- suppress_filters (true/false)
Количество выводимых постов. Установить на 0 , чтобы ограничить вывод максимальным числом постов на страницу (устанавливается в настройках ВП) или поставить -1 чтобы убрать ограничения вывода (LIMIT).
posts_per_page имеет больший приоритет чем numberposts .
offset(число) Отступ от первого поста (записи). category(число/строка/массив)
Укажите ID категории из которой нужно получить посты. Можно указать ID со знаком минус -3 , тогда эта категория будет исключена (будут получены все записи, кроме записей из категории 3). Можно указать несколько ID через запятую в виде строки 3,5,12 или -3,-5,12 ).
В значении нужно передавать ID, а не название категории.
Смотрите также описание параметра cat у WP_Query .
category_name(строка) Показывать посты только из этой категории (указывается название или альтернативное имя(slug) категории).
По умолчанию: » tag(строка) Получить записи имеющие указанные в этом параметре метки. Нужно указывать альтернативное имя (slug) метки. Если указать несколько имен (меток) через запятую, то будут получены записи соответствующие любой метке, а если разделить пробелами, то будут получены записи имеющие все указанные метки.
По умолчанию: » include(строка/число/массив)
ID постов, которые нужно получить. Если указывается строка, то ID нужно разделять запятыми или пробелами. Пример, получит 6 постов: ‘45,63,78,94,128,140’.
Важно: Указав этот параметр, бессмысленно указывать параметры posts_per_page , offset , category , exclude , meta_key , meta_value и post_parent .
По умолчанию: »
exclude(строка/число) ID постов которые нужно исключить из выборки, указывать через запятую или пробел.
По умолчанию: » meta_key и meta_value(строка)
Получить посты имеющие указанное произвольное поле (meta_key) со значением (meta_value).
Можно указать meta_key и meta_value , тогда будут получены посты, у которых есть указанное метаполе и значение которого равно указанному значение.
Или можно указать только meta_key , тогда будут получены все записи у которых это метаполе есть и не важно какое там значение.
meta_query(массив) Выборка записей по произвольным полям. Подробнее см. в описании WP_Query (meta_query).
По умолчанию: [] date_query(массив) Выборка записей по датам. Подробнее см. в описании WP_Query (date_query).
По умолчанию: [] post_type(строка/массив)
Какого типа посты нужно получать, может быть:
- any — все типы, кроме revision и типов у которых указан параметр exclude_from_search=true .
- attachment — прикрепленные записи.
по умолчанию WP_Query ставит статус ‘post_status’=>’publish’ , а вложения имеют статус ‘post_status’=>’inherit’ , поэтому чтобы вывести вложения нужно еще изменить параметр post_status на ‘inherit’ или ‘any’.
Какого типа вложения нужно получить. Можно использовать, когда параметр post_type = attachment .
- image/jpeg
- image/png
- image/gif
- image — для любых картинок
- audio/mpeg
- application/pdf
- application/zip
Вместо одно миме типа можно указать несколько в массиве. Полный список миме типов смотрите здесь.
Статус записи. Можно передать несколько статусов через запятую. Может принимать:
- publish — опубликовано
- private — личная запись
- draft — черновик
- future — запланировано
- pending — на модерации
- inherit — вложение, любое вложение получает этот статус. Ставиться автоматически, при $post_type=’attachment’
- any — все статусы
post_parent(число) Показать только дочерние записи к указанному ID.
По умолчанию: » — необрабатывается nopaging(логический) Включить или отключить пагинацию, если стоит true параметр $numberposts игнорируется.
По умолчанию: false orderby(строка)
Сортировать результат по указанным полям. Можно указывать несколько полей сортировки, через пробел. Допустимые поля:
- author — сортировать по ID авторов.
- content — сортировать по контенту.
- date — сортировать по дате создания записи.
- ID — сортировать по ID записи. Указываются ID в массиве или через запятую.
- menu_order — сортировать по полю menu_order . Используется для постоянных страниц и вложений (картинки, файлы и т.п.).
- mime_type — сортировать по MIME типу. Используется для вложений.
- modified — сортировать по дате изменения.
- name — сортировать по альтернативному имени (slug).
- rand — случайная сортировка. Создает повышенную нагрузку на БД.
- status — сортировать по статусу (черновик, опубликовано и т.п.)
- title — сортировать по названию.
- parent — сортировать по ID родителя (parent ID).
- password — сортировать по паролю.
- type — сортировать по типу (пост, страница и т.д. ).
- comment_count — по количеству комментариев.
- meta_value — по значению указанного произвольного поля.
- post__in — учитывает порядок указанных ID в параметре include.
Префикс post_ у полей таблицы опускается для удобства. Например вместо date можно написать post_date , вместо content post_content и т.д.
order(строка) В каком направлении упорядочить, указанное в параметре $orderby , поле:
ASC — по порядку (от меньшего к большему: а,б,в).
DESC — в обратном порядке (от большего к меньшему: в,б,а).
По умолчанию: ‘DESC’ suppress_filters(true/false)
При true (по умолчанию) пропускает все хуки изменения SQL запроса, такого типа posts_* или comment_feed_* .
Какие именно фильтры отключаются смотрите здесь.
В функциях WP_Query и query_posts() этот параметр отключен по умолчанию (равен false).
suppress_filters = true не виляет на работу фильтра pre_get_posts.
Такое отключение фильтров по умолчанию, может ввести в замешательство, если есть плагины влияющие на вывод записей, через фильтры SQL запроса, например WPML. В таких случаях suppress_filters нужно отключить.