Если вы делали импорт товаров в WooCommerce (WordPress), то сталкивались с этой неприятной ошибкой:
Ярлык «НАЗВАНИЕ АТРИБУТА» слишком длинный (более 28 символов). Укоротите его, пожалуйста.
Что значит ошибка
При импорте товаров, в WooCommerce создаются атрибуты. У атрибутов (у постов и т.п.) есть SLUG (или ярлык) — уникальный идентификатор записи, состоящий из «безопасных» символов, которые могут участвовать в URL.
Например атрибут «Максимально допустимая эксплуатационная масса погрузчика» должна преобразоваться в SLUG «maksimalno-dopustimaya-ekspluatacionnaya-massa-pogruzchika«.
Но вот незадача, максимальная длинна SLUG 28 символов…. Ошибка возникала 5 лет назад и осталась до сих пор. Разработчики WooCommerce почему-то игнорируют проблему, хотя она появляется у всех и регулярно. Лично я, почти каждый раз при импорте товаров, сталкиваюсь с ней и страдаю. Давайте исправим ошибку.
Как исправить ошибку
1. Ставим/проверяем, что у вас установлен плагин Cyr-To-Lat, который преобразует SLUG (ярлыков) с русского на транслит (как на примере выше).
2. Заходим в файл functions.php вашей активной темы и прописываем в ней код:
add_filter('sanitize_taxonomy_name', function( $urldecode, $taxonomy ) {
$urldecode = mb_substr($urldecode, 0, 27, 'utf-8');
return $urldecode;
}, 10, 2 );
Путь к файлу /НАЗВАНИЕ _САЙТА/public_html/wp-content/themes/НАЗВАНИЕ_ВАШЕЙ_АКТИВНОЙ_ТЕМЫ/functions.php
Для не программистов объясню — мы устанавливаем свое событие при создании SLUG (ярлыков). Событие устанавливается не только товаров, но и постов и т.д. Код обрезает название атрибута до 28 символов и тем самым мы обходим ограничения WooCommerce. После выгрузки, этот код можно удалить.
Как массово удалить товары и атрибуты из WooCommerce
В процессе выгрузки, может понадобиться удалить неправильно созданные товары, атрибуты, картинки и т.п. Если товаров и атрибутов сотни или тысячи, вручную это делать оооочень долго. Нам нужно автоматизировать процесс.
Есть разные варианты, решил описать 2 способа:
Способ 1. Полуавтоматический
1. Ставим плагин WooCommerce Remove All Products, активируем, переходим в него и жмем кнопку DELETE
<?php
include 'wp-load.php';
$attributes = json_decode(json_encode(wc_get_attribute_taxonomies()),true);
sort($attributes);
foreach ($attributes as $key => $attribute) {
$deleted = wc_delete_attribute( $attribute['attribute_id'] );
echo '<pre>';
print_r(sprintf('Deleting %s - Result %s',$attribute['attribute_label'], $deleted));
echo '</pre>';
}
?>
Дальше переходим по ссылке http://НАЗВАНИЕ _САЙТА/remove.php — все атрибуты удаляются. После использования, удалите файл.
3. Картинки товаров удаляем через медиафайлы вручную, категории товаров тоже удаляем вручную. Хорошо, что в WordPress есть массовый выбор и делать это не долго.
Способ 2. Автоматический, с помощью SQL
Можно удалить данные массово через базу данных, с помощью SQL запросов, но будьте аккуратней, чтобы не удалить лишнее. Так же замените в запросах префиксы таблиц wp_ на те, которые заданы у вас в настройках WP. И не забудьте сделать бекап базы данных и файлов сайта.
1. Удаляем массово товары в WooCommerce
DELETE FROM wp_term_relationships WHERE object_id IN
(SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type IN
('product','product_variation'));
DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');
2. Удаляем массово атрибуты в WooCommerce
DELETE FROM wp_terms WHERE term_id IN
(SELECT term_id FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%');
DELETE FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%';
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN
(SELECT term_taxonomy_id FROM wp_term_taxonomy);
3. Удаляем post meta
DELETE pm
FROM wp_postmeta pm
LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
WHERE wp.ID IS NULL
4. Картинки товаров удаляем через медиафайлы вручную
Надеюсь, вам была полезна информация. Если знаете более простой и проверенный способ, можете поделиться в комментариях к статье.