/ Сайтостроение / Плагины / Модификация Woocommerce

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

HIT

04.07.2017

2397

Продолжаем серию модификаций модуля интернет коммерции 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) — строки без кавычек. Нужно их добавить.

Тэги: , ,

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

  • Похожие записи
  • Комментарии
  • Вложения
Скидки Woocommerce

Скидки Woocommerce

Deprecated: Function create_function() is deprecated in /home/t/tiberi6w/opttour.ru/public_html/wp-content/plugins/wp-spamshield/wp-spamshield.php on line 2033

Добавляем и настраиваем в woocommerce различные системы скидок. Стандартная скидка Woocommerce Можно включить «акционную» цену на товар, к ней можно добавить дату окончания скидки. У товара появляется лэйбл «Распродажа», можно Читать далее »

Количество товара

Количество товара

Количество товара (quantity) — один важнейших элементов функционала интернет-магазина (woocommerce в частности). Есть множество нюансов связанных с количеством товара, рассмотрим их. Вывод количества в категориях товаров По-умолчанию в шаблоне вывода Читать далее »

Хуки для woocommerce

Хуки для woocommerce

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

/

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

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

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