Если вы были вокруг WordPress на некоторое время, вы будете знать, как трудно было создать списки сообщений, основанных на сложных критериев, а также в соответствии со стандартами WordPress. За несколько лет платформа прошла долгий путь. Используя силу WP_Query
класса, мы можем перечислять сообщения в любом случае мы хотим.
Что такое WP-Кипри?
WP_Query
Класс является одним из наиболее важных частей codebase WordPress. Среди прочего, он определяет запрос, необходимый на любой странице, и соответственно вытягивает сообщения. Он также сохраняет много информации о запросах он делает, что очень помогает при оптимизации страниц (и устранение их).
Другая роль WP_Query
заключается в том, чтобы позволить нам выполнять сложные запросы базы данных безопасным, простым и модульным способом.
Дальнейшее чтение на SmashingMag:
- Мощный WordPress Советы и хитрости
- Строительство Расширенный WordPress Поиск с WP-запрос
- 10 Полезные WordPress Loop хаки
- Do-It-Yourself Кэширование Методы с WordPress
Безопасности
На протяжении всего нашего взаимодействия с этим объектом, мы поставляем параметры и используя функции для достижения нашей цели. Внутренние данные объекта заботятся о многих раздражающих аспектах, таких как защита от атак на впрыски с помощью S’L и обеспечение использования надлежащих типов данных.
Простота
Объект абстрагирует большую часть сложности запроса, так что нам не придется возиться со спецификой нашей базы данных. Потому что мы используем массив для предоставления наших критериев, все более понятным. Нет ручной базы данных присоединяется или вложенных запросов не требуется — просто создать массив аргументов и мгновенно класс!
Модульность
Мой любимый из всех является модульность. При составлении необработанных запросов трудно управлять часто используемыми битами, поскольку они являются лишь фрагментами кода S’L. WP_Query
делает покончить с этим, используя ассоциативный массив в качестве аргумента. Множество добра вытекает: вы можете объединить аргументы из разных мест, запустить массив функций содержание вашего сердца и манипулировать им в гениальных способов.
Начало работы
«Обычный» WordPress loop
Давайте сначала рассмотрим обычный цикл, а затем создадим тот же цикл с WP_Query
помощью. Допустим, мы кодифицировали category.php
файл.
<?php
if(have_posts()) :
while(have_posts()) :
the_post();
?>
<h1><?php the_title() ?></h1>
<div class='post-content'><?php the_content() ?></div>
<?php
endwhile;
else :
?>
Oops, there are no posts.
<?php
endif;
?>
Та же петля с использованием WP-кипри
<?php
$args = array('cat' => 4);
$category_posts = new WP_Query($args);
if($category_posts->have_posts()) :
while($category_posts->have_posts()) :
$category_posts->the_post();
?>
<h1><?php the_title() ?></h1>
<div class='post-content'><?php the_content() ?></div>
<?php
endwhile;
else:
?>
Oops, there are no posts.
<?php
endif;
?>
Как вы можете видеть, нет большой разницы на всех! Давайте разобьем его:
-
Построение запроса На странице категории, WordPress уже знает, что вы хотите перечислить сообщения из этой категории. Поскольку мы строим запрос с
WP_Query
нуля, используя, мы должны указать это сами. Мы углубимся немного глубже в это немного. -
Мгновенное воспроизведение класса и запрос для публикаций Путем мгновенности класса с построенной массив аргумент,
WP_Query
будет пытаться вытащить должности указаны и нагрузки других деталей. -
Создание цикла Вы можете использовать все обычные функции; просто не забудьте использовать их в качестве методов вашего объекта:
- Вместо
have_posts()
, использовать$category_posts->have_posts()
. - Вместо
the_post()
, использовать$category_posts->the_post()
.
- Вместо
- Возобновить работу в обычном режиме После того как вы сделали выше, вы можете использовать все теги шаблонов вы узнали и любите.
Если вы посмотрите на это подробно, вы обнаружите, что глобальный $post
объект также доступен. Это означает, что если вы используете пользовательский цикл, как это в другом цикле, все может пойти не так. Обязательно храните исходное значение $post
объекта и восстанавливай его после цикла.
<?php
$temp_post = $post; // Storing the object temporarily
$my_query = new WP_Query();
while($my_query->have_posts()) {
// Loop in here
}
$post = $temp_post; // Restore the value of $post to the original
?>
Копать глубже
Сила хорошего аргумента
Легкость, с которой мы можем создавать циклы очевидна, но как насчет на самом деле запрос для сообщений? Позвольте мне показать вам общую технику я использую при создании ползунки для коммерческих тем.
Во многих случаях пользователи вашей темы захотят получить отличный ползунок, но они могут быть немного ленивыми в создании контента. Многие пользователи также хотят показывать будущий контент. Давайте запросим на предстоящие (т.е. неопубликованные) публикации, которые имеют прикрепленное изображение.
<?php
$args = array(
'post_status' => 'future',
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'value' => ’,
'compare' => '!='
)
)
);
$slider_posts = new WP_Query($args);
?>
<?php if($slider_posts->have_posts()) : ?>
<div class='slider'>
<?php while($slider_posts->have_posts()) : $slider_posts->the_post() ?>
<div class='slide'>
<?php the_post_thumbnail() ?>
</div>
<?php endwhile ?>
</div>
<?php endif ?>
Короткий, сладкий и совершенно понятно — просто красиво. И мы только что выцарапали поверхность.
Знайте свои по умолчанию
Возможно, вы заметили, что я не указал ряд вещей в моих запросах. Как насчет того, сколько сообщений в список? Как насчет статуса поста в первом запросе, который мы сделали?
Значения по умолчанию предоставляются для многих наиболее распространенных аргументов. Вот некоторые из них, которые не нужно указывать, если вы не хотите изменить их:
-
posts_per_page
По умолчанию к значению, указанному в настройках чтения для количества сообщений для списка. -
post_type
По умолчаниюpost
. -
post_status
По умолчаниюpublish
.
Вы можете найти полный список параметров в Кодексе, конечно!
Массивы Awesome
Во многих случаях необходимо указать ряд значений, которые может принять аргумент. Там, где это кажется логичным, WP_Query
как правило, позволяет использовать массивы, чтобы сделать вашу жизнь проще. Вот несколько примеров:
- Вы можете использовать массив для
post_status
вытягивания сообщений из нескольких различных состояний. Обратите внимание, что вы можете использовать строкуany
для получения сообщений из всех статусов. - Если вы используете пользовательские типы постов, вы будете рады услышать, что вы можете использовать массив для значения
post_type
параметра, а также. - Для параметров типа таксономии и так далее можно использовать массив для
category__in
tag__in
обозначения множества значений.
Обработка таксономий
WP_Query
достаточно хорошо, чтобы предложить простой способ сделать расширенные запросы таксономии, а также. Это особенно полезно для веб-сайтов со сложными настройками и для коммерческих тем с большими наборами функций. Используемый механизм называется tax_query
. Давайте посмотрим на пример.
Скажем, у вас есть сайт все о фильмах. Вы храните фильмы в пользовательском типе поста «фильм»; у вас есть пользовательские таксономии для жанра, пользовательские таксономии для актеров, и вы используете регулярные ПР ‘категории, чтобы указать, насколько хорошо фильм. Давайте найдем все «Действие» фильмы в главной роли «Брюс Уиллис», которые не являются «Плохой»:
<?php
$args = array(
'post_type' => 'movie',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array('bad')
'operator' => 'NOT IN'
),
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => array('action')
),
array(
'taxonomy' => 'actor',
'field' => 'slug',
'terms' => array('Bruce Willis'),
)
)
);
?>
Хотя этот пример с жестким кодом будет полезен только для людей, которые любят Die Hard, это не трудно понять, как расширенный фильтр может быть построен, что позволяет пользователям фильтровать через ваш контент в любом случае, каким образом они хотят.
Узнайте больше обо всех удивительных вещах, которые вы можете сделать с параметрами таксономии в Кодексе.
Развлечения с мета-данными
Вы уже видели, что WP_Query
отлично подходит для обработки мета-данных — мы использовали meta_query
во втором примере, чтобы построить слайдер из сообщений, которые признакам изображений. Так же, как с таксономии запросов, большая гибкость построена здесь.
В настоящее время мы строим тему WordPress, которая будет использоваться для создания веб-страницы для квартиры (ы) в аренду. Мы храним квартиры в качестве пользовательского типа поста и используем метаданные для хранения деталей. С мета-запросом, мы можем легко тянуть во всех квартирах, которые могут вместить четыре или более человек, которые имеют балкон и которые не курят.
<?php
$args = array(
'post_type' => 'apartment',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'persons',
'value' => '4',
'compare' => '>=',
'type' => 'NUMERIC'
),
array(
'key' => 'balcony',
'value' => '1',
'type' => 'BINARY',
'compare' => '='
),
array(
'key' => 'smoking',
'value' => '0',
'type' => 'BINARY',
'compare' => '='
)
)
);
?>
Опять же, это очень модульный, очень понятно. Чтобы узнать больше о параметрах, которые вы можете использовать, достаточно ознакомиться с разделом«Параметры пользовательских полей»в WP_Query
документации.
Методы и свойства
После того как вы сделали запрос, вы можете уговорить много информации из вашего объекта. Вы можете найти полный список «Методы и свойства» в Кодексе. Вот те, которые я, как правило, используют большинство:
-
$query
Отображает строку запроса, передаваемую$wp_query
объекту. Это очень полезно для устранения неполадок в некоторых продвинутых случаях. -
$query_vars
Отображает ассоциативный массив аргументов, которые вы прошли. Если вы делаете много смешивания и сопоставления перед прохождением аргументов, этот инструмент может быть полезным действительно, чтобы проверить, что все хорошо. -
$posts
Сохраняет запрашиваемые сообщения из базы данных. Я редко использую это свойство, но это хорошо знать, что это, где ваши предметы приходят. -
$found_posts
Удобная мелочь, которая показывает общее количество найденных элементов (без ограничения, налагаемогоposts_per_page
аргументом).
С великой державой приходит большая ответственность
Хотя WP_Query
дает вам много, чтобы играть вокруг с, он имеет свои недостатки. Многие люди (мое прошлое самоуправления включены) сходят с ума, когда они понимают, как легко стучать из запросов повсюду.
Имейте в виду, что больше запросов означает большую загрузку сервера. Я обнаружил, что на размещенных систем, сложные запросы могут быть особенно озорной, потому что они едят на оперативной памяти, которая, вероятно, ваш скудный ресурс.
Убедитесь в том, чтобы проверить, что запрос по умолчанию держит на каждой странице. Какой смысл в создании нового запроса для последних сообщений на первой странице, если он там по умолчанию? Используйте то, что вы можете более одного раза, результаты кэша, и так далее.
Источник: smashingmagazine.com