ときどき、PHPでも現在のパスを取得したいときがあります。

個人用としてメモしておこうかなと思います。

ソースコードと説明

/****************
* 現在のパス取得
****************/
function get_url_pos(){
    $parses = parse_url($_SERVER["REQUEST_URI"]);
    $urls = explode("/",$parses["path"]);
    $urls = array_filter($urls, "strlen");
    $urls = array_values($urls);

    return $urls;
}

説明するとまず、parse_url($_SERVER["REQUEST_URI"]);で「現在のURL」を配列にします。

「https://watanabemitsutoshi.com/webcreate/wordpress」というURLの場合はそれぞれのパーツが格納されていくイメージです。

array(3) {
  ["host"]=>
  string(#) "http://watanabemitsutoshi.com"
  ["path"]=>
  string(#) "/webcreate/wordpress"
  ["query"]=>
  string(#) ""
}

確認はしていませんが多分こんな感じになると思います。(実行結果ではないサンプルなのでstringの値は#にしてあります。)

そして、explodeで$parsesに格納したURL情報を取り出すためにはキーの[“path”]から取ります。

これでドメイン以降のパスをそれをスラッシュごとに取り出しできます。

array_filter、array_valuesという流れできちんとした配列に。

配列にwebcreate、wordpressというように格納されます。

$url = get_url_pos();

今回はfunctionで書いているので、呼び出し方は当たり前ですが、こんな感じ。

これで取得完了です。

任意のURLでも取得できるよ

/****************
* 指定したパス取得
****************/
function get_url_select($url){
    $parses = parse_url($url);
    $urls = explode("/",$parses["path"]);
    $urls = array_filter($urls, "strlen");
    $urls = array_values($urls);

    return $urls;
}

戻り値と返り値があるパターンです。

戻り値と返り値を指定しておけば、変数に入れたリンクなどでパスが取り出せます。

$url = get_url_select(ここに値);

臨機応変に処理が簡潔に書けて便利です。

使い方の凡例

まずはvar_dump()で実行結果を確認しましょう。

配列で欲しいものを$url[0]という形で指定すれば、比較にも使えます。

例えば、ページ内にメニューがあったとします。

https://watanabemitsutoshi.com/webcreate/wordpressの記事内だった場合、カテゴリーに属しているメニューをアクティブ状態にしてあげたい。

当ブログの場合だと、Web制作はwebcreateというスラッグです。

webcreateというパスは共通なので、「Web制作」をアクティブ状態にしてあげたいときはwebcreateというパスがある場合のみ、リンクにactiveを付けてあげるような形でやってあげればいいですよね。

実は丁度、上記で紹介した2つの処理で比較ができます。

現在のページとメニューのリンクのスラッグで比較してあげれば良いので、現在のページのスラッグとメニューのリンクのスラッグが一致したら〜という感じでif文を書いてしまえばOKです。

if ( メニューURLパス[0] == 現在のページURLパス[0] ){    //URLが一致したらactive
$html .= '<li class="active"><a href="メニューリンク"><span>メニュータイトル</span></a></li>';
}else {
$html .= '<li><a href="メニューリンク">メニュータイトル</a></li>';
}

あらかじめ取得したものを入れた変数を使うだけなので簡単だと思います。

まとめ

今回はfunctionに書く前提で紹介してみましたが、別に使いたいところに書いても構いません。でも関数化しておくと楽だし、便利ですね。

PHP: parse_url – Manual

parse_urlに関してはリファレンスで確認を。リファレンスを読むことは大事です!!

やりたいことがあったらGoogleで調べれば大概出てきますが、しっかり意味を理解して書かないとあとあと大変なことになるので意味を覚えたほうがいいですね。