WordPressの相対URL


115

WordPressでは、画像、ファイル、リンクなどが相対URLではなく絶対URLでWordPressに挿入されることに苛立ちを感じていました。相対URLは、ドメイン名の切り替え、httpとhttpsの切り替えなどにはるかに便利です。今日、相対URLでWP_CONTENT_URLを定義すると、投稿にファイルを挿入するときに、絶対URLではなく相対URLを使用することがわかりました。 。ずっと欲しかったもの!ただし、WordPressの公式ドキュメントでは、WP_CONTENT_URLを定義する場合は完全なURIを使用する必要があると述べています。

ワードプレスコーデックスは言う

WP_CONTENT_URLをこのディレクトリの完全なURI(末尾のスラッシュなし)に設定します。例:

define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');

相対URLを使用すると、すべてが正常に動作するようです。たとえば、

define( 'WP_CONTENT_URL', '/my-content-folder');

しかし、相対URIの使用に問題がありますか?完全なURIで定義する必要があるとWordPressが述べる理由があるに違いないと私は考えています。


3
答えは、WPコードおよび使用しているプラ​​グインのコードでのすべての使用を監査して、完全なURLであると想定されていない場合、それらがどれも想定していないことを確認することですが、理由は考えられませんそれは私の頭の上で大丈夫ではないでしょう。
2013年

2
このプラグインを試すwordpress.org/plugins/relative-urlをか、これはあなたが助けるかもしれない読んdeluxeblogtips.com/2012/06/relative-urls.html
クリシュナ

5
@クリシュナ:wp-configに相対URLだけを入力できるのにプラグインが必要なのはなぜですか?問題のポイントは、wp-configで相対URLを使用すると問題が発生するかどうかを確認することです。
AidanCurran 2013

36
ワードプレスに触れなければならないときに泣きます。
Tony Cronin 2014年

6
@TonyCroninそれがDrupalではないことを嬉しく思います。
motorbaby 2016

回答:


74

これは、コア開発者だけが答えることができる/すべきである質問の種類だと思います。調査したところ、コアチケット#17048が見つかりました。ブラウザに配信されるURLはルート相対である必要があります。コア開発者のリーダーであるAndrew Nacinが説明した理由を見つけることができます。彼はこの[wp-hackers]スレッドにもリンクしています。これらのリンクの両方で、WPが相対URLを使用しない理由に関する主な引用は次のとおりです。

コアチケット:

  • ルート相対URLは実際には適切ではありません。/path/WordPressでない可能性があります。インストールの外にある可能性があります。したがって、実際には絶対URLと大差ありません。

  • また、相対URLを使用すると、インストールを移動したときに変換を実行することが著しく困難になります。ほとんどの場合、find-replaceが必要になります。そのため、皮肉にも絶対URLの方が移植性が高くなります。

  • 他の多くの場所で絶対URLが必要です。これらを条件付きで追加する必要があると、処理が追加されるだけでなく、潜在的なバグ(およびプラグインとの非互換性)が発生します。

[wp-hackers]スレッド

  • WordPressは多くの場合サブディレクトリにあるため、何に関連しているかはわかりません。つまり、コンテンツを処理してから、パスの残りの部分に追加する必要があります。これによりオーバーヘッドが発生します。

  • 相対URLには、先頭にスラッシュがあるものとないものの2種類があることに注意してください。どちらにも、これを正しく実装することを不可能にする警告があります。

  • WordPressは絶対URLを保存する必要があります(保存します)。これには、コンテンツの前処理、オーバーヘッド、あいまいさは必要ありません。再配置する必要がある場合は、データベース内のグローバルな検索置換です。


そして、個人的なメモでは、テーマとプラグインが間違ってコード化されていることが何度か見つかりましたWP_CONTENT_URL
彼らこれが設定できることを知らず、これが真であると仮定します:WP.URL / wp-content / WhatEver、そしてそれは常にそうであるとは限りません。そして、途中で何かが壊れます。


