WordPressで構築されたウェブサイトを別のサーバに移転する際、FTPで「/wp-contents/uploads」配下に画像をアップロードしてもWordPressのメディアライブラリには一切表示されません。
これはWordPressがディレクトリ内を都度々々走査するのではなく、あくまでデータベース上に登録された情報に従っているため。これではさすがに記事作成の際に不便なので、これらの画像の存在をデータベースに認知させる「Media from FTP」などのプラグインが広く利用されているのですが、アップロード先の情報…つまり「それらの画像がどの記事で利用されているか?」という記事との紐づけ(アタッチ)情報まではセットされない模様。
実際、記事との紐づけ情報は無くても困らないというケースが大半だと思いますが、将来サイトの構成・レイアウト変更でいざ必要となった時にバタバタするのも嫌なので今のうちに…と思い、このような処理に特化したプラグインを探してみるも見つけきれず。ならば自力でなんとかしようと思い、phpMyAdminなどDBを直接弄れる環境から実行可能なSQLをこしらえました。
update wp_posts t1,
(
select
image_id as id,
min(page_id) as post_parent
from
(
select
id as image_id,
guid as image_url
from
wp_posts
where
post_title not like '%siteicon%' and
post_type = 'attachment' and
post_mime_type like 'image/%' and
post_parent = 0
) image,
(
select
id as page_id,
post_content as page_content
from
wp_posts
where
post_type in ('page', 'post')
) page
where
page.page_content like concat('%', image.image_url, '%')
group by
image_id
) t2
set
t1.post_parent = t2.post_parent
where
t1.id = t2.id
WordPressに登録されている画像のURLから、それが利用された記事を探してそのIDをpost_parentにセットするという流れ。セキュリティ向上のためテーブルに接頭語を設定している場合は、テーブル名が「wp_posts」ではなく「??????posts」のようになっていると思うので、必要に応じ置換してください。
なお、古いバージョンのMySQLでは副問合せがうまく機能しないケースがあった…ような記憶があるので、その場合は動きません。悪しからず。
実行に際しては必ずバックアップをとったうえで自己責任でご利用願います。