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()を呼び出しバリエーション同期する手順で解決します。