ворд-пресс.рф
Разработка

WP_Meta_Query: фильтр записей по полям и ограничения производительности

Практический фильтр по числовому метаполю с предупреждениями о нагрузке и дублировании данных.

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.

Что протестировать

  1. Результаты на нулевых и отрицательных вводах.
  2. Правильность границы >= и отсутствие неопубликованных записей.
  3. Пагинацию и общий объём выборки.
  4. Время ответа с реальным объёмом данных на staging.
  5. Сосуществование с кешем и другими фильтрами каталога.

Вывод: WP_Meta_Query удобен для умеренного объёма данных и простых фильтров, но сам по себе не является оптимизированным поисковым движком.

Источник: https://developer.wordpress.org/reference/classes/wp_meta_query/

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.