WooCommerce не сохраняет значение SKU

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

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

После исправления, если сохранение не удалось, возвращается сообщение об ошибке. Как оказалось ошибка была в том что артикул уже существовал и второй такой же нельзя было добавить.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *