주문 에이잭스에 수수료를 추가하는 woocommerce 커스텀 체크아웃 필드
체크아웃 시 주문 총액에 커스텀 수수료를 붙이려고 합니다.woocommerce에 체크박스를 추가했습니다.
add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' );
function add_box_option_to_checkout( $checkout ) {
echo '<div id="message_fields">';
woocommerce_form_field( 'add_gift_box', array(
'type' => 'checkbox',
'class' => array('add_gift_box form-row-wide'),
'label' => __('Ilość pudełek ozdobnych - 25 PLN/szt'),
'placeholder' => __(''),
), $checkout->get_value( 'add_gift_box' ));
}
이벤트를 처리할 사용자 지정 js 파일을 포함했습니다.
jQuery( document ).ready(function( $ ) {
$('#add_gift_box').click(function(){
var data = {
action: 'woocommerce_add_gift_box',
state: '200',
};
jQuery.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: data,
success: function (code) {
console.log(code);
jQuery('body').trigger('update_checkout');
},
dataType: 'html'
});
});
});
그리고 php 수수료 처리 기능
function woo_add_cart_fee( $data ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) || ! $_POST ) return;
$extracost = 0;
if (isset($_POST['state'])) {
$extracost = intval($_POST['state']);
}
WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost );
}
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
add_action('wp_ajax_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);
add_action('wp_ajax_nopriv_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);
어떤 이유로 $_POST['state']의 값이 추가되지 않고 하드코드화된 값을 지정하면 이 함수는 동작합니다.여러 가지 옵션을 시도해 봤지만 동작하지 않습니다.
비슷한 글을 봤는데 정답이 하나도 없어요.
포스트 데이터는 'post_data'의 AJAX 함수에 의해 전송되어 시리얼화 됩니다.따라서 체크박스의 값을 얻으려면parse_str()
이거!
parse_str( $_POST['post_data'], $post_data );
그러면 'add_module_box' 옵션을$post_data['add_gift_box']
주문이 완료되면 이 'post_data' 요소는 더 이상 사용할 수 없으며 모든 것이 다음 위치에 있음을 유의하십시오.$_POST
.
코드에 근거한 완전한 예:
1) 체크박스를 체크아웃에 추가합니다.
add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' );
function add_box_option_to_checkout( $checkout ) {
echo '<div id="message_fields">';
woocommerce_form_field( 'add_gift_box', array(
'type' => 'checkbox',
'class' => array('add_gift_box form-row-wide'),
'label' => __('Ilość pudełek ozdobnych - 25 PLN/szt'),
'placeholder' => __(''),
), $checkout->get_value( 'add_gift_box' ));
echo '</div>';
}
2) 체크박스를 클릭했을 때 카트를 갱신하는 스크립트 (추가 AJAX 요청 불필요!)
add_action( 'wp_footer', 'woocommerce_add_gift_box' );
function woocommerce_add_gift_box() {
if (is_checkout()) {
?>
<script type="text/javascript">
jQuery( document ).ready(function( $ ) {
$('#add_gift_box').click(function(){
jQuery('body').trigger('update_checkout');
});
});
</script>
<?php
}
}
3) 수수료 추가 조치
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
return;
}
if ( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST; // fallback for final checkout (non-ajax)
}
if (isset($post_data['add_gift_box'])) {
$extracost = 25; // not sure why you used intval($_POST['state']) ?
WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost );
}
}
대박이다!!정말 감사해요.대신 백분율을 추가하도록 조금 변경했습니다.이것이 더 나은 답이 아니라는 것을 알지만 당신의 대답을 재촉할 만한 평판은 없습니다.나처럼 갇힌 사람이 누구든..
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); function woo_add_cart_fee( $cart ){
global $woocommerce;
if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
return;
}
if ( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST; // fallback for final checkout (non-ajax)
}
if (isset($post_data['add_gift_box'])) {
$percentage = 0.01;
$surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;
$woocommerce->cart->add_fee( 'Surcharge', $surcharge, true, '' );
}
}
언급URL : https://stackoverflow.com/questions/32119053/woocommerce-custom-checkout-field-to-add-fee-to-order-ajax
'programing' 카테고리의 다른 글
MongoDB에서 대소문자를 구분하지 않는 정렬 (0) | 2023.03.10 |
---|---|
Joda DateTime을 ISO 8601 형식으로 자동 포맷 (0) | 2023.03.10 |
구성 요소 속성이 현재 날짜/시간에 따라 달라지는 경우 Angular2 "체크된 후 식이 변경되었습니다" 예외를 관리하는 방법 (0) | 2023.03.10 |
Xmlhttp 요청 리디렉션 방지 (0) | 2023.03.10 |
온라인/오프라인 상태 변화 감지 방법 (0) | 2023.03.10 |