WordPressに人間のためのサイトマップを作る方法

とりあえず・・・何ができるかを先に見てください。
このページの↑のほうに設置している サイトマップ です。
今回は、サイトマップの作り方です。

タイトルにも書いてある通り、GoogleやYahooとかの検索ロボットのためではありません。訪問者(人間)に見てもらうためのサイトマップです。
検索ロボット用には、Google XML Sitemapsという便利なプラグインがありますので、こちらを使うといいと思います。

では、さくさくっと作り方を書いていきます。

前提条件

  • 探す時間が惜しかったので、プラグインが既に存在するのかあまり調べてない
  • テーマファイルとして、新規にファイルを作成する
  • 既存のWordPress本体やテーマファイルには手を加えない
  • 記事数が増えたときのことを考えてない(今仕様)

とりあえず事前に軽くGoogleさんなどに聞いてまわったのですがスグには見つからず、探している時間があれば作ったほうが早いと思って作ることにしました。探せば既にプラグインがあるのかもしれません。
あとの2つはお約束みたいなものです。こういうオープンソースのものって下手にいじるとバージョンアップがあった時に、変更箇所を全部直さなきゃいけなくなるので、既存ファイルには手をつけないという条件は外せません。

ファイルを作成する

/wp-content/themes/XXX/page.php
/XXX/ には、お使いのテーマの名称が入ります。
FTP接続などをして、page.phpをダウンロードしてください。
※ page.phpには変更を行いません。サーバ上にそのまま何も行わずに残しておきます。

そして、ダウンロードしたpage.php を sitemap.php などとファイル名を変更します。ファイル名に決まりはなく好きなもので結構です。

ファイルに書き加える

sitemap.php をテキストエディタなどで開きます。
そして、ファイルの先頭に次のように書き加えてください。

Template Name: sitemap の sitemap の部分は、テンプレートの名称になります。他の名前が良ければ好きなものに書き換えてもOKです。

sitemap.phpの中から、次の場所を探してください。

the_content(...);

引数の (…) の部分は、使用しているテーマによって異なります。説明の便宜上 (…) と書きますが、変更せずにそのままの引数にしておいてください。

この場所のスグ下に、aulta_sitemap(0, true); を書き加え、次のようにします。

the_content(...);
aulta_sitemap(0, true);

sitemap.phpファイルの一番下まで移動し、次の内容を書き加えます。

terms . " AS t"
. " inner join " . $wpdb->term_taxonomy . " AS tt"
. " ON t.term_id = tt.term_id"
. " where tt.taxonomy = 'category'"
. " and tt.parent = " . $parentId
. " order by tt.parent, t.name" // カテゴリ名の昇順
;
// sql実行
$terms = $wpdb->get_results($query);
// sqlのデータを処理
$list = "";
foreach ($terms as $value){
// 再帰で子カテゴリ取得
$child = aulta_sitemap( $value->term_id );
// (該当カテゴリの記事数が0件以上 || 子カテゴリが存在する)とき
if ( ($value->count > 0) || (strlen($child) > 0) ){
$list .= '
<ul>
 	<li>' . $value->name // カテゴリ名
. $child // 子カテゴリ一覧
. aulta_entries($value->term_id) // 記事一覧
. '</li>
</ul>
';
}
}
$output = "";
// 該当データがあれば、
<ul>
 	<li style="list-style-type: none;">
<ul>タグで囲む</ul>
</li>
</ul>
 
<ul>
 	<li style="list-style-type: none;">
<ul>if (strlen($list) > 0) $output .= '
 	<li style="list-style-type: none;">
<ul>' . $list . '</ul>
</li>
</ul>
</li>
</ul>
';
// Rootでなければ(再帰中なら)、$outputを返す
if ( ! $isRoot) return $output;
// Rootなら出力
echo $output;
}

続けて、次のように書き加えます。

