meta_query позволяет выбрать записи WordPress по значениям произвольных полей. Это полезно для небольших каталогов, но не всегда хорошо масштабируется: запросы по wp_postmeta могут создавать тяжёлые SQL JOIN и условия фильтрации.
Пример: проекты с бюджетом от заданной суммы
Пусть у case_study есть числовое метаполе project_budget. Для числового сравнения используйте type => NUMERIC и приводите входные данные к числу до сборки запроса.
<?php
$min_budget = isset( $_GET['min_budget'] )
? max( 0, absint( wp_unslash( $_GET['min_budget'] ) ) )
: 0;
$args = array(
'post_type' => 'case_study',
'post_status' => 'publish',
'posts_per_page' => 12,
'paged' => max( 1, get_query_var( 'paged', 1 ) ),
'meta_query' => array(
array(
'key' => 'project_budget',
'value' => $min_budget,
'compare' => '>=',
'type' => 'NUMERIC',
),
),
);
$query = new WP_Query( $args );
Этот пример показывает только формирование запроса, а не полный шаблон списка и пагинации. Вывод результатов должен дополнительно экранироваться.
Почему каталог может тормозить
- Каждое дополнительное поле в сложном
meta_queryусложняет SQL. - Сортировка по числовым метаданным при больших объёмах может быть дорогой.
- Неограниченный
posts_per_pageувеличивает память и время ответа. - Фильтрация по большим текстовым значениям плохо подходит для
wp_postmeta.
Для конечных значений вроде «регион», «тип услуги», «бренд» часто предпочтительнее таксономия. Если нужен большой каталог с множеством диапазонов, проектируйте индексы или отдельное хранилище и измеряйте реальные планы SQL, прежде чем переносить всё на meta_query.
Что протестировать
- Результаты на нулевых и отрицательных вводах.
- Правильность границы
>=и отсутствие неопубликованных записей. - Пагинацию и общий объём выборки.
- Время ответа с реальным объёмом данных на staging.
- Сосуществование с кешем и другими фильтрами каталога.
Вывод: WP_Meta_Query удобен для умеренного объёма данных и простых фильтров, но сам по себе не является оптимизированным поисковым движком.
Источник: https://developer.wordpress.org/reference/classes/wp_meta_query/
Материал был полезен?
Помогите нам сделать материалы точнее и понятнее.