表示されている現在のページのURLを取得する方法は?


55

カスタムPHPコードを追加して、サイトのページがブラウザーに読み込まれるたびに、そのページのURLが画面にエコーされるようにします。を使用できますがecho get_permalink()、すべてのページで機能するわけではありません。一部のページ(私のホームページなど)には複数の投稿get_permalink()が表示されますが、これらのページで使用すると、表示されたページのURLは返されません(ループ内の最後の投稿のURLを返します)。これらのページについて、URLを返すにはどうすればよいですか?

get_permalink()ループが実行される前に起動する特定のフックに接続できますか?または、どういうわけかループから抜け出すことも、完了後にリセットすることもできますか?

ありがとう。


このURLで何をしたいのか、コンテキストを提供できますか?共有可能なURLを作成しようとしていますか?リンク/アクションのカスタムURLを組み立てますか?
トムJノウェル

@TomJNowell特定のJSスクリプトをキューに登録したいが、特定のページのみ(この場合、これらのページはさまざまな言語での私のサイトのホームページです:example.comexample.com / frexample.com / es、等)。JSファイルは、ホームページにのみ表示されるいくつかのタイトルにハイパーリンクを追加するサーバーです。
cag8f

is_home()or is_page( 'fr' )などを使用して、それが正しい場合にのみスクリプトをキューに入れるのはなぜですか?
トムJノウェル

@TomJNowellさて、私のコードはif ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} 言語に関係なく、すべてのホームページで起動するようです。それはあなたが提案していたことですか?
cag8f

使ってみません$_SERVER['REQUEST_URI']か?この質問を参照してください:stackoverflow.com/q/6768793/247696
Flimm

回答:


86

get_permalink() は、単一のページおよび投稿に対してのみ有効であり、ループ内でのみ機能します。

私が見た最も簡単な方法はこれです:

global $wp;
echo home_url( $wp->request )

$wp->requestURLのパス部分が含まれます。[設定]> [全般]でURL /path/to/pagehome_url()出力しますが、パスを追加することができます。そのため、このコードではホームURLにリクエストパスを追加しています。

これはおそらく、プレーンに設定されたパーマリンクでは機能せず、クエリ文字列(?foo=barURLの一部)が省略されることに注意してください。

パーマリンクがプレーンに設定されているときにURLを取得する$wp->query_varsには、代わりにそれを渡すことで使用できますadd_query_arg()

global $wp;
echo add_query_arg( $wp->query_vars, home_url() );

そして、これら2つの方法を組み合わせて、パーマリンクの設定に関係なく、クエリ文字列を含む現在のURLを取得できます。

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );

7
パーマリンクがプレーンに設定されている場合:echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
マックスユーディン

1
@Jacob私はそれを試しましたが、それは私のホームページのURLのみを返すようです。このページの左上(dev.horizo​​nhomes-samui.com/properties/hs0540)でわかるように、ここにコードを挿入しましたecho home_url( $wp->request )。私も含めるglobal $wpようにしました。パーマリンクは「プレーン」ではなく、「投稿名」に設定されています。ログに関連するPHPエラーも表示されません。この特定のページは私の開発サイトの一部であり、それ以外の場合は訪問者に対してブロックされています。それが重要かどうかはわかりません。編集:実際には、その考えを保持してください-ユーザーエラーかもしれません。スタンバイ
...-cag8f

@Jacob edit 2:OK、コードは実際に機能します。私の問題は、functions.php「naked」にコードを含めることでした。つまり、フックに接続されている関数には含まれていませんでした。そのため、ブラウザに表示されたページに関係なく、コードはホームページのURLを返していました。関数(WPフック(wp_enqueue_scripts)にアタッチされた関数)内でコードを移動すると、表示されたページのURLが実際に返されました。その行動の理由を知っていますか?そのための新しい質問を作成する必要があるかもしれません。
cag8f

3
@ cag8f functions.phpでコードが「裸」になっている場合は、$ wpオブジェクトのすべてのプロパティが設定される前にコードを実行しています。適切なフックに接続された関数でそれをラップすると、Wordpressコードの適切なポイントが実行されるまで実行を遅らせます。
アンディマコーレイブルック

これらの方法はすべて素晴らしいものであり、WordPressで作業するための素晴らしいアイデアです。trailingslashit()ただし、必要に応じて追加することもできます。
ジェイク

8

以下のコードを使用して、WordPressの現在のURL全体を取得できます。

global $wp;
$current_url = home_url(add_query_arg(array(), $wp->request));

これにより、クエリパラメータを含む完全なパスが表示されます。


こんにちは-あなたが見ている場合developer.wordpress.org/reference/functions/add_query_argを、あなたのコードが実際に既存のクエリパラメータを保持していないことがわかります。
アンディマコーレイブルック

2
クエリパラメータを保持するには、空array()をに置き換える必要があります$_GET。すなわち:home_url(add_query_arg($_GET,$wp->request));
ブラッドアダムス

WordPressがサブディレクトリにインストールされている場合、動作しません
ManzoorWani

1
function current_location()
{
    if (isset($_SERVER['HTTPS']) &&
        ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
        $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
        $protocol = 'https://';
    } else {
        $protocol = 'http://';
    }
    return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

echo current_location();

このコードが問題を解決する方法と理由を説明できますか?
ケロ

私の意見では、最も柔軟なソリューションです。WPページ(wp-admin、wp-login.php、アーカイブページなど)でも機能します。URLパラメータが含まれていないことに注意してください
Philipp

1

次のコードは、現在のURLを提供します。

global $wp;
echo home_url($wp->request)

以下のコードを使用して、クエリパラメータとともに完全なURLを取得できます。

global $wp;  
$current_url = home_url(add_query_arg(array($_GET), $wp->request));

これにより、クエリパラメータを含む完全なパスが表示されます。既にURLにある場合、これはクエリパラメータを保持します。


このスニペットはwp-admin/plugins.php、現在のURLをスキップします。ルートパスとクエリ文字列のみです。
リザード・イドラシュク

0

これは、前述の改善された例です。きれいなURLが有効になっている場合は動作しますが、/ page-slug /?param = 1などのクエリパラメータがある場合やURL がい場合は破棄されます。

次の例は両方のケースで機能します。

    $query_args = array();

    $query = wp_parse_url( $YOUR_URL );

    $permalink = get_option( 'permalink_structure' );

    if ( empty( $permalink ) ) {

        $query_args = $query['query'];

    }

    echo home_url( add_query_arg( $query_args , $wp->request ) )

0

たぶんwp_guess_url()あなたが必要なものです。バージョン2.6.0以降で使用可能。


これは、ベースURLを推測するだけです。フロントエンドでは、と同様の効果が得られhome_url()ます。
ジェイク

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