Неправильно проверяется при добавлении в корзину. Можно еще купить больше акций, чем в инвентаре - PullRequest
1 голос
/ 05 апреля 2020

После того, как я ударился головой о стену, мне, наконец, удалось уменьшить количество своего запаса на основе значения в настраиваемом поле.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что она не проверяется надлежащим образом (во-вторых, часть). Несмотря на то, что на складе только скажем 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...