WordPress SEO対策 All in One SEO Packのdescription出力の改造

WordPressのSEO対策として、Wordpressプラグイン「All in One SEO Pack」(以下、aioseop)をご利用の方は、多いと思います。わたしもよく利用しています。

といっても、meta keywordとdescriptionは、昔ほどSEO対策としては薄れているようですが、やっぱり、SEO対策として重要なヘッダータイトル(<head><title>~</title></head>)の出力がaioseopはよくできていると思います。

そもそも、meta descriptionとは、検索エンジンが検索結果の説明文に使ってくれる事が多い(ほとんど?)情報です。オーガニック検索で、説明文がしっかりしているものと、そうでないものとでは、説明文がしっかりしているものがクリックされやすいと思います。

search-result

さて、aioseopで、このmeta descriptionに値をセットするには、新規投稿の際に狙った説明文をaioseopの入力項目に入れなければなりません。固定ページなら、まだしも、投稿は、かなりめんどうです。しかし、meta descriptionがないと、検索エンジンがページ内の情報を解析した内容(メニューやサイドコンテンツの内容が検索エンジンで認識される可能性も・・)が表示されるので、なんとかmeta descriptionを制御したいです。

aioseop-post

aioseopとは別に、これらの問題を解消した優良なmeta情報を補助するプラグイン「meta manager」があります。このプラグインは、新規投稿の際に狙った説明文を入力しないと、the_contentの中身のタグ等をstripして、meta descriptionに自動的にセットしてくれます。しかしながら、aioseopとmeta descriptionを同時に入れると、meta情報が重複してしまうので、一般的には、どちらかのプラグインを採用することになると思います。

そこで、aioseopをコアハックして、説明文を入力しないと、the_contentより自動的にセットしてくれるように改造しようとソースを眺めてみると、apply_filtersがフックがかまされてました! これで、改造のため、プラグイン本体のソースは弄らなくてもすみそうです。

			if ( is_category() && $this->show_page_description() )
				$description = $this->internationalize( category_description() );
			elseif ( is_tag()  && $this->show_page_description() )
				$description = $this->internationalize( tag_description() );
			elseif ( is_tax()  && $this->show_page_description() )
				$description = $this->internationalize( term_description() );
			elseif ( is_author()  && $this->show_page_description() )
				$description = $this->internationalize( get_the_author_meta( 'description' ) );
			else if ( $is_front_page )
				$description = trim( stripcslashes( $this->internationalize( $aioseop_options['aiosp_home_description'] ) ) );
			else if ( is_single() || is_page() || is_home() || $this->is_static_posts_page() )
				if ( $this->is_static_front_page() )
					$description = trim( stripcslashes( $this->internationalize( $aioseop_options['aiosp_home_description'] ) ) );
				elseif ( !empty( $blog_page ) )
					$description = $this->get_post_description( $blog_page );
			if ( empty( $description ) && is_object( $post ) && !is_archive() && empty( $blog_page ) )
				$description = $this->get_post_description( $post );

			$description = apply_filters( 'aioseop_description', $description );

			if ( isset($description) && (strlen($description) > $this->minimum_description_length ) && !( $is_front_page && is_paged() ) ) {
				$description = trim( strip_tags( $description ) );
				$description = str_replace( '"', '', $description );

じゃあってことで、ありがたくこのフックにmeta managerの一部のロジックを拝借して適用すると、期待どおりの動きになりました。フィルターフック バンザイ!!!

/**
* all in one seo pack の description出力改造
*/
function my_description($description) {
	global $post;
	global $aioseop_options;

	if (trim($description)) {
		return trim($description);
	}

	/* default */
	$description = $aioseop_options['aiosp_home_description'];

	if ((is_archive()) || (is_home())) {
		/* blog */
		$description = 'blogです。お気に入りの記事がありましたら、シェアをお願いします。';
	} elseif(is_single() || is_page()) {
		/* single or page */
		$description = get_post_field('post_content', $post->ID);
	}

	$description = strip_shortcodes( $description );
	$description = str_replace( ']]>', ']]&gt;', $description );
	$description = strip_tags( $description );
	$description = str_replace( "\xc2\xa0", " ", $description );
	$description = trim( preg_replace( '/[\n\r\t ]+/', ' ', $description), ' ' );
	$description = mb_convert_kana($description,'sKV','UTF-8');
	$description = mb_substr( $description, 0, 120, 'UTF-8' );
	$_find_pos = mb_strrpos($description,'。',0,'UTF-8');
	if (($_find_pos >= 1) && ($_find_pos <= 120 - 1)) {
		$description = mb_substr( $description, 0, $_find_pos + 1, 'UTF-8' );
	}

	return $description;
}
add_filter('aioseop_description', 'my_description');
  • [2013.7.2] descriptionを120文字でカットするコードを追記しました。凡ミスです。
  • 上記コードは、UTF-8でfunctions.phpに編集・保存してください。
  • aioseopの設定で下記のとおり「詳細を自動生成」のチェックを外さないと、日本語と相性の悪いaioseopのdescription生成関数が優先されてしまいます。
    aioseop-setting