Я расширяю 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.