WEBLOG

WordPress > 実装フロー

wordpress リニューアル時にメディア画像をインポートする(プラグインなし)

Create:

Category:WordPress実装フロー

[ version.24 ]

WordPressで作成されたサイトからWordPressで作成されたサイトへインポートすることが前提です。

WordPressでアップロードされた画像を強引にそして綺麗にインポートする方法です。

ここではphpMyAdminを使用しますので、新旧のDBにそれぞれアクセスします。

プラグインは使用しません。

大まかな手順

  1. 旧サイトDBで「wp_posts」と「wp_postmeta」をそれぞれ「wp_posts_past」「wp_postmeta_past」に複製し、エクスポートし、新サイトに「wp_posts_past」「wp_postmeta_past」をインポートします。
  2. 旧サイトのアップロードデータ「wp-content/uploads/」をダウンロードして新サイトの「wp-content/uploads/」にアップロードします。
  3. PHPでインポートを実行します。

DBの複製~エクスポートとインポート

phpMyAdmin で下記のように複製して上のタブエクスポートでダンプします。

ダンプしたデータは新サイトのphpMyAdminでインポートしておきます。

画像の複製

旧サイトのアップロードデータ「wp-content/uploads/」をダウンロードして新サイトの「wp-content/uploads/」にアップロードします。

※ 回線が速ければ圧縮~ダウン&アップ~解凍するとすぐにできます。

※ 同サーバー内であればSSHで接続し、コマンドで複製するとさらに早くできます。

PHPでインポート

ここからが本題です。

画像の基礎知識

DB内で画像のデータは、「wp_posts」にpost_type = attachment で保存されています。

リサイズされた画像などのメタデータは「wp_postmeta」にwp_postsのIDとwp_postmetaのpost_idで関連付け保存されています。

実行ファイルとコード

実行ファイルはどこに置いてもいいのですが、wp_load.php と同じ階層に保存することにします。

もちろんインポートさせるので新サイトの方に置きます。

ファイル名は「wp_import_attachment.php」とすることにします。

include_once './wp-load.php';

//// 旧サイト attachment 抽出
$attachment_ids = [];
$sql = "SELECT
		*
	FROM
		wp_posts_past
	WHERE
		post_type = 'attachment'
";
$past_attachment_posts = $wpdb->get_results($sql);

//// 新サイトへインポート
foreach ($past_attachment_posts as $past_post) {
	$wpdb->insert(
		'wp_posts',
		[
			'post_author' => 1,
			'post_date' => $past_post->post_date,
			'post_date_gmt' => $past_post->post_date_gmt,
			'post_title' => $past_post->post_title,
			'post_status' => $past_post->post_status,
			'comment_status' => 'closed',
			'ping_status' => 'closed',
			'post_password' => '',
			'post_name' => $past_post->post_name,
			'post_modified' => $past_post->post_modified,
			'post_modified_gmt' => $past_post->post_modified_gmt,
			'guid' => $Import->str_replace('ttps://www.pastsite.jp', 'ttps://www.newsite.jp', $past_post->guid),
			'post_type' => $past_post->post_type,
			'post_mime_type' => $past_post->post_mime_type,
		],
		[
			'%d', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s',
		],
	);
	$insert_post_id = $wpdb->insert_id; // 新サイトDBにインサートされた「ID」
	//// 旧サイトpostmeta抽出 *複数あり
	$sql_postmeta = "SELECT
			*
		FROM
			wp_postmeta_past
		WHERE
			post_id = $past_post->ID
	";
	$postmetas = $wpdb->get_results($sql_postmeta);
	foreach ($postmetas as $postmeta) {
		$wpdb->insert(
			'wp_postmeta', // wp_postmeta_test_attachment || wp_postmeta
			[
				'post_id' => $insert_post_id,
				'meta_key' => $postmeta->meta_key,
				'meta_value' => $postmeta->meta_value,
			],
			[
				'%d', '%s', '%s',
			],
		);
	}
}

途中、guidのところでURLを置換しています。

このファイルを実行して完了です。

注意点

ここでは、バックアップやアップロードフォルダの変更、マルチサイトの対応など省略しています。

また、多い時の分割実行や同じインサートを何度も実行しないようにする回避策なども省略しています。

ご武運を祈ります。

pagetop
loading