WordPress のメモ書き。
とあるサイトの負荷を軽減させるために画像サーバを別建てする必要が出てきました。
サイトは WordPress で作っていて、これまでと変わらない操作で画像を管理出来るようにする必要があるため、この画像を Nginx のリバースプロキシ + キャッシュを使って処理させようと思ってます。
実体は WordPress に。画像サーバの Nginx は要求された画像をなければ取得しに行って、以降はキャッシュを返す事によってリクエスト数を分散させようという目論見です。
とりあえず今回は WordPress の画像を別サーバで処理させるためにフックを使って URL を変更してみます。
スポンサーリンク
URLを置換する関数 (手抜きVer)
まず最初は共通で利用する画像の URL を置換する関数から。
今回は時間がなかったのでやっつけで “/wp-content/uploads” を含む URL のドメイン名を置換するようにしてみた。どうせここには画像しかアップしないから全部書き換えてしまえという感じですが、もっと厳密にやりたい場合はちゃんとした正規表現を使った方が良いと思う。
function domain_replace_thumbnail( $content ) { $url1 = '/worklog.be\/wp-content\/uploads/'; $url2 = 'image.worklog.be/wp-content/uploads'; $content = preg_replace( $url1, $url, $content ); return $content; }
アイキャッチ画像のフィルターフック
まずは、アイキャッチ画像をフィルターフック使って URL を変更する所から。
ちなみに、このフックはアイキャッチ画像の表示に the_post_thumbnail とか get_the_post_thumbnail の関数を利用している場合限定。
これらの関数は post_thumbnail_html というフックが用意されているのでこれで URL を変更する。
add_filter( 'post_thumbnail_html', 'url_replace_thumbnail' );
コンテンツデータのフィルターフック
コンテンツ内に直接記述されている URL は the_content のフィルターフックを利用する。
これは DB から読み出したデータを teh_content で出力する直前に作用するフックになる。
add_filter( 'the_content', 'url_replace_thumbnail' );
テキストウィジェットのフィルターフック
最後はテキストウィジェットにもフィルターフックをかけてやる。
サイドバーのテキストウィジェットに直接記述された URL は widget_text でフックをかける事ができる。
add_filter( 'widget_text', 'url_replace_thumbnail' );
大雑把ですがこれで大体の画像は全て新しい URL に置換する事ができるはずです。
あとは利用しているテーマやプログラムで、コレ以外の方法で出力している画像の URL を変更すれば OK。
次回は、この変換された URL で画像を表示できるように Nginx を構成する所を書いてみたいと思います。