/ Плагины / Доработка функционала Woocommerce

Доработка функционала Woocommerce

HIT

02.11.2016

10556

7

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

Общий вес заказа

Чтобы выводить общий вес заказа, нужно в шаблонах cart-totals.php (в корзине) и/или review-order.php (в заказе) добавить следующий код (перед закрывающим тегом таблицы /table):

<tr class="total-weight">
	<?php global $woocommerce; ?>
	<th><?php _e('Общий вес', 'woocommerce'); ?></th>
	<td><?php
		$total_weight = $woocommerce->cart->cart_contents_weight;
		$total_weight .= ' '.get_option('woocommerce_weight_unit');
		echo $total_weight; 
	?></td>
</tr>

Автообновление корзины, при изменении количества

// Автоматическое обновлении корзины, при изменении количества товаров
add_action( 'wp_footer', 'cart_update_qty_script' );

function cart_update_qty_script() {
	if (is_cart()) :
	?>
		<script>
		jQuery('div.woocommerce').on('change', '.qty', function(){
			jQuery("[name='update_cart']").trigger("click");
		});
		</script>
	<?php
	endif;
}
Нельзя убирать input «Обновить», если он не нужен его надо просто скрыть display: none, без него обновление не работает

Более правильное поведение обновления: только когда пройдет секунда после внесения изменений, а не во время их.

add_action( 'wp_footer', 'cart_update_qty_script' );
function cart_update_qty_script() {
	if (is_cart()) :
		?><script>
		let tmpTimer = undefined;
		$('div.woocommerce').on("change", ".qty", function() {
			clearTimeout(tmpTimer)
			tmpTimer = setTimeout(() => {
				jQuery("[name='update_cart']").trigger("click");
				tmpTimer = undefined
			}, 1000);
		})
		</script><?php
	endif;
}

Не показывать остатки (В наличие)

Не показывать количество товара, ограничившись надписью В наличие

// Настройка отображения наличия товара

add_filter( 'woocommerce_get_availability', 'wcs_custom_get_availability', 1, 2);
function wcs_custom_get_availability( $availability, $_product ) {
    
    // Change In Stock Text
    if ( $_product->is_in_stock() ) {
        $availability['availability'] = __('В наличие', 'woocommerce');
    }
    // Change Out of Stock Text
    if ( ! $_product->is_in_stock() ) {
        $availability['availability'] = __('Нет в наличие', 'woocommerce');
    }
    return $availability;
}

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

add_filter( 'woocommerce_get_availability', 'wcs_custom_get_availability', 1, 2);
function wcs_custom_get_availability( $availability, $_product ) {
    if ( $_product->is_in_stock() ) {
		if ( $_product->backorders_allowed() && $_product->get_stock_quantity() <= 0 ) {
			$availability['availability'] = __('<i class="fa fa-clock-o"></i> Под заказ, cрок поставки товара от 3 до 12 дней', 'woocommerce');
    	} else {
        	$availability['availability'] = __('<i class="fa fa-check-circle"></i> В наличии', 'woocommerce');
		}
    }
    if ( !$_product->is_in_stock() ) {
        $availability['availability'] = __('<i class="fa fa-times-circle"></i> Нет в наличии', 'woocommerce');
    }

    return $availability;
}

Также можно добавить интересное уведомление о наличии, если остался один товар в наличии:

if ( $_product->get_stock_quantity() == '1' ) {
   $availability['availability'] = __('<i class="fa fa-clock-o" aria-hidden="true"></i> Последний товар', 'woocommerce');
}

Если у нас в каталоге выведено поле количество, а товар в наличии остался все один, поле количество исчезает автоматически, вместо него можно вывести текст:

// Текст вместо кнопок количества, если последний товар
function woocommerce_last_stock_product() { 
	global $product;
	if ( $product->get_stock_quantity() == '1' ) {
        echo '<p class="laststock">Последний товар</p>';
    }
};
add_action( 'woocommerce_after_shop_loop_item', 'woocommerce_last_stock_product', 7 );

Поле количество, которое не выводиться, лучше скрывать более надежно (чем opacity: 0;):
.quantity.hidden {display: none;}

И еще одно уведомление о товаре Под заказ (включен backorder):

// Изменение текста кнопок
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 ( !empty($product_price) ) {
		
		if ( $product->get_stock_quantity() > 0 ) {
			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 __( 'Выбрать', 'woocommerce' ); break;
				default: return __( 'Подробнее', 'woocommerce' );
			}			
		} elseif ( $product->backorders_allowed() ) {
			return __( 'Под заказ', 'woocommerce' );
		} else {
			return __( 'Нет в наличии', 'woocommerce' );
		}
		
    } else { return __( 'Подробнее', 'woocommerce' ); }
}

Автоматическая нумерация строк корзины

Если нам нужно реализовать автоматическую нумерацию строк наименований корзины, нужно сделать следующее:

1. В файле шаблона woocommerce/cart/cart.php добавить в таблицу <th class=»product-number»>№</th>
2. Прописать CSS

/* Нумерация строк */

.cart {border-collapse: collapse; counter-reset: schetchik;}

.cart tbody tr {counter-increment: schetchik;}

