Back to Woocommerce

WooCommerce CLI Migrator

plugins/woocommerce/src/Internal/CLI/Migrator/README.md

10.8.0-dev10.4 KB
Original Source

WooCommerce CLI Migrator

A command-line tool for migrating products from external e-commerce platforms to WooCommerce.

Available Commands

CommandDescriptionExample
setupConfigure platform credentialswp wc migrate setup [--platform=shopify]
productsMigrate products from source platformwp wc migrate products --platform=shopify
listList all registered migration platformswp wc migrate list
resetReset platform credentialswp wc migrate reset [--platform=shopify]

Basic Usage

  1. Configure platform credentials:

    bash
    wp wc migrate setup
    
  2. Migrate products:

    bash
    # Get product count
    wp wc migrate products --count
    
    # Migrate all products
    wp wc migrate products
    
    # Migrate with limit and batch size
    wp wc migrate products --limit=100 --batch-size=25
    

Products Command Options

Basic Parameters

ParameterDescriptionExample
--platformSource platform (default: shopify)shopify
--limitMaximum products to migrate100
--batch-sizeProducts per batch (max 250)25
--countShow total product count only--count

Filtering Parameters

ParameterDescriptionExample
--statusFilter by product statusactive, archived, draft
--product-typeFilter by product type"T-Shirt", "single"
--vendorFilter by vendor/brand"My Brand"
--idsSpecific product IDs"123,456,789"

Filtering Examples:

bash
# Count products with filters
wp wc migrate products --count --status=active
wp wc migrate products --count --product-type="T-Shirt"

# Migrate with filters
wp wc migrate products --status=active --limit=50
wp wc migrate products --vendor="My Brand" --limit=25

Field Selection Parameters

ParameterDescriptionExample
--fieldsInclude only specific fields"name,price,sku"
--exclude-fieldsExclude specific fields"images,metafields"

Field Selection Examples:

bash
# Migrate only specific fields
wp wc migrate products --fields=name,price,sku --limit=50

# Exclude heavy fields
wp wc migrate products --exclude-fields=images,metafields --limit=100

Execution Control Parameters

ParameterDescriptionExample
--resumeResume previous migration--resume
--skip-existingSkip existing products--skip-existing
--dry-runPreview without importing--dry-run
--verboseShow detailed output--verbose
--assign-default-categoryAssign default category to uncategorized products--assign-default-category

Advanced Examples:

bash
# Preview migration
wp wc migrate products --dry-run --verbose --limit=10

# Resume previous migration
wp wc migrate products --resume

# Skip existing products
wp wc migrate products --skip-existing --limit=200

# Assign default category to uncategorized products
wp wc migrate products --assign-default-category --limit=100

Architecture

Components

Platform Interface

Each platform must implement:

Supported Platforms

PlatformStatusLocation
Shopify✅ Production ReadyPlatforms/Shopify/

Creating a New Platform

To add support for new platforms, create them as external WordPress plugins that register themselves using the woocommerce_migrator_platforms filter.

1. Create Plugin Structure

text
your-platform-migrator/
├── your-platform-migrator.php     # Main plugin file
├── src/
│   ├── YourPlatformFetcher.php
│   └── YourPlatformMapper.php

2. Register Platform

In your main plugin file:

php
<?php
/**
 * Plugin Name: Your Platform Migrator
 * Description: Migrate from Your Platform to WooCommerce
 */

add_action('init', function() {
    if (!class_exists('WooCommerce')) return;
    
    add_filter('woocommerce_migrator_platforms', function($platforms) {
        $platforms['yourplatform'] = [
            'name'        => 'Your Platform',
            'fetcher'     => 'YourNamespace\\YourPlatformFetcher',
            'mapper'      => 'YourNamespace\\YourPlatformMapper',
            'credentials' => [
                'api_key' => 'Enter API Key:',
                'store_url' => 'Enter Store URL:',
            ],
        ];
        return $platforms;
    });
});

3. Implement Fetcher

php
<?php
use Automattic\WooCommerce\Internal\CLI\Migrator\Interfaces\PlatformFetcherInterface;

class YourPlatformFetcher implements PlatformFetcherInterface {
    private array $credentials;

