【WordPress】投稿や固定ページのURLを取得する方法|esc_url()での安全な出力

WordPressで投稿や固定ページのURLを取得することは、カスタムリンクや動的なコンテンツを作成する際に非常に重要です。この記事では、さまざまな関数を使ってURLを安全に取得・出力する方法を紹介します。

この記事でわかること

  • get_permalink()/get_page_link()/home_url()の使い分け
  • esc_url()による安全な出力
  • get_page_link()の意外な挙動(静的フロントページの場合)
スポンサーリンク

get_permalink() 関数を使ったURLの取得

get_permalink() 関数は、特定の投稿や固定ページのURLを取得するために使用されます。この関数は投稿IDを引数として受け取り、そのURLを返します。the_permalink()と異なり自動でエスケープされないため、出力時はesc_url()で囲んでください。

投稿・固定ページのURLを安全に取得して表示
$post_id = 123; // 投稿または固定ページのID
$url = get_permalink( $post_id );
echo esc_url( $url );

ループ内での the_permalink() 関数の活用

the_permalink() 関数は、WordPressのループ内で現在の投稿や固定ページのURLを表示するために使用されます。この関数はテンプレートタグとして内部で適切にエスケープされた上で出力されるため、そのまま使用して問題ありません。

ループ内で現在の投稿のURLを出力
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        the_permalink(); // 現在の投稿のURLを出力(自動でエスケープ済み)
    }
}

固定ページのURLを取得する get_page_link() 関数

get_page_link() 関数は、特定の固定ページのURLを取得するための関数です。get_permalink() と似ていますが、固定ページに特化しています。

固定ページのURLを安全に取得して表示
$page_id = 456; // 固定ページのID
$url = get_page_link( $page_id );
echo esc_url( $url );
静的フロントページの場合はホームURLが返る
本番WPコアで確認したところ、対象のページが「設定 → 表示設定」で指定した静的フロントページである場合、get_page_link()は通常のページURL(例:/about/)ではなく、サイトのルートURL(home_url('/')を返します。フロントページとして使われているかどうかを意識せずに書けるため、便利な仕様です。

home_url() 関数でカスタムパスのURLを生成

home_url() 関数は、サイトのホームURLにカスタムパスを追加して完全なURLを生成する際に使用されます。特に、カスタムリンクを作成する場合に便利です。

カスタムパス付きのURLを安全に生成して表示
$relative_path = '/custom-path/';
$url = home_url( $relative_path );
echo esc_url( $url );

よくある質問(FAQ)

Q記事や固定ページのパーマリンクURLを取得するには?
Aget_permalink($post_id)でURLを取得できます。ループ内では引数なしのget_permalink()で現在の投稿のURLを取得します。表示する場合はecho esc_url(get_permalink())が安全です。
Qカスタム投稿タイプのURLも同じ方法で取得できますか?
Aはい、get_permalink()はカスタム投稿タイプにも対応しています。register_post_type()でrewriteを正しく設定し、パーマリンクを再保存しておく必要があります。
QスラッグからURLを取得するには?
Aget_page_by_path(‘スラッグ’)で投稿オブジェクトを取得し、get_permalink($post->ID)でURLを得ます。またはget_permalink(get_page_by_path(‘スラッグ’))と一行で書くこともできます。

まとめ

  • 投稿・固定ページ共通get_permalink()(要esc_url)
  • ループ内the_permalink()(自動エスケープ済み)
  • 固定ページ専用get_page_link()(静的フロントページはホームURLを返す)
  • カスタムパスhome_url()(要esc_url)

直接echoする関数はすべてesc_url()で囲んで、安全にURLを出力しましょう。