8年もののWordPressと40万レコードのwp_postsと820万レコードのwp_postmeta
随分昔に作られたWordPressのサイトの引っ越しをすることになりました。
いつものようにダンプデータをとって、引越し先のデータベースに突っ込んで、wp_cliでURLを変える……と思ってたのですが、なんだか一つひとつのアクションにやけに時間がかかる。
どうなってるの、とレコード数を数えたら、見出しのような数。
内訳を見てみると、そのほとんどが、flamingo_inbound
というpost_type
の記事。そしてwp_postmetaの800万件を超えるレコードもどうやらその関係。
プラグインをアンインストールしたら消える?
このレコードの理由になっているプラグインは、「Flamingo」というもの。
依頼主に確認したところ、プラグインは消していいよ、ということだったので、もしかすると、プラグインのアンインストールで消えるかなと思ったのだけど、これは思惑通りにはいかず、レコードは残ったままになりました。
うかつに消せないっぽい?
調べてみると先行事例がみつかった。
なるほど。でも、
DELETE FROM wp_posts WHERE post_type = 'flamingo_inbound';
しちゃうと、wp_postmeta
のレコードが残ってしまうそうな。上掲の記事によると、WordPressの関数wp_delete_post($post->ID, true)
だったら、紐付いているwp_postmeta
のレコードも消してくれるそうな。
一気に消せない
しかしまあ40万件と800万件を一気に消すことは当然できない。というわけでバッチ処理。
<?php
set_time_limit(0);
define('WP_USE_THEMES', false);
require(__DIR__ . '/wp-blog-header.php');
$batch_size = 500;
$loop_count = 0;
do {
$items = $wpdb->get_results("
SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'flamingo_inbound'
LIMIT $batch_size
");
if (empty($items)) {
echo "No more flamingo_inbound posts to delete.\n";
break;
}
foreach ($items as $v) {
wp_delete_post($v->ID, true);
}
wp_cache_flush();
$loop_count++;
echo "Batch $loop_count: Deleted " . count($items) . " posts.\n";
} while (!empty($items));
echo "All flamingo_inbound posts deleted.\n";
これをwp-blog-header.php
と同じディレクトリ(ほとんどの場合、ドキュメントルートかしら)に置いて、
/path/to/php /path/to/filename.php
で、実行すると、500件ずつ削除してくれて、全部なくなります。4時間位かかりましたが、すっきり。