この記事はブロックされています。続きを読みたい方はログインをして下さい。会員ではない方は新規会員登録をして下さい。


ワードプレスのデータをphpMyAdminでSQL文を使って直接変更する方法 その2

今回は私がWordPressでドハマリした時に非常に助かったMySQL文を紹介します。
WordPressはサーバーのリソースに影響するのでアクセスが増加するとメモリが足りなくなったり、サーバー側からリソース制限を食らうことがままあります。

WordPressの管理画面でなんとかしたいのですが、重くて動かなかったりPHPの実行時間が足りずにInternal Server Errorでどうにもならない時があります。

例えば投稿記事を削除してデータベースの空きを作りたい時、管理画面からちまちまと数件ずつ削除するのはクールではありません。そんな時は、phpMyAdminからMySQLを操作します。
phpMyAdminについては前回やったので省略します。

例えば、ある投稿ステータスの記事を完全にまとめて削除したい場合があったとします。
単に削除する場合はSQL文を考えなくてもphpMyAdminの検索機能で検索して、表示されたものにまとめてチェックを入れて削除すればいいのですが、テーブルのデータによってはそれをしてはいけない場合があります。

そのテーブルが投稿記事が格納されている「wp_posts」「wp_postmeta」などのリレーションが掛かっているテーブルです。「wp_posts」には投稿関係のデータが入っているのですが、カスタムフィールドなどのユーザーやプラグインが後付で追加するデータについては別のテーブルである「wp_postmeta」に格納されています。

なので「wp_posts」の該当データだけを雑に削除してしまうと、それに関連付けられている「wp_postmeta」のデータが孤立して残ってしまいます。孤立したデータが残ってしまうと、もう見た目だけでは削除が不可能となってしまいます。
同じことはカテゴリとタグにも言えます。

で、困ったことにWordPressでは記事を削除した時に関連するデータも消されるはずなのですが、PHPのエラーやサーバーの応答時間などによって、孤立したデータが残る場合があります。削除が不完全なままになることがあります。
これらのデータは積もりに積もるとデータベースの容量を逼迫していき、直接MySQLを操作しないと消えないやっかいなデータとなってしまいます。
プラグインの中で孤立したデータを削除できるものもあるのですが、そもそもWordPressに過大な負荷が掛かっていると正常に動作しないという…。

そこで活躍するのがSQLの中でもちょっと難しい中級クラスの結合というテクニックです。
結合については話が難しいのであとで説明するとして、まずは汎用的に使えるSQL文を紹介します。

記事が「投稿」タイプでステータスが「ゴミ箱(trash)」の記事をまとめて削除するには以下のようにします。

DELETE a , b , c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id )
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
WHERE a.post_type = 'post' AND a.post_status = 'trash';

記事が「投稿」タイプでステータスが「ゴミ箱(trash)」または「下書き(draft)」の記事をまとめて削除するには以下のようにします。

関連記事