Оптимизация wp_ajax: пишем кастомный AJAX-фильтр WooCommerce под высокие нагрузки

Стандартные плагины фильтрации товаров отправляют тяжелые запросы через admin-ajax.php, что принудительно инициализирует всю админку WordPress при каждом клике пользователя. На магазинах с базой от 10 000 товаров это вызывает жесткие просадки TTFB. Пишем оптимизированный обработчик фильтрации на чистом PHP.

1. Отказ от admin-ajax в пользу кастомного эндпоинта REST API

Маршруты 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',
    ]);
}

2. Оптимизированный WP_Query с прямым кэшированием

Чтобы снизить нагрузку на 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);
}

Теги:

[wp_chatgpt_assistant]
Скопировано!