/*
* カテゴリID($categoryId)に該当する記事タイトルの一覧を取得
*/
function aulta_entries($categoryId){
global $wpdb;
// 数値チェック
if ( ! ereg("^[0-9]+$", $categoryId)) $categoryId = -1;
// 投稿から指定期間内 new アイコン付加
// 下記の場合、現在から (3600秒 * 24 * 3) = (1日 * 3) = 3日以内
$newIconLimits = time() - 3600 * 24 * 3;
// $categoryId に該当する記事のリストを取得
$query = "select *"
. " from " . $wpdb->term_taxonomy . " as tt"
. " inner join " . $wpdb->term_relationships . " as tr"
. " on tt.term_taxonomy_id = tr.term_taxonomy_id"
. " inner join " . $wpdb->posts . " as p on tr.object_id = p.ID"
. " where tt.term_id = " . $categoryId
. " and tt.taxonomy = 'category'"
. " and p.post_status = 'publish'"
. " order by post_date desc" // 投稿日時順
;
// sql実行
$terms = $wpdb->get_results($query);
// sqlのデータを処理
$list = "";
foreach ($terms as $value){
$new = '';
// 記事が、指定期間内($newIconLimits)かチェック
if (strtotime($value->post_date) > $newIconLimits){
// 事前に使用しているテーマのディレクトリに new アイコンを作成する
$new = '<img src="/wp-content/themes/XXX/images/new.gif" />';
}
$list .= '
<ul>
 	<li style="list-style-type: none;">
<ul>
 	<li><a>ID) . '">' . $value->post_title . '</a>' . $new . '</li>
</ul>
</li>
</ul>
';
}
$output = "";
// 該当データがあれば、
<ul>
 	<li style="list-style-type: none;">
<ul>
 	<li style="list-style-type: none;">
<ul>タグで囲む</ul>
</li>
</ul>
</li>
</ul>
 
<ul>
 	<li style="list-style-type: none;">
<ul>
 	<li style="list-style-type: none;">
<ul>if (strlen($list) > 0) $output .= '
 	<li style="list-style-type: none;">
<ul>' . $list . '</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
';
// $outputを返す
return $output;
}

書き加えた内容について

function() 名の先頭に、 aulta_ を付けているのは、WordPress本体側の関数名と重複しないことを保証するためです。
関数内のプログラムについて、WordPress側が用意している関数をどこまで使うか、自分オリジナルのコードをどこまで入れるか、という部分で多少悩みました。

実行速度を考えるなら、 $wpdb->get_results($query) などとしなくても、 PHPのmysql_query()を直接呼んで、mysql_fetch_array() をループしてやればいいんですがね。そういう方法も考えたけど、今のところ悩むほどの問題でもないので、WordPress側に合わせておきました。(こうやって公開すると、table名の都合もあるし)

aulta_entries()で、X日以内に投稿されたタイトルに newアイコンを付けるようにしています。newアイコンは、ご自身で素材屋さんなどから好きなものを選んで、テーマフォルダ(/wp-content/themes/XXX/)にアップロードしておきます。

その他の部分については、コード中のコメントを読んでください。

いよいよ公開

ここまでできたら、sitemap.php をFTPなどで、/wp-content/themes/XXX/ にアップロードします。

ここで、ブラウザからWordPressの管理画面を開きます。

  1. 【作成】【ページ】で、ページを新規作成します。
  2. 『タイトル』には、”サイトマップ”などとお好きな名前を付けてください。
  3. 『本文』には、”サイトマップです。”などとご自由に書いてください。
  4. タイトルや本文は、【管理】【ページ】からいつでも変更できます。
  5. 『親ページ』で、”メインページ(親ページなし)”を選択します。
  6. 『ページテンプレート』で、”sitemap”(※)が選択できるようになっているので選択します。
  7. 『公開』ボタンを押してください。

※ Template Name: で sitemap から変更していれば、その名前です。

ブログの閲覧者側のほうから、先ほど作成したページを開いてください。
サイトマップは作成されているでしょうか?

最初に【前提条件】でも書いていますが、このサイトマップは記事の件数が少ないことが前提です。
なぜなら、記事のタイトルを全て出力するように作ってあるからです。

カテゴリごとにページを分けるとか、そういうのは私自身がまだ必要になっていないので考えませんでした。記事が少ないうちはページ分けをするほうが煩雑になりますので。

広告