.cart td, .cart tbody tr:before {text-align: center; border: 1px solid #ccc;}

.cart tbody tr:before {display: table-cell; vertical-align: middle;}

.cart tbody tr:before, .cart b:after {content: counter(schetchik);}

Выводить пустой рейтинг

Чтобы выводить пустой рейтинг в шаблоне товара достаточно в файле single-product/rating.php отключить проверку (//)

if ( $rating_count > 0 ) :

endif;

Для того чтобы рейтинг выводился в шаблоне архива, используем такую функцию

// Woocommerce rating stars always
remove_action('woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );
add_action('woocommerce_after_shop_loop_item_title', 'get_star_rating', 2 );

function get_star_rating() {
	global $woocommerce, $product;
	$average = $product->get_average_rating();
	echo '<div class="star-rating"><span style="width:'.( ( $average / 5 ) * 100 ) . '%"><strong itemprop="ratingValue" class="rating">'.$average.'</strong> '.__( 'out of 5', 'woocommerce' ).'</span></div>';
}

В данном случае товары с пустым рейтингом будут выводиться с пятью пустыми звездами. Но можно сделать проверку и пустой рейтинг как-либо оформить по особенному

function get_star_rating() {
	global $woocommerce, $product;
	$average = $product->get_average_rating();

	if($average > 0) { echo '<div class="star-rating"><span style="width:'.( ( $average / 5 ) * 100 ) . '%"><strong itemprop="ratingValue" class="rating">'.$average.'</strong> '.__( 'out of 5', 'woocommerce' ).'</span></div>'; }
	else { echo '<div class="star-rating rating-empty"></div>'; }
}

Теперь у блока с пустым рейтингом появился дополнительный класс — rating-empty. Можно задать ему любые свойства css. Например .rating-empty:before {color: whitesmoke !important;}, рейтинг будет едва виден.

Убрать «Подытог»

// Убираем строку «Подытог»
add_filter( 'woocommerce_get_order_item_totals', 'adjust_woocommerce_get_order_item_totals' );

function adjust_woocommerce_get_order_item_totals( $totals ) {
  unset($totals['cart_subtotal']  );
  return $totals;
}

Изменить изображение placeholder

// Изменить миниатюру NO-IMAGE
add_action( 'init', 'custom_fix_thumbnail' );
 
function custom_fix_thumbnail() {
add_filter('woocommerce_placeholder_img_src', 'custom_woocommerce_placeholder_img_src');
   
	function custom_woocommerce_placeholder_img_src( $src ) {
	$upload_dir = wp_upload_dir();
	$uploads = untrailingslashit( $upload_dir['baseurl'] );
	$src = $uploads . '/2017/01/placeholder2.png';
	 
	return $src;
	}
}

Убрать скобки с счетчиков товаров

Убираем круглые скобки с счетчиков товаров в виджете Категории товаров

function categories_postcount_filter ($variable) {
   $variable = str_replace('(', '<span class="post_count"> ', $variable);
   $variable = str_replace(')', ' </span>', $variable);
   return $variable;
}
add_filter('wp_list_categories','categories_postcount_filter');

Убрать скобки в выводе категорий в архивах

function archive_postcount_filter ($variable) {
   $variable = str_replace('(', ' ', $variable);
   $variable = str_replace(')', ' ', $variable);
   return $variable;
}
add_filter('get_archives_link', 'archive_postcount_filter');

Убираем скобки счетчиков товаров в виджете Фильтр по атрибутам

function archive_postcount_filter ($variable) {
   $variable = str_replace('(', ' ', $variable);
   $variable = str_replace(')', ' ', $variable);
   return $variable;
}
add_filter('woocommerce_layered_nav_count', 'archive_postcount_filter');

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Купить в 1 клик

Купить в 1 клик

Добавляем в интернет-магазин кнопку «Купить в 1 клик». Рассмотрим различные плагины по данному направлению. WooCommerce Direct Checkout Плагин с 20 000 скачиваниями, по сути только меняет назначение кнопки «В корзину», Читать далее »

Конвертировать цену в рубли

Конвертировать цену в рубли

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

Фильтры Woocommerce

Фильтры Woocommerce

В базовую комплектацию Woocommerce входит набор виджетов для фильтрации товаров. Но данные виджеты необходимо несколько доработать. WooCommerce Навигация по слоям В этом виджете необходимо задать атрибут товара по которому будет Читать далее »

/ /

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

7 комментариев

  1. Никита

    Подскажите пожалуйста куда добавлять код Убрать «Подытог», в какой файл?

  2. okeseok

    У меня в ИМ вот так:Availability: 5 в наличииЯ хочу сделать вот так:В наличии: 5Скажите пожалуйста как можно это сделать?
     

  3. Алексей

    Подскажите, как можно сделать так, чтобы в рейтинги не учитывались комментарии с нулевым рейтингом (на сайте отключили обязательность выставления звездочками на случай если человек не комментирует покупку а задает уточняющий вопрос в дереве комментариев, но при выводе в шаблоне они участвуют при расчете среднего значения рейтинга,)

    1. Alexandr

      Над данной темой не размышлял. Если будет время, подумаю над решением. И если что-нибудь придумаю или найду — опишу.

  4. Алекс

    Здравствуйте. А есть какой-то хук, чтобы идентификатор оформленных заказов не начинался с единицы? Например новый магазин и id заказов соответственно начинаются с 1. Не хотелось бы, чтобы видели, что магазин только начал работу. 
    Где-то видел хук, чтобы можно было изменить эту цифру например на 1000. То есть отсчёт будет начинаться с одной тысячи и потом повышаться как обычно, но не с единицы.
    Спасибо.

  5. Мария

    Доброго времени суток!
    Автообновление корзины при изменении количества товаров работает через раз.
    Нажал +/-  и товар добавился/удалился. а кнопка Обновить Корзину только активировалась,
    НО! не перегрузилась страница —  ну и не пересчитался Итог
    и только следующий клик дает обновление Корзины — так тогда и количество другое — плюс уже 2 товара.
    где подвох?
     
     

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