1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPressのプラグイン「Flamingo」のレコードを消す

Posted at

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時間位かかりましたが、すっきり。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?