Woocommerce 3에서 체크아웃 시 Ajax를 통해 주문 제출 및 작성
체크아웃 양식에 버튼을 추가했습니다.
<input type="submit" id="ajax-order-btn" class="button" value="Place Order via AJAX" />
에 AJAX 스니펫을 추가했습니다.functions.php
파일:
add_action('wp_head', 'ajax_call_place_order');
function ajax_call_place_order() {
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {
$(document).on("click", "#ajax-order-btn" ,function(e) {
e.preventDefault();
var data = {
action: 'ajax_order',
};
$.post('<?php echo esc_url( home_url() ); ?>/wp-admin/admin-ajax.php', data);
});
});
</script>
<?php
}
다음으로 프로그래밍 방식으로 주문을 작성하는 AJAX 콜백을 나타냅니다.
add_action('wp_ajax_ajax_order', 'ajax_order_callback_wp');
add_action( 'wp_ajax_nopriv_ajax_order', 'ajax_order_callback_wp' );
function ajax_order_callback_wp() {
$address = array(
'first_name' => 'John',
'last_name' => 'Doe',
'company' => 'Speed Society',
'email' => 'joe@testing.com',
'phone' => '760-555-1212',
'address_1' => '123 Main st.',
'address_2' => '104',
'city' => 'San Diego',
'state' => 'Ca',
'postcode' => '92121',
'country' => 'US'
);
$order = wc_create_order();
$order->add_product( get_product('275962'), 1); // This is an existing SIMPLE product
$order->set_address( $address, 'billing' );
$order->calculate_totals();
$order->update_status("Completed", 'Imported order', TRUE);
}
문제는 현재 주문 데이터를 얻을 수 있는 방법을 찾을 수 없고, 현재 하드코딩된 데이터가 아닌 프로그래밍 방식으로 주문을 작성할 때 그 데이터를 사용할 수 없다는 것입니다.Checkout 페이지의 현재 주문과 동일한 주문을 해야 합니다.
나는 로 시도하고WC_Checkout
, 및 메서드create_order()
그리고.get_checkout_fields()
하지만 성공하지 못했습니다.
PHP 주문 작성에는 WC_Checkout에서 커스텀 클론을 사용합니다.create_order()
완벽하게 작동하는 방법제출된 모든 데이터는 자동으로 순서대로 설정됩니다.
커스텀 오더 메타 데이터 및 커스텀 오더 아이템 메타 데이터의 경우 다음과 같이 모든 woocommerce 기본 후크를 사용할 수 있습니다.
woocommerce_checkout_create_order
woocommerce_checkout_update_order_meta
woocommerce_checkout_create_order_line_item
- 등등
또, jQuery 코드에 필요한 변경을 가하고, 필요한 포맷 데이터를 Ajax*(현재 바닥글에 있습니다)* 경유로 PHP에 송신했습니다.
Ajax를 통해 주문을 작성하는 전체 코드:
add_action('wp_footer', 'checkout_billing_email_js_ajax' );
function checkout_billing_email_js_ajax() {
// Only on Checkout
if( is_checkout() && ! is_wc_endpoint_url() ) :
?>
<script type="text/javascript">
jQuery(function($){
if (typeof wc_checkout_params === 'undefined')
return false;
$(document.body).on("click", "#ajax-order-btn" ,function(evt) {
evt.preventDefault();
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
enctype: 'multipart/form-data',
data: {
'action': 'ajax_order',
'fields': $('form.checkout').serializeArray(),
'user_id': <?php echo get_current_user_id(); ?>,
},
success: function (result) {
console.log(result); // For testing (to be removed)
},
error: function(error) {
console.log(error); // For testing (to be removed)
}
});
});
});
</script>
<?php
endif;
}
add_action('wp_ajax_ajax_order', 'submited_ajax_order_data');
add_action( 'wp_ajax_nopriv_ajax_order', 'submited_ajax_order_data' );
function submited_ajax_order_data() {
if( isset($_POST['fields']) && ! empty($_POST['fields']) ) {
$order = new WC_Order();
$cart = WC()->cart;
$checkout = WC()->checkout;
$data = [];
// Loop through posted data array transmitted via jQuery
foreach( $_POST['fields'] as $values ){
// Set each key / value pairs in an array
$data[$values['name']] = $values['value'];
}
$cart_hash = md5( json_encode( wc_clean( $cart->get_cart_for_session() ) ) . $cart->total );
$available_gateways = WC()->payment_gateways->get_available_payment_gateways();
// Loop through the data array
foreach ( $data as $key => $value ) {
// Use WC_Order setter methods if they exist
if ( is_callable( array( $order, "set_{$key}" ) ) ) {
$order->{"set_{$key}"}( $value );
// Store custom fields prefixed with wither shipping_ or billing_
} elseif ( ( 0 === stripos( $key, 'billing_' ) || 0 === stripos( $key, 'shipping_' ) )
&& ! in_array( $key, array( 'shipping_method', 'shipping_total', 'shipping_tax' ) ) ) {
$order->update_meta_data( '_' . $key, $value );
}
}
$order->set_created_via( 'checkout' );
$order->set_cart_hash( $cart_hash );
$order->set_customer_id( apply_filters( 'woocommerce_checkout_customer_id', isset($_POST['user_id']) ? $_POST['user_id'] : '' ) );
$order->set_currency( get_woocommerce_currency() );
$order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) );
$order->set_customer_ip_address( WC_Geolocation::get_ip_address() );
$order->set_customer_user_agent( wc_get_user_agent() );
$order->set_customer_note( isset( $data['order_comments'] ) ? $data['order_comments'] : '' );
$order->set_payment_method( isset( $available_gateways[ $data['payment_method'] ] ) ? $available_gateways[ $data['payment_method'] ] : $data['payment_method'] );
$order->set_shipping_total( $cart->get_shipping_total() );
$order->set_discount_total( $cart->get_discount_total() );
$order->set_discount_tax( $cart->get_discount_tax() );
$order->set_cart_tax( $cart->get_cart_contents_tax() + $cart->get_fee_tax() );
$order->set_shipping_tax( $cart->get_shipping_tax() );
$order->set_total( $cart->get_total( 'edit' ) );
$checkout->create_order_line_items( $order, $cart );
$checkout->create_order_fee_lines( $order, $cart );
$checkout->create_order_shipping_lines( $order, WC()->session->get( 'chosen_shipping_methods' ), WC()->shipping->get_packages() );
$checkout->create_order_tax_lines( $order, $cart );
$checkout->create_order_coupon_lines( $order, $cart );
/**
* Action hook to adjust order before save.
* @since 3.0.0
*/
do_action( 'woocommerce_checkout_create_order', $order, $data );
// Save the order.
$order_id = $order->save();
do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );
echo 'New order created with order ID: #'.$order_id.'.' ;
}
die();
}
코드가 기능합니다.php 파일에는 액티브한 아이 테마(또는 활성 테마).테스트 및 동작.
체크아웃 필드 데이터도 게시하고 데이터를 캡처하도록 JS 기능을 만듭니다.$_POST
jQuery(document).ready(function($) {
$(document).on("click", "#ajax-order-btn" ,function(e) {
e.preventDefault();
var post_data: $( 'form.checkout' ).serialize()
var data = {
action: 'ajax_order',
post_data : post_data
};
$.post('<?php echo esc_url( home_url() ); ?>/wp-admin/admin-ajax.php', data);
});
});
언급URL : https://stackoverflow.com/questions/55423974/submit-and-create-an-order-on-checkout-via-ajax-in-woocommerce-3
'programing' 카테고리의 다른 글
Mongo 문서를 삽입한 후 업데이트하려면 어떻게 해야 하나요? (0) | 2023.03.12 |
---|---|
mongo 명령어가 mongodb 서버에 접속하려고 할 때 인식되지 않음 (0) | 2023.03.12 |
입력 상자가 비어 있는지 확인합니다. (0) | 2023.03.12 |
Angular의 지시 변수에 배열 바인딩JS (0) | 2023.03.12 |
Mac OSX Mavericks(10.9.2)에서 Spring Boot 부팅이 매우 느린 이유는 무엇입니까? (0) | 2023.03.07 |