WooCommerce - фильтрация по избранным товарам в админке

28 июн. 2013 г., 01:56:45
Просмотры: 19.7K
Голосов: 2

В WooCommerce есть простой способ отметить товары как "Избранные", нажав на значок звездочки в колонке "Featured" в админ-панели.

Мне нужно иметь возможность фильтровать и показывать только избранные товары в админке. Кто-нибудь знает простой способ сделать это?

Покопавшись, я выяснил, что это реализовано через мета-ключи/значения, где _featured - это ключ, а значение может быть либо yes, либо no.

К сожалению, поскольку это реализовано не через таксономии (как категории товаров), нет возможности использовать стандартную фильтрацию в админке для отображения только избранных товаров. Можно отсортировать колонку Featured, чтобы все избранные товары были либо вверху, либо внизу списка, но это всё.

1
Комментарии

Я нашел решение здесь: https://stackoverflow.com/questions/46470206/woocommerce-filter-by-featured-products-in-admin Оно работает с Wordpress 4.9.

Jordi Jordi
21 янв. 2018 г. 11:28:29
Все ответы на вопрос 3
9
13

Вы можете сортировать список товаров по статусу "Рекомендуемые". Просто нажмите на звезду в верхней части колонки... первый клик разместит все нерекомендуемые товары вверху, а второй клик изменит порядок, разместив рекомендуемые товары вверху.

URL в админке будет выглядеть так: /wp-admin/edit.php?post_type=product&orderby=featured&order=desc

Сортировка товаров по статусу 'Рекомендуемые'

ОБНОВЛЕНИЕ:

Итак, оказалось, что фильтрация по статусу "Рекомендуемые" не такая сложная. WooCommerce фильтрует по "подтипу", и поскольку это также фильтрация по метаданным, мы можем в основном просто скопировать их код и внести несколько изменений.

Первая функция добавляет элемент выбора (выпадающий список), а вторая обрабатывает изменения в запросе админки.

/**
 * Фильтрация товаров по типу
 *
 * @access public
 * @return void
 */
function wpa104537_filter_products_by_featured_status() {

     global $typenow, $wp_query;

    if ($typenow=='product') :


        // Рекомендуемые/Не рекомендованные
        $output .= "<select name='featured_status' id='dropdown_featured_status'>";
        $output .= '<option value="">'.__( 'Показать все статусы "Рекомендуемые"', 'woocommerce' ).'</option>';

        $output .="<option value='featured' ";
        if ( isset( $_GET['featured_status'] ) $output .= selected('featured', $_GET['featured_status'], false);
        $output .=">".__( 'Рекомендуемые', 'woocommerce' )."</option>";

        $output .="<option value='normal' ";
        if ( isset( $_GET['featured_status'] ) $output .= selected('normal', $_GET['featured_status'], false);
        $output .=">".__( 'Не рекомендованные', 'woocommerce' )."</option>";

        $output .="</select>";

        echo $output;
    endif;
}

add_action('restrict_manage_posts', 'wpa104537_filter_products_by_featured_status');

/**
 * Фильтрация товаров в админке на основе выбранных опций
 *
 * @access public
 * @param mixed $query
 * @return void
 */
function wpa104537_featured_products_admin_filter_query( $query ) {
    global $typenow, $wp_query;

    if ( $typenow == 'product' ) {

        // Подтипы
        if ( ! empty( $_GET['featured_status'] ) ) {
            if ( $_GET['featured_status'] == 'featured' ) {
                $query->query_vars['meta_value']    = 'yes';
                $query->query_vars['meta_key']      = '_featured';
            } elseif ( $_GET['featured_status'] == 'normal' ) {
                $query->query_vars['meta_value']    = 'no';
                $query->query_vars['meta_key']      = '_featured';
            }
        }

    }

}

add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );

Обновлено для WooCommerce 3.0

Обратный вызов parse_query должен быть обновлен, так как статус "Рекомендуемые" больше не хранится как метаданные записи.

/**
 * Фильтрация товаров в админке на основе выбранных опций
 *
 * @access public
 * @param mixed $query
 * @return void
 */
function wpa104537_featured_products_admin_filter_query( $query ) {
    global $typenow;

    if ( $typenow == 'product' ) {

        // Подтипы
        if ( ! empty( $_GET['featured_status'] ) ) {
            if ( $_GET['featured_status'] == 'featured' ) {
                $query->query_vars['tax_query'][] = array(
                    'taxonomy' => 'product_visibility',
                    'field'    => 'slug',
                    'terms'    => 'featured',
                );
            } elseif ( $_GET['featured_status'] == 'normal' ) {
                $query->query_vars['tax_query'][] = array(
                    'taxonomy' => 'product_visibility',
                    'field'    => 'slug',
                    'terms'    => 'featured',
                    'operator' => 'NOT IN',
                );
            }
        }

    }

}
add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );
28 июн. 2013 г. 03:58:22
Комментарии

