Хук Woocommerce для проверки наличия / отмены заказа после размещения заказа, до обработки заказа - PullRequest
0 голосов
/ 27 декабря 2018

Я расширяю WooCommerce, используя другой плагин.Я проверяю запас товаров в корзине после того, как был сделан заказ.Затем я обновляю запас на основе количества, полученного от стороннего API-вызова.Заказ все еще выполняется, когда количество на складе меньше, чем заказываемое количество.

Я использую зацепку woocommerce_checkout_order_processed и также пытался использовать woocommerce_create_order.В обоих случаях мне удалось успешно обновить количество Продукта с помощью количества, возвращенного из стороннего API.Оба хука привели к нежелательному поведению заказа, который все еще обрабатывается, даже если товара нет на складе.Мне интересно, стоит ли мне вместо этого использовать woocommerce_after_checkout_validation, но я не уверен в том, как его реализовать.

add_action( 'woocommerce_checkout_order_processed', $plugin_extension, 'woo_integrator_check_stock_before_processing_order', 1, 1 );    

public function woo_integrator_check_stock_before_processing_order ( $order_id ) {
$order = wc_get_order ( $order_id );
$items = $order->get_items();
$item_qty_sku = array();

foreach( $items as $key => $item){
    $product = wc_get_product($item['product_id']);
    $item_qty_sku[] =  array(
        'SKU' => $product->get_sku(),
        'Name' => $product->get_name(),
        'Quantity' => $item['qty']
    );
}

// to test out the API, set $api_mode as ‘sandbox’
$api_mode = 'sandbox';
if($api_mode == 'sandbox'){
    // sandbox URL example
    $endpoint = "sandbox.com/endpoint"; 
}
else{
    // production URL example
    $endpoint = "production.com/endpoint"; 
}

// setup the data which has to be sent
$data = new stdClass();
$data = json_encode($item_qty_sku);

// send API request via cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_HTTPHEADER,array('content-type: application/json',));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec ($ch);

curl_close ($ch);
$json = json_decode($response);

// the handle response    
if (strpos($response,'ERROR') !== false) {
    print_r($json);
} 
else {
    // success
   foreach($json as $key => $json_product){
        foreach( $items as $key => $item ){
            $product = wc_get_product($item['product_id']);
            if( $product->get_sku() == $json_product->SKU ){
                if( $item['qty'] != $json_product->Quantity){
                    $product->set_stock_quantity($json_product->Quantity);
                    $product->save();
                    }
                }
            }           
        }
    }
}

Ожидается: заказ не выполняется, если количество запаса товара, возвращенное из API, меньше, чем количество, которое пытается быть заказанным.

Фактически: заказ завершается, даже если количество продукта, возвращенное из API, меньше, чем количество, которое пытается быть заказанным.Количество на складе товара имеет отрицательное значение.

Фактический пример: Заказ 5 какого-либо товара.API возвращает, что есть только 3 на складе.Заказ завершен.В WooCommerce количество запаса для этого продукта теперь равно -2.

Ожидаемый пример: Заказ 5 какого-либо продукта.API возвращает, что есть только 3 на складе.Заказ не проходит.В WooCommerce количество товара для этого товара теперь равно 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...