WooCommerce - Фиксированное количество товара

15 нояб. 2012 г., 12:28:55
Просмотры: 13.4K
Голосов: 2

Я пытаюсь реализовать в WooCommerce функционал, о котором не могу найти информацию. Вот сценарий:

Я продаю винты и у меня есть 1500 штук на складе. Я хочу, чтобы клиент мог выбирать между покупкой 10, 30, 50 или 100 винтов через выпадающий список. Цена за винт снижается при покупке 100 штук по сравнению с 10, 30 и т.д.

Это работает как нужно с помощью атрибутов товара и вариаций. НО запасы не уменьшаются так, как я хочу, потому что система считает, что это одна упаковка из 100 винтов и уменьшает запас на 1.

Я думаю о модификации файла class-wc-product-variation.php, который содержит следующий код:

function reduce_stock( $by=1 ) {
    global $woocommerce;
    if ( $this->variation_has_stock ) {
        if ( $this->managing_stock() ) {
            $this->stock        = $this->stock - $by;
            $this->total_stock  = $this->total_stock - $by;
            update_post_meta( $this->variation_id, '_stock', $this->stock );
            $woocommerce->clear_product_transients( $this->id ); // Очищаем временные данные
            // Проверяем атрибут отсутствия на складе для родителя
            if ( ! $this->is_in_stock() ) {
                // Проверяем родительский товар
                $parent_product = new WC_Product( $this->id );
                // Продолжаем только если у родителя отключен предзаказ
                if ( ! $parent_product->backorders_allowed() && $parent_product->get_total_stock() <= 0 ) {
                    update_post_meta( $this->id, '_stock_status', 'outofstock' );
                }
            }
            return $this->stock;
        }
    } else {
        return parent::reduce_stock( $by );
    }
}

Я пытаюсь установить $by равным названию вариации товара (10, 30, 50, 100), но я не очень силен в PHP. Я попытался собрать релевантный код (по крайней мере, как мне кажется) и объединил его в следующую функцию:

function new_reduce_by () {
    // Получаем название вариации
    $this->variation_data[$name] = $attrvalue[0];
    // Извлекаем только цифры (некоторые атрибуты могут заканчиваться на "граммы" и т.д.)
    preg_match_all('!\d+!', $attrvalue[0], $modified_attrvalue);
    // Преобразуем массив в переменную
    $custom_reduce_value = implode(' ', $modified_attrvalue[0]);
    // Возвращаем название (значение) вариации
    return $custom_reduce_value;
}

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

Должен ли этот код работать? Если да, то как лучше вызвать функцию? Я понимаю, что нельзя просто изменить $by=1, нужно передать значение или переменную.

Или может быть есть другой способ решения этой проблемы?

Большое спасибо!

0
Все ответы на вопрос 3
2

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

Если все ваши вариации действительно представляют только количество, то логично, что при завершении заказа вы обновляете количество для родительского товара и каждой из вариаций, чтобы все они отражали одинаковый остаток на складе.

Таким образом, при обработке заказа у вас есть ID родительского товара и ID вариаций внутри объекта $product, и вы можете просто обновить значения количества для каждого из них в цикле.

Я не помню подходящий хук сходу, но вы можете найти документацию WooCommerce по ссылкам: http://wcdocs.woothemes.com/apidocs/index.html и http://wcdocs.woothemes.com/codex/extending/hooks/

15 нояб. 2012 г. 17:12:25
Комментарии

Вы правы, я совсем забыл, что могу использовать хуки для этого. Однако сейчас проблема в том, как фактически получить вариацию и изменить остаток на складе. Я не могу найти подходящий код, и поскольку мои знания PHP не так хороши, я не могу написать свой код с нуля. Код, который я привел в своем вопросе, не работает. Думаю, это потому, что мне сначала нужно получить продукты. Я пробовал: $order = new WC_Order( $order_id ); $items = $order_info->get_items(); Но я не знаю, как продолжить.

Nicklas Nicklas
20 нояб. 2012 г. 14:29:01

Посмотрите на http://wcdocs.woothemes.com/category/snippets/, возможно, вы найдете там нужный код.

Steve Steve
20 нояб. 2012 г. 16:28:30
0

Вы можете использовать этот плагин: http://wordpress.org/support/plugin/woocommerce-incremental-product-quantities

в сочетании с этим плагином: https://wordpress.org/plugins/woocommerce-bulk-discount/

Плагин Advanced Product Quantities позволит вам устанавливать минимальные количества, а также определять шаг для постепенного увеличения количества. Единственный момент - в вашей ситуации используются значения 10, 30, 50, 100, что не соответствует правилу увеличения с фиксированным шагом. Поэтому если вы сможете изменить ваши наборы количеств, например, на наборы по 10 или 25, то этот плагин отлично подойдет.

Плагин Bulk Discounts позволит вам создавать правила скидок в процентах как глобально, так и для отдельных товаров.

13 мая 2014 г. 03:11:41
1
-1

Ознакомьтесь с аддоном Dynamic Pricing для WooCommerce - возможно, он сможет выполнить то, что вам нужно.

21 нояб. 2012 г. 18:09:27
Комментарии

Пожалуйста, предоставьте некоторые детали о том, как именно упомянутый продукт решает данный вопрос, а также было бы хорошо добавить ссылку (обычно существует множество похожих продуктов с похожими названиями). Также я не уверен, говорите ли вы о своем собственном продукте (судя по вашим данным), и если это так, пожалуйста, укажите вашу аффилированность.

Rarst Rarst
21 нояб. 2012 г. 21:03:57