/ Плагины / Изменяем админку Woocommerce

Изменяем админку Woocommerce

HIT

18.01.2018

7289

3

В данной статье собираются сниппеты меняющие функционал или внешний вид админ части Woocommerce.

Вернуть выпадающий список категорий

С версии WC 3.2 изменился фильтр постов в админке, конкретно выбор категории. Теперь сделали в виде Ajax строки поиска. Это не всегда удобно. Вернем предыдущую версию в виде выпадающего дерева категорий:

//Возвращаем в админку выпадающий список категорий
add_action( 'restrict_manage_posts', 'wcacd_category_dropdown', 15 );
function wcacd_category_dropdown() {
	// show the old dropdown category filter from WC 3.1.2
	wc_product_dropdown_categories( array( 'option_select_text' => __( 'Filter by category', 'woocommerce' ) ) );
	
	// hide the WC 3.2+ ajax category filter
	print '<style>.post-type-product .tablenav div .select2 {display:none;}</style>';
}

Переключатель уровня вложенности категорий

Решение взято с сайта wp-kama.

// Переключатель уровня категорий в админке
$taxonomy = 'product_cat';
add_action( "{$taxonomy}_add_form", function($taxonomy){
	ob_start();
} );

add_action( "after-{$taxonomy}-table", function($taxonomy){
	$html = ob_get_clean();

	$__preg_replace_callback = function( $match ){
		$val = @ $_GET['parent_only'];
		ob_start();
		?>
		<div class="alignleft actions">
			<select name="parent_only" onchange="window.add_param_to_URL(this)">
				<option value="">Все уровни...</option>
				<option value="yes" <?php selected('yes', $val) ?> >Только родители</option>
			</select>
		</div>
		<script>
		window.add_param_to_URL = function(el){
			var href = window.location.href, sep = /[?]/.test(href) ? "&" : "?", name = el.name.replace(/[^a-z_-]/i,'');
			window.location = (new RegExp(name+'=?')).test(href) ? href.replace( (new RegExp('([?&]'+name+'=?)[^&]*')), (el.value ? "$1"+ el.value : '') ) : (href + sep + name + "="+ el.value);
		}
		</script>
		<?php
		return $match[1] . ob_get_clean();
	};

	echo preg_replace_callback('~(id="doaction[^<]+</div>)~', $__preg_replace_callback, $html );
} );


add_filter('get_terms_args', 'my_terms_filter_handler');
function my_terms_filter_handler( $query ){
	if( empty($_GET['parent_only']) || ! is_admin() ) return $query;
	if( ! ( $query['fields'] == 'count' || isset($query['page'])  ) )
		 return $query;
	$query['parent'] = 0; // только родители
	return $query;
}

Сортировка по колонке Статус наличия

// Сортировка товаров по статусу наличия
add_filter( 'manage_edit-product_sortable_columns', 'my_product_sorting_column' );
function my_product_sorting_column( $columns ) {
    $columns['is_in_stock'] = 'in_stock';

    return $columns;
}
add_action( 'pre_get_posts', 'my_product_sorting' );

function my_product_sorting( $query ) {

    if( ! is_admin() )
        return;

    $orderby = $query->get( 'orderby');

    if( 'in_stock' == $orderby ) {
        $query->set('meta_key','_stock_status');
        $query->set('orderby','meta_value');
    }
}

Сортировка в админке по умолчанию

Можно произвольно изменить порядок вывода товаров в админке. При этом выбор сортировки по умолчанию не влияет на вывод товаров в админке.

Сортировка по названию

function sp_41964737_custom_product_order( $query ){

    global $typenow;

    if( is_admin() && $query->is_main_query() && $typenow == 'product' ){

        /* Post Column: e.g. title */
        if($query->get('orderby') == ''){
            $query->set('orderby', 'title');
        }
        /* Post Order: ASC / DESC */
        if($query->get('order') == ''){
            $query->set('order', 'ASC');
        }

    }
}
add_action( 'parse_query', 'sp_41964737_custom_product_order' );

Сортировка по статусу наличия (сначала в наличии)

function sp_41964737_custom_product_order( $query ){

    global $typenow;

    if( is_admin() && $query->is_main_query() && $typenow == 'product' ){
		
        /* Post Column: e.g. title */
        if($query->get('meta_key') == ''){
            $query->set('meta_key', '_stock_status');
        }		

        /* Post Column: e.g. title */
        if($query->get('orderby') == ''){
            $query->set('orderby', 'meta_value');
        }
		
        /* Post Order: ASC / DESC */
        if($query->get('order') == ''){
            $query->set('order', 'ASC');
        }

    }
}
add_action( 'parse_query', 'sp_41964737_custom_product_order' );

Добавить фильтр по рекомендуемым (featured) товарам

