はじめに
前の記事を見直していて、添付ファイルのリンク先を設定していなかったことに気がつきました。(´・ω・`)
これでは、記事に添付されている画像ファイルによっては画像が細かすぎて伝わらない恐れがありますので、後付ではありますが、設定することにしました…
が、正規表現でハマったので、それについてもメモすることにしました。
設定の方法
方針
WordPressのデータベースに対して直接SQL文を実行して設定をします。
正規表現を使って置き換えていきますが、後々で再度実行することが必要になった場合のことも考えて、すでにリンクが設定されている添付ファイルに再度リンクを設定してしまうことがないような正規表現を考えます。
本Webサイトで使っているのはMariaDBなので、正規表現による文字列の置き換えにはregexp_replace関数が使えます。
設定の手順
以下の手順で設定を行います。
なお、Wordpressのデータベースを直接操作しますので、バックアップは必ず取得してください。また、その他の手順についても、所望の結果が必ず得られることを保証するものではありません。あしからずご了承願います。
- WordPressが使用しているデータベースのバックアップ(フルダンプ)を取得します。
- SQL文を実行し、リンクを設定します。リバースエンジニアリング感満載のSQL文ですが、そこは深く追及しない方向でお願いいたします。(´・ω・`)
- リンクの設定後の記事の内容を見るためのSQL文を実行し、結果を確認します。
SQL文でハマる。
動かなかったやつ。
「方針」のところで書いた仕様を実現すべく、以下のようなSQL文を書いてとりあえず試運転してみたところ、
MariaDB [(none)]> select regexp_replace('<img src="https://pandanote.info/wordpress/wp-content/uploads/2018/12/P_20181201_191300_vHDR_Auto_a-233x300.jpg" alt="" width="233" height="300" class="alignnone size-medium wp-image-3517" />','(?<!<a href=[^>]*>)(<img src=.*wp-image-(\d+)[^>]*>)','<a href="https://pandanote.info/?attachment_id=\2" rel="attachment wp-att-\2">\1</a>') as regexp_replace_result; | |
ERROR 1139 (42000): Got error 'lookbehind assertion is not fixed length at offset 18' from regexp |
と言われてしまいました。
文字数が不定の否定先読みって実行できないんですね…
知りませんでした… orz
動いたやつ。
スポンサーリンク
ということで、お昼によく行くそば屋で考えること約10分。鴨だしそばうまいです。
(※↑の写真及び↓の広告はイメージです。本文とは一切関係ありません。)
ピコーン!!
「いったん追加してから、もう一回regexp_replace関数を実行して削除すれば良くね?」
と思って、以下のように書いてみたところ…
MariaDB [(none)]> select regexp_replace( | |
regexp_replace('<img src="https://pandanote.info/wordpress/wp-content/uploads/2018/12/P_20181201_191300_vHDR_Auto_a-233x300.jpg" alt="" width="233" height="300" class="alignnone size-medium wp-image-3517" />', | |
'(<img src=.*wp-image-(\d+)[^>]*>)', | |
'<a href="https://pandanote.info/?attachment_id=\2" rel="attachment wp-att-\2">\1</a>'), | |
'(?:(<a href[^>]*>))+(<img[^>]*>)(</a>)+', | |
'\1\2\3'); | |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |
| regexp_replace(regexp_replace('<img src="https://pandanote.info/wordpress/wp-content/uploads/2018/12/P_20181201_191300_vHDR_Auto_a-233x300.jpg" alt="" width="233" height="300" class="alignnone size-medium wp-image-3517" />','(<img src=.*wp-image-(\d+)[^>] | | |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |
| <a href="https://pandanote.info/?attachment_id=3517" rel="attachment wp-att-3517"><img src="https://pandanote.info/wordpress/wp-content/uploads/2018/12/P_20181201_191300_vHDR_Auto_a-233x300.jpg" alt="" width="233" height="300" class="alignnone size-medium wp-image-3517" /></a> | | |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |
うまくいきました!! (`・ω・´)
なお成功例につきましては、見やすいようにregexp_replace関数の引数ごとに改行しています。
本番環境のようなもので動作確認。
試運転がうまくいったところで、本Webサイトが使用しているMariaDBサーバ用のSQL文を書いて実行してみます。
本番環境ですので、Google Analyticsとにらめっこしながら、アクセスが途切れた頃合いを見計らって以下のSQL文を実行します。
MariaDB [hoge]> update wp_posts set post_content=regexp_replace( | |
regexp_replace(post_content, | |
'(<img src=.*wp-image-(\d+)[^>]*>)', | |
'<a href="https://pandanote.info/?attachment_id=\2" rel="attachment wp-att-\2">\1</a>'), | |
'(?:(<a href[^>]*>))+(<img[^>]*>)(</a>)+', | |
'\1\2\3') | |
where post_status = 'publish' and post_type='post'; |
かなりドキドキものです。
結果は…
成功したようです。
update文はいつ実行してもドキドキしますね。
すべての添付ファイルのリンクについての確認作業はこれから行いますが、確認した限りではうまくリンクが設定できているようです。
まとめ
この記事を書くにあたり、あたらめてテスト用の画像をアップロードして添付ファイルのリンクを設定してみたのですが、この設定は一回変更しておくとその設定がそのまま使用されるのに今気が付きました。
それに気づかなかったのは本Webサイトの管理人たるpandaのミスだったわけです。(´・ω・`)
しかし、Wordpressのアップグレード時に設定が変わってしまったり、誤って設定を変えてしまう可能性がないとは言えないので、後からバッチ処理的に設定するための手段を準備しておく価値はあると思います。
この記事は以上です。