mihdan
8/13/2015 - 4:18 PM

Програмное создание заказа в WooCommerce через Ajax

Програмное создание заказа в WooCommerce через Ajax

<?php
/**
 * Создание заказа по кнопке "Заказать в один клик
 */
function roomble_ajax_create_order() {

	// Получить корзину
	$cart = WC()->cart;

	$phone = esc_attr( trim( $_REQUEST['phone'] ) );
	$email = esc_attr( trim( $_REQUEST['email'] ) );
	$name = esc_attr( trim( $_REQUEST['name'] ) );
	$nonce = esc_attr( trim( $_REQUEST['nonce'] ) );

	if( ! wp_verify_nonce( $nonce, 'woocommerce-cart' ) ) {
		wp_send_json_error('Не совпадает ключ безопасности. Обратитесь к разработчикам.');
	}

	$address = [
		'first_name' => $name,
		'email'      => $email,
		'phone'      => $phone,
		'country'    => 'RU',
	];

	$order = wc_create_order();

	// Информация о покупателе
	$order->set_address( $address, 'billing' );
	$order->set_address( $address, 'shipping' );

	// Товары из корзины
	foreach( $cart->get_cart() as $cart_item_key => $cart_item ) {

		$_product     = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
		$product_id   = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

		$order->add_product( $_product, $cart_item['quantity'], [
			'variation' => $cart_item['variation'],
			'totals'    => [
				'subtotal'     => $cart_item['line_subtotal'],
				'subtotal_tax' => $cart_item['line_subtotal_tax'],
				'total'        => $cart_item['line_total'],
				'tax'          => $cart_item['line_tax'],
				'tax_data'     => $cart_item['line_tax_data']
			]
		]);
	}

	// Добавить купоны
	foreach ( $cart->get_coupons() as $code => $coupon ) {
		$order->add_coupon( $code, $cart->get_coupon_discount_amount( $code ), $cart->get_coupon_discount_tax_amount( $code ) );
	}

	$order->calculate_totals();

	// Отправить письмо юзеру
	$mailer = WC()->mailer();
	$email = $mailer->emails['WC_Email_Customer_Processing_Order'];
	$email->trigger( $order->id );

	// Отправить письмо админу
	$email = $mailer->emails['WC_Email_New_Order'];
	$email->trigger( $order->id );

	// Очистить корзину
	$cart->empty_cart();

	wp_send_json_success( $order->id );

}
add_action( 'wp_ajax_create_order', 'roomble_ajax_create_order' );
add_action( 'wp_ajax_nopriv_create_order', 'roomble_ajax_create_order' );
?>