/ Плагины / Кнопки WC

Кнопки WC

HIT

17.01.2018

3190

4

Давно хотел подробно разобрать тему с кнопками WC. Кнопки меняют свой вид и функционал в зависимости от типа продукта, наличия, и других факторов. Так же в движке магазина Woocommerce множество других кнопок не относящихся непосредственно к товарам (перейти в корзину, перейти к оформлению и т.д.).

Ajax кнопка В корзину в карточке товара

Из коробки кнопка В корзину при добавлении товара обновляет страницу. Изменим это, добавив Ajax. Данный функционал я почерпнул на сайте http://elartica.com. Работает как для простого товара, так для вариативного.

Добавляем скрипт:

var $warp_fragment_refresh = {
    url: wc_cart_fragments_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'get_refreshed_fragments' ),
    type: 'POST',
    success: function( data ) {
        if ( data && data.fragments ) {

            $.each( data.fragments, function( key, value ) {
                $( key ).replaceWith( value );
            });

            $( document.body ).trigger( 'wc_fragments_refreshed' );
        }
    }
};

$('.entry-summary form.cart').on('submit', function (e)
{
    e.preventDefault();

    $('.entry-summary').block({
        message: null,
        overlayCSS: {
            cursor: 'none'
        }
    });

    var product_url = window.location,
        form = $(this);

    $.post(product_url, form.serialize() + '&_wp_http_referer=' + product_url, function (result)
    {
        var cart_dropdown = $('.widget_shopping_cart', result)

        // update dropdown cart
        $('.widget_shopping_cart').replaceWith(cart_dropdown);

        // update fragments
        $.ajax($warp_fragment_refresh);

        $('.entry-summary').unblock();

    });
});

Меняем в шаблоне woocommerce/single-product/add-to-cart/simple.php строку

<button type="submit" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>

на

<input type="hidden" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" />
<button type="submit" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>

Если в магазине у нас только простые товары (без вариативных), то можно сделать еще проще — установить кнопку с шаблона архива:

remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_loop_add_to_cart', 30 );

Надписи на кнопках в каталоге

Данный код конфликтует с блоками WC Gutenberg
// Изменение текста кнопок add_filter('woocommerce_product_add_to_cart_text' , 'custom_woocommerce_product_add_to_cart_text' ); 

function custom_woocommerce_product_add_to_cart_text() { 
global $product; $product_type = $product-&gt;get_type(); 
switch ( $product_type ) { 
case 'external': return __( 'Buy product', 'woocommerce' ); break; 
case 'grouped': return __( 'View products', 'woocommerce' ); break; 
case 'simple': return __( 'Add to cart', 'woocommerce' ); break; 
case 'variable': return __( 'Select options', 'woocommerce' ); break;
default: return __( 'Read more', 'woocommerce' ); } 
}

Я дополнил код проверкой товаров на наличие и указание цены

// Изменение текста кнопок
add_filter( 'woocommerce_product_add_to_cart_text' , 'custom_woocommerce_product_add_to_cart_text' );
function custom_woocommerce_product_add_to_cart_text() {
	global $product;
	$product_type = $product->get_type();
	$product_price = $product->get_price();
	
    if ( $product->is_in_stock() && !empty($product_price) ) {
		switch ( $product_type ) {
			case 'external': return __( 'Buy product', 'woocommerce' ); break; 
			case 'grouped': return __( 'View products', 'woocommerce' ); break; 
			case 'simple': return __( 'Add to cart', 'woocommerce' ); break; 
			case 'variable': return __( 'Select options', 'woocommerce' ); break;
			default: return __( 'Подробнее', 'woocommerce' );
		}		
    } else { return __( 'Подробнее', 'woocommerce' ); }
}

Если на сайте есть возможность предзаказа, то можно сделать условие и по выводу надписи Предзаказ:

// Изменение текста кнопок
add_filter( 'woocommerce_product_add_to_cart_text' , 'custom_woocommerce_product_add_to_cart_text' );
function custom_woocommerce_product_add_to_cart_text() {
	global $product;
	$product_type = $product->get_type();
	$product_price = $product->get_price();
	
    if ( $product->is_in_stock() && !empty($product_price) ) {
		if ( $product->backorders_allowed() ) {
			return __( 'Предзаказ', 'woocommerce' );
		} else {
			switch ( $product_type ) {
				case 'external': return __( 'Buy product', 'woocommerce' ); break; 
				case 'grouped': return __( 'View products', 'woocommerce' ); break; 
				case 'simple': return __( 'Add to cart', 'woocommerce' ); break; 
				case 'variable': return __( 'Select options', 'woocommerce' ); break;
				default: return __( 'Подробнее', 'woocommerce' );
			}	
		}
		
    } else { return __( 'Подробнее', 'woocommerce' ); }
}

