Как создать фильтр товаров Woocommerce по кастомному полю в админке WordPress?

Ссылка скопирована
1 ответ

Нужно как-то реализовать фильтр в админке по кастомному полю.

Небольшое предисловие: это сайт агентства недвижимости и там у них есть выбор агента, который занимается этим объявлением. Я сделал кастомные страницы, привязал полю и сделал там выбор. Всё присваивается и отлично работает в фронтенде.

Однако, нужно сделать столбец в списке объявлений (Товаров Вукоммерс), которые еще могут фильртоваться, чтобы увидеть, сколько объявлений на определенном агенте. Как это сделать? Подойдет вариант и через код и через плагин.

Дополнительно:

Однако, нужно сделать столбец в списке объявлений (Товаров Вукоммерс), которые еще могут фильртоваться, чтобы увидеть, сколько объявлений на определенном агенте.

Покажите Ваши попытки.

  • Для создания фильтра товаров в WooCommerce по кастомному полю в админке WordPress, вам потребуется добавить дополнительное поле к товарам и затем создать фильтр для этого поля. Давайте разберемся с этим шаг за шагом:

    Шаг 1: Добавление кастомного поля к товарам в WooCommerce

    Откройте вашу админ-панель WordPress.
    Перейдите в раздел "Товары" (Products) и выберите товар, к которому вы хотите добавить кастомное поле, или создайте новый товар.
    В редакторе товара прокрутите вниз до раздела "Произвольные поля" (Custom Fields).
    Введите название поля в поле "Имя" (Name), например, "Мой кастомный фильтр".
    Введите значение поля в поле "Значение" (Value), например, "Значение фильтра".
    Нажмите кнопку "Добавить настраиваемое поле" (Add Custom Field).

    Теперь у товара есть кастомное поле "Мой кастомный фильтр" с значением "Значение фильтра".

    Шаг 2: Создание фильтра по кастомному полю

    Установите и активируйте плагин "WooCommerce Product Filter" (или другой аналогичный плагин, если вы предпочитаете другой).
    Перейдите в раздел "WooCommerce" в админ-панели WordPress и выберите "Product Filter".
    Нажмите на "Add New Filter" для создания нового фильтра.
    В настройках фильтра укажите следующие параметры:
    Название фильтра: Например, "Фильтр по моему кастомному полю".
    Тип фильтра: Выберите тип фильтра, который соответствует вашему кастомному полю (например, текстовое поле, выпадающий список и т. д.).
    Для поля "Имя поля" укажите название кастомного поля, которое вы создали в шаге 1 ("Мой кастомный фильтр").
    Остальные настройки фильтра можно настроить в соответствии с вашими потребностями.
    Нажмите "Сохранить" (Save), чтобы сохранить фильтр.

    Теперь у вас есть фильтр товаров в админке WooCommerce, который использует кастомное поле "Мой кастомный фильтр" для фильтрации товаров.

  • Михаил Р., я нашел вопрос подобный в Хабре, там порекомендовали плагин, который их создаёт. Он отлично работает, но для добавления из ACF, просит купить про версию этого плагина
  • Onix Onix, спасибо огромное! Завтра опробую, поделюсь результатами
  • Onix Onix, не могу найти этот плагин(
    Там только для фронтенда(
  • Как создать фильтр товаров Woocommerce по кастомному полю в админке Wordpress?

    Вот как примерно это будет выглядеть. Вам нужно только адаптировать под свой проект.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Алексей Денисов Ответ

    Фильтр товаров WooCommerce в админке по кастомному полю делается двумя частями: сначала добавляется выпадающий список над таблицей товаров, затем изменяется запрос списка товаров через pre_get_posts. Если агент хранится в meta field товара, фильтровать нужно по meta_query.

    Пример для поля agent_id:

    add_action('restrict_manage_posts', function () {
        global $typenow;
     
        if ($typenow !== 'product') {
            return;
        }
     
        $current = sanitize_text_field($_GET['agent_id'] ?? '');
     
        echo '<select name="agent_id">';
        echo '<option value="">Все агенты</option>';
     
        $agents = get_posts([
            'post_type'      => 'agent',
            'posts_per_page' => -1,
            'post_status'    => 'publish',
        ]);
     
        foreach ($agents as $agent) {
            printf(
                '<option value="%s" %s>%s</option>',
                esc_attr($agent->ID),
                selected($current, $agent->ID, false),
                esc_html($agent->post_title)
            );
        }
     
        echo '</select>';
    });

    add_action('restrict_manage_posts', function () { global $typenow; if ($typenow !== 'product') { return; } $current = sanitize_text_field($_GET['agent_id'] ?? ''); echo '<select name="agent_id">'; echo '<option value="">Все агенты</option>'; $agents = get_posts([ 'post_type' => 'agent', 'posts_per_page' => -1, 'post_status' => 'publish', ]); foreach ($agents as $agent) { printf( '<option value="%s" %s>%s</option>', esc_attr($agent->ID), selected($current, $agent->ID, false), esc_html($agent->post_title) ); } echo '</select>'; });

    add_action('pre_get_posts', function ($query) {
        if (!is_admin() || !$query->is_main_query()) {
            return;
        }
     
        if ($query->get('post_type') !== 'product') {
            return;
        }
     
        $agent_id = absint($_GET['agent_id'] ?? 0);
        if ($agent_id) {
            $query->set('meta_query', [[
                'key'   => 'agent_id',
                'value' => $agent_id,
            ]]);
        }
    });

    add_action('pre_get_posts', function ($query) { if (!is_admin() || !$query->is_main_query()) { return; } if ($query->get('post_type') !== 'product') { return; } $agent_id = absint($_GET['agent_id'] ?? 0); if ($agent_id) { $query->set('meta_query', [[ 'key' => 'agent_id', 'value' => $agent_id, ]]); } });

    Отдельно можно добавить колонку с агентом через фильтры manage_product_posts_columns и manage_product_posts_custom_column. Если поле создано через ACF, используйте тот же meta key, который хранит ACF. Для relationship/post object чаще всего в meta лежит ID связанной записи.

    Если агент хранится не как ID, а как строка имени, фильтр всё равно работает, но value должен совпадать с сохранённым значением. Для ACF Post Object чаще всего хранится ID, для Select может храниться value, для Relationship — массив сериализованных ID. В последнем случае простой meta_query по = не сработает, нужен LIKE по сериализованному значению, но это менее эффективно.

    Для больших каталогов недвижимости лучше хранить отдельное простое meta-поле agent_id с числом. Тогда фильтр будет быстрым и понятным. После добавления фильтра проверьте, что он не применяется к обычным записям, заказам и другим post types в админке.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно