Woocommerce에서 쿠폰을 프로그래밍 방식으로 적용합니다.
Woocommerce에서는 카트 중량이 100파운드 이상일 경우 전체 고객 주문에 10% 할인을 적용할 수 있는 방법을 찾고 있습니다.나는 이것을 이루기 위한 중간 단계이다.다음 단계에서는 functions.php를 통해 액션/훅을 통해 쿠폰 코드를 프로그래밍 방식으로 적용할 수 있는 방법을 찾고 있습니다.
woocommerce_display_displays_displays 함수를 사용하여 이 작업을 수행할 수 있는 것으로 보이는데(http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html ) 사용방법을 잘 모르겠습니다.
지금까지 카트 내 모든 제품의 총 중량을 측정하기 위해 cart.php를 수정하고 할인 적용 쿠폰(수동으로 입력한 경우)을 작성했으며 기능에 코드를 추가했습니다.php: 무게를 확인하고 사용자에게 메시지를 표시합니다.
편집: 코드 일부가 삭제되어 다음 솔루션에 코드가 포함되어 있습니다.
안내해주셔서 감사합니다, 프레니조건이 충족되면 할인 쿠폰을 성공적으로 적용하고 조건이 충족되지 않으면 할인 쿠폰을 제거하는 최종 결과는 다음과 같습니다.
/* 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 값을 반환합니다.할인이 성공하면 TRUE, 여러 가지 이유 중 하나로 실패하면 FALSE입니다.
이 솔루션을 사용했는데 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();
}
}
}
}
2017/2019년 Woocommerce 3 이후
하나의 후크 함수에 있는 다음 콤팩트 코드는 사용자 지정 메시지를 표시하는 카트 총 중량에 따라 할인(쿠폰)을 추가합니다.고객이 카트 아이템을 변경한 경우, 카트 중량이 정의된 중량 미만일 경우 할인(쿠폰)을 제외한 카트 아이템이 코드에 의해 체크됩니다.
코드:
add_action('woocommerce_before_calculate_totals', 'discount_based_on_weight_threshold');
function discount_based_on_weight_threshold( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Your settings
$coupon_code = 'onweight10'; // Coupon code
$weight_threshold = 100; // Total weight threshold
// Initializing variables
$total_weight = $cart->get_cart_contents_weight();
$applied_coupons = $cart->get_applied_coupons();
$coupon_code = sanitize_text_field( $coupon_code );
// Applying coupon
if( ! in_array($coupon_code, $applied_coupons) && $total_weight >= $weight_threshold ){
$cart->add_discount( $coupon_code );
wc_clear_notices();
wc_add_notice( sprintf(
__("Your order is over %s so a %s Discount has been Applied! Your total order weight is %s.", "woocommerce"),
wc_format_weight( $weight_threshold ), '10%', '<strong>' . wc_format_weight( $total_weight ) . '</strong>'
), "notice");
}
// Removing coupon
elseif( in_array($coupon_code, $applied_coupons) && $total_weight < $weight_threshold ){
$cart->remove_coupon( $coupon_code );
}
}
코드가 기능합니다.php 파일에는 액티브한 아이 테마(또는 활성 테마).테스트 및 동작.
언급URL : https://stackoverflow.com/questions/15744689/apply-a-coupon-programmatically-in-woocommerce
'programing' 카테고리의 다른 글
Oracle Connection URL 기본 스키마 (0) | 2023.02.26 |
---|---|
JSON 문자열을 탈출하는 방법 (0) | 2023.02.26 |
동기 http 콜(angular)JS (0) | 2023.02.26 |
JSON 필드에 대한 업데이트가 DB에 지속되지 않음 (0) | 2023.02.26 |
Wordpress - 학습되지 않은 구문 오류:예기치 않은 토큰 < (0) | 2023.02.26 |