Спасибо. Как я отметил в последнем предложении своего вопроса, я знаю об этой функции сортировки. Однако я хочу использовать функцию "Сортировка товаров", которая позволяет сортировать перетаскиванием, для сортировки Рекомендуемых товаров, что по умолчанию невозможно.

Вы можете фильтровать по категории, затем нажать "Сортировка товаров" и перетащить их в нужном порядке. Я хочу это для рекомендуемых товаров...

Gabriel Luethje Gabriel Luethje
28 июн. 2013 г. 22:04:29

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

helgatheviking helgatheviking
28 июн. 2013 г. 23:08:34

Похоже, я находил своё решение в тот момент, когда вы публиковали своё, и они выглядят похожими. Спасибо!

Gabriel Luethje Gabriel Luethje
28 июн. 2013 г. 23:26:55

Да, похоже, мы делаем одно и то же. Довольно изящная доработка... возможно, использую это на своих сайтах.

helgatheviking helgatheviking
28 июн. 2013 г. 23:48:01

В WordPress (4.7.5) и WooCommerce (3.0.7) ваш код не работает.

John Shang John Shang
26 мая 2017 г. 20:19:21

Ну, этому коду уже 4 года, а WooCommerce претерпел масштабную переработку с выходом версии 3.0. Я обновил код, и теперь он вроде бы работает.

helgatheviking helgatheviking
26 мая 2017 г. 23:21:33

Большое спасибо! Часть нового кода уже опубликована. Предлагаю вам проверить его.

John Shang John Shang
27 мая 2017 г. 07:12:19

@helgatheviking Ты просто супер! Спасибо за это; работает отлично в WP 4.8.3 и WC 3.1.2

chb chb
1 нояб. 2017 г. 09:11:00

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

dw1 dw1
19 июн. 2019 г. 17:34:14
Показать остальные 4 комментариев
3

Я нашел этот плагин: https://wordpress.stackexchange.com/a/45447/15190, который смог адаптировать для предоставления выпадающего списка фильтрации по Рекомендуемым товарам. С его помощью я могу использовать функцию WooCommerce "Сортировка товаров" перетаскиванием, чтобы легко изменять порядок отображения Рекомендуемых товаров в виджете "Рекомендуемые товары" и других местах.

Вот код с моими доработками, который позволяет это реализовать для Рекомендуемых товаров WooCommerce:

<?php
/*
Plugin Name: Фильтр в админке по Рекомендуемым товарам WooCommerce
Plugin URI: http://en.bainternet.info
Description: адаптировано из https://wordpress.stackexchange.com/q/45436/2487. Позволяет показывать только Рекомендуемые товары, что затем дает возможность сортировать их перетаскиванием
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
 * Создаем выпадающий список фильтра
 * 
 * @author Ohad Raz
 * 
 * @return void
 */
function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    // Применяем фильтр только к нужному типу записи
    if ('product' == $type){
        // Список значений для фильтра в формате 'метка' => 'значение'
        $values = array(
            'Показать только Рекомендуемые' => 'Yes', 
            'Показать только НЕ Рекомендуемые' => 'No',
        );
        ?>
        <select name="Featured">
        <option value=""><?php _e('Показать все товары', 'wpse45436'); ?></option>
        <?php
            $current_v = isset($_GET['Featured'])? $_GET['Featured']:'';
            foreach ($values as $label => $value) {
                printf(
                    '<option value="%s"%s>%s</option>',
                    $value,
                    $value == $current_v? ' selected="selected"':'',
                    $label
                );
            }
        ?>
        </select>
        <?php
    }
}

add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
 * Фильтрация по мета-полю при отправке формы
 * 
 * @author Ohad Raz
 * @param  (wp_query object) $query
 * 
 * @return Void
 */
function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'product' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Featured']) && $_GET['Featured'] != '') {
        $query->query_vars['meta_key'] = '_featured';
        $query->query_vars['meta_value'] = $_GET['Featured'];
    }
}
28 июн. 2013 г. 23:24:05
Комментарии

Не забудьте выбрать один из наших ответов в качестве официального, чтобы убрать этот вопрос из списка "неотвеченных".

helgatheviking helgatheviking
30 июн. 2013 г. 17:17:29

В wordpress(4.7.5) и woocommerce(3.0.7) ваш код не работает.

John Shang John Shang
26 мая 2017 г. 20:17:59

Устаревший код, не работает в WP 5 и WC 4.8. Добавляет поле фильтра вверху списка товаров, но не фильтрует.

D.A.H D.A.H
20 дек. 2020 г. 21:39:05
2

Вы можете использовать плагин для WordPress Filter Featured Products for WooCommerce.

25 мая 2021 г. 20:41:30
Комментарии

Хотя давно не обновлялся, всё равно работает отлично. Спасибо

Stephan Burlot Stephan Burlot
9 дек. 2022 г. 13:28:00

Я обновил код от @helgatheviking для тех, кто не хочет использовать плагин. Спрашивайте или голосуйте за, я не могу разместить его здесь, так как у меня недостаточно репутации в этом сообществе

Stephan Burlot Stephan Burlot
9 дек. 2022 г. 13:34:02