Установите все варианты на складе, если один вариант отсутствует в WooCommerce

Мы запускаем систему самостоятельного хранения с WooCommerce и используем плагин WooCommerce Subscriptions. Наши единицы хранения - это уникальный продукт с переменной подпиской. У каждого варианта свой расчетный период (1 месяц, 3 месяца, 6 месяцев и 12 месяцев). Мне нужно, чтобы весь родительский продукт или, по крайней мере, все варианты отсутствовали в наличии, если нет в наличии одного варианта.

Я не нашел никаких связанных настроек и пока не нашел, как это сделать.

Любая помощь приветствуется.


person RJay    schedule 11.08.2020    source источник


Ответы (1)


В следующих случаях все варианты будут отсутствовать (для определенных переменных продуктов), когда один вариант отсутствует в наличии (также работает с подписками WooCommerce):

add_filter('woocommerce_available_variation', 'set_all_variations_out_of_stock', 10, 3 );
function set_all_variations_out_of_stock( $data, $product, $variation ) {
    // Set the Id(s) of the related variable product(s) below in the array
    if( in_array( $product->get_id(), array(738) ) ){
        $out_of_stock = false; // initializing
        
        // Loop through children variations of the parent variable product
        foreach( $product->get_visible_children() as $_variation_id ) {
            if( $_variation_id != $data['variation_id'] ) {
                $_variation = wc_get_product($_variation_id);
                
                
                if( ! $_variation->is_in_stock() ) {
                    $out_of_stock = true; // Flag as out of stock
                    break;
                }
            }
        }
        if ( $out_of_stock ) {
            $data['availability_html'] = '<p class="stock out-of-stock">'. __('Out of stock', 'woocommerce') .'</p>';
            $data['is_in_stock'] = false;
        }
    }
    return $data;
}

Код находится в файле function.php вашей активной дочерней темы (активной темы). Проверено и работает.


Важное примечание:

Запас может управляться по родительскому переменному продукту.

  1. Включите управление запасами для переменного продукта (на вкладке «Инвентарь») и установите там запас.
  2. Отключите управление запасами для каждого варианта для этого переменного продукта.

Вы сделали. Теперь управление запасами осуществляется по переменному продукту.

person LoicTheAztec    schedule 11.08.2020
comment
Спасибо большое, буду тестировать. Что-то, что пришло мне в голову прямо сейчас, будет ли продукт в наличии, если вариант появится на складе? - person RJay; 11.08.2020
comment
Я проголосовал за это. Но на самом деле это не сработало. Я это тестировал. Пожалуйста, проверьте мои скриншоты здесь: imgur.com/a/HBuLCxG - person RJay; 11.08.2020
comment
Хорошо, код заработал после того, как я изменил идентификатор продукта. Я пропустил этот комментарий. Можно ли вместо ID указывать все товары? Потому что все мои продукты имеют и будут подписками на переменные. - person RJay; 12.08.2020
comment
Также. Это работало только в интерфейсе. Мне нужно, чтобы он показывал, что его нет в наличии в серверной части. Является ли это возможным? - person RJay; 12.08.2020
comment
@RJay Чтобы это работало для всех продуктов, просто удалите if( in_array( $product->get_id(), array(738) ) ){ и закрывающую скобку } перед return $data; - person LoicTheAztec; 12.08.2020
comment
Хорошо, я понимаю. У меня есть идея ... Можно ли написать SQL для изменения значения stock_status в зависимости от вариаций в таблице под названием _wc_product_meta_lookup? - person RJay; 12.08.2020
comment
@RJay Только что что-то протестировал, и он работаетВам не нужен следующий код: Сначала включите управление запасами для переменного продукта и установите для запаса значение 1 Затем для каждого варианта отключите управление запасами… Итак, теперь вам не нужен код, и вы можете удалить мой код ответа. Речь идет только о настройках. Теперь, когда вариант приобретен, всех вариантов нет в наличии. Чтобы снова включить продукт, вам просто нужно пополнить запасы переменного продукта (но не вариантов). Таким образом, это работает как для внешнего, так и для внутреннего интерфейса. - person LoicTheAztec; 12.08.2020
comment
Хорошо, спасибо. Я установил это так, как вы упомянули. И с этого момента все должно быть в порядке. Я обновлю здесь для следующей продажи, но я ожидаю, что все будет так, как вы сказали. - person RJay; 12.08.2020
comment
@RJay Будет, я сам это проверил. - person LoicTheAztec; 12.08.2020
comment
Можем ли мы выставить товар на складе, когда всех его вариантов нет в наличии? Управление запасами осуществляется на уровне вариаций, а не на уровне продукта. Таким образом, даже когда всех вариантов нет в наличии, продукт все равно отображается в наличии. - person Sohaib Ahmad; 02.01.2021