/ Плагины / Модификация Woocommerce

Модификация Woocommerce

HIT

04.07.2017

3444

Продолжаем серию модификаций модуля интернет коммерции Woocommerce.

Скрыть колонки редактирования товаров

add_filter( 'manage_edit-product_columns', 'change_columns_filter',10, 1 );
function change_columns_filter( $columns ) {
  
unset($columns['product_tag']);
unset($columns['sku']);
unset($columns['featured']);  

return $columns;
}

Тоже самое можно сделать вручную открыв в админке настройки экрана.

Все колонки woocommerce

$columns['cb']  
$columns['thumb']
$columns['name'] 
$columns['sku'] 
$columns['is_in_stock']
$columns['price']
$columns['product_cat'] 
$columns['product_tag']
$columns['featured']
$columns['product_type']
$columns['date']

Добавить колонку с ценой

// Цена в админке
function true_add_post_columns($my_columns){
	$slider = array( 'price' => 'Цена' );
	$my_columns = array_slice( $my_columns, 0, 5, true ) + $slider + array_slice( $my_columns, 5, NULL, true );
	return $my_columns;
}
 
function true_fill_post_columns( $column ) {
	global $post;
	switch ( $column ) {
		case 'price':
		break;
	}
}
 
add_filter( 'manage_edit-product_columns', 'true_add_post_columns', 10, 1 ); // manage_edit-{тип поста}_columns
add_action( 'manage_posts_custom_column', 'true_fill_post_columns', 10, 1 );

Так же, для красоты, не помешает добавить к стилям админки th#price {width: 20ch;}, чтобы колонка с ценой не была слишком узкой. Как это сделать — читать тут.

Фильтр по статусу наличия товаров

В админке Woocommerce в товарах есть колонка статус наличия товаров — сделаем возможность фильтрации по этой колонке.

/* Добавляем в админку фильтр наличия */
add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );

function wpse45436_admin_posts_filter_restrict_manage_posts(){

    $type = 'product';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //Добавляем фильтр
    if ('product' == $type){
        //измените это на список значений, которые вы хотите показать
        //in 'label' => 'value' format
        $values = array(
            'Out of Stock' => 'outofstock', 
            'In Stock' => 'instock',
        );
        ?>
        <select name="Stock">
        <option value=""><?php _e('Show All Stock', 'wpse45436'); ?></option>
        <?php
            $current_v = isset($_GET['Stock'])? $_GET['Stock']:'';
            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' );

function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'product';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'product' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Stock']) && $_GET['Stock'] != '') {
        $query->query_vars['meta_key'] = '_stock_status';
        $query->query_vars['meta_value'] = $_GET['Stock'];
    }
}

Не выводить товары из определенной категории

// Не выводить товары из определенной категории(й)
function custom_pre_get_posts_query( $q ) {

    $tax_query = (array) $q->get( 'tax_query' );

    $tax_query[] = array(
           'taxonomy' => 'product_cat',
           'field' => 'slug',
           'terms' => array( 'gruntovki' ),
           'operator' => 'NOT IN'
    );


    $q->set( 'tax_query', $tax_query );

}
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );

Не выводить товары без категории

Убираем из результатов поиска woocommerce товары у которых не присвоена категория

// Не выводить товары, у которых отсутствует категория
function custom_pre_get_posts_query( $q ) {
  
global $post;
$terms = get_terms( 'product_cat', array('hide_empty' => 0) );
  
foreach( $terms as $term ) {
$termsids[] = $term->term_id; //Создаем массив
}

    $tax_query = (array) $q->get( 'tax_query' );

    $tax_query[] = array(
           'taxonomy' => 'product_cat',
           'field' => 'term_id',
           'terms' => $termsids,
           'operator' => 'IN'
    );

    $q->set( 'tax_query', $tax_query );
}
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );

Эту и предыдущую функции можно/нужно экранировать условием if( !is_admin() ) {}, чтобы на админку они не распространялись

Минимальный заказ

Устанавливаем минимальную сумму заказа. Если заказ будет на меньшую сумму магазин выдаст предупреждение

//Устанавливаем минимальную сумму заказа
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' );

function wc_minimum_order_amount() {
    // Set this variable to specify a minimum order value
    $minimum = 500;

    if ( WC()->cart->total < $minimum ) {

        if( is_cart() ) {

            wc_print_notice(
                sprintf( 'Минимальный заказ на сайте %s , Ваш заказ пока составляет %s' ,
                    woocommerce_price( $minimum ),
                    woocommerce_price( WC()->cart->total )
                ), 'error'
            );

        } else {

            wc_add_notice(
                sprintf( 'Минимальный заказ на сайте %s , Ваш заказ пока составляет %s' ,
                    woocommerce_price( $minimum ),
                    woocommerce_price( WC()->cart->total )
                ), 'error'
            );

        }
    }
}

