🏊‍♂️

ライブドアブログと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で管理するときの画像の取り扱いの最適解はなにか?

読み手にはわかりにくいのは承知で、自分向けの備忘録と割り切って、画像無しで記事を完成させるのも一考です。ある程度記事がたまったら、総集編として画像ありの1記事にまとめて公開するのも良いかもしれません。

Discussion