WordPressのSEO対策として、Wordpressプラグイン「All in One SEO Pack」(以下、aioseop)をご利用の方は、多いと思います。わたしもよく利用しています。
といっても、meta keywordとdescriptionは、昔ほどSEO対策としては薄れているようですが、やっぱり、SEO対策として重要なヘッダータイトル(<head><title>~</title></head>)の出力がaioseopはよくできていると思います。
そもそも、meta descriptionとは、検索エンジンが検索結果の説明文に使ってくれる事が多い(ほとんど?)情報です。オーガニック検索で、説明文がしっかりしているものと、そうでないものとでは、説明文がしっかりしているものがクリックされやすいと思います。
さて、aioseopで、このmeta descriptionに値をセットするには、新規投稿の際に狙った説明文をaioseopの入力項目に入れなければなりません。固定ページなら、まだしも、投稿は、かなりめんどうです。しかし、meta descriptionがないと、検索エンジンがページ内の情報を解析した内容(メニューやサイドコンテンツの内容が検索エンジンで認識される可能性も・・)が表示されるので、なんとかmeta descriptionを制御したいです。
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( ']]>', ']]>', $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生成関数が優先されてしまいます。