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

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

HIT

02.11.2016

9064

6

Продолжаем дорабатывать различные аспекты модуля 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');

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

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

Статусы заказов

Как и любой интернет-магазин Woocommerce присваивает заказам определенные статусы в зависимости от отплаты и формирования заказа. Существует 7 различных статусов заказа: В ожидании оплаты (Pending payment) Обработка (Processing) На удержании Читать далее »

Обзор плагинов по созданию скидок

Обзор плагинов по созданию скидок

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

Функция действующая на конкретный раздел

Функция действующая на конкретный раздел

Создадим функцию, которая будет действовать на конкретный раздел сайта, в частности на конкретную категорию woocommerce. Задачу разобьем на 2 этапа: выборка категорий необходимых для воздействия и непосредственно функция. Вывод определенного Читать далее »

/

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

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

  1. Никита

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

  2. okeseok

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

  3. Алексей

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

    1. Alexandr

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

  4. Алекс

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

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