Класс «WP_Query» — это класс, который позволяет получить публикации из базы данных с самыми разными критериями. К примеру, можно получить публикации за определённое время, из определённых категории или с указанием значений произвольных полей. Рассмотрим запрос, сделанный с помощью этого класса:
С помощью такого кода в переменную «$query» будет записаны публикации из базы данных, которые находятся в рубрике «food» (еда). Далее по коду мы использовали функции цикла WordPress, с помощью которых выводим заголовок и содержание каждой полученной публикации.
Обратите внимание на функцию «wp_reset_postdata». Она приводит глобальную переменную $post в правильное состояние. Используйте эту функцию всегда, когда создаёте произвольный запрос через WP_Query
В WrodPress существует глобальная переменная $wp_query, в которой хранится информация о текущем запросе. Эта глобальная переменная всегда создаётся при вызове класса WP_Query и используется в функциях главного цикла WordPress. А ещё именно по содержанию этой переменной WordPress узнаёт, какой тип страницы сейчас отображается (публикация/ архив/ метка и т.п.).
Как можно заметить, первым аргументом в класс WP_Query передаётся массив. Этот массив содержит параметры фильтра. Давайте попробуем вынести его в отдельную переменную и добавить условий:
Перечислим возможные ключи фильтрации выборки и описания к ним:
English •
Loop 日本語
Русский •
(Add your language)
- Contents
- Стилизация Записей из различных Рубрик
- Исключение Записей из некоторых Рубрик
- Множественные Циклы в Действии
- Возвращает
- Параметры Категорий (рубрик)
- Параметры Таксономий
- #1 Вывод записей из одной таксономии
- #2 Выведем посты прикрепленные к термину bob из таксономии people
- #3 Вывод из нескольких таксономий
- #4 Использование аргумента relation=OR
- #5 Многоуровневый сложный запрос с использование оператора relation=OR
- Использование get_posts()
- Параметры Авторов
- #1 Выведем посты для одного автора
- #2 Выведем посты нескольких авторов сразу
- #3 Исключим посты автора
- #4 Еще пример
- Параметры Записей (постов, страниц)
- Посты/страницы по ID
- Посты/страницы по Слагу
- Дочерние посты/страницы
- Множественные выводы постов/страниц
- Параметры Типов записей
- Посты по типу
- Сортировка по произвольному полю
- Базовые примеры (без meta_query)
- #6 Посты со значением произвольного поля равным 0, не важно какой ключ.
- #2 Записи имеющие одновременно два произвольных поля
- #3 Записи имеющие хотя бы одно поле
- #4 Записи с двумя полями отсортированные по третьему полю
- #5 Получим записи у которые есть произвольное поле
- #6 Вложенные сложные запросы
- #7 Сортировка по произвольному полю
- Получим только картинки любого типа
- Параметры Отступов
- Параметры Сортировки и порядка
- #1 Сортировка по заголовку
- #2 Выведем один случайный пост
- #6 Множественная сортировка с использованием массива (с версии 4
- #7 Сортировка по ‘meta_value’ для нового типа поста (post_type)
- #1 Посты на странице
- #2 Отступы сверху
- #3 Записи со страницы пагинации 6
- #5 Прилепленные записи (посты)
- Параметры Поиска
- Параметры Доступа
- Параметры Кэширования
- #1 Выведем 50 постов, но не будет добавлять информацию о постах в кэш
- Параметры Возвращаемых данных
- Комбинирование параметров
- Комбинирование с переменными
- Комбинирование массивом
- Записи из категории и с меткой
- #2 Получим только первую часть контента $more = 0
- #4 Вставка переменных в параметры запроса
Contents
Циклом называют PHP код, который отображает записи на страницах WordPress. WordPress обрабатывает им каждую запись, которую следует показать на текущей странице, и форматирует её так, как задано в теле Цикла. Любой HTML или PHP код, расположенный внутри Цикла, будет повторен для каждой записи.
Когда документация WordPress говорит про конкретные Тэги Шаблона или плагины, что «этот тэг используется внутри Цикла», то тэг будет повторен для каждой записи. Например, по умолчанию Цикл выводит для каждой записи следующую информацию:
Другие сведения о каждой записи можно отобразить с помощью соответствующих Тэгов шаблона или (для продвинутых пользователей) посредством переменной $post, которая содержит информацию о текущей записи, пока Цикл выполняется.
Для первого знакомства с Циклом прочтите Цикл в Действии.
Цикл должен быть расположен в файле index.php и в любых других шаблонах, используемых для отображения записей.
Убедитесь, что включили вызов заголовка Шаблона (header.php) в верхней части Шаблонов вашей Темы. Если вы используете Цикл внутри собственного дизайна (и ваш дизайн не является шаблоном), установите WP_USE_THEMES в значение false:
Цикл начинают этой строкой кода:
и заканчивают так:
Стилизация Записей из различных Рубрик
Этот пример отображает для каждой записи её Заголовок, Рубрики и Содержимое. При этом Заголовок используется в качестве ссылки на Постоянный адрес записи.
Кроме того, записи из Рубрики с ID равным ‘3’ получают особый класс стилей, чтобы поменять их внешний вид с помощью CSS. Для этого задействован Тэг Шаблона in_category().
Исключение Записей из некоторых Рубрик
Этот пример может быть использован для исключения определенной Рубрики из обычного отображения. Он основан на предыдущем примере.
Запомните: Если вы используете этот пример для основной страницы, вы должны использовать другой Шаблон для архивов Рубрик. Иначе, WordPress будет исключать все записи в Рубрике 3, каждый раз, когда вы просматриваете Архив этой Рубрики!
Однако, если вы хотите использовать этот же файл шаблона, вы должны обойти это используя тэг is_home():
Благодаря этому записи из Рубрики 3 будут исключены только с главной страницы. Существуют другие Условные Тэги, которые можно использовать для управления выводом в зависимости от того выполняется ли определенное условие на запрашиваемой странице.
Этот раздел посвящен расширенному использованию Цикла. Здесь будет немного технической информации — но пусть это вас не пугает. Мы начнем с самого простого и приложив немного сообразительности, терпения и энтузиазма, вы тоже сможете строить множественные Циклы.
Во-первых, «зачем нужно использовать множественные Циклы?» Множественные циклы могут понадобиться в том случае, если вам необходимо произвести какие-то различные дейстия над несколькими группами записей, и при этом расположить их на одной странице. Различные действия — могут означать все что угодно, вы ограничены только PHP-мастерством и собственной фантазией.
Мы перейдем к примерам ниже, но сначала вы должны ознакомиться с основами. Взгляните на простой Цикл. Он состоит из:
Слова атрибуты записи: в этом примере простой заменитель части кода, который описывает как форматировать и отображать каждую запись на странице. Этот код может быть изменен в зависимости от того, каким вы хотите видеть свой WordPress. Если откроете файла index.php темы Кубрика, секция атрибуты записи будет выглядеть вот так:
Множественные Циклы. Пример 1
Если вам нужно сохранить оригинальный запрос, вы можете создать новый объект запроса.
Множественные Циклы Пример 2
Важно:В PHP5, оператор «=» создает ссылку на объект, вместо того что копировать его, как это было в php4. Чтобы Пример 2 заработал в PHP 5, вам нужно использовать следующий код:
Однако, этот второй пример не работает в WordPress 2.1.
Множественные Циклы Пример 3 — Плагины
Просто замените следующие строки:
Множественные Циклы в Действии
Самый лучший способ понять как использовать множественные циклы — рассмотреть пример их использования. Чаще всего, множественные циклы используются для отображения двух (и более) списков записей на странице. Этот метод используется веб-мастером в том случае, когда он хочет отобразить не только последние записи, а еще и записи из некоторой рубрики.
Оставим в стороне все вопросы форматирования и CSS, представим что нам нужно отобразить два списка записей. Один из которых будет списком последних записей (стандартное количество записей равное 10,недавно добавили), и другой, который будет содержать только записи из рубрики «featured». Записи в рубрике «featured» должны быть отображены первыми, следущими за вторым списком записей (стандарт). Хитрость в том, что не одна запись не должна присутствовать в обоих рубриках.
Шаг 1. Получить записи только из рубрики «featured».
Говоря обычным языком, вышеуказанный код можно прочтитать так:
Установить $my_query равным результату запроса всех записей, где название рубрики featured, и кроме того, вернуть мне только одну запись. Также, установить значение переменной $do_not_duplicate равной ID-значению одиночной, возвращаемой записи. Выбрать то что описано в строке Получить записи вместе с параметрами форматирования, связанные с возвращаемой записью.
Обратите внимение, что нам понадобится использовать значение переменной $do_not_duplicate в следующем шаге, чтобы убедиться,что та же самая запись не попадет в оба списка.
Шаг 2. Второй цикл, получение Х последних записей (исключая первую).
Представленный код получает X последних записей (как описано в настройках WordPress), сохраняет одну, уже отображенную в первом цикле, и отображает остальные записи, в соответствии с секцией Получить записи.
Получить все записи; где запись равна $do_not_duplicate, то ничего не делать (continue), в другом случае отобразить все другие записи в соответствии с секцией Do stuff. Также, обновить кэш, чтобы плагины связанные с тэгированием и ключевыми словами работали нормально. Вернуть переменную $do_not_duplicate, содержащую ID записи, ранее выведенной.
Here is what the final piece of code looks like without any formatting:
This article on multiple loops is a combination of Ryan Boren and Alex King’s discussion about the Loop on the Hackers Mailing List as well as the tutorial written at MaxPower.
Используется самим WordPress при получении записей для текущей страницы (архив авторов, отдельная запись, рубрика, метка). Определяет какие посты будут показаны в базовом Цикле WordPress. Создает базовый Цикл WordPress. Возвращает список записей (постов).
Благодаря этой функции можно изменить стандартный вывод постов в WordPress. Вывод формируется на основе того, какая страница показывается (главная, архив по дате, категория, архив автора и т.п.). Например, можно изменить цикл так:
Для внедрения непосредственно в SQL запрос, можно использовать эти фильтры.
Возвращает
Например, давайте изменим порядок сортировки постов, при этом не затрагивая остальные параметры запроса, для этого нужно написать такой код перед Циклом WordPress:
В этом примере «порция» добавочных аргументов должна претворятся знаком амперсанд (&)
Так же параметры можно передать в виде массива:
Параметры Категорий (рубрик)
Получает посты относящиеся к определенным категориям.
ID категории. Можно указать несколько ID в строке через запятую или в массиве. Чтобы исключить рубрики укажите минус (-) перед ID категории — это исключит и все вложенные рубрики. Чтобы не исключить вложенные, используйте параметр category__not_in.
Имя категории. Используйте слаг (альтернативное имя), а не само название категории.
Получить посты, которые входят одновременно в несколько категорий.
Получить посты, которые входят в одну из указанных категорий.
Получить посты, которые не входят в указанную категорию.
Этот параметр не учитывает вложенные рубрики. Чтобы исключить рубрику и вложенные рубрики, укажите ID рубрик через запятую со знаком минус в параметре cat: cat=-25,-32.
Параметры Таксономий
Выводит посты связанные с определенной таксономией.
С WP 3.1. Нужно указать параметры запроса по таксономии. Может принимать ряд вложенных аргументов, это: tax_query это массив, элементами которого являются другие массивы, в каждом из которых указывается таксономия, её термины и то как использовать эти термины. Оператор relation указывается в первом массиве tax_query и определяет как сравнивать вложенные массивы между собой. Такая конструкция позволяет создавать запрос одновременно к нескольким таксономиям.
#1 Вывод записей из одной таксономии
Выведем записи из раздела (термина) bob, который является элементом таксономии people:
#2 Выведем посты прикрепленные к термину bob из таксономии people
Сделаем тоже самое что и в примере выше, только с использованием аргумента tax_query:
#3 Вывод из нескольких таксономий
Выведем посты из нескольких произвольных таксономий:
Аналог примера выше. Выведем записи, который одновременно относятся к нескольким произвольным таксономиям через tax_query:
#4 Использование аргумента relation=OR
Выведем посты, которые находятся в рубрике quotes или которые имеют формат quote (форматы введены в версии 3.1). Для этого используем аргумент relation:
#5 Многоуровневый сложный запрос с использование оператора relation=OR
Допустим, нам нужно получить записи одной из групп элементов таксономии.
Например, надо получить автомобили марки ford черного цвета или автомобили марки bmw белого цвета:
В этом примере первый оператор relation=OR влияет на первые дочерние вложенные массивы. А оператор relation=AND во вложенных массивах влияет на массивы вложенных массивов.
Использование get_posts()
Т.е. получим записи типа func, у которых нет ни одного термина из таксономии func_cat. Для этого используем параметр ‘operator=NOT EXISTS’.
Параметры Авторов
Получает посты принадлежащие определенным авторам.
Массив ID авторов, записи которых нужно получить.
Массив ID авторов, записи которых нужно исключить.
#1 Выведем посты для одного автора
Посты по ID автора:
Посты по нику автора:
#2 Выведем посты нескольких авторов сразу
Посты четырех авторов по ID:
#3 Исключим посты автора
Исключим посты автора 12 и покажем все посты, кроме его:
#4 Еще пример
Получим все записи авторов с ID 2 и 6:
Получим записи всех авторов, кроме авторов с ID 2 и 6:
Параметры Записей (постов, страниц)
Получает отдельные страницы или посты.
ID поста который нужно получить (p=27).
post_name (слаг) записи (поста). Пример: name=o-saite.
Заголовок записи (поста). Пример: name=О сайте. С версии 4.4.
ID постоянной страницы, которую нужно получить (page_id=27)
Альт. название постоянной страницы (pagename=o-saite)
Вернет только дочерние страницы.
Выберет посты родители которых указанны в массиве.
Выберет посты родители которых не указанны в массиве.
Укажите через запятую ID постов, которые нужно получить (post__in=5,12,2,14,7).
Выберет все посты кроме указанных.
Выберет указанные посты. Указывать нужно post_name (slug) через запятую или в массиве. С версии 4.4.
Посты/страницы по ID
Выведем пост по ID:
Выведем страницу по ID:
Посты/страницы по Слагу
Выведем пост по Слагу:
Выведем страницу по Слагу:
Дочерние посты/страницы
Выведем дочернюю страницу, используя слаг родительской и дочерней страницы разделенные слэшом: parent_slug/child_slug
Выведем дочерние страницы, используя ID родительской:
Выведем страницы верхнего уровня, исключим все дочерние:
Выведем посты родители которых указаны в массиве:
Множественные выводы постов/страниц
Выведем только указанные посты:
Выведем все посты, кроме указанных:
Заметка: нельзя объединять post__in и post__not_in в одном запросе.
Не используете строку с ID разделенными запятыми, так работать не будет. Нужно передавать готовый массив:
Параметры Типов записей
Показывает посты указанного типа.
Записи какого типа нужно показывать. По умолчанию: post. Но если указан параметр tax_query, то по умолчанию ставиться any.
Посты по типу
Выведем только страницы:
Выведем все посты, кроме ревизий и типов постов у которых при регистрации параметр exclude_from_search выставлен в true:
Выведем 4 типа постов одновременно:
Основным параметром для работы с мета-данными в WP_Query является meta_query, который получает записи (посты) по существующим у них произвольным полям и их значениям. По принципу использования, meta_query похож на tax_query — массив, где каждый элемент в свою очередь является массивом с параметрами запроса, т.е. meta_query — это массив массивов:
Такая конструкция позволяет использовать множественные запросы. Первый параметр relation во «внешнем» массиве описывает логическую связь между запросами. Он может принимать значения AND (используется по умолчанию. Совпадение со всеми запросами) или OR (совпадение с любым из запросов).
Старые переменные запроса мета-данных: meta_key, meta_value, meta_value_num, meta_compare по прежнему поддерживаются и могут быть использованы для простых запросов связанных с произвольными полями.
Сортировка по произвольному полю
Для сортировки по полю, нужно указать ключ данных поля, и затем в параметре ‘orderby’ указать название этого ключа, например:
Если произвольное поле указывается через параметр meta_key и meta_value, то для сортировки по этому полю в параметре orderby укажите значения: meta_value или meta_value_num (для чисел). См. ниже описание параметра orderby.
Базовые примеры (без meta_query)
При использовании параметра «meta_value» значение 99 будет больше 100, так как эти значения распознаются как строки, а не числа. Для того чтобы числа понимались как числа нужно использовать параметр «meta_value_num»:
#6 Посты со значением произвольного поля равным 0, не важно какой ключ.
Выведем продукты (product) у которых ключ равен color и значение поля не равно blue:
Заметка: для meta_query нужно указывать массив в массиве, даже если вы задаете один запрос.
#2 Записи имеющие одновременно два произвольных поля
Пример вывода постов с несколькими произвольными полями и указанием различных условий для значений этих произвольных полей:
#3 Записи имеющие хотя бы одно поле
Выведем посты с ключом color и значением не (NOT LIKE) blue или (OR) посты с ключом price со значениями поля от 20 до 100:
#4 Записи с двумя полями отсортированные по третьему полю
Предположим у нас есть тип записей toys — игрушки, а в произвольных полях мы указываем материал: твердая мягкая и вес игрушки в граммах: 100 300 500.
Получим мягкие игрушки вес которых от 200 до 500 грамм и отсортируем их по цене по убыванию:
#5 Получим записи у которые есть произвольное поле
Этот пример показывает, как получить записи для которых установлены миниатюры (у которых есть произвольное поле _thumbnail_id):
#6 Вложенные сложные запросы
С версии 4.1 можно создавать вложенные запросы. Например, выполним такое условие: нужно показать продукты оранжевого цвета (color=orange) ИЛИ маленькие (size=small) продукты красного цвета (color=red):
#7 Сортировка по произвольному полю
Выбирает вложения с указанным миме типом. Список миме типов смотрите в описании wp_get_mime_types().
Миме тип записи. Используется только для вложений — записей с типом ‘attachment’.
Этот параметр будет работать только когда параметр post_type = attachment и post_status = inherit. Т.е. миме-тип может быть только у вложений.
Получим только картинки любого типа
Получает посты с указанным статусом.
По умолчанию publish, а если пользователь авторизован добавляется еще и private. Если запрос запущен из админ части, добавляются еще и защищенные типы статусов: future, draft и pending.
Параметры Отступов
Можно установить отступ от первого поста в результатах запроса. Например, стандартно запрос возвращает 6 постов, а если в тот же запрос добавить параметр offset=1, то будут возвращены 5 постов (первый пост из запроса будет пропущен).
Сколько постов из результатов запроса пропустить.
Параметры Сортировки и порядка
Сортирует и устанавливает направление сортировки.
Направление сортировки по параметру orderby, может быть:
orderby = array()
С версии WordPress 4.0 в orderby можно указывать массив сочетающий в себе оба параметра: orderby и order. Сделано это для сортировки по нескольким колонкам одновременною Синтаксис такой:
#1 Сортировка по заголовку
Отсортируем по порядку в меню, а затем по заголовку
#2 Выведем один случайный пост
Выведем посты отсортированные по двум полям: ‘title’ и ‘menu_order’ (title первостепенен):
#6 Множественная сортировка с использованием массива (с версии 4
Получим страницы отсортированные по заголовку (title) и номеру меню (menu_order) в разном порядке (ASC/DESC):
#7 Сортировка по ‘meta_value’ для нового типа поста (post_type)
Выведем посты типа ‘my_custom_post_type’ отсортированные по ключу произвольного поля «age» и отфильтрованные, чтобы показывались только посты со значением поля 3 и 4:
Выключит пагинацию, выведет все посты на одной странице.
Количество постов на одной странице. Если выставить -1, то будут выведены все посты (без пагинации).
Сколько постов пропустить сверху выборки (верхний отступ).
Внимание: Установка этого параметра переписывает/игнорирует параметр «paged» и ломает пагинацию (решение проблемы).
Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице (front page).
Прилепленные посты не будут показываться в начале списка, но они не исключаются и будут выводиться в обычном порядке.
#1 Посты на странице
Выведем 3 поста на странице:
Выведем все посты на странице:
Выведем все посты и отключим пагинацию:
#2 Отступы сверху
Выведем посты начиная с четвертого (пропустим первые 3):
Выведем 5 постов которые идет за тремя последними:
#3 Записи со страницы пагинации 6
Покажем посты с текущей страницы пагинации. Полезно при построении произвольной пагинации:
Выведем посты с текущей страницы и установим параметр paged в 1, когда переменная не определена на первой странице пагинации:
Вывод текущей страницы пагинации на статической главной странице:
#5 Прилепленные записи (посты)
Исключим все прилепленные посты из запроса:
Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты не будут сверху, они будут выводится как обычные посты (по дате):
Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты будут полностью исключены. Также добавим сюда правило для правильной пагинации:
Число комментариев для получения на отдельной странице комментариев. По умолчанию опция: comments_per_page.
Количество комментариев, которое должен иметь пост. С версии 4.9.
Параметры Поиска
true — искать по точной фразе указанной в параметре s.
По умолчанию: false
Посты найденные по поисковой фразе.
Параметры Доступа
Показывает посты если пользователь имеет достаточные права.
Выведем опубликованные приватные посты, если у пользователя есть достаточные для просмотра права:
Параметры Кэширования
Не добавляет данные в кэш при выполнении запросов.
Кэшировать ли информацию о посте.
Кэшировать ли информацию о мета данных поста.
Кэшировать ли информацию о привязке поста к терминам и таксономиям.
#1 Выведем 50 постов, но не будет добавлять информацию о постах в кэш
Обычно эти функции использовать не нужно — кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.
Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в false по умолчанию, так как нет необходимости обновлять кэш при каждой загрузке страницы.
Параметры Возвращаемых данных
Устанавливает какие данные должен возвращать запрос.
Какие данные возвращать. По умолчанию возвращаются все.
true — не подсчитывать количество найденных строк. В некоторых случаях может ускорить запрос.
По умолчанию: false
Комбинирование параметров
Вы наверняка заметили, что параметры соединяются между собой символом амперсанд — &, именно этим символом параметры комбинируются (объединяются).
Комбинирование с переменными
Посты из категории 13 за текущий месяц на главной странице блога:
Комбинирование массивом
Вернет только 2 поста, из категории 1 и 3, отсортированные в обратном порядке по заголовку:
Записи из категории и с меткой
Вывести все посты из категории 1, имеющие метку apples:
Чтобы на главной странице блога исключить посты, которые находятся в категории 3, нужно вставить следующий код в файл front-page.php или home.php перед началом Цикла WordPress:
Можно добавить еще несколько категорий к исключению:
#2 Получим только первую часть контента $more = 0
Параметры также можно передать в виде массива. Так они будут более наглядны и читаемы. Например, пример 2 можно записать так:
Как видите тут можно поставить каждую переменную на отдельную строку, а это более понятно и читаемо.
#4 Вставка переменных в параметры запроса
Можно создавать динамические параметры запроса, если нужно, чтобы запрос менялся в зависимости он каких либо обстоятельств, для этого значение параметра нужно записать в переменную, а затем переменную передать в параметры запроса, сделать это можно несколькими способами:
1) Сборка запроса с использованием одинарных кавычек ‘ ‘
Переменные внутри двойных кавычек интерпретируются PHP как переменные, а не как простой текст:
3) Использование глобальной переменной $query_string
Сохранение базового запроса текущей страницы и добавление в него своих параметров
Этот пример по сути тоже самое что и пример с использованием глобальной переменной $query_string, только в виде массива.