WordPressのwp_postmetaテーブルを掃除する

たとえば、この「がとらぼ」の様にのんびり手打ちで作るような個人ブログではあまり関係ありませんが、WordPressの管理画面は大量のデータを引っ張ってきてコンテンツをドバッと作るような操作は出来ないのでそれ用のスクリプトを作って行います。大規模なコンテンツサイトを構築する場合はカスタムフィールドにデータを突っ込むことになると思いますが、そこに適当に作ったスクリプトでデータを入れると「汚れる」ことがよくあります。(そんないいかげんなスクリプトを使ってはいけませんね)

汚れ方として多いのは「データの重複」。WordPressのカスタムフィールドはいくらでも重複データを置けてしまうのでうっかりバグったスクリプトでデータを流し込むとアホみたいに重複データが溜まります。で、無駄なデータが溜まり過ぎるとWordPressの記事表示が遅くなります。
これを綺麗にするにはMySQLでpw_postmetaテーブルを触って重複データを除いてやります。

wp_postmetaテーブル
meta_id post_id meta_key meta_value
ここは自動採番 コンテンツ番号 カスタムフィールド(名前) カスタムフィールド(値)

この内のpost_id, meta_key, meta_value(緑の部分)の全てが重複したものを対象とします。

SQLクエリ

DELETE wp_postmeta FROM wp_postmeta INNER JOIN (SELECT post_id, meta_key, meta_value, MIN(meta_id) AS min_id, COUNT(*) FROM wp_postmeta GROUP BY post_id, meta_key, meta_value HAVING COUNT(*) > 1) AS DUPLICATION ON wp_postmeta.post_id = DUPLICATION.post_id AND wp_postmeta.meta_key = DUPLICATION.meta_key AND wp_postmeta.meta_value = DUPLICATION.meta_value AND wp_postmeta.meta_id <> DUPLICATION.min_id;

データが数十万件程度なら数秒で重複したデータが綺麗に消えます。(重複したデータの内のmeta_idが最小のものが1件残ります。)

wp_postmetaテーブルのmeta_valueの値が重複するというのは正常な場合でもあることなので精査せずに全ての重複を嫌わないようご注意ください。