Стандартные плагины фильтрации товаров отправляют тяжелые запросы через admin-ajax.php, что принудительно инициализирует всю админку WordPress при каждом клике пользователя. На магазинах с базой от 10 000 товаров это вызывает жесткие просадки TTFB. Пишем оптимизированный обработчик фильтрации на чистом PHP.
Маршруты WordPress REST API работают значительно быстрее, так как не подгружают лишние интерфейсные хуки админ-панели. Регистрируем собственный эндпоинт для фильтрации товаров:
add_action('rest_api_init', 'it_gig_register_filter_endpoint');
function it_gig_register_filter_endpoint() {
register_rest_route('itgig/v1', '/filter/', [
'methods' => 'GET',
'callback' => 'it_gig_get_filtered_products',
'permission_callback' => '__return_true',
]);
}
Чтобы снизить нагрузку на MySQL, мы будем использовать только базовые параметры индексации, избегая тяжелых и неоптимизированных связок meta_query по текстовым полям:
function it_gig_get_filtered_products($request) {
$category = sanitize_text_field($request->get_param('category'));
$price_min = (int)$request->get_param('min_price');
$price_max = (int)$request->get_param('max_price');
$args = [
'post_type' => 'product',
'posts_per_page' => 12,
'status' => 'publish',
'no_found_rows' => false,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
];
if (!empty($category)) {
$args['tax_query'] = [[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category,
]];
}
$query = new WP_Query($args);
$products = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$products[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
'price' => get_post_meta(get_the_ID(), '_price', true)
];
}
wp_reset_postdata();
}
return new WP_REST_Response($products, 200);
}
Теги: