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

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

HIT

18.01.2018

6871

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

Все что связано с процессом непосредственно заказа. Особенно после того как пользователь нажимает кнопку Оформить заказ. Редирект после оформления заказа После оформления стандартного заказа woocommerce происходит редирект на шаблон успешного Читать далее »

Методы доставки по городам

Методы доставки по городам

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

Виртуальный и Скачиваемый товар

Виртуальный и Скачиваемый товар

В интернет-магазине Woocommerce можно создавать Виртуальный и Скачиваемый товары. Разберемся как это выглядит и работает. Виртуальный товар Данная опция не меняет структуру товара. Если при оформлении в корзине только виртуальные Читать далее »

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

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

  1. Вячеслав

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

    1. Alexandr

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

  2. Alex

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

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