Запрос записей

Ниже я приведу рекомендации по запросу (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 мы поговорим ниже в этом руководстве.

Была ли эта страница полезной?