    public function __construct(array $credentials) {
        $this->credentials = $credentials;
    }

    public function fetch_batch(array $args): array {
        // Use $this->credentials['api_key'] etc.
        // Return: ['items' => [], 'cursor' => '', 'has_next_page' => bool].
    }

    public function fetch_total_count(array $args): int {
        // Return: total product count.
    }
}

4. Implement Mapper

php
<?php
use Automattic\WooCommerce\Internal\CLI\Migrator\Interfaces\PlatformMapperInterface;

class YourPlatformMapper implements PlatformMapperInterface {
    public function map_product_data(object $source_product): array {
        return [
            'name' => $source_product->title,
            'description' => $source_product->description,
            'regular_price' => $source_product->price,
            'sku' => $source_product->sku,
            // ... more mappings
        ];
    }
}

Reference Implementation

See the Shopify platform for a complete example: Platforms/Shopify/

Required Data Structure

Your mapper must return data in this format:

php
[
    // Basic Product Information
    'name' => 'Product Title',
    'slug' => 'product-slug',
    'description' => 'Full product description',
    'short_description' => 'Brief description',
    'status' => 'publish', // publish|draft|private
    'catalog_visibility' => 'visible', // visible|catalog|search|hidden
    'date_created_gmt' => '2023-01-01 12:00:00',
    
    // Pricing
    'regular_price' => '29.99',
    'sale_price' => '19.99',
    
    // Inventory
    'sku' => 'PRODUCT-SKU',
    'manage_stock' => true,
    'stock_quantity' => 100,
    'stock_status' => 'instock', // instock|outofstock|onbackorder
    
    // Physical Properties
    'weight' => '1.5',
    
    // Taxonomies
    'categories' => [
        ['name' => 'Category 1', 'slug' => 'category-1'],
        ['name' => 'Category 2', 'slug' => 'category-2']
    ],
    'tags' => [
        ['name' => 'Tag 1', 'slug' => 'tag-1'],
        ['name' => 'Tag 2', 'slug' => 'tag-2']
    ],
    'brand' => [
        'name' => 'Brand Name',
        'slug' => 'brand-slug'
    ],
    
    // Images
    'images' => [
        [
            'src' => 'https://example.com/image1.jpg',
            'alt' => 'Image description',
            'is_featured' => true,
            'original_id' => 'source_image_id_123'
        ],
        [
            'src' => 'https://example.com/image2.jpg',
            'alt' => 'Gallery image',
            'is_featured' => false,
            'original_id' => 'source_image_id_456'
        ]
    ],
    
    // Variable Products
    'is_variable' => false,
    'attributes' => [
        [
            'name' => 'Color',
            'options' => ['Red', 'Blue', 'Green'],
            'position' => 0,
            'is_visible' => true,
            'is_variation' => true
        ],
        [
            'name' => 'Size',
            'options' => ['Small', 'Medium', 'Large'],
            'position' => 1,
            'is_visible' => true,
            'is_variation' => true
        ]
    ],
    'variations' => [
        [
            'original_id' => 'source_variant_id_789',
            'regular_price' => '29.99',
            'sale_price' => '24.99',
            'sku' => 'PRODUCT-SKU-RED-S',
            'manage_stock' => true,
            'stock_quantity' => 10,
            'stock_status' => 'instock',
            'weight' => '1.5',
            'menu_order' => 0,
            'attributes' => [
                'Color' => 'Red',
                'Size' => 'Small'
            ],
            'image_original_id' => 'source_image_id_789',
            'cost_of_goods' => '15.00'
        ]
    ],
    
    // Metadata and Tracking
    'original_product_id' => 'source_platform_product_id',
    'original_url' => 'https://source-platform.com/products/product-slug',
    'metafields' => [
        'custom_field_1' => 'value1',
        'custom_field_2' => 'value2',
        'global_title_tag' => 'SEO Title',
        'global_description_tag' => 'SEO Description'
    ],
    'meta_data' => [
        ['key' => 'custom_meta_key', 'value' => 'custom_meta_value']
    ],
    
    // Cost of Goods (if supported)
    'cost_of_goods' => '15.00'
]