WordPressでプラグインを使わずにタグを考慮した関連記事を表示する方法

2017-12-15 @niketcha

関連記事の精度を上げることはSEO対策になります。でもSTINGER8デフォルトの関連記事は、同じカテゴリーの中からランダムで表示するというもの。 そこでタグを考慮した関連記事をプラグインを使わずに表示する方法を調べました。 タグの付け方によってはかなり精度の高い関連記事になるので、タグ管理を楽にするためのプラグインも紹介します。

Sponsored Link

タグを考慮した関連記事を表示する方法

タグを考慮した関連記事をプラグインなしで表示する方法です。

function.phpの編集

//そこそこ精度が良い関連記事コード
function get_related_posts($show_post = 5) {
	$post_id = get_post()->ID;
	// 個別記事、カスタム投稿 で表示する
	if (empty($post_id) || is_singular(array('page','attachment')))
		return false;
	$ex_show_post = get_post_meta($post_id, '_my_relatedposts_shownum', true); // 関連記事の表示数
	$rel_date = get_post_meta($post_id, '_my_relatedposts_update', true); // 関連記事の登録日
	$modified_date = mysql2date('Ymd', get_lastpostmodified(), false); // ブログの最終更新日
	$post_type = get_post()->post_type;
	$post_status = get_post()->post_status;
	$rel_ids = array();
	$taxes = get_object_taxonomies($post_type, 'names'); // 使用タクソノミを取得(カテゴリ+カスタムタクソノミ)
	$tax_array = array();
	if (isset($taxes)) { 
		foreach ($taxes as $taxname) {
			$terms = get_the_terms($post_id, $taxname);
			if ($terms !== false) {
				foreach ($terms as $term) {
					$rel_ids[$taxname][] = $term->term_id; // タームIDを配列に入れる
				}
				$tax_array[] = array(
					'taxonomy' => $taxname, // categoryとかpost_tagとか
					'field' => 'term_id', // 'id' または 'slug'
					'terms' => $rel_ids[$taxname], // int または string または array
					'include_children' => 'false', // 子カテゴリを含まない
					'operator' => 'IN',
				);
			}
		}
	}
	$args = array(
		'post__not_in' => array( $post_id ), // この記事を除外
		'posts_per_page' => -1, // 検索する記事数 -1で全ての記事
		'post_status' => 'publish', // 公開記事に限定
		'post_type' => $post_type, // ターゲットポストタイプ
		'tax_query' => array_merge( array('relation' => 'OR'), $tax_array )
	);
	$rel_query = get_posts($args);
	if ($rel_query !== false) {
		foreach ($rel_query as $rel) {
			$rel_point = 0;
			$set_id = $rel->ID;
			foreach ($taxes as $taxname) {
				$terms = get_the_terms($set_id, $taxname);
				if (is_array($terms)) {
					foreach ($terms as $term) {
						// 関連IDを含むかチェック
						if (isset($rel_ids[$taxname]) && in_array($term->term_id , $rel_ids[$taxname])) {
							$rel_point++;
							if($taxname === 'post_tag')
								$rel_point++; // タグの優先度を高くする
						}
					}
				}
			}
			$rel_with[$set_id] = intval($rel_point); // 関連度数
		}
	} else {
		return false;
	}
	// 日時が未登録 or 登録日以降にブログが更新されている or 表示数が変わった ときに関連記事を登録する
	if(empty($rel_date) || $modified_date > $rel_date || $show_post !== $ex_show_post) {
		arsort($rel_with); // 関連度数でソート
		$i = 0;
		foreach ($rel_with as $key => $val) {
			if($i >= $show_post) {
				break;
			} else {
				$rel_posts[] = $key;
				$i++;
			}
		}
		// 記事が公開時のみカスタムフィールドに登録する
		if ($post_status === 'publish') {
		update_post_meta($post_id, '_my_relatedposts', $rel_posts);
		update_post_meta($post_id, '_my_relatedposts_update', date('Ymd'));
		update_post_meta($post_id, '_my_relatedposts_shownum', $show_post);
		}
	} else {
		$rel_posts = false;
	}
	return $rel_posts;
}

上記のコードをfunction.phpに貼り付けます。

single.phpの修正

関連記事を表示したい場所に下記のコードを貼り付けます。
<?php $related_posts = get_related_posts(3);?>
<?php if ( $related_posts ){ ?>
	<?php foreach( $related_posts as $rid ): ?>
		<p><a href="<?php the_permalink( $rid ); ?>" ><?php echo get_the_title( $rid ); ?></a></p>
	<?php endforeach; ?>					
<?php }?>

get_related_postsの後の()に入れている数字は、関連記事を何件取得するかを指定します。 指定しなかった場合は5件取得されます。

私はリンクを貼ったタイトルのみ表示したかったので上記のような形にしてます。 アイキャッチ画像を表示したい場合は下記のコードを貼ってください。

<?php $related_posts = get_related_posts(3);?>
<?php if ( $related_posts ){ ?>
	<?php foreach( $related_posts as $rid ): ?>
		<div>
			<a href="<?php the_permalink( $rid ) ?>">
				<?php if ( has_post_thumbnail( $rid ) ): // アイキャッチ画像を持っているときの処理 ?>
					<?php echo get_the_post_thumbnail( $rid, 'thumbnail'); ?>
				<?php else: // アイキャッチ画像を持っていないときの処理 ?>
					<img src="<?php echo get_template_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="100" height="100" />
				<?php endif; ?>
				<?php echo get_the_title( $rid ); ?>
			</a>
		</div>
	<?php endforeach; ?>					
<?php }?>

アイキャッチ画像がない場合はテンプレートディレクトリのimagesフォルダにあるno-img.pngという画像を表示するようになっています。

タグを管理するプラグイン

記事が増えてくるとタグの管理って大変ですよね。 以前どんなタグを付けたか忘れてしまって同じようなタグを量産してしまったり… そこで便利なのがSimple Tagsというプラグインです。

Simple Tagsってどんなプラグイン?

プラグインをインストールして有効化すると、「ツール」から「タグ一括編集」ができるようになります。

タグ一括編集では記事のタイトルを見ながらタグを編集できます。

日付でフィルターをかけたり、一度に表示する件数を最大200件まで増やしたりできます。

また投稿画面の下部に今まで作ったタグリストが表示されるようになり、クリックすることでタグを指定できます。

「設定」メニューに「Simple Tags」の項目が追加されるので、好みに合わせて設定を変えてみてください。

詳細な設定ができるタグクラウドを表示させる機能もあるみたいです。

参考にした記事:行き着く先はあんこさん

-ウェブサイト構築, word press

コメントを残す

お名前もメールも入力は任意です。お気軽に指摘や質問などしていただけると嬉しいです。

Gravatarに登録すると、お好きな画像をアバターに設定できます。

Copyright© ニケッチャニッキ , 2017-2018 All Rights Reserved.