Продолжаем серию модификаций модуля интернет коммерции 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){ $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 );