プラグインの相対URLedseのAnswerでリンク)は、アクションフックの一連のフィルターで関数wp_make_link_relativeを適用します。それは非常に単純なコードであり、素晴らしいオプションのようです。template_redirect


14
良い情報。dev.mysite.com-> qa.mysite.com-> www.mysite.comまたはwww.anothersite.comに問題なく展開できるように、常にルート相対パスを使用しています。WPがそのことを考慮して設計されていなかったことは残念です。設定WP_CONTENT_URLは(許可されていても)相対URLを設定することを意図していないようなので、プラグインは最良のオプションのようです。設定時にプラグインWP_CONTENT_URLが機能しないが、プラグインを使用すると正常に機能するテストケースはありますか?
ジャスティン

2
相対パスはで始まりません。/ 相対URI(内で使用<a>)はで始まりませんhttp://
TulainsCórdova2016

13
Wordpressは適切なWebサイト向けではありませんでした。これは常にハックであり、ハッカーが(ここの引用から明らか)箱の外を考えたり見たりしていない人が書いたものです。Webサイトを移動できる唯一の方法は、相対URLやルート相対URLを正しく使用している場合です。絶対URLは絶対にそれを防ぎます。
ハッカ

8
サブドメイン、ルート、またはサブフォルダーに配置するように設定できるサイトを作成しました。それほど難しいことではありません。基本的には、「これはかなり前に作成したものであり、この変更は大きな影響を与えるため、修正しない」と言っている理由があるように感じます。
Donny V.

3
それでも、開発者の理由はどれも有効ではないと考えています。ハードコードされたURLには、相対的な問題と同じ問題があります。これは、元の開発者が「悪い習慣」ツールキットで行っている本当に悪い習慣の1つにすぎません...ワードプレスにはそれらがたくさんあるため、削除するために何度もフォークされています。これらの問題。
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

完全なURLパスを相対パスに変換します。

httpまたはhttpsプロトコルとドメインを削除します。パス「/」を最初に維持するため、真の相対リンクではなく、Webルートベースからのパスです。

リファレンス:Wordpress Codex


そして、あなたはそのphpスニペットをどこにドロップしますか?
エドワード

6

ラップに同意します。主な理由は、相対パスでの混乱を避けるためだと思います。ワードプレスは相対パスを使用して最初から機能することができると思いますが、複数のプラグインを使用する場合、テーマがどのように構成されるかなどの問題が発生する可能性があります。

テストサーバーで作業するときに、このプラグインを相対パスに使用したことがあります。

ルート相対URLすべてのURLをルート相対URLに
変換して、同じサイトを複数のIPでホストし、本番環境への移行を容易にし、モバイルデバイスのテストを改善します。


5
wp-configファイルで1つの定数を設定するだけでプラグインが必要になるのはなぜですか?WP_CONTENT_URL相対化の特定の落とし穴を回避するソリューションを提供し、独自のアプローチで落とし穴に負けない限り。私が知りたいのは、WP_CONTENT_URL親族を作ることで実際に既知の落とし穴があるかどうかです。
AidanCurran 2013年

1
スラッシュで始まるURLは、/wp-content/some-file.jpgある絶対パスではない相対パス。混乱の可能性はありません。WordPressが正当な理由なしに役に立たないのは、絶対URLにプロトコルとドメイン名が含まれているためです。WPサイトを開発からステージングからライブまで展開するには、データベースダンプのドメイン名に対して検索と置換スクリプトを実行する必要があります。私が思う問題は、それがブログで機能する制作中のコンテンツを編集するために設計されていることです(それはそれのために作られているものです)が、多くの商用Webサイトではそうではないということです。
アデ

1
dude.com/bob/janeと/ bob / janeの違いは何ですか?#serious #badpractice
Dawesi

