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

Модифицирование Woocommerce

HIT

04.07.2017

1400

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

Логин WC в шапке

Создаем функцию ссылки в личный кабинет WC

function my_account_loginout_link() {    

if (is_user_logged_in() ) {  
global $wp; 
$current_user = get_user_by( 'id', get_current_user_id() ); 
echo '<a class="nav-link" href="'. wp_logout_url( get_permalink( wc_get_page_id( 'shop' ) ) ) .'">выйти</a>'; echo '<strong><a class="nav-link" href="'. get_permalink( wc_get_page_id( 'myaccount' ) ) .'">'.$current_user->display_name.'</a></strong>';    
}   
elseif (!is_user_logged_in() ) {        
echo '<a class="nav-link" href="' . get_permalink( wc_get_page_id( 'myaccount' ) ) . '">Авторизация/Регистрация</a>';   
}

}

Выводим в любом месте сайта:

<?php my_account_loginout_link(); ?>

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

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']

Добавить какую-либо колонку

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

В админке 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 > Настройки > Основные настройки)

Тэги: , ,

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

  • Похожие записи
  • Комментарии
  • Вложения
Настраиваем woocommerce

Настраиваем woocommerce

Настраиваем различные аспекты плагина woocommerce, под текущие задачи. Ваша корзина пуста Шаблон для настроек страницы корзины (когда она пуста) находится здесь: woocommerce (локализованная в теме)/cart/cart-empty.php Можно отцентрировать и добавить какое-либо Читать далее »

/
Добавление полей при оформлении заказа

Добавление полей при оформлении заказа

Добавляем поля для шаблона Оформление заказа Woocommerce. Стандартные поля Woocommerce делятся на 3 группы: поля оплаты (billing) поля доставки (shipping) поля аккаунта (account) Добавляем текстовое поле в стандартные группы WC Читать далее »

/
Скидки Woocommerce

Скидки Woocommerce

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

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

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

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