Продолжаем серию модификаций модуля интернет коммерции Woocommerce.
Скрыть колонки редактирования товаров
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']
Добавить колонку с ценой
// Цена в админке
function true_add_post_columns($my_columns){
$slider = array( 'price' => 'Цена' );
$my_columns = array_slice( $my_columns, 0, 5, true ) + $slider + array_slice( $my_columns, 5, NULL, true );
return $my_columns;
}
function true_fill_post_columns( $column ) {
global $post;
switch ( $column ) {
case 'price':
break;
}
}
add_filter( 'manage_edit-product_columns', 'true_add_post_columns', 10, 1 ); // manage_edit-{тип поста}_columns
add_action( 'manage_posts_custom_column', 'true_fill_post_columns', 10, 1 );
Так же, для красоты, не помешает добавить к стилям админки th#price {width: 20ch;}, чтобы колонка с ценой не была слишком узкой. Как это сделать — читать тут.
Фильтр по статусу наличия товаров
В админке 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' );
Минимальный заказ
Устанавливаем минимальную сумму заказа. Если заказ будет на меньшую сумму магазин выдаст предупреждение
//Устанавливаем минимальную сумму заказа
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->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){
if(empty($price)) return $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);
До бесплатной доставки осталось…
Выведем текстовый блок в корзине, который будет показывать посетителю, сколько ему осталось до бесплатной доставки.
// Сколько осталось до бесплатной доставки
function get_left_to_free_shipping( $content, $multiply_by = 1 ) {
if ( '' == $content ) {
$content = __( '%left_to_free% left to free shipping', 'woocommerce-jetpack' );
}
$min_free_shipping_amount = 0;
$legacy_free_shipping = new WC_Shipping_Legacy_Free_Shipping();
if ( 'yes' === $legacy_free_shipping->enabled ) {
if ( in_array( $legacy_free_shipping->requires, array( 'min_amount', 'either', 'both' ) ) ) {
$min_free_shipping_amount = $legacy_free_shipping->min_amount;
}
}
if ( 0 == $min_free_shipping_amount ) {
if ( function_exists( 'WC' ) && ( $wc_shipping = WC()->shipping ) && ( $wc_cart = WC()->cart ) ) {
if ( $wc_shipping->enabled ) {
if ( $packages = $wc_cart->get_shipping_packages() ) {
$shipping_methods = $wc_shipping->load_shipping_methods( $packages[0] );
foreach ( $shipping_methods as $shipping_method ) {
if ( 'yes' === $shipping_method->enabled && 0 != $shipping_method->instance_id ) {
if ( 'WC_Shipping_Free_Shipping' === get_class( $shipping_method ) ) {
if ( in_array( $shipping_method->requires, array( 'min_amount', 'either', 'both' ) ) ) {
$min_free_shipping_amount = $shipping_method->min_amount;
break;
}
}
}
}
}
}
}
}
$free_shipping = new WC_Shipping_Free_Shipping();
if ( in_array( $free_shipping->requires, array( 'min_amount', 'either', 'both' ) ) ) {
$min_free_shipping_amount = $free_shipping->min_amount;
}
if ( 0 != $min_free_shipping_amount ) {
if ( isset( WC()->cart->cart_contents_total ) ) {
$cart_taxes = ( "WCJ_IS_WC_VERSION_BELOW_3_2_0" ? WC()->cart->get_taxes() : WC()->cart->get_cart_contents_taxes() );
$total = ( WC()->cart->prices_include_tax ) ? WC()->cart->cart_contents_total + array_sum( $cart_taxes ) : WC()->cart->cart_contents_total;
if ( $total >= $min_free_shipping_amount ) {
return do_shortcode( get_option( 'wcj_shipping_left_to_free_info_content_reached', __( 'У вас бесплатная доставка!', 'woocommerce-jetpack' ) ) );
} else {
$content = str_replace( '%left_to_free%', wc_price( ( $min_free_shipping_amount - $total ) * $multiply_by ), $content );
$content = str_replace( '%free_shipping_min_amount%', wc_price( ( $min_free_shipping_amount ) * $multiply_by ), $content );
return $content;
}
}
}
return $content;
}
// Добавление в корзину блока с информацией о бесплатной доставке
function how_much_is_to_free_delivery() {
$content = 'Вам не хватает %left_to_free% до бесплатной доставки.<!--<br>Всего нужно %free_shipping_min_amount%-->';
$free_text = get_left_to_free_shipping( $content );
echo '<div class="free-shipping-info">'.$free_text.'</div>';
};
add_action( 'woocommerce_cart_totals_after_order_total', 'how_much_is_to_free_delivery', 12 );
