Обновление количества и статуса товарных запасов в WooCommerce 3

#php #wordpress #woocommerce #product #stock

#php #wordpress #woocommerce #продукт #на складе

Вопрос:

Я пытаюсь установить количество товара на складе равным нулю при наличии определенного post_meta

Я подключаюсь к ‘woocommerce_update_product’. Когда я нажимаю «обновить», это запускается и обновляется правильно; однако действие никогда не заканчивается. (страница только загружается …)

Когда я обновляю страницу и проверяю запасы, это изменяется правильно.

Я делаю что-то не так?

Это мой код

 add_action('woocommerce_update_product', 'sv_set_no_stock_when_discontinued', 10, 1);
function sv_set_no_stock_when_discontinued($prodId){

    $discontinued = get_post_meta($prodId, '_is_discontinued', true);

    if($discontinued == 'yes'){

        $product = wc_get_product($prodId);

        // Using WC setters
        $product->set_manage_stock(true);
        $product->set_stock_quantity(0);
        $product->set_stock_status('outofstock');

        // Save Product
        $product->save();
    }
}
  

Оставив его на некоторое время, я получаю следующие ошибки:

Неустранимая ошибка: разрешенный объем памяти 1077936128 байт исчерпан (пытался выделить 20480 байт) в wp-includesmeta.php в строке 1078

Неустранимая ошибка: разрешенный объем памяти 1077936128 байт исчерпан (пытался выделить 20480 байт) в wp-includesclass-wp-fatal-error-handler.php в строке 72

Ответ №1:

Объект WC_Product уже включен в качестве 2-го аргумента для woocommerce_update_product Hook… Таким образом, вы можете немного изменить свой код, например:

Но поскольку этот хук находится в WC_Product_Data_Store_CPT классе, ему не очень нравятся WC_Product методы установки и особенно save() метод.

Поэтому вместо этого мы заменим этот хук следующим:

 add_action( 'woocommerce_admin_process_product_object', 'set_no_stock_if_discontinued' );
function set_no_stock_if_discontinued( $product ) {
    if( $product->get_meta('_is_discontinued') === 'yes' 
    || ( isset($_POST['_is_discontinued']) 
    amp;amp; esc_attr($_POST['_is_discontinued']) === 'yes' ) ) {

        // Using WC setters
        $product->set_manage_stock(true);
        $product->set_stock_quantity(0);
        $product->set_stock_status('outofstock');
    }
}
  

Ввод кода functions.php файл активной дочерней темы (или активной темы). Протестировано и работает.

Примечание: save() метод не нужен, поскольку он запускается сразу после этого перехвата.

Глобальное примечание: вы также можете установить для параметра «управление запасами» значение false.

Комментарии:

1. Только что протестировал, и он отлично работает. Знаете ли вы, почему метод save () не будет работать в крючке ‘woocommerce_update_product’?

2. @Jpv Посмотрите на код, в котором находится ваш хук , и, возможно, вы поймете…