WooCommerce: как использовать кастомные метаданные для поиска и фильтров заказов

Диагностика проблемы: почему стандартный поиск заказов не подходит

WooCommerce по умолчанию позволяет искать заказы по стандартным полям — ID, email клиента, статус заказа. Однако часто возникают задачи поиска или фильтрации по кастомным метаданным, например, по уникальному коду клиента, внутреннему номеру заказа или дополнительным параметрам, добавленным в заказ. Без кастомных расширений эти данные не индексируются и не участвуют в поиске и фильтрации.

Основные признаки проблемы:

  • Поиск по нужным полям не дает результатов, хотя данные точно есть;
  • Невозможно сформировать выборку заказов с определёнными кастомными значениями через стандартный интерфейс;
  • При попытке фильтрации через пользовательские поля нет автоматической поддержки.

Как добавить поддержку кастомных метаданных в поиск и фильтры WooCommerce

1. Добавление пользовательских полей в заказ

Если вы еще не добавили нужные метаданные в заказы, используйте хук woocommerce_checkout_update_order_meta для сохранения данных из формы оформления заказа:

add_action('woocommerce_checkout_update_order_meta', 'add_custom_order_meta', 10, 2); 
function add_custom_order_meta($order_id, $data) {
    if (!empty($_POST['custom_code'])) {
        update_post_meta($order_id, '_custom_code', sanitize_text_field($_POST['custom_code']));
    }
}

Это позволит сохранять поле custom_code в метаданных заказа с ключом _custom_code.

2. Расширение поиска заказов по метаданным

Чтобы добавить в поиск админки WooCommerce возможность искать по кастомным метаданным, нужно использовать фильтр woocommerce_shop_order_search_fields:

add_filter('woocommerce_shop_order_search_fields', 'add_custom_meta_to_order_search');
function add_custom_meta_to_order_search($search_fields) {
    $search_fields[] = '_custom_code';
    return $search_fields;
}
<

Теперь при поиске в админке WooCommerce поле _custom_code будет учитываться.

3. Создание фильтра по кастомному полю на странице заказов

Для удобства можно добавить выпадающий фильтр по значению метаполя:

add_action('restrict_manage_posts', 'add_custom_code_filter_to_orders');
function add_custom_code_filter_to_orders() {
    global $typenow;
    if ($typenow !== 'shop_order') return;

    $selected = isset($_GET['_custom_code_filter']) ? sanitize_text_field($_GET['_custom_code_filter']) : '';

    echo '<select name="_custom_code_filter">';
    echo '<option value="">Все коды</option>';
    
    // Здесь можно получить уникальные значения из базы или задать вручную
    $codes = ['CODE1', 'CODE2', 'CODE3'];
    foreach ($codes as $code) {
        printf('<option value="%s" %s>%s</option>', esc_attr($code), selected($selected, $code, false), esc_html($code));
    }
    echo '</select>';
}

add_filter('request', 'filter_orders_by_custom_code');
function filter_orders_by_custom_code($vars) {
    if (!empty($_GET['_custom_code_filter'])) {
        $vars['meta_key'] = '_custom_code';
        $vars['meta_value'] = sanitize_text_field($_GET['_custom_code_filter']);
    }
    return $vars;
}

Проверка результата после внедрения

Чтобы убедиться, что поиск и фильтрация работают:

  1. Создайте или отредактируйте заказ, добавив кастомное поле _custom_code с уникальным значением.
  2. В админке в списке заказов воспользуйтесь поиском по значению этого поля — заказ должен появиться в результатах.
  3. Используйте выпадающий фильтр вверху списка заказов, выберите значение и убедитесь, что фильтрация сработала.

Частые ошибки и как их исправить

  • Кастомное поле не сохраняется в заказе. Проверьте, что значение приходит из формы $_POST и используется update_post_meta. Не забудьте санитизацию данных.
  • Поиск не находит заказы по кастомному полю. Убедитесь, что ключ поля добавлен в woocommerce_shop_order_search_fields без лишних пробелов и с корректным названием.
  • Фильтр не отображается или не работает. Проверьте правильность проверки типа записи $typenow === 'shop_order' и передачу параметров запроса через request.
  • Медленная работа админки из-за большого количества уникальных значений фильтра. В этом случае лучше ограничить список значений фильтра, например, использовать только популярные или последние значения.

Практические советы по безопасности и производительности

  • Всегда используйте функции санитизации (sanitize_text_field, esc_attr) при работе с пользовательскими данными.
  • Не храните в метаданных слишком большие объемы данных, это замедляет запросы.
  • Если фильтрация по метаданным становится узким горлышком, рассмотрите создание дополнительной таблицы в базе с индексами для быстрого поиска.
  • Для более сложных фильтров и поиска можно использовать специализированные плагины, например, Clearfy Pro для оптимизации запросов и очистки сайта.

Сравнение способов реализации фильтрации по кастомным метаданным

МетодПлюсыМинусы
Добавление метаполя и расширение поиска через хукиБыстро и просто, не требует дополнительных таблицМожет замедлить запросы при большом объеме данных
Создание отдельной таблицы с индексамиВысокая производительность на больших сайтахТребует дополнительного кода и поддержки
Использование плагинов для фильтрацииГотовые решения, удобный интерфейсМогут замедлять сайт и влиять на совместимость
Автоматический возврат оплаты при отмене заказа в WooCommerce
24.05.2026
Автоматизация обработки заказов без WooCommerce в WordPress
01.01.2026
Добавление последовательных вариаций товара в WooCommerce
05.01.2026
Как создать автоматический отчет по заказам WooCommerce с помощью PHP
07.04.2026
Создание и использование shortcode в WordPress: подробное руководство с примерами кода
11.11.2025