В Woocommerce я пытаюсь найти способ применить 10% скидку на заказ всего клиента, если вес в тележке превышает 100 фунтов. Я часть пути к достижению этого. На следующем шаге я ищу способ программно применить код купона через action / hook через функции.php.
Похоже, что я могу использовать функцию woocommerce_ajax_apply_coupon для этого ( http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html ), но я не уверен, как ее использовать.
Пока я изменил cart.php, чтобы получить общий вес всех продуктов в корзине, я создал купон, который применяет скидку (если введено вручную), и я добавил некоторый код в functions.php, чтобы проверить вес и отображение сообщения пользователю.
EDIT: Частичный код удален, полный код включен в решение ниже.
Спасибо за руководство Freney. Вот результат работы, который успешно применяет скидочный купон при выполнении условия, а также удаляет его, когда он больше не выполняется:
/* Mod: 10% Discount for weight greater than 100 lbs Works with code added to child theme: woocommerce/cart/cart.php lines 13 - 14: which gets $total_weight of cart: global $total_weight; $total_weight = $woocommerce->cart->cart_contents_weight; */ add_action('woocommerce_before_cart_table', 'discount_when_weight_greater_than_100'); function discount_when_weight_greater_than_100( ) { global $woocommerce; global $total_weight; if( $total_weight > 100 ) { $coupon_code = '999'; if (!$woocommerce->cart->add_discount( sanitize_text_field( $coupon_code ))) { $woocommerce->show_messages(); } echo '<div class="woocommerce_message"><strong>Your order is over 100 lbs so a 10% Discount has been Applied!</strong> Your total order weight is <strong>' . $total_weight . '</strong> lbs.</div>'; } } /* Mod: Remove 10% Discount for weight less than or equal to 100 lbs */ add_action('woocommerce_before_cart_table', 'remove_coupon_if_weight_100_or_less'); function remove_coupon_if_weight_100_or_less( ) { global $woocommerce; global $total_weight; if( $total_weight <= 100 ) { $coupon_code = '999'; $woocommerce->cart->get_applied_coupons(); if (!$woocommerce->cart->remove_coupons( sanitize_text_field( $coupon_code ))) { $woocommerce->show_messages(); } $woocommerce->cart->calculate_totals(); } }
Сначала создайте купон на скидку (через http://docs.woothemes.com/document/create-a-coupon-programatically/ ):
$coupon_code = 'UNIQUECODE'; // Code - perhaps generate this from the user ID + the order ID $amount = '10'; // Amount $discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product $coupon = array( 'post_title' => $coupon_code, 'post_content' => '', 'post_status' => 'publish', 'post_author' => 1, 'post_type' => 'shop_coupon' ); $new_coupon_id = wp_insert_post( $coupon ); // Add meta update_post_meta( $new_coupon_id, 'discount_type', $discount_type ); update_post_meta( $new_coupon_id, 'coupon_amount', $amount ); update_post_meta( $new_coupon_id, 'individual_use', 'no' ); update_post_meta( $new_coupon_id, 'product_ids', '' ); update_post_meta( $new_coupon_id, 'exclude_product_ids', '' ); update_post_meta( $new_coupon_id, 'usage_limit', '1' ); update_post_meta( $new_coupon_id, 'expiry_date', '' ); update_post_meta( $new_coupon_id, 'apply_before_tax', 'yes' ); update_post_meta( $new_coupon_id, 'free_shipping', 'no' );
Затем примените этот купон к вашему заказу:
if (!$woocommerce->cart->add_discount( sanitize_text_field( $coupon_code ))) $woocommerce->show_messages();
Эта последняя функция возвращает значение BOOL: ИСТИНА, если скидка была успешной, ЛОЖЬ, если она терпит неудачу по любой из причин.
Я использовал это решение, но он содержит ошибку, как это написал OP. Если пользователь пропускает предварительный просмотр тележки и идет прямо в форму выписки, она не применяется к купону. Вот мое решение.
// Independence day 2013 coupon auto add // Add coupon when user views cart before checkout (shipping calculation page). add_action('woocommerce_before_cart_table', 'add_independence_day_2013_coupon_automatically'); // Add coupon when user views checkout page (would not be added otherwise, unless user views cart first). add_action('woocommerce_before_checkout_form', 'add_independence_day_2013_coupon_automatically'); // Check if php function exists. If it doesn't, create it. if (!function_exists('add_independence_day_2013_coupon_automatically')) { function add_independence_day_2013_coupon_automatically() { global $woocommerce; $coupon_code = 'independencedaysale'; $bc_coupon_start_date = '2013-06-30 17:00:00'; $bc_coupon_end_date = '2013-07-08 06:59:59'; // Only apply coupon between 12:00am on 7/1/2013 and 11:59pm on 7/7/2013 PST. if ((time() >= strtotime($bc_coupon_start_date)) && (time() <= strtotime($bc_coupon_end_date))) { // If coupon has been already been added remove it. if ($woocommerce->cart->has_discount(sanitize_text_field($coupon_code))) { if (!$woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) { $woocommerce->show_messages(); } } // Add coupon if (!$woocommerce->cart->add_discount(sanitize_text_field($coupon_code))) { $woocommerce->show_messages(); } else { $woocommerce->clear_messages(); $woocommerce->add_message('Independence day sale coupon (10%) automatically applied'); $woocommerce->show_messages(); } // Manually recalculate totals. If you do not do this, a refresh is required before user will see updated totals when discount is removed. $woocommerce->cart->calculate_totals(); } else { // Coupon is no longer valid, based on date. Remove it. if ($woocommerce->cart->has_discount(sanitize_text_field($coupon_code))) { if ($woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) { $woocommerce->show_messages(); } // Manually recalculate totals. If you do not do this, a refresh is required before user will see updated totals when discount is removed. $woocommerce->cart->calculate_totals(); } } } }