WEBLOG
WordPress > 実装フロー
WordPressで作成されたサイトからWordPressで作成されたサイトへインポートすることが前提です。
WordPressでアップロードされた画像を強引にそして綺麗にインポートする方法です。
ここではphpMyAdminを使用しますので、新旧のDBにそれぞれアクセスします。
プラグインは使用しません。
phpMyAdmin で下記のように複製して上のタブエクスポートでダンプします。
ダンプしたデータは新サイトのphpMyAdminでインポートしておきます。
旧サイトのアップロードデータ「wp-content/uploads/」をダウンロードして新サイトの「wp-content/uploads/」にアップロードします。
※ 回線が速ければ圧縮~ダウン&アップ~解凍するとすぐにできます。
※ 同サーバー内であればSSHで接続し、コマンドで複製するとさらに早くできます。
ここからが本題です。
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を置換しています。
このファイルを実行して完了です。
ここでは、バックアップやアップロードフォルダの変更、マルチサイトの対応など省略しています。
また、多い時の分割実行や同じインサートを何度も実行しないようにする回避策なども省略しています。
ご武運を祈ります。