パンくずリストの作り方(PHPでフォルダ名を取得して作成)

パンくずリストは、ウェブページがサイトでどのような位置関係にあるかを示すナビゲーターです。グーグルの検索結果ページにも表示されるようになりました。ウェブページのディレクトリ(フォルダ)名をPHPで取得して、パンくずリストを作ってみました。

パンくずリストとは

パンくずリストの例の画像

ウェブページが巨大になってくると、閲覧しているウェブページが、サイトでどのような位置関係にあるのかを把握するのが難しくなってきます。

そこで、この画像のように、トップページから該当ページへの道筋を表示することが行われています。これがパンくずリスト(breadcrumb)と呼ばれるものです。

「パンくずリスト」の名前は、 童話楽天 の「ヘンゼルとグレーテル」で、主人公が森の中で迷わないようにパンくずを少しずつ落としながら歩いたということから来ているといわれています。

具体的には次のようなものです。「このページのタイトル」以外はクリック可能なリンク表示になっています。

トップページ名 > 大項目名 > 小項目名 > このページのタイトル

PHPを使ったパンくずリストの作り方

私の場合は、トップページから3クリック以内で全てのページへ移動できますので、ディレクトリ(フォルダ)は2階層までとなっています。(正確には、サイトマップを使えば、最短は2クリック以内で全てのページへ移動可能です)

次のようにPHPを使って第一階層と第二階層のディレクトリ名を取得してパンくずリストを作成しています。

PHPを使ってファイルのディレクトリ名を取得します

文字列を区切り文字で分割するには、普通はsplit()関数を使います。しかし、split()関数はPHP 5.3.0 で非推奨になったらしい。代わりにexplode()関数を使うことにしました。この方が動作が速いようです。

PHPの explode() 関数の使い方

explode() の機能は文字列を区切り文字($delimiter)で分割し、その分割された文字列の配列を返すものです。

explode($delimiter,$string[,limit])

この配列の各要素は、元の文字列($string)を文字列($delimiter)で区切った、部分文字列になります。

limitに正の値が指定された場合の、返される配列は、最大limit数の要素になり、その最後の要素には$stringの残りの部分が全て含まれます。

もし、limitが負の場合は、後ろからlimit個の要素を削除して、他の全ての要素が返されます。(Ver.5.1.0より)

PHPの explode() 関数を使ってファイルのディレクトリ(フォルダ)名を取得します

<?php
$s_name=$_SERVER['SCRIPT_NAME'];
$dir_a=explode("/",$s_name,-1);
?>

この例では、$_SERVER['SCRIPT_NAME']は、サーバーのドメイン名の後ろのパスとファイル名を表しています。例えばhoge.jp/dir1/dir2/example.phpなら/dir1/dir2/example.phpを表しています。

そこで、PHPの explode() 関数を使ってファイルのディレクトリ名に分解します。この中のディレクトリ(フォルダ)名「dir1」を取り出すのなら「$dir_a[1]」とします。この中の「dir2」を取り出すのなら「$dir_a[2]」とします。

「$limit」が「-1」になっているのは、最後の文字列がファイル名なのでこれを削除する為です。この「-1」は、今回の場合は無くても動作に影響しません。

「$_SERVER['SCRIPT_NAME']」を直接explode()で処理しようとするとエラーとなります。だから、あらかじめ、「$_SERVER['SCRIPT_NAME']」を「$s_name」に代入しています。

取得したディレクトリ名を使ってパンくずリストを作る

私のウェブサイトはジャンル毎にディレクトリ(フォルダ)を分けていて、その階層は2階層までになっています。この方法は、PHPの explode() 関数を使ってファイルのディレクトリを取得して、パンくずリストを作るのにとても好都合なのです。

ページのタイトルは$titleで取得しています。このタイトルからmb_substr関数を使って、全角と半角を含めた20文字を先頭から取り出しています。文字のエンコードはシフトJISです。

次に取り出した$s_titleから「,」で区切られた部分より前をexplode関数を使って$s_title[0]で取り出しています。「,」で区切られていない場合は全部を取り出します。もし、タイトルが無い場合は、「This Page」と表示させています。

<?php
$s_name=$_SERVER['SCRIPT_NAME'];
$dir_a=explode("/",$s_name,-1);
$s_title=mb_substr($title,0,20,"SJIS");
$s_title=explode(",",$s_title);
$f_name=substr($_SERVER['SCRIPT_NAME'],-9,9);
if($f_name!="index.php")
{ ?>
<a href="http://hoge.jp/">トップページ</a> &gt;
<?php
if($dir_a[1]=="第1階層のディレクトリ名1") { echo"<a href='/第1階層のディレクトリ名1/'>第1階層の項目名1</a> &gt;";}
if($dir_a[1]=="第1階層のディレクトリ名2") { echo"<a href='/第1階層のディレクトリ名2/'>第1階層の項目名2</a> &gt;";}
以下同様にサイトに合わせて作成します
if($dir_a[2]=="第2階層のディレクトリ名1") { echo"<a href='/第2階層のディレクトリ名1/'>第2階層の項目名1</a> &gt;";}
if($dir_a[2]=="第2階層のディレクトリ名2") { echo"<a href='/第2階層のディレクトリ名2/'>第2階層の項目名2</a> &gt;";}
以下同様にサイトに合わせて作成します
if($s_title[0]=="") { echo" This Page";}
echo" $s_title[0]";
<?php } ?>

この中で、index.phpのページはトップページからすぐに行けますので、パンくずリストを表示しないようにしています。

パンくずリストを表示したい所で、このファイルを各ページにインクルードして取り込むと、各ページにパンくずリストが表示されます。この方法はあまりにも簡単で拍子抜けしてしまいました。今まで何度もパンくずリストの作成に挑戦して失敗していたのは何だったのでしょうか。

グーグルの検索結果ページに表示されると少しだけ目立ちます

パンくずリストは必ず表示される訳ではありませんが、パンくずリストが検索結果に表示されると、URLだけ表示している他のサイトより、日本語表示のパンくずリストは少しだけ目立つようになります。これによって、少しでもアクセスが増えれば良いのですがどうでしょうか。それよりも、ユーザーにとってウェブページが見やすくなる効果の方が大きいでしょう。

以前は構造化マークアップをしなければパンくずリストは表示されませんでした。しかし、最近はグーグルが高確率でパンくずリストを理解して、スニペットに表示するようになりました。