WordPressが画像URLに相対パスを採用しないのはなぜ?
-
メディアがあるディレクトリはサイトトップからは絶対的にパスが通っているわけです。
一方エントリーはパーマリンクによって、生成されるURLがふられるわけですものね。
パーマリンクでカテゴリーベースにしていた場合、スラッグを修正した時にメディアのパスを見なおさないケースが起こったら大変だと思います。相対パスにできるとも思いますが、わたし個人的には絶対パスで不便はありません。
回答ありがとうございます。
なるほど。よく自分なりにも調べてみたのですが、mod_rewriteでURLを変換した場合(パーマリンク設定でカテゴリベースを設定した場合など)、ブラウザは実URLではなく、変換後のURLを基点として相対パスを辿っていくのですね。
本当に理解できているか自信がないので、下の例をご覧いただければうれしいです。この理解で正しければdigit@maetelさんの仰る通り、絶対パスの方が分かりやすく修正する際もミスが少ない気がします。例:
・ドキュメントルート /www/wp
・メディアディレクトリ /www/wp/wp-content/uploads
・書き換え前の記事URL http://url.com/123
・書き換え後の記事URL http://url.com/topic/123
上記のような場合、URL書き換え前の記事でメディアファイルを ./wp-content/uploads/media.jpg などと指定していた場合、URL書き換え後は(もし相対パスで指定するならば) ../wp-content/uploads/media.jpg とすべて修正をかけなくてはいけないということでしょうか?ixkaitoさん回答ありがとうございます。
不可能とは、相対アドレスにすると論理的に矛盾ができるということでしょうか?それともdigit@maetelさんの仰るような不都合が生じるということでしょうか?理解力が足りないので、なぜその点が相対アドレスと深く関わってくるのかということからきちんと理解できていないのですが、(仮に実装しようとなら)例えばwpアドレスとサイトアドレスが違う場合は単純な条件分岐で相対アドレスでの指定をグレーアウトするだけで実現可能な気がします。
参考までに自分の場合は引っ越し前提で固定ページに画像を使う場合
下記のようなショートコードを作成してテーマファイルの中に画像を入れています。//イメージショートコード function imgFunc($atts) { extract(shortcode_atts(array( 'src' => "", 'alt' => "", 'width' => "", 'height' => "", ), $atts)); $src = get_template_directory_uri() . "/img/" . $src; if($alt){$alt= "alt='{$alt}'";} if($width){$width= "width='{$width}'";} if($height){$height= "height='{$height}'";} return "<img src='{$src}' {$alt} {$width} {$height}>"; } add_shortcode('img', 'imgFunc');
連投失礼します。
ちなみに私も実際にwpアドレスとサイトアドレスを別々にした際、前述の例に示したような理由から、同じ相対パスで正しいメディアの場所を指定し続けることはできないということは理解しています(正確には理解はしていませんが体験しています)。ixkaitoさんの仰る内容は、このようなお話以前に、論理的に内部に矛盾ができてしまうということでしょうか?もしそうならばプラグインやfunctionを使って(あるいは手動で)メディアファイルを相対パスで指定することもバグを誘発するような危険な行為になるのでしょうか?
gogowebさん回答ありがとうございます。
私はまだショートコードなどの仕組みがあまり理解できていないのですが、ショートコード側でドメインとテンプレートのimgディレクトリまでのurlを指定していらっしゃるということでしょうか。とても勉強になります。http://example.com 直下にWPをインストールした場合、exampleというテーマで相対パスで style.css をトップページに記述すると、
<link rel="stylesheet" href="wp-content/themes/example/style.css" />
になります。では、設定で WordPress アドレスを http://example.com/wp に変更して、WPをwpディレクトリに移す場合、style.css は
<link rel="stylesheet" href="wp/wp-content/themes/example/style.css" />
にならなければいけません。テーマ内の記述をすべて変更しなければならなくなります。そもそもWPをどこにインストールされるかわからない以上、相対パスでテーマの作りようがありません。
上記の場合でなくても、投稿や固定ページ内の内容はいろんなページで表示される可能性がある(ホーム、アーカイブページ、個別ページ、さらに自分の好きな場所に表示させることも可能です)ので、WPが現在のページを判断して相対パスを出力する処理をするのは現実的ではありませんし、それをするほどのメリットもありません。
ixkaito さんが書かれているようにどこにインストールされるか分からないから、管理画面で入力されているサイトやWordPressのアドレスを WordPressの関数を介して出力しています。
また、投稿やテーマに限らない部分、例えばプラグインが http:// から始まる 画像パスをデータベース内に保存していることもあります。
(例:Image Widget は画像のパスを「シリアライズ」した状態でデータベースに保存)単純に「ローカルから本番環境への移行などの際、とても不便に感じた」のであれば、
Codexの「Moving WordPress」を参考に作業をおこなえば済む話です。ローカルから本番環境への移行などの際、とても不便に感じたのでもし相対パスにした際に起こりうる問題などありましたらご教授頂きたいです。
試していませんが、feedのリンクなどはどうなりますかね?
本文の画像URLを相対リンクで記述して、移転する場合などで書き換えが必要になったときに、正規表現などでの書き換えがとても困難になりませんか?
テンプレート部分などでは、
get_template_directory_uri()
などのワードプレス関数を使っていれば、フィルタを使って、URLが簡単に書き換えられますが、そういう部分を
wp_make_link_relative()
みたいなもので書き換えたとしても、あまり魅力はない様に思います。画像を相対リンクにして、楽になりたいというきもちは、わかります
日本でも
http://wpxtreme.jp/how-to-resolve-the-absolute-url-probrem-in-post-content
http://www.warna.info/archives/1789/
海外でも
http://wordpress.org/support/topic/using-relative-instead-of-absolute-links-for-images?replies=19
Otto says
Use of absolute URIs is the generally preferred approach. Relative URIs is bad practice and bad form, generally speaking. It might be fine for a static site, or one that is intended to be moved to a new location, but for a dynamically generated site which has a permanent URL/domain, absolute URIs just make more sense.
>ixkaitoさん、とてもよくわかりました。ありがとうございます。私自身まだwebそのものを触り始めたばかりなような状態なので、アーカイブページやその他のページにまで考えが及んでいませんでした。勉強になります。確かにそのお話を聞くとわざわざ相対パスで指定することにメリットは感じないですね。
>gatespaceさん、ありがとうございます。ローカルからの移行の際はプラグインなども気をつけないといけないんですね。頭がそこまで回っていませんでした。あまりプラグインは導入していませんでしたが、移行させる際は気をつけようと思います。また参照リンクありがとうございます。拝見させていただきます。
>nobitaさん、ありがとうございます。確かにfeedにも問題でてきますね。絶対パスで指定しないと本当に色々なところで問題が出てくるんですね。こんなに問題がたくさんあるということを考えてもみませんでした。リンクも、とても参考になりました。ありがとうございます。
皆さんに指摘されればされるほど「なるほど」と新しい発見がありました。こんなにも問題があるなんて考えても見ませんでした。ずっと疑問だったことが解決してとてもスッキリしました。ありがとうございました。
- トピック「WordPressが画像URLに相対パスを採用しないのはなぜ?」には新たに返信することはできません。