function wpa104537_filter_products_by_featured_status() {

     global $typenow, $wp_query;

    if ($typenow=='product') :


        // Featured/ Not Featured
        $output .= "<select name='featured_status' id='dropdown_featured_status'>";
        $output .= '<option value="">'.__( 'Show All Featured Statuses', 'woocommerce' ).'</option>';

        $output .="<option value='featured' ";
        if ( isset( $_GET['featured_status'] ) ) $output .= selected('featured', $_GET['featured_status'], false);
        $output .=">".__( 'Featured', 'woocommerce' )."</option>";

        $output .="<option value='normal' ";
        if ( isset( $_GET['featured_status'] ) ) $output .= selected('normal', $_GET['featured_status'], false);
        $output .=">".__( 'Not Featured', 'woocommerce' )."</option>";

        $output .="</select>";

        echo $output;
    endif;
}
add_action('restrict_manage_posts', 'wpa104537_filter_products_by_featured_status');

function wpa104537_featured_products_admin_filter_query( $query ) {
    global $typenow;

    if ( $typenow == 'product' ) {

        // Subtypes
        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' );

Добавить фильтр по атрибуту brand

// Добавляем выпадающий фильтр по атрибуту pa_brand на страницу списка товаров
add_action( 'restrict_manage_posts', 'add_brand_filter_to_products' );

function add_brand_filter_to_products() {
    global $typenow;

    if ( 'product' !== $typenow ) {
        return;
    }

    // Получаем все термины атрибута pa_brand
    $taxonomy = 'pa_brand';

    $terms = get_terms( array(
        'taxonomy'   => $taxonomy,
        'hide_empty' => true,
        'orderby'    => 'name',
        'order'      => 'ASC',
    ) );

    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
        echo '<select name="filter_pa_brand" style="min-width:200px;">';
        echo '<option value="">' . esc_html__( 'Фильтр по бренду', 'woocommerce' ) . '</option>';

        foreach ( $terms as $term ) {
            $selected = '';

            if ( isset( $_GET['filter_pa_brand'] ) && $_GET['filter_pa_brand'] == $term->slug ) {
                $selected = ' selected="selected"';
            }

            printf(
                '<option value="%s"%s>%s</option>',
                esc_attr( $term->slug ),
                $selected,
                esc_html( $term->name )
            );
        }

        echo '</select>';
    }
}

// Обрабатываем выбранный фильтр и применяем его к основному запросу
add_action( 'pre_get_posts', 'apply_brand_filter_in_admin' );

function apply_brand_filter_in_admin( $query ) {
    global $pagenow, $typenow;

    if ( is_admin() && 'edit.php' === $pagenow && 'product' === $typenow && $query->is_main_query() ) {
        if ( isset( $_GET['filter_pa_brand'] ) && ! empty( $_GET['filter_pa_brand'] ) ) {
            $tax_query = array(
                array(
                    'taxonomy' => 'pa_brand',
                    'field'    => 'slug',
                    'terms'    => sanitize_text_field( $_GET['filter_pa_brand'] ),
                ),
            );

            // Объединение с существующим tax_query, если он есть
            $existing_tax_query = $query->get( 'tax_query' );

            if ( ! empty( $existing_tax_query ) && is_array( $existing_tax_query ) ) {
                $existing_tax_query[] = $tax_query[0];
                $query->set( 'tax_query', $existing_tax_query );
            } else {
                $query->set( 'tax_query', $tax_query );
            }
        }
    }
}
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Хлебные крошки WC

Хлебные крошки WC

Хлебные крошки WC имеют свои особенности. Их невозможно заменить стандартными хлебными крошками, т.к. в них еще не предусмотрена система для иерархических таксономий. Выводим хлебные крошки Первым делом надо назначить хлебные Читать далее »

Конвертировать цену в рубли

Конвертировать цену в рубли

Предположим, что есть товары, цена которых у продавца в долларах, но при этом на сайте мы хотим продавать эти товары за рубли по сегодняшнему курсу, чтобы не усложнять функционал мультивалютностью. Читать далее »

Watermark для изображений товаров (обзор плагинов)

Watermark для изображений товаров (обзор плагинов)

Рассмотрим различные плагины по добавлению водяного знака (watermark) на изображения товаров. WooCommerce Products Image Watermark (BeRocket) Плагин не понравился. Логотип добавляется только одним способом, с указанием положения. Можно перезагрузить загруженные Читать далее »

Добавить комментарий

Notice: Функция WP_Styles::add вызвана неправильно. Стиль с дескриптором "editor-buttons" был поставлен в очередь с незарегистрированными зависимостями: dashicons. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 6.9.1.) in /home/t/tiberi6w/opttour.ru/public_html/wp-includes/functions.php on line 6260

3 комментария

  1. Вячеслав

    Здравствуйте.
    Подскажите как сделать в админке вукомерца поиск по артикулу.

    1. Alexandr

      Попробуйте, как вариант, плагин Search by SKU for Woocommerce. Он расширяет поиск товаров по артикулу. Не могу только точно сказать работает ли в админке.

  2. Alex

    У меня предложенная функция сортировки в админке по умолчанию не сработала.

Изменяем админку Woocommerce
Вывод файлов по категориям записей
Рекомендации для васВывод файлов по категориям записейOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.