Еще одно решение. В данном сниппете указывается недостающая сумма и на странице Оформление заказа выводится предупреждение о том, что нужно увеличить заказ. Оформление при этом не отображается.

// Ограничение по минимальной сумме при покупке товаров
add_action( 'woocommerce_check_cart_items', 'spyr_set_min_total' );
function spyr_set_min_total() {
    if( is_cart() || is_checkout() ) {
        global $woocommerce;

        // минимальная сумма
        $minimum_cart_total = 500;

        // сумма из корзины
        $total = WC()->cart->subtotal;
     
        // Сообщение об ошибке при меньшей сумме в корзине, чем лимит
        if( $total <= $minimum_cart_total  ) {
            // Display our error message
            $not_enough_summa = $minimum_cart_total - $total;
            wc_add_notice( sprintf( 'Минимальная сумма заказа: %s'
                .'<br>Для оформления заказа не хватает: %s',
                wc_price($minimum_cart_total),
                wc_price($not_enough_summa)
                ),
            'error' );
        }
    }
}

WC()->cart->total — общая сумма заказа в корзине
WC()->cart->subtotal — сумма заказа без учета доставки в корзине
WC()->cart->shipping_total — сумма доставки в корзине

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

// Предупреждение о минимальной сумме заказа
function notice_minimum_woocommerce() {

global $product; 
$price = $product->get_regular_price();  
$minimum = 500;  
  
if ( $price < $minimum ) {

echo '<div id="minimum">';

echo 'Минимальная сумма заказа — 500 руб.';

echo '</div>';

}

}
add_action( 'woocommerce_single_product_summary', 'notice_minimum_woocommerce', 15 );

Округление цены

Классическое округление цены товара:

add_filter( 'woocommerce_get_price_including_tax', 'round_price_product', 10, 1 );

add_filter('wc_cart_totals_subtotal_html', 'round_price_product', 10, 1 );

add_filter( 'woocommerce_get_price', 'round_price_product', 10, 1);

function round_price_product($price){

$price=round($price, 0, PHP_ROUND_HALF_DOWN);

while($price%1!=0) $price+=1;

return $price;

}

0 — точность округления (количество десятичных символов)
1 — до какого числа округлять.

Варианты округления php:
PHP_ROUND_HALF_UP — Округляет в большую сторону, если следующий знак находится посередине. Т.е. округляет 1.5 в 2.
PHP_ROUND_HALF_DOWN — Округляет в меньшую сторону, если следующий знак находится посередине. Т.е. округляет 1.5 в 1.
PHP_ROUND_HALF_EVEN — Округляет в сторону ближайшего четного знака.
PHP_ROUND_HALF_ODD — Округляет в сторону ближайшего нечетного знака.

Нестандартное округление:

add_filter( 'woocommerce_get_price_including_tax', 'round_price_product', 10, 1 );

add_filter('wc_cart_totals_subtotal_html', 'round_price_product', 10, 1 );

add_filter( 'woocommerce_get_price', 'round_price_product', 10, 1);

function round_price_product($price){

$price = ceil($price);

  while($price%1!=0) $price+=1;

return $price;

}

ceil — Округляет дробь в большую сторону
floor — Округляет дробь в меньшую сторону

Округление начинает действовать и на товары, у которых не задана цена и тогда они становятся либо по 0.00 руб, либо вовсе Бесплатно!
Чтобы этого не происходило, нужно установить условие — воздействовать на цены больше 0:

if ($price>0) {
$price = ceil($price);
while($price%1!=0) $price+=1;
}
 
return $price;

Чтобы округлить не акционную цену (при наличии акционной), нужно добавить фильтр округления и к функции:

add_filter( 'woocommerce_get_regular_price', 'round_price_product', 10, 1);

В некоторых случаях округление может работать некорректно: перестает отображаться старая цена (если есть акционная) и лэйбл Sale! В этом случае, лучше сократить количество знаков десятичной дроби (Woocommerce > Настройки > Основные настройки)

До бесплатной доставки осталось…

Выведем текстовый блок в корзине, который будет показывать посетителю, сколько ему осталось до бесплатной доставки.

