| ブログトップ | CMS関連 | PHP関連 | WEB関連全般 |

WordPressのサイトマップを作る【プラグインなし】

WordPressのサイトマップといえば「Sitemap Generator」プラグインが有名でいつもお世話になってますが、今回はプラグインなしで作ってみることにしました。

早速ですが、出来上がったものがこちら。

//カテゴリーと投稿をツリー構造で取得(引数:親カテゴリID, カテゴリーのulタグの表示フラグ)
function getCategoryAndPostTree($parent_id = 0, $cat_ul_use_flag = 1){
	$numberposts = 20;	//投稿の表示件数
	$return = "";

	//カテゴリー取得
	$categories = get_terms('category','parent='.$parent_id.'&hide_empty=0&orderby=order&order=asc');

	if($categories){
		if($cat_ul_use_flag == 1) $return .= "<ul>\n";
		foreach($categories as $category_values){
			$return .= '<li><a href="'.get_category_link($category_values->term_id).'" >'.$category_values->name."</a>\n";

			//投稿取得
			add_filter('pre_option_category_children', 'my_category_children');
			$posts = get_posts(array('numberposts'=>$numberposts, 'category'=>$category_values->term_id));
			remove_filter('pre_option_category_children', 'my_category_children');
			
			$arg_ul_use_flag = 1;
			if($posts){
				$return .= "<ul>\n";
				foreach($posts as $post_values){
					$return .= '<li><a href="'.get_permalink($post_values->ID).'">'.$post_values->post_title."</a></li>\n";
				}
				$arg_ul_use_flag = 0;
			}
			$return .= getCategoryAndPostTree($category_values->term_id, $arg_ul_use_flag);
			if($posts) $return .= "</ul>\n";
			$return .= "</li>\n";
		}
		if($cat_ul_use_flag == 1) $return .= "</ul>\n";
	}

	return $return;
}

//サブカテゴリに所属する投稿記事を排除する
function my_category_children( $return ) {
	return array();
}

//サイトマップ
function simple_sitemap(){
	global $wpdb;

	echo '<div id="sitemap">';

	//カテゴリと投稿のツリー
	$get_category_and_post .= getCategoryAndPostTree(0);
	echo $get_category_and_post; 
	
	//固定ページのツリー
	$args = array('depth'        => 0,
		'show_date'    => NULL,
		'date_format'  => get_option('date_format'),
		'child_of'     => 0,
		'exclude'      => NULL,
		'include'      => NULL,
		'title_li'           => '',
		'echo'         => 1,
		'authors'      => NULL,
		'sort_column'  => 'menu_order, post_title',
		'link_before'  => NULL,
		'link_after'   => NULL,
		'exclude_tree' => NULL ); 

	echo '<ul>';
		wp_list_pages($args);
	echo '</ul>';
	
	echo '</div>';
}
add_shortcode('sitemap', 'simple_sitemap');

02~35行目:カテゴリーおよび投稿のツリーを作る関数
38~40行目:サブカテゴリーの投稿を表示しないために使用する関数
43~72行目:サイトマップ本体の関数
73行目:ショートコード設定

03行目の「$numberposts」には「投稿」の表示件数を入れてください。
07行目、「orderby=order」となってますが、これは「My Category Order」プラグインを使っていること前提となっています。使っていない場合は、他の値に変えるか、&orderby=orderを消してください。
15行目(add_filter~)と17行目(remove_filter~)は、サブカテゴリー以下に所属する投稿を表示しないための処理です(Wordpressは親切なんだか迷惑なんだか、とあるカテゴリーに所属する投稿を取得した場合、そのサブカテゴリーに所属する投稿まで取得してしまいます。しかもget_postsにはそれを解除するキーワードが存在しない)。もし親カテゴリーの時にもサブカテゴリーに所属する投稿を表示したい場合は、この行は消してください。

functions.phpに上記のプログラムを追加し、固定ページの内容に[sitemap]を記述すれば完成です。

サイトマップのデモ
バリデーションチェックもしたし、リストのもつれは大丈夫なはず・・・
 

参考サイト

お手軽WordPress Tips:プラグインを使わず、簡単なコードでシンプルなサイトマップを作成する - かちびと.net

WordPress › フォーラム » サブカテゴリ以下の記事タイトルを表示しない

このエントリーをはてなブックマークに追加

LINEで送る

トラックバック

トラックバックURL

コメントする

※メールアドレスが公開されることはありません。

名前 *
メール*
URL
Copyright(c) 2010 - 2017 ダリの雑記