WordPressの画像を記事に紐づける

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では副問合せがうまく機能しないケースがあった…ような記憶があるので、その場合は動きません。悪しからず。

実行に際しては必ずバックアップをとったうえで自己責任でご利用願います。

    このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー および 利用規約 に適用されます。

    reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

    頂戴したコメントは管理者に承認されるまで表示されません。また、メールアドレスが公開されることはありません。
    このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。