WooCommerce - фильтрация по избранным товарам в админке
В WooCommerce есть простой способ отметить товары как "Избранные", нажав на значок звездочки в колонке "Featured" в админ-панели.
Мне нужно иметь возможность фильтровать и показывать только избранные товары в админке. Кто-нибудь знает простой способ сделать это?
Покопавшись, я выяснил, что это реализовано через мета-ключи/значения, где _featured
- это ключ, а значение может быть либо yes
, либо no
.
К сожалению, поскольку это реализовано не через таксономии (как категории товаров), нет возможности использовать стандартную фильтрацию в админке для отображения только избранных товаров. Можно отсортировать колонку Featured, чтобы все избранные товары были либо вверху, либо внизу списка, но это всё.
Вы можете сортировать список товаров по статусу "Рекомендуемые". Просто нажмите на звезду в верхней части колонки... первый клик разместит все нерекомендуемые товары вверху, а второй клик изменит порядок, разместив рекомендуемые товары вверху.
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' );

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

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

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

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

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

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

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

Я нашел этот плагин: 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'];
}
}

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

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

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