Проверка по количеству на складе в Add-to-Cart и скрытие вариантов с недостаточным запасом (пользовательский скрипт) - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть собственный скрипт, который уменьшает запасы на основе значений в настраиваемом поле, расположенном в моих продуктах вариантов. Затем это значение сравнивается с текущей суммой запаса, и если оно превышает доступное, возвращается ошибка. Все это работает нормально.

Проблемы, с которыми я сталкиваюсь:

  • Если вы находитесь на той же странице продукта и решили добавить другое количество «1», ошибка не срабатывает - но это произойдет, если «2» превысит go на складе. Не уверен, как это исправить.

  • Вторая проблема заключается в том, что у меня есть переменный продукт с 3 вариантами. 100 г, 200 г и 500 г. Мне нужно скрыть оба варианта: 200 г и 500 г, когда, скажем, в наличии только 150 г.

Я потратил кучу усилий, пытаясь найти решения, но продолжаю терпеть неудачу. Я не самый продвинутый программист, поэтому я думаю, что моя проблема заключается в том, что я не знаю, какие фильтры или хуки действий должны быть нацелены, чтобы найти нужную документацию.

 // 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 );
        $stock_weight_checkbox = $product->get_meta( '_stock_weight_checkbox', true );

    var_dump($stock_weight_checkbox);

    // 'custom_field' is "15 grams" - keep only the numbers
    $quantity_grams = preg_replace('/[^0-9.]+/', '', $term_name);

    // new quantity
    if( 'yes' == $stock_weight_checkbox && is_numeric ( $quantity_grams ) && $quantity_grams != 0 )
        $quantity *= $quantity_grams;

    return $quantity;
}

function validate_attribute_weight( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
    // Get custom field
    $weight = get_post_meta( $variation_id, 'custom_field', true );
    $stock_weight_checkbox = get_post_meta( get_the_id(),'_stock_weight_checkbox', true );

    if ( 'yes' == $stock_weight_checkbox && ! empty( $weight ) ) {
        // Get product object
        $product = wc_get_product( $product_id );

        // Get current product stock
        $product_stock = $product->get_stock_quantity();

        // ( Weight * quantity ) > product stock
        if( ( ( $weight * $quantity ) > $product_stock ) ) {
            wc_add_notice( sprintf( 'Sorry, you cannot add <strong>' . $weight .'</strong> of <strong>%1$s</strong> to the cart because there are only <strong>%2$sg</strong> left in our inventory. Please choose a lesser amount. We hope to have more in stock shortly.', $product->get_name(), $product_stock ), 'error' );
            $passed = false;
        }
    }

    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'validate_attribute_weight', 10, 5 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...