Продолжаем дорабатывать различные аспекты модуля 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;
}
Более правильное поведение обновления: только когда пройдет секунда после внесения изменений, а не во время их.
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');
[site-socialshare]
Подскажите пожалуйста куда добавлять код Убрать «Подытог», в какой файл?
В functions.php
У меня в ИМ вот так:Availability: 5 в наличииЯ хочу сделать вот так:В наличии: 5Скажите пожалуйста как можно это сделать?
Подскажите, как можно сделать так, чтобы в рейтинги не учитывались комментарии с нулевым рейтингом (на сайте отключили обязательность выставления звездочками на случай если человек не комментирует покупку а задает уточняющий вопрос в дереве комментариев, но при выводе в шаблоне они участвуют при расчете среднего значения рейтинга,)
Над данной темой не размышлял. Если будет время, подумаю над решением. И если что-нибудь придумаю или найду — опишу.
Здравствуйте. А есть какой-то хук, чтобы идентификатор оформленных заказов не начинался с единицы? Например новый магазин и id заказов соответственно начинаются с 1. Не хотелось бы, чтобы видели, что магазин только начал работу.
Где-то видел хук, чтобы можно было изменить эту цифру например на 1000. То есть отсчёт будет начинаться с одной тысячи и потом повышаться как обычно, но не с единицы.
Спасибо.
Доброго времени суток!
Автообновление корзины при изменении количества товаров работает через раз.
Нажал +/- и товар добавился/удалился. а кнопка Обновить Корзину только активировалась,
НО! не перегрузилась страница — ну и не пересчитался Итог
и только следующий клик дает обновление Корзины — так тогда и количество другое — плюс уже 2 товара.
где подвох?