【WP】今いる投稿・カテゴリ・タグページのURLを取得する方法

WordPressで「現在表示中のページ」のURLを取得する方法まとめ。カテゴリやタグアーカイブの取得、2ページ以降もカバーする方法も。条件分岐せずPHPで直接取得するときの方法もご紹介しています。

【WP】今いる投稿・カテゴリ・タグページのURLを取得する方法

WordPressで現在表示中のページURLを取得(出力)する方法です。

TwitterやFacebookを初めとするSNSのシェアボタンを作ったり、リンクバック用のURLを細かく制御したいときなど割と出番は多いのではないでしょうか。

自分でもあちこち作り散らかして閲覧性が悪いので備忘録がてらにまとめておきます。

今いる投稿ページのURL

一番オーソドックスな方法は標準で用意されています。

【PHP】
the_permalink();

しかし問題はループ外の処理でしょう。特にトップページやカテゴリページなどは表示頻度も高いのですが、意図した動作をしないので困ります。具体的に言うと最新記事のIDがキャッシュに残ります。

なのでカテゴリやタグなどのアーカイブページに関しては個別に取得しないといけないんですよね。あうあうあうあうあう。

トップページのURLを出力

【PHP】
<?php
if( is_home() ){
  echo home_url( '/' );
}
?>

タグ呼び出しそのままだとスラッシュが入らないので必要に応じて入れて下さい。

どこか特定のページを指定したいとき

直下以外のページを指定したいときは、該当する相対パスを指定します。

【PHP】
<?php echo home_url( '/hogehoge/' ); ?>

カテゴリアーカイブのURLを出力

カテゴリアーカイブは現在のカテゴリを取得してからURLを生成します。

【PHP】
<?php
global $post;
if ( is_category() ){
  $url = get_category_link( get_query_var('cat') );
  echo $url;
}
?>

タグアーカイブのURLを出力

最初の頃これ割とはまりました。…というか、なんで標準タグがないの。(怒)

【PHP】
<?php
if ( is_tag() ){
  $postTag = get_the_tags();
  $url = get_tag_link( $postTag[0]->term_id );
  echo $url;
}
?>

何度も関数を通さず、直書きするとこんな感じ。

【PHP】
<?php
if ( is_tag() ){
  $postTag = get_the_tags();
  $url = home_url('/') .'tag/'. $postTag[0]->slug .'/';
  echo $url;
}
?>

ページネーションしてるとき

複数ページにわたってるときは1枚目しか返ってこないので困ります。それぞれのアーカイブページでURLを生成した後、更に2ページ目以降であるかどうかを判定します。

【PHP】
<?php
global $page,$paged;
if ( $paged >= 2 || $page >= 2):
  $url = $url.'page/'.max( $paged, $page ).'/';
endif;

もう、とにかく条件分岐条件分岐で面倒臭い~。どうにかなりませんのこれ。><

PHPで現在のリクエスト情報を取得する

どうにかひとつの書式で済ませたいんですが、WordPressのテンプレートタグだと一言で書けないようです。

そんなときはPHPで現在のリクエストを直接取得するという手も。これだととりあえず今ブラウザが開いてるページのURLが得られます。出力されると困るものが入ってきたら、要らない文字列を探して切り捨てて下さい。

【PHP】
<?php
$tempUrl = 'http://'. $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
// ゴミ取り処理
$p = strpos( $url, "要らない文字列");
  if($p):
    $url = substr($url, 0, $p);
  else:
    $url = $tempUrl;
  endif;
echo $url;
?>

現在表示中のページURLを取得してみた感想

面倒な処理でもテンプレートタグが用意されてるのがWordPressの良さだと思うんですが、条件ごとに細かく切り出さないといけないのが悩ましいですね。

タグとカテゴリはタクソノミーで振り分けたらひとつの処理にまとまるのかしら。ちょっと調べて出来そうだったら追記します。