При добавлении вариации товара через скрипт, часть вариаций добавляется, доходит до определенного места и дальше не идет добавление. После анализа кода и поиска где идет прерывание, нашел что прерывание идет при добавлении вариации артикула, через функцию 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();
}
. . .
После исправления, если сохранение не удалось, возвращается сообщение об ошибке. Как оказалось ошибка была в том что артикул уже существовал и второй такой же нельзя было добавить.