// Сколько осталось до бесплатной доставки
function get_left_to_free_shipping( $content, $multiply_by = 1 ) {
        if ( '' == $content ) {
            $content = __( '%left_to_free% left to free shipping', 'woocommerce-jetpack' );
        }
        $min_free_shipping_amount = 0;
       
        $legacy_free_shipping = new WC_Shipping_Legacy_Free_Shipping();
        if ( 'yes' === $legacy_free_shipping->enabled ) {
            if ( in_array( $legacy_free_shipping->requires, array( 'min_amount', 'either', 'both' ) ) ) {
                $min_free_shipping_amount = $legacy_free_shipping->min_amount;
            }
        }
        if ( 0 == $min_free_shipping_amount ) {
            if ( function_exists( 'WC' ) && ( $wc_shipping = WC()->shipping ) && ( $wc_cart = WC()->cart ) ) {
                if ( $wc_shipping->enabled ) {
                    if ( $packages = $wc_cart->get_shipping_packages() ) {
                        $shipping_methods = $wc_shipping->load_shipping_methods( $packages[0] );
                        foreach ( $shipping_methods as $shipping_method ) {
                            if ( 'yes' === $shipping_method->enabled && 0 != $shipping_method->instance_id ) {
                                if ( 'WC_Shipping_Free_Shipping' === get_class( $shipping_method ) ) {
                                    if ( in_array( $shipping_method->requires, array( 'min_amount', 'either', 'both' ) ) ) {
                                        $min_free_shipping_amount = $shipping_method->min_amount;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
               
        $free_shipping = new WC_Shipping_Free_Shipping();
            if ( in_array( $free_shipping->requires, array( 'min_amount', 'either', 'both' ) ) ) {
                $min_free_shipping_amount = $free_shipping->min_amount;
            }
       
        if ( 0 != $min_free_shipping_amount ) {
            if ( isset( WC()->cart->cart_contents_total ) ) {
                $cart_taxes = ( "WCJ_IS_WC_VERSION_BELOW_3_2_0" ? WC()->cart->get_taxes() : WC()->cart->get_cart_contents_taxes() );
                $total = ( WC()->cart->prices_include_tax ) ? WC()->cart->cart_contents_total + array_sum( $cart_taxes ) : WC()->cart->cart_contents_total;
                if ( $total >= $min_free_shipping_amount ) {
                    return do_shortcode( get_option( 'wcj_shipping_left_to_free_info_content_reached', __( 'У вас бесплатная доставка!', 'woocommerce-jetpack' ) ) );
                } else {
                    $content = str_replace( '%left_to_free%',             wc_price( ( $min_free_shipping_amount - $total ) * $multiply_by ), $content );
                    $content = str_replace( '%free_shipping_min_amount%', wc_price( ( $min_free_shipping_amount )          * $multiply_by ), $content );
                    return $content;
                }
            }
        }
    return $content;
}	

// Добавление в корзину блока с информацией о бесплатной доставке
function how_much_is_to_free_delivery() { 
	$content = 'Вам не хватает %left_to_free% до бесплатной доставки.<!--<br>Всего нужно %free_shipping_min_amount%-->';
	$free_text = get_left_to_free_shipping( $content );
	echo '<div class="free-shipping-info">'.$free_text.'</div>';
};
add_action( 'woocommerce_cart_totals_after_order_total', 'how_much_is_to_free_delivery', 12 );

Ошибка (this will throw an Error in a future version of PHP) — строки без кавычек. Нужно их добавить.

Тэги: , ,

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Upgrade WC

Upgrade WC

Очередная серия улучшений (upgrade) плагина WC. Буду добавлять по мере изучения новые решения. Поиск по SKU (артикулу) Из коробки WC не ищет по артикулам (SKU). Но достаточно установить плагин Search Читать далее »

/
Metabox woocommerce

Metabox woocommerce

У плагина woocommerce есть набор дополнительных полей при редактировании товара. При необходимости можно в группы полей WC добавить свои произвольные metabox. Должно получится так: Создание и отображение metabox Первый экшн Читать далее »

/
Хуки для woocommerce

Хуки для woocommerce

Здесь собраны наиболее востребованные хуки woocommerce, которые могут пригодится при настройке любого интернет-магазина. С другими полезными хуками можно ознакомиться здесь Необходимые части кода вставляем в файл functions (лучше использовать отдельный Читать далее »

/

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

Пока нет комментариев. Будь первым!

Модификация Woocommerce
День и ночь: фон
Рекомендации для васДень и ночь: фонOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.