WordPressで画像がどの投稿に使われているかを探す
要は、画像のパスを指定して、一致する投稿がどれかを探したいということです。
MySQLにクエリを投げる
WordPressはMySQLにデータ保存しているんだから、直接クエリを投げてしまえばよさそう。
投稿はwp_postsに格納されているらしい。
(通常はテーブル名のprefixをwp_
からwp_hentai_
とかまぁ適当に変更していると思いますが、適宜読み替えてください)
mysql> select
id, guid, post_status, post_title
from
wp_posts
where
post_content like '%http://hentai.example.jp/images/2014-08-19/52101a34a34d6ef04f00001f.jpg%';
+------+----------------------------------------+-------------+------------------+
| id | guid | post_status | post_title |
+------+----------------------------------------+-------------+------------------+
| 6225 | http://hentai.example.jp/?p=6225 | publish | (えろいので検閲) |
| 6226 | http://hentai.example.jp/archives/6226 | inherit | (えろいので検閲) |
+------+----------------------------------------+-------------+------------------+
2 rows in set (0.00 sec)
なぜか2件ヒットして、どうやらpost_statusが違うというのがわかった。
idが6225の方が正解で、6226の方はアクセスすると404になった。
post_statusがinheritってなんぞ?
Inherit
Used with a child post (such as Attachments and Revisions) to determine the actual status from the parent post. (inherit)
添付ファイルかリビジョン(変更履歴保存と自動保存)で使われるらしい。
今回の場合は変更履歴でしょう。なぜ最初の履歴の方が投稿より先の番号なのかよくわからないですが。
添付ファイルかどうかはどう判定するのか?
添付ファイルの場合、post_typeが'attachment'になるらしい。
普通の投稿はpost_typeが'post'だから、ここら辺で絞り込めそうです。
post_contentsを検索する範疇だったら添付ファイルかどうかは関係ないのですが、投稿データから検索するという目的なら絞り込んだほうがよさそうです。
変更履歴を残さないようにするには?
wp_config.phpに
define('WP_POST_REVISIONS', false);
を追加すればOK。
過去の変更履歴を消すには?
変更履歴はpost_typeが'revision'になるので、
delete from wp_posts where post_type = 'revision';
で消せます。
うちは変更履歴がいっぱいあった……
mysql> select count(id) from wp_posts where post_type = 'revision';
+-----------+
| count(id) |
+-----------+
| 1579 |
+-----------+
1 row in set (0.00 sec)
というわけで、
投稿データを検索するには、post_typeとpost_statusで絞り込んで、
mysql> select
id, guid, post_type, post_status, post_title
from
wp_posts
where
post_content like '%http://hentai.example.jp/images/2014-08-19/52101a34a34d6ef04f00001f.jpg%'
and post_type = 'post'
and post_status = 'publish'
としておけば、余計なものは除いて検索できそう。