ページ毎に異なるmeta descriptionを出力する

WordPressで、ページ毎に異なるmeta descriptionを出力する方法をご紹介します。
これは、add-meta-tags日本語化の作業を行っていたのですが、この部分は独自に作成した方が良いとの判断で、開発中のプラグインに使用するためのプログラムの一部です。
meta descriptionだけに限らず、好きな所でこのファンクションを呼び出すことで、ページ本文のテキストの先頭n文字を取得することができます。

WordPress標準では、このような関数はありませんし、いろいろ出回っているmeta出力用のプラグインでも複数ページにわたる記事やカテゴリアーカイブなどがサポートされていません。
このため、独自に開発したというものです。

では、さっそくサンプルコードをご紹介します。

function outMetaDescription($descLength = 80){
	global $page;

	if(is_home()){
	// TOPページ
		$mycontent = get_bloginfo('description');
		if(!empty($mycontent)){
			// mycontent変数からhtmlタグやwordpressタグなどを取り除く
			$mycontent = cleanDescription($mycontent);
		}else{
			// mycontentがない場合はブログ名からhtmlタグやwordpressタグなどを取り除く
			$mycontent = cleanDescription(get_bloginfo('name'));
		}
		
		if(!empty($mycontent)){
			$descText = $mycontent;
		
			if(is_paged()){
				global $paged;
				$descText .= ' (' . $paged . 'ページ)';
			}
		}
	}elseif(is_search()){
	// 検索結果ページ(検索キーワード)
		$mycontent = cleanDescription(get_search_query());
		if(!empty($mycontent)){
			$descText = '「' . $mycontent . '」で' . get_bloginfo('name') . 'を検索した結果の一覧ページです。';
		
			if(is_paged()){
				global $paged;
				$descText .= ' (' . $paged . 'ページ)';
			}
		}
	}elseif(is_date()){
	// アーカイブページ(YYYY年MM月アーカイブ)
		$date = single_month_title('',FALSE);
		$mycontent = ereg_replace('^[0-9]+.?月','',$date).'年'.ereg_replace('[0-9]+$','',$date);
		if(!empty($mycontent)){
			$mycontent = cleanDescription($mycontent);	// mycontent変数からhtmlタグやwordpressタグなどを取り除く
			$descText = $mycontent . 'の' . get_bloginfo('name') . '記事一覧ページです。';
		
			if(is_paged()){
				global $paged;
				$descText .= ' (' . $paged . 'ページ)';
			}
		}
	}elseif(is_singular()){
	// 記事またはページ、添付ファイルページ
		global $post;
		$usePageOne = false;	// 複数ページ目にも1ページ目の概要を使用するか
		$useSplitFunc = false;	// 概要を指定された文字数で切断すべきか
		if(empty($post->post_content)){
		// エントリーがそもそも空の場合
			if(has_excerpt()){
			// 手書きの概要がある場合
				$mycontent = $post->post_excerpt;
			}
		}elseif(!empty($page) && $page != 1){
		// 2ページ目以降
			$mycontentAry = explode('<!--nextpage-->',$post->post_content);
			if(empty($mycontentAry[$page-1])){
			// 該当ページの中身が空の場合
				$usePageOne = true;
			}else{
			// 該当ページの中身がある場合
				$mycontent = $mycontentAry[$page-1];
				$useSplitFunc = true;
			}
		}
		
		if(!empty($post->post_content) && empty($mycontent)){
		// mycontent変数がセットされていない(=1ページ目か、2ページ目以降も1ページ目の概要を使用)の場合
			if(has_excerpt()){
			// 手書きの概要がある場合
				$mycontent = $post->post_excerpt;
			}else{
			// 手書きの概要がない場合
				$mycontent = $post->post_content;
				$useSplitFunc = true;
			}
		}
		
		if($descLength == null || !ereg("[0-9]+",$descLength)){ $descLength = 80; }
		// 長さ指定にnullが設定されている場合や数値以外が指定された場合は80文字目まで
		
		$mycontent = cleanDescription($mycontent);	// mycontent変数からhtmlタグやwordpressタグなどを取り除く
		if(!empty($mycontent)){
			if($useSplitFunc){
				$descText = mb_substr($mycontent, 0, $descLength);
				if($descText != $mycontent){ $descText .= '…'; }
			}
		}else{
			$descText = wp_title('',false);
			$descText = cleanDescription($descText);	// descText変数からhtmlタグやwordpressタグなどを取り除く
			$usePageOne = true;
		}
		if($usePageOne && !empty($descText) && !empty($page) && $page != 1){ $descText .= ' ('.$page.'ページ)'; }	// 2ページ目以降で1ページ目の概要を使う場合

	}elseif(is_author()){
	// 投稿者ページ
		$mycontent = wp_title('',false);
		if(!empty($mycontent)){
			$mycontent = cleanDescription($mycontent);	// mycontent変数からhtmlタグやwordpressタグなどを取り除く
			$descText = $mycontent . 'が書いた' . get_bloginfo('name') . 'の記事一覧ページです。';
		
			if(is_paged()){
				global $paged;
				$descText .= ' (' . $paged . 'ページ)';
			}
		}
	}else{
		$mycontent = wp_title('',false);
		if(!empty($mycontent)){
			$mycontent = cleanDescription($mycontent);	// mycontent変数からhtmlタグやwordpressタグなどを取り除く
			$descText = $mycontent . 'に関する' . get_bloginfo('name') . 'の記事一覧ページです。';
		
			if(is_paged()){
				global $paged;
				$descText .= ' (' . $paged . 'ページ)';
			}
		}
	}
	return($descText);
}

function cleanDescription($desc) {
	$desc = stripslashes($desc);
	$desc = strip_tags($desc);
	if(is_singular()){ $desc = ereg_replace('[([^]]+)]','',$desc); }
	$desc = htmlspecialchars($desc);
	$desc = preg_replace('/([n tr]+)/', ' ', $desc); 
	if(!is_search()){ $desc = preg_replace('/( +)/', ' ', $desc); }
	return trim($desc);
}

呼び出す際は、outMetaDescription(文字数)となります。
この関数は、概要テキストを返しますので、metaに埋め込むなどして利用します。

例:

$desc = outMetaDescription(80);
if(!empty($desc)){ echo '<meta name="description" content="' . $desc . '" />'; }

なお、サンプルコード下部のcleanDescriptionは、outMetaDescriptionの中から呼び出され、不要なWordPressのショーコードタグやhtmlタグを取り除くための関数です。

ページ毎に異なるmeta descriptionを出力するにコメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です