В карточке:

// Change the add to cart text on single product pages
add_filter('woocommerce_product_single_add_to_cart_text', 'woo_custom_cart_button_text');
function woo_custom_cart_button_text() {
	foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
		$_product = $values['data'];
		if( get_the_ID() == $_product->get_ID() ) {
			if ( $_product->backorders_allowed() ) {
				return __('Предзаказ', 'woocommerce');
			} else {
				return __('Добавить в корзину', 'woocommerce');
			}
		}
	}
	return __('Add to cart', 'woocommerce');
}

Иконки в тексте кнопок

Чтобы вставлять в вышеописанный код иконки в виде html символов, нужно в шаблоне woocommerce/loop/add-to-cart.php изменить строку

esc_html( $product->add_to_cart_text() )

на

htmlspecialchars_decode( $product->add_to_cart_text() )

Товар уже в корзине

Чтобы изменить текст кнопки В корзину, если товар уже добавлен, используем функции:

// Change the add to cart text on single product pages
add_filter('woocommerce_product_single_add_to_cart_text', 'woo_custom_cart_button_text');
function woo_custom_cart_button_text() {
	
	foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
		$_product = $values['data'];
	
		if( get_the_ID() == $_product->get_ID() ) {
			return __('Already in cart - Add Again?', 'woocommerce');
		}
	}
	
	return __('Add to cart', 'woocommerce');
}

// Change the add to cart text on product archives
add_filter( 'woocommerce_product_add_to_cart_text', 'woo_archive_custom_cart_button_text' );
function woo_archive_custom_cart_button_text() {
	
	foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
		$_product = $values['data'];
	
		if( get_the_ID() == $_product->get_ID() ) {
			return __('Already in cart', 'woocommerce');
		}
	}
	
	return __('Add to cart', 'woocommerce');
}
Текст кнопки для товара у которого нет цены

Решено: можно использовать дополненное выше решение, и отдельно сделать отбор товаров по отсутствию цены empty($product_price).

Добавить кнопку Перейти в корзину

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

function go_cart_button_single() {
	foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
		$_product = $values['data'];

		if( get_the_ID() == $_product->get_ID() ) {
			echo '<a class="button go-cart" href="/cart/">Перейти в корзину</a>';
		}
	}
}

add_action( 'woocommerce_after_add_to_cart_button', 'go_cart_button_single' );

Изменить текст кнопки Оформление

// Изменить текст кнопки Оформление заказа
add_filter( 'woocommerce_order_button_text', 'woo_custom_order_button_text' );
function woo_custom_order_button_text() {
	return __( 'Перейти к оплате', 'woocommerce' );
}

Редирект в Оформление

Чтобы при добавлении товара в корзину сразу происходил редирект, нужно сделать 2

1. Включить чекбокс Перенаправить в корзину после успешного добавления в настройках Woocommerce > Товары.

2. Добавить функцию:

// Редирект в оформление при добавлении товара
add_filter('add_to_cart_redirect', 'lw_add_to_cart_redirect');
function lw_add_to_cart_redirect() {
	global $woocommerce;
	$lw_redirect_checkout = $woocommerce->cart->get_checkout_url();
	return $lw_redirect_checkout;
}
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Связывание товаров по атрибутам

Связывание товаров по атрибутам

Рассмотрим принцип связывания товаров по атрибутам, чтобы в товаре отображались вариации товара, например с другим цветом или размером. WPC Linked Variation for WooCommerce Автор: WPClever, 700+ установок Алгоритм работы следующий: 1. Читать далее »

Шаг количества товара

Шаг количества товара

Шаг количества товара или кратность в некоторых сферах интернет торговли является важной составляющей. Рассмотрим варианты создания данного функционала. Quantities and Units for WooCommerce Плагин Quantities and Units for WooCommerce (3,000+) Читать далее »

/
Массовое изменение цен

Массовое изменение цен

Смотрим какие есть решения для массового изменения цен товаров Woocommerce. В данной статье центральное внимание направлено именно на изменение цены, а не на изменение различных свойств товара. Плагин WooCommerce Prices Читать далее »

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

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

  1. Александр

    Здравствуйте, спасибо зам за мега полезную информацию. Скажите, в какой файл нужно вставить код проверки товара в корзине?

    1. Alexandr

      Здравствуйте! Если Вы про функционал «Товар уже в корзине», то эти функции нужно вставлять в functions.php.

  2. Александр

    Да, и в какой файл нужно добавить скрипт?

    1. Alexandr

      Скрипт добавляем в файл со всеми скриптами которые используем на сайте. Как подключать подобные файлы описано здесь.

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