2026年6月28日

2026年6月28日

WP All Importのエラーを解決する方法

はじめに

WP All Importで大量のCSVデータをインポートしようとすると500件で止まってしまう・商品画像のURLを指定してインポートしても画像が取得されない・カスタムフィールドへのマッピングが保存されず毎回再設定が必要・WooCommerce商品のバリエーションデータがインポートされないといった問題は、PHPのタイムアウト・メモリ制限・外部画像取得の設定が原因です。

症状・原因

  • 大量データのインポートが途中の「処理中」状態で止まりブラウザをリロードしても再開できない
  • CSVの画像URL列を指定してインポートしても商品画像が設定されない
  • インポート完了後に確認するとカスタムフィールドのデータが空になっている
  • WooCommerce商品をインポートすると「Variable product」の子商品が作成されない

解決手順

ステップ1:WP All Importの状態を確認する

# WP All Importの設定確認
wp eval "
if (defined('PMXI_VERSION')) {
    echo 'WP All Import version: ' . PMXI_VERSION . PHP_EOL;
}

// インポート履歴を確認
global \$wpdb;
\$imports = \$wpdb->get_results(
    \"SELECT id, friendly_name, uploaded_filename, imported, created, updated
     FROM {\$wpdb->prefix}pmxi_imports
     ORDER BY id DESC LIMIT 10\",
    ARRAY_A
);

echo 'Total imports: ' . count(\$imports) . PHP_EOL;
foreach (\$imports as \$import) {
    printf('  #%d: %s | %d items | Created: %s' . PHP_EOL,
        \$import['id'],
        \$import['friendly_name'] ?? \$import['uploaded_filename'],
        \$import['imported'] ?? 0,
        \$import['created']
    );
}

// PHP設定確認
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
echo 'memory_limit: '       . ini_get('memory_limit') . PHP_EOL;
echo 'upload_max_filesize: '. ini_get('upload_max_filesize') . PHP_EOL;
echo 'post_max_size: '      . ini_get('post_max_size') . PHP_EOL;
"

ステップ2:インポート処理をカスタマイズする

// functions.php: WP All Importカスタム処理

// ① インポート前にPHP設定を最適化
add_action('pmxi_before_xml_import', function(int $import_id): void {
    // タイムアウトと最大実行時間を延長
    ini_set('max_execution_time', 600);
    ini_set('memory_limit', '512M');
    set_time_limit(600);

    error_log(sprintf('[WPAI] Import #%d started, memory_limit=512M', $import_id));
});

// ② 各レコードのインポート時にカスタム処理
add_action('pmxi_saved_post', function(int $post_id, array $data, bool $is_update): void {
    // インポート後のカスタムメタ処理
    if (!empty($data['_custom_field'])) {
        update_post_meta($post_id, 'custom_field', sanitize_text_field($data['_custom_field']));
    }

    // インポート日時を記録
    update_post_meta($post_id, '_imported_at', current_time('mysql'));
    update_post_meta($post_id, '_import_source', 'wp_all_import');
}, 10, 3);

// ③ インポート完了後にキャッシュをクリア
add_action('pmxi_after_xml_import', function(int $import_id): void {
    // オブジェクトキャッシュをクリア
    wp_cache_flush();

    // WooCommerce商品のトランジェントをクリア
    if (function_exists('wc_delete_product_transients')) {
        global $wpdb;
        $product_ids = $wpdb->get_col(
            "SELECT DISTINCT meta_value FROM {$wpdb->postmeta}
             WHERE meta_key = '_import_source' AND meta_value = 'wp_all_import'"
        );
        foreach ($product_ids as $product_id) {
            wc_delete_product_transients($product_id);
        }
    }

    error_log(sprintf('[WPAI] Import #%d completed', $import_id));
});

ステップ3:画像インポートを修正する

// functions.php: 画像インポート設定

// ① 外部画像の取得タイムアウトを延長
add_filter('http_request_timeout', function(int $timeout, string $url): int {
    // 画像取得時は60秒に延長
    if (preg_match('/\.(jpg|jpeg|png|gif|webp)$/i', $url)) {
        return 60;
    }
    return $timeout;
}, 10, 2);

// ② 画像インポート時のファイルサイズ制限を確認
add_filter('pmxi_image_max_size', function(int $max_size): int {
    return 10 * 1024 * 1024; // 10MB
});

// ③ インポート後に画像のサムネイルを再生成
add_action('pmxi_gallery_image', function(int $post_id, int $attachment_id, string $image_url): void {
    // サムネイルサイズを再生成
    $metadata = wp_generate_attachment_metadata(
        $attachment_id,
        get_attached_file($attachment_id)
    );
    wp_update_attachment_metadata($attachment_id, $metadata);

    error_log(sprintf('[WPAI] Regenerated thumbnails for attachment #%d', $attachment_id));
}, 10, 3);

ステップ4:バッチサイズを調整する

# バッチサイズ設定でタイムアウト回避
wp eval "
// WP All Import バッチサイズを確認・更新
\$settings = get_option('pmxi_plugin_options', []);
echo 'Current records per request: ' . (\$settings['records_per_request'] ?? 5) . PHP_EOL;
echo 'Current import chunk size: '   . (\$settings['chunk_size'] ?? 5) . PHP_EOL;

// バッチサイズを小さくしてタイムアウトを回避
\$settings['records_per_request'] = 5;
\$settings['chunk_size']          = 5;
update_option('pmxi_plugin_options', \$settings);
echo 'Updated: records_per_request=5, chunk_size=5' . PHP_EOL;

// 既存のインポートファイルを確認
\$upload_dir = wp_upload_dir();
\$import_dir = \$upload_dir['basedir'] . '/wpallimport/files/';

if (is_dir(\$import_dir)) {
    \$files = glob(\$import_dir . '*');
    echo 'Import files: ' . count(\$files) . PHP_EOL;
    foreach (array_slice(\$files, 0, 5) as \$file) {
        echo '  ' . basename(\$file) . ' (' . size_format(filesize(\$file)) . ')' . PHP_EOL;
    }
}
"

ステップ5:WooCommerce商品バリエーションのインポートを修正する

// functions.php: WooCommerceバリエーションインポート

// ① バリエーションインポート後にWCデータを同期
add_action('pmxi_saved_post', function(int $post_id, array $data, bool $is_update): void {
    $product = wc_get_product($post_id);
    if (!$product || $product->get_type() !== 'variable') return;

    // バリエーションデータを同期
    WC_Product_Variable::sync($post_id);
    $product->save();

    // 価格キャッシュをクリア
    delete_transient('wc_var_prices_' . $post_id);

    error_log(sprintf('[WPAI] Synced variable product #%d with %d variations',
        $post_id,
        count($product->get_children())
    ));
}, 20, 3);

// ② インポート後に在庫状態を更新
add_action('pmxi_after_xml_import', function(int $import_id): void {
    // WooCommerce在庫をすべて更新
    global $wpdb;
    $product_ids = $wpdb->get_col(
        "SELECT post_id FROM {$wpdb->postmeta}
         WHERE meta_key = '_import_source' AND meta_value = 'wp_all_import'"
    );

    foreach ($product_ids as $product_id) {
        $product = wc_get_product($product_id);
        if ($product) {
            wc_update_product_stock_status($product_id,
                $product->is_in_stock() ? 'instock' : 'outofstock'
            );
        }
    }
});

注意事項

  • WP All Importの大量データインポート時は「設定 → レコード/リクエスト」を5〜10件に設定することでタイムアウトを回避できます。デフォルトの設定では1リクエストで大量のレコードを処理しようとするためサーバーの制限に引っかかります
  • 外部URLからの画像取得はサーバーのallow_url_fopenが有効である必要があります。無効な場合はcURLを使用した取得が試みられますが、それも無効な場合は手動でサーバーに画像をアップロードする必要があります
  • WooCommerce商品のバリエーションをインポートする場合はWP All Import ProのWooCommerceアドオンが必要です。無料版ではバリエーション商品の完全なインポートはサポートされていません

まとめ

WP All Import修復は①pmxi_importsテーブルでインポート履歴・PHP設定(タイムアウト・メモリ)を確認、②pmxi_before_xml_importフックでmemory_limit=512Mに設定・pmxi_saved_postフックでカスタムメタ保存・pmxi_after_xml_importでキャッシュクリア、③http_request_timeoutフィルターで外部画像取得を60秒に延長・pmxi_gallery_imageフックでサムネイル再生成、④records_per_request=5にバッチサイズを削減してタイムアウト回避、⑤pmxi_saved_postフックでWC_Product_Variable::sync()を呼び出しバリエーション同期する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