При добавлении вариации товара через скрипт, часть вариаций добавляется, доходит до определенного места и дальше не идет добавление. После анализа кода и поиска где идет прерывание, нашел что прерывание идет при добавлении вариации артикула, через функцию set_sku(). При этом ошибки не отлавливаются в файле логирования на хостинге и при включении дебага в вордпрессе, тоже ошибка не появляется
define(‘WP_DEBUG’,false);
Просмотрев документацию по функции set_sku(), увидел что в ней встроено отлавливание ошибок, значит надо в коде тоже это предусмотреть.
Функция в set_sku() в WooCommerce
/** * Set SKU. * * @since 3.0.0 * @throws WC_Data_Exception Throws exception when invalid data is found. * @param string $sku Product SKU. */ public function set_sku( $sku ) { $sku = (string) $sku; if ( $this->get_object_read() && ! empty( $sku ) && ! wc_product_has_unique_sku( $this->get_id(), $sku ) ) { $sku_found = wc_get_product_id_by_sku( $sku ); $this->error( 'product_invalid_sku', __( 'Invalid or duplicated SKU.', 'woocommerce' ), 400, array( 'resource_id' => $sku_found ) ); } $this->set_prop( 'sku', $sku ); }
Обратите внимание на
throws WC_Data_Exception Throws exception when invalid data is found.
что в переводе «генерирует исключение WC_Data_Exception. Выбрасывает исключение при обнаружении неверных данных.»
Значит обрамляем код добавления вариации перехватом исключений
try{ } catch(Exception $ex){ }
Решение, для добавления атрибута вариациям
Код до исправления
. . . // добавляем вариации (опции) $variation = new WC_Product_Variation(); $variation->set_parent_id($product_id); $variation->set_attributes($attr_variation); $variation->set_price($price); $variation->set_regular_price($price); $variation->set_sku($sku); $variation->set_status('publish');//private $id = $variation->save(); . . .
Код после исправления
. . . // добавляем вариации (опции) try{ $variation = new WC_Product_Variation(); $variation->set_parent_id($product_id); $variation->set_attributes($attr_variation); $variation->set_price($price); $variation->set_regular_price($price); $variation->set_sku($sku); $variation->set_status('publish');//private $id = $variation->save(); } catch(Exception $ex){ $id = $ex->getMessage(); } . . .
После исправления, если сохранение не удалось, возвращается сообщение об ошибке. Как оказалось ошибка была в том что артикул уже существовал и второй такой же нельзя было добавить.