
Накратко за проекта
Онлайн магазинът работеше с YITH WooCommerce Brands Add-On, но клиентът премина към
Perfect Brands for WooCommerce за по-добра интеграция и по-добър дизайн. Освен това беше важно всички брандове да се запишат и в стандартния WooCommerce атрибут pa_brands
за по-добра съвместимост с филтри и продуктови вариации.
Ключови подобрения
- Пълна миграция на брандовете: Всички термини от YITH бяха прехвърлени към
pwb-brand
иpa_brands
, запазвайки slug и описание. - Автоматично свързване на продуктите: Всеки продукт, който имаше YITH бранд, беше свързан с новите брандове в Perfect Brands и WooCommerce атрибутите.
- Еднократна миграция: Кодът е оптимизиран да се изпълнява само веднъж и след това се самоизключва.
Използвани технологии
- WooCommerce – основната платформа за управление на продуктите.
- PHP + WordPress API – за директна миграция през
functions.php
. - wp_insert_term() и wp_set_object_terms() – за създаване на брандове и свързване на продуктите.
Предизвикателства
Основното предизвикателство беше да се прехвърлят брандовете, без да се изгубят връзките с продуктите и без да се дублират съществуващи термини в Perfect Brands и WooCommerce атрибутите. Решението беше да се направи проверка с term_exists()
и да се използва еднократен скрипт, който автоматично създава липсващите термини и ги асоциира.
Резултат
След миграцията всички продукти запазиха правилните брандове и вече се използваха в Perfect Brands и WooCommerce атрибутите, което позволи по-добра съвместимост с филтри и дизайн. Времето за ръчна обработка беше спестено изцяло, а сайтът вече е готов за бъдещи оптимизации и филтри по брандове.
Стъпки за репродуциране
- Поставете предоставения PHP код в
functions.php
на активната или child темата. - Заредете администраторския панел – скриптът ще се изпълни автоматично веднъж.
- Проверете в продуктите дали брандовете са мигрирани към
pwb-brand
иpa_brands
. - След успешната миграция премахнете кода от
functions.php
и деактивирайте YITH плъгина.
Времето за пълното изпълнение на скрипта зависи пряко от броя на продуктите в сайта. Колкото повече са продуктите и брандовете на сайта, толкова повече време ще отнеме. Бъдете търпеливи. Скрипта е направен да се пусне само веднъж - при евентуален повторен refresh скрипта няма да прекъсне процеса на работа и да започне отново.
Използван код
add_action('init', function () {
if (!current_user_can('manage_options')) {
return;
}
if (get_option('yith_to_pwb_and_pa_brands_migration_done')) {
return;
}
$old_tax = 'yith_product_brand';
$new_tax_pwb = 'pwb-brand';
$new_tax_pa = 'pa_brands';
$terms = get_terms([
'taxonomy' => $old_tax,
'hide_empty' => false,
]);
if (!empty($terms) && !is_wp_error($terms)) {
foreach ($terms as $term) {
$existing_pwb = term_exists($term->name, $new_tax_pwb);
if (!$existing_pwb) {
$new_term_pwb = wp_insert_term($term->name, $new_tax_pwb, [
'description' => $term->description,
'slug' => $term->slug
]);
$new_term_pwb_id = is_wp_error($new_term_pwb) ? null : $new_term_pwb['term_id'];
} else {
$new_term_pwb_id = is_array($existing_pwb) ? $existing_pwb['term_id'] : $existing_pwb;
}
$existing_pa = term_exists($term->name, $new_tax_pa);
if (!$existing_pa) {
$new_term_pa = wp_insert_term($term->name, $new_tax_pa, [
'description' => $term->description,
'slug' => $term->slug
]);
$new_term_pa_id = is_wp_error($new_term_pa) ? null : $new_term_pa['term_id'];
} else {
$new_term_pa_id = is_array($existing_pa) ? $existing_pa['term_id'] : $existing_pa;
}
$products = get_posts([
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => $old_tax,
'field' => 'term_id',
'terms' => $term->term_id,
]
]
]);
foreach ($products as $product) {
if ($new_term_pwb_id) {
wp_set_object_terms($product->ID, (int)$new_term_pwb_id, $new_tax_pwb, true);
}
if ($new_term_pa_id) {
wp_set_object_terms($product->ID, (int)$new_term_pa_id, $new_tax_pa, true);
}
}
}
}
update_option('yith_to_pwb_and_pa_brands_migration_done', 1);
error_log('✅ Миграцията е завършена!');
});