Проекти

WooCommerce Бранд Миграция: От YITH към Perfect Brands и pa_brands

image
24 юли 2025 г.

Накратко за проекта

Онлайн магазинът работеше с 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 атрибутите, което позволи по-добра съвместимост с филтри и дизайн. Времето за ръчна обработка беше спестено изцяло, а сайтът вече е готов за бъдещи оптимизации и филтри по брандове.

Стъпки за репродуциране

  1. Поставете предоставения PHP код в functions.php на активната или child темата.
  2. Заредете администраторския панел – скриптът ще се изпълни автоматично веднъж.
  3. Проверете в продуктите дали брандовете са мигрирани към pwb-brand и pa_brands.
  4. След успешната миграция премахнете кода от functions.php и деактивирайте YITH плъгина.

Времето за пълното изпълнение на скрипта зависи пряко от броя на продуктите в сайта. Колкото повече са продуктите и брандовете на сайта, толкова повече време ще отнеме. Бъдете търпеливи. Скрипта е направен да се пусне само веднъж - при евентуален повторен refresh скрипта няма да прекъсне процеса на работа и да започне отново.

Използван код

Php
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('✅ Миграцията е завършена!');
});