Ниже я приведу рекомендации по запросу (Query) по кастомным (произвольным) полям от создателей плагина ACF (Advanced Custom Fields) и расскажу, как получить массив объектов записей из базы данных с помощью собственных функций WordPress.
В WP существует множество способов запросить записи, однако в этой статье будут использованы общие функции get_posts
, объект WP_Query
и фильтр pre_get_posts
.
Содержание
Общие правила
Если вы уже знакомы с приведенными выше функциями, объектами и фильтрами, то можете пропустить этот блок.
Объект WP_Query
используется для запроса записей и возвращает объект, содержащий массив объектов $post
и множество полезных методов.
Функция get_posts
использует вышеупомянутый объект WP_Query
, однако возвращает только массив объектов $post
, что делает ее более простым способом поиска и перебора постов.
Фильтр pre_get_post
вызывается после создания объекта запроса, но перед выполнением самого запроса.
Пример
Этот пример демонстрирует, как запросить все посты и отобразить их в списке. Обратите внимание, что функции setup_postdata()
и wp_reset_postdata()
используются для того, чтобы такие функции, как the_permalink()
и the_title()
, работали как положено.
<?php
$posts = get_posts(array(
'posts_per_page' => -1,
'post_type' => 'post'
));
if( $posts ): ?>
<ul>
<?php foreach( $posts as $post ):
setup_postdata( $post );
?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
Параметры произвольного поля
И функция get_posts
, и объект WP_Query
принимают аргументы для запроса значений пользовательских полей. Существует как базовый, так и расширенный способ запроса, которые описаны ниже. Вы можете прочитать больше о параметрах в руководстве WP codex.
Основной пример
В этом примере показаны аргументы для поиска всех постов, в которых пользовательское поле 'color'
имеет значение 'red'
.
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'post',
'meta_key' => 'color',
'meta_value' => 'red'
));
Продвинутый пример
В этом примере показаны аргументы для поиска всех записей, в которых пользовательское поле 'color'
имеет значение 'red'
или 'orange'
, а другое пользовательское поле 'featured'
(флажок или чекбокс) отмечен галочкой.
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'post',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'color',
'value' => array('red', 'orange'),
'compare' => 'IN',
),
array(
'key' => 'featured',
'value' => '1',
'compare' => '=',
),
),
));
Ниже вы найдете еще ряд примеров.
Обратите внимание, что в этих примерах используется объект WP_Query
, а не функция get_posts
, однако аргументы и логика остаются теми же.
Одно значение пользовательского поля
В этом примере мы найдем все записи, которые имеют тип поста (post_type
) 'event'
, где пользовательское поле 'location'
равно 'Melbourne'
. Пользовательское поле 'location'
в данном случае может быть текстовым полем, радиокнопкой или полем выбора (то, что сохраняет одно текстовое значение).
<?php
// args
$args = array(
'numberposts' => -1,
'post_type' => 'event',
'meta_key' => 'location',
'meta_value' => 'Melbourne'
);
// query
$the_query = new WP_Query( $args );
?>
<?php if( $the_query->have_posts() ): ?>
<ul>
<?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('event_thumbnail'); ?>" />
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); // Restore global post data stomped by the_post(). ?>
Множественные значения произвольных полей (значения на основе текста)
В этом примере мы найдем все записи, которые имеют тип записи (post_type
) 'event'
, где пользовательское поле 'location'
равно 'Melbourne'
, а пользовательское поле 'attendees'
больше 100. Пользовательское поле 'attendees'
в данном случае может быть числовым полем, текстовым полем, радиокнопкой или полем выбора (то, что сохраняет одно текстовое значение).
<?php
// args
$args = array(
'numberposts' => -1,
'post_type' => 'event',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'location',
'value' => 'Melbourne',
'compare' => '='
),
array(
'key' => 'attendees',
'value' => 100,
'type' => 'NUMERIC',
'compare' => '>'
)
)
);
// query
$the_query = new WP_Query( $args );
?>
<?php if( $the_query->have_posts() ): ?>
<ul>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('event_thumbnail'); ?>" />
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); // Restore global post data stomped by the_post(). ?>
Множественные значения полей (значения на основе массива)
В этом примере мы найдем все записи, имеющие тип (post_type
) 'event'
, в которых пользовательское поле 'location'
равно 'Melbourne'
или 'Sydney'
. Пользовательское поле 'location'
в данном случае может быть полем с несколькими вариантами выбора или полем с флажком (что-то, что сохраняет сериализованное значение массива).
<?php
// args
$args = array(
'numberposts' => -1,
'post_type' => 'event',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'location',
'value' => 'Melbourne',
'compare' => 'LIKE'
),
array(
'key' => 'location',
'value' => 'Sydney',
'compare' => 'LIKE'
)
)
);
// query
$the_query = new WP_Query( $args );
?>
<?php if( $the_query->have_posts() ): ?>
<ul>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('event_thumbnail'); ?>" />
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); // Restore global post data stomped by the_post(). ?>
О произвольных полях с использованием плагина ACF мы поговорим ниже в этом руководстве.