1
@Ade、宿題は相対パスで行ってください。あなたは/wp-content/some-file.jpg絶対的な道であることについて間違っています。今後コメントを読む他の人にとって、Web相対パスは、プロトコルとドメインがパスから除外されたパスであることに注意してください。したがって、/wp-content/some-file.jpgおよびwp-content/some-file.jpg主要で、両方の相対的/第一の例では、アカウント所有者またはサーバのアクセス可能なルートディレクトリを参照の目的を保持します。
ペグ

1
@Pegues OK、「absolute url」ではなく「absolute path」という用語を使用して多くのソース(SOの一部)を見つけました。「ルート相対」パスとも呼ばれます。セマンティクスと用語はもちろん重要ですが、根本的に異なるという点は依然として重要です。ルートに対して相対的であることは、絶対URLの一貫した利点をすべて備えています。私が知らない他の理由がない限り。
Ade

4

私のサイトでそれをfunctions.phpで解決しました

add_action("template_redirect", "start_buffer");
add_action("shutdown", "end_buffer", 999);

function filter_buffer($buffer) {
    $buffer = replace_insecure_links($buffer);
    return $buffer;
}
function start_buffer(){
    ob_start("filter_buffer");
}

function end_buffer(){
    if (ob_get_length()) ob_end_flush();
}

function replace_insecure_links($str) {

   $str = str_replace ( array("http://www.yoursite.com/", "https://www.yoursite.com/") , array("/", "/"), $str);

   return apply_filters("rsssl_fixer_output", $str);

}

私は1つのプラグインに参加し、それをバラバラにカットしてこれを作りました。私のサイトのすべてのリンク(メニュー、CSS、スクリプトなど)を置き換え、すべてが機能していました。


0

[設定] => [メディア]の下に、[ファイルの完全なURLパス]のオプションがあります。これを空白ではなくデフォルトのメディアディレクトリパス '/ wp-content / uploads'に設定すると、相対パスが挿入されます(例: '/wp-content/uploads/2020/06/document.pdf')。

すべてのリンクが投稿などに関連しているかどうかはわかりませんが、少なくともメディアを処理しているため、ほとんどの人が心配しています。


このオプション「ファイルへのフルURLパス」は、デフォルトではメディア設定に表示されません。それをアクティブにするwp-configにいくつかの設定はありますか?
AidanCurran

@AidanCurran私はそれが長い間存在していたと確信していますが、いくつかの調査の結果、WP 3.5+からデフォルトで削除されたため、結局これを有効にするwp-configがあるようです。wordpress.org/plugins/upload-url-path-enablerのような古いプラグインを使用して元に戻すことができます。 つまり、プラグインの1つがこれを追加し直していると思います。ElementorとテーマFuturioをプラグインFuturio Extraで使用するだけです。私は何も変更せずにそれらを無効にしようとしたので、確かではありません:/
抱擁

@AidanCurran次のようなものを追加できます:update_option( 'upload_url_path'、 '/ wp-content / uploads'); ただし、テーマのfunctions.phpファイル内、または一部のコードスニペットプラグインを使用すると、同じ効果が得られます。
ハグ

-3

get_home_url()を使用する必要があります。その場合、リンクは絶対的ですが、サイトのURLを変更しても影響はありません


-4

ドメイン名を変更している間、古いドメイン名のすべてのインスタンスを新しいものに置き換えることができるSQLダンプファイルを作成していると思います。これを行うのに役立つプラグインがないため、これは唯一のオプションです。

これが最速の方法です。


1
シリアル化されたPHP文字列のドメイン名も置き換える必要があることを覚えておいてください。この便利な検索および置換ツールは、標準的な方法のようです(GitHubリポジトリはこちら)。これは、私がcapistrano-wpのように使用するCapistranoデプロイメントソリューションで使用され、非常にうまく機能しているようです。また、ムービングワードプレスコーデックスの公式ページでも参照されています
マットギブソン

3
このアプローチは面倒でエラーが発生しやすくなります。wp-configで相対URLを使用することでそれを回避できる場合は、それほど良い方法ではありませんか?問題のポイントは、wp-configで相対URLを使用すると問題が発生するかどうかを確認することです。
AidanCurran 2013

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.