После того, как я ударился головой о стену, мне, наконец, удалось уменьшить количество своего запаса на основе значения в настраиваемом поле.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что она не проверяется надлежащим образом (во-вторых, часть). Несмотря на то, что на складе только скажем 20, я все еще могу добавить 50 к корзине и оформить заказ (оставив свой инвентарь в минусе). Я бы предпочел добавить в корзину, используя AJAX, но сейчас я просто хочу, чтобы эта проверка работала. Любое понимание?
// reduce stock based on custom field
add_filter( 'woocommerce_order_item_quantity', 'filter_order_item_quantity', 10, 3 );
function filter_order_item_quantity( $quantity, $order, $item )
{
$product = $item->get_product();
$term_name = $product->get_meta( 'custom_field', true );
// 'pa_weight' attribute value is "15 grams" - keep only the numbers
$quantity_grams = preg_replace('/[^0-9.]+/', '', $term_name);
// new quantity
if( is_numeric ( $quantity_grams ) && $quantity_grams != 0 )
$quantity *= $quantity_grams;
return $quantity;
}
// check out of stock using custom field
add_filter( 'woocommerce_add_to_cart_validation', 'woocommerce_validate_attribute_weight' );
function woocommerce_validate_attribute_weight()
{
// get product id
if (isset($_REQUEST["add-to-cart"])) {
$productid = (int)$_REQUEST["add-to-cart"];
} else {
$productid = null;
}
// get quantity
if (isset($_REQUEST["quantity"])) {
$quantity = (int)$_REQUEST["quantity"];
} else {
$quantity = 1;
}
// get weight of selected attribute
if (isset($_REQUEST["custom_field"])) {
$weight = preg_replace('/[^0-9.]+/', '', $_REQUEST["custom_field"]);
} else {
$weight = null;
}
// comparing stock
if($productid && $weight)
{
$product = wc_get_product($productid);
$productstock = (int)$product->get_stock_quantity();
if(($weight * $quantity) > $productstock)
{
wc_add_notice( sprintf( 'You cannot add that amount of "%1$s" to the cart because there is not enough stock (%2$s remaining).', $product->get_title(), $productstock ), 'error' );
return;
}
}
return true;
}