#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 Посмотрите на код, в котором находится ваш хук , и, возможно, вы поймете…