MUを含めしばらくWordPressを使っている。それまで一度も気になったことがなかったのだが、最近になってWordPress3.0.xのマルチサイト機能を利用し始めたところ、画像が何かのタイミングで表示されないことがあった。プラグインの問題だろうと思っていたが、詳しく調べるとFirefoxの問題らしい。
まず、画像を追加すると以下のコードが生成される。当然これは表示される。
<img title="A" src="http://www.yoursite.jp/wp/blogname/files/mediafile.jpg" />
複数の画像をアップロードし、その後記事を書くスタイルをとっている。すべからく画像をドラッグすることになる。これは表示されない。(以前、コピーアンドペーストをしたところ、コードがおかしくなったことがあって、ドラッグアンドドロップではその問題が発生しなかったことからこのような操作をしている)
<img title="B" src="../files/mediafile.jpg" />
コードを以下のように直せば表示されるが面倒。
スポンサードリンク
<img title="E" src="./files/mediafile.jpg" />
その他表示されるのは以下のとおり:
<img title="C" src="../blogname/files/mediafile.jpg" />
<img title="D" src="/wp/blogname/files/mediafile.jpg" />
http://www.yoursite.jp/wp/blogname/files/mediafile.jpg
http://www.yoursite.jp/wp/blogname/wp-includes/ms-files.php?file=mediafile.jpg
以下は表示されない:
http://www.yoursite.jp/wp/files/mediafile.jpg
解決策を探す
まず、.htaccessで解決できないかと考えたが、筆者にはそれができなかった。仕方なくリダイレクトするPHPコードを書く事にした。問題は相対パスになってしまうとブログ名が分からなくなってしまうこと。ハードコーディングではマルチサイトの意味がなくなってしまうので、これはRefererから取得することで解決した。”直接”設置したプログラムにアクセスすると転送が無限ループするという警告が出たので注意が必要だ。
設置例
.htaccess
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] # add casey for image insert RewriteRule ^files/(.+)$ files/wpmr.php?$1 [L] # uploaded files RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L] </IfModule> # END WordPress
/wp/files/wpmr.php
<?php /*----------------------------------------------------- * redirector for wordpress multiple blog media. * WordPress Media file Redirector *----------------------------------------------------- * Detail: * - Firefox is illegal to convert a relative path and * to rearrange the media. * - Appended to the .htaccess to display correctly if * the transfer to this program. * - Each time there is no need to change the source. * * Install: * - Add write transfer this program to .htaccess. * ex. * RewriteRule ^files/(.+)$ files/wpmr.php?$1 [L] * - Make directory and put this file. * ex. * /wp/files/wpmr.php * * Auther: * - casey, www.casey.jp, GPL * * History: * - 2010.10.13 0.01a first * * See also see my blog. */ // get filename $path = pathinfo($_SERVER["REQUEST_URI"]); $file = $path["basename"]; // get ref $ref = $_SERVER["HTTP_REFERER"]; // make url $path = split("/", $ref); for($i=0; $i<count($path)-1; $i++){ $url .= $path[$i] . '/'; } // set filename //$ret = $ref .'files/'. $file; $ret = $url .'wp-includes/ms-files.php?file='. $file; // redirect header("Location: $ret", true, 302); exit(); ?>
# 危なくプラグイン作者にメールを送るところだった
コメント