WordPress レコメンド機能プラグインあれこれ

YARPP
Yet Another Related Posts Plugin

訪問者の方の滞在時間をなるべく長くということを目的にレコメンド機能(訪問者の好みにあった情報を推薦する)を付加するWordpressプラグインがいろいろとあります。

具体的には下記のようなWordpressプラグインがあります(他にも多数あります)。

  1. Yet Another Related Posts Plugin
    「タイトル」「内容」「カテゴリー」「タグ」からスコアを計算し、関連記事を自動的につけてくれるプラグイン
  2. Where did they go from here
    この記事を読んだ人は、この記事も読んでいます」のような記事を自動的につけてくれるプラグイン
Yet-Another-Related-Posts-Plugin
Yet Another Related Posts Pluginを使うと、こんな感じ
Where-did-they-go-from-here
Where did they go from hereを使うと、こんな感じ

しかし、これらのプラグインは、「the_content」(本文)の下方に自動的に情報が差し込まれて、プラグインをインストールして有効化しただけで表示OKという楽といえば楽な仕様なのですが、筆者は下記の点で困りました。

  • the_content」(本文)とレコメンドの記事のmargin/paddingが調整しずらい。
  • the_excerpt」(記事の概要)にレコメンドの記事の内容が挿入されてしまう。

筆者は、下記の方法で解決しました。

使用したWordpressのバージョン

WordPress 3.6

  • the_content」のフィルターフックで、本文を「<div class=”inside”><!– content start –>。。。(本文)。。。<!– content end –></div><!– .inside –>」で囲み、CSSクラス「.inside」でmargin/paddingの調整ができるようにする。
  • the_excerpt」で、上記の「<!– content start –>。。。(本文)。。。<!– content end –>」内だけを出力するようにしたいのですが、当然「the_excerpt」では、HTMLタグなどはstrip(除去)されています。では、どこでHTMLタグなどがstripされているかというと、「get_the_excerpt」のフィルター「wp_trim_excerpt」なのですが、HTMLタグがついた状態で加工できるようなフィルターが見当たりません。従って、Wordpress本体の「wp_trim_excerpt」をまるっとfunctions.phpにコピーして、自分仕様の「wp_trim_excerpt」を作ることにします。

ソースコード(ご参考)は下記のとおりです。

/**
* 記事の内容をinsideで囲む
*/
function my_content_inside($content) {
	return '<div class="inside"><!-- content start -->' . $content . '<!-- content end --></div><!-- .inside -->';
}
add_filter('the_content', 'my_content_inside',1);

/**
* excerptで記事の内容のみを抽出
*/
function my_wp_trim_excerpt($text = '') {
	$raw_excerpt = $text;
	if ( '' == $text ) {
		$text = get_the_content('');

		$text = strip_shortcodes( $text );

		$text = apply_filters('the_content', $text);

		/* add strip */
		if (preg_match('/<!-- content start -->(.*)<!-- content end -->/s',$text,$matches)) {
			$text = $matches[1];
		}

		$text = str_replace(']]>', ']]&gt;', $text);
		$excerpt_length = apply_filters('excerpt_length', 55);
		$excerpt_more = apply_filters('excerpt_more', ' ' . '[&hellip;]');
		$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
	}
	return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
remove_filter( 'get_the_excerpt', 'wp_trim_excerpt'  );
add_filter   ( 'get_the_excerpt', 'my_wp_trim_excerpt');