🏊♂️
ライブドアブログとnoteの記事をWordpressへ移行する 5
趣味の水泳関連の記事が、ライブドアブログとnoteの2つのプラットフォームに分散してしまいました。
これらの記事を新設したWordpressに集約して公開するまで、作業を記録していこうと思います。
移行元の記事数は、
ライブドアブログ:904件 https://waist100.blog.jp/
note:160件
です。
今日の作業
wp-cliでの全記事更新
ChatGPTの回答が不満で、claude.aiで聞いてみました。
wp-cliを使わない前提でのphpプログラムを指定されましたが、タイムアウトのリスクがあるため、wp-cli版で生成してもらいました。
resave-posts.phpを作成して、wordpressのトップディレクトリに置きます。
<?php
/**
* WP-CLIコマンド: 記事を更新日時を変えずに再保存
*
* 使い方:
* wp eval-file resave-posts.php
*
* または直接実行:
* wp eval-file resave-posts.php --skip-plugins --skip-themes
*/
if (!defined('WP_CLI') || !WP_CLI) {
die('このスクリプトはWP-CLIからのみ実行できます。');
}
WP_CLI::line('記事の再保存を開始します...');
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'ID',
'order' => 'ASC',
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
);
$posts = get_posts($args);
$total = count($posts);
$processed = 0;
$errors = 0;
WP_CLI::line("処理対象: {$total}件の記事");
$progress = \WP_CLI\Utils\make_progress_bar('記事を処理中', $total);
foreach ($posts as $post) {
// 現在の更新日時を取得
$modified_date = $post->post_modified;
$modified_date_gmt = $post->post_modified_gmt;
// 自動保存を無効化
remove_action('post_updated', 'wp_save_post_revision');
// 記事を再保存(更新日時を保持)
$result = wp_update_post(array(
'ID' => $post->ID,
'post_modified' => $modified_date,
'post_modified_gmt' => $modified_date_gmt,
), true);
// 自動保存を再度有効化
add_action('post_updated', 'wp_save_post_revision', 10, 1);
if (is_wp_error($result)) {
$errors++;
WP_CLI::warning("記事ID {$post->ID} でエラー: " . $result->get_error_message());
} else {
$processed++;
}
$progress->tick();
}
$progress->finish();
WP_CLI::success("処理完了!");
WP_CLI::line("成功: {$processed}件");
if ($errors > 0) {
WP_CLI::warning("エラー: {$errors}件");
}
DBのバックアップをします。
実行します。
wp eval-file resave-posts.php
ここでエラー。
[sc3okxtn9eihv@s331 waist100.ddns.net]$ wp eval-file resave-posts.php
PHP Notice: Undefined index: argv in phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php on line 938
PHP Warning: array_slice() expects parameter 1 to be array, null given in phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php on line 938
PHP Warning: Invalid argument supplied for foreach() in phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Configurator.php on line 150
PHP Warning: Use of undefined constant STDOUT - assumed 'STDOUT' (this will throw an Error in a future version of PHP) in phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/
wp-cliを使わない方法を提示されたので以下のスクリプトを使いました。
php resave-posts8.php
で実行します。
resave-posts8.php
<?php
/**
* アイキャッチ画像を再生成し、更新日時を投稿日時と同じにする
*
* 使い方:
* php resave-posts.php
*/
// WordPressを読み込む
define('WP_USE_THEMES', false);
require('./wp-load.php');
global $wpdb;
echo "==========================================\n";
echo "記事の再保存を開始します...\n";
echo "==========================================\n\n";
// タイムアウトを防ぐ
set_time_limit(0);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'ID',
'order' => 'ASC',
);
$posts = get_posts($args);
$total = count($posts);
$processed = 0;
echo "処理対象: {$total}件の記事\n\n";
foreach ($posts as $post) {
// 投稿日時を保存(更新日時をこれに合わせる)
$post_date = $post->post_date;
$post_date_gmt = $post->post_date_gmt;
// 記事を再保存(アイキャッチ画像を再生成)
remove_action('post_updated', 'wp_save_post_revision');
wp_update_post(array(
'ID' => $post->ID,
));
add_action('post_updated', 'wp_save_post_revision', 10, 1);
// 更新日時を投稿日時と同じにする(DB直接更新)
$wpdb->update(
$wpdb->posts,
array(
'post_modified' => $post_date,
'post_modified_gmt' => $post_date_gmt,
),
array('ID' => $post->ID),
array('%s', '%s'),
array('%d')
);
$processed++;
// 進捗表示(50記事ごと)
if ($processed % 50 == 0) {
$percentage = round(($processed / $total) * 100, 1);
echo "処理中... {$processed} / {$total} ({$percentage}%)\n";
}
}
// キャッシュをクリア
wp_cache_flush();
echo "\n==========================================\n";
echo "✓ 処理完了!\n";
echo "==========================================\n";
echo "成功: {$processed}件\n";
echo "\n更新日時は投稿日時と同じに設定されました。\n";
echo "(WordPressでは更新日時=投稿日時の場合、更新日時は表示されません)\n\n";
・アイキャッチ画像の表示
・投稿日時はオリジナルのまま
・更新日時を今日付けでアップデートしない
が達成できました。
ひとまずこれで、XREA free側での作業を完了とし、次の作業にうつります。
残タスク
- XREA から シンフリーサーバーへのWordpress移行
- note記事のエクスポートとWordpressへのインポート
- Wordpressへインポート(水泳記事)
- zennへインポート(IT技術記事)
- 移行済みnote記事の全削除
番外編として
-zennの記事をGithubで管理するときの画像の取り扱いの最適解はなにか?
- 公式では/images/<画像ファイル>だが、レポジトリの容量増やしたくない
- すでに解決されている記事
読み手にはわかりにくいのは承知で、自分向けの備忘録と割り切って、画像無しで記事を完成させるのも一考です。ある程度記事がたまったら、総集編として画像ありの1記事にまとめて公開するのも良いかもしれません。
Discussion