自作テーマのWordPressで関連記事を表示させる方法 | アダルトアフィリエイト
noteで公開した自作テーマのWordPressサイトに関連記事を追加したので、今回は関連記事の追加方法を解説します。
関連記事の作成方法
WordPressにはプラグインで関連記事を表示させる方法がありますが、今回はプラグインを使わずに自作しました。
考え方としては、投稿IDから出演女優とジャンルタグを取得し、現在の記事を除外してランダムに最大6件取得します。
ジャンルタグの方は、投稿数が多い上位2つのジャンルを表示するようにします。
また、記事が1件未満だったら表示しないという処理も行います。
それでは、function.phpに書いていきます。
function.php
投稿ページなので、前回紹介したsetupPostクラスに追加します。
長いコードになりますが、getRelatedPostsメソッドを追記します。
戻り値は出演女優、ジャンルタグの関連記事と名前を配列で返します。
class setupPost {
private $post_id;
private $post;
public function __construct($post_id = null) {
$this->post_id = $post_id ? $post_id : get_the_ID();
$this->post = get_post($this->post_id);
if (!$this->post) {
throw new Exception("Invaild post ID");
}
}
// ...
public function getRelatedPosts() {
// 関連投稿を格納する配列を初期化
$related_posts = array(
'actor' => array(), // 出演女優に基づく関連投稿
'genre1' => array(), // ジャンル1に基づく関連投稿
'genre1_name' => '', // ジャンル1の名前
'genre2' => array(), // ジャンル2に基づく関連投稿
'genre2_name' => '' // ジャンル2の名前
);
// 現在の投稿の出演女優を取得('actor' タクソノミー)
$actors = wp_get_post_terms($this->post_id, 'actor', array('fields' => 'ids'));
// 出演女優が存在する場合
if ($actors) {
// 出演女優に基づく投稿のクエリを設定
$actor_args = array(
'post_type' => 'post', // 投稿タイプは 'post'
'post_per_page' => 6, // 取得する投稿の最大数は6
'post__not_in' => array($this->post_id),// 現在の投稿は除外
'orderby' => 'rand', // ランダムに並び替える
'tax_query' => array(
array(
'taxonomy' => 'actor', // 'actor' タクソノミーに基づくクエリ
'field' => 'term_id', // タームIDを使用
'terms' => $actors, // 出演女優のタームID
),
),
);
// WP_Query でクエリを実行
$actor_query = new WP_Query($actor_args);
// クエリ結果に投稿がある場合、関連投稿に追加
if ($actor_query->have_posts()) {
$related_posts['actor'] = $actor_query->posts;
}
}
// 現在の投稿に関連するジャンル('post_tag' タクソノミー)を取得、投稿数が多い順に並び替え
$genres = wp_get_post_terms($this->post_id, 'post_tag', array('orderby' => 'count', 'order' => 'DESC', 'fields' => 'ids'));
// ジャンルが2つ以上ある場合
if ($genres && count($genres) > 1) {
// ジャンル1に基づく投稿のクエリを設定
$genre1_args = array(
'post_type' => 'post', // 投稿タイプは 'post'
'posts_per_page' => 6, // 取得する投稿の最大数は6
'post__not_in' => array($this->post_id),// 現在の投稿は除外
'orderby' => 'rand', // ランダムに並び替える
'tax_query' => array(
array(
'taxonomy' => 'post_tag', // 'post_tag' タクソノミーに基づくクエリ
'field' => 'term_id', // タームIDを使用
'terms' => array($genres[0]), // 最も投稿数の多いジャンルのタームID
),
),
);
// WP_Query でクエリを実行
$genre1_query = new WP_Query($genre1_args);
// クエリ結果に投稿がある場合、関連投稿に追加
if ($genre1_query->have_posts()) {
$related_posts['genre1'] = $genre1_query->posts;
$related_posts['genre1_name'] = get_term($genres[0], 'post_tag')->name; // ジャンル名も取得
}
// ジャンル2に基づく投稿のクエリを設定
$genre2_args = array(
'post_type' => 'post', // 投稿タイプは 'post'
'posts_per_page' => 6, // 取得する投稿の最大数は6
'post__not_in' => array($this->post_id),// 現在の投稿は除外
'orderby' => 'rand', // ランダムに並び替える
'tax_query' => array(
array(
'taxonomy' => 'post_tag', // 'post_tag' タクソノミーに基づくクエリ
'field' => 'term_id', // タームIDを使用
'terms' => array($genres[1]), // 2番目に投稿数の多いジャンルのタームID
),
),
);
// WP_Query でクエリを実行
$genre2_query = new WP_Query($genre2_args);
// クエリ結果に投稿がある場合、関連投稿に追加
if ($genre2_query->have_posts()) {
$related_posts['genre2'] = $genre2_query->posts;
$related_posts['genre2_name'] = get_term($genres[1], 'post_tag')->name; // ジャンル名も取得
}
}
// 関連記事が1件未満の場合、nullを返す
if (empty($related_posts['actor']) && empty($related_posts['genre1']) && empty($related_posts['genre2'])) {
return null;
}
// 関連投稿を返す
return $related_posts;
}
}
ちなみに自分の場合は出演女優はカスタムタクソノミーにしてるので'actor'は適宜置き換えてください。
single.phpで表示
最後にsingle.phpで表示させる例を書きます。
<?php
$post = new setupPost();
$actors = $post->getActors();
$actors_name = implode(',', array_column($actors, 'name'));
$related_posts = $post->getRelatedPosts();
$related_genre1_name = $related_posts['genre1_name'];
$related_genre2_name = $related_posts['genre2_name'];
?>
<?php if($related_posts):
if(!empty($related_posts['actor'])): ?>
<div class="p-post__related-heading"><?=$actors_name ?>のおすすめの記事</div>
<div class="p-post__related-wrap">
<?php foreach($related_posts['actor'] as $post):
setup_postdata($post);
?>
<a class="p-post__related-card" href="<?php the_permalink(); ?>">
<div class="p-post__related-img"><?php display_thumb_image(); ?></div>
<div class="p-post__related-title"><?php the_title(); ?></div>
</a>
<?php endforeach;
wp_reset_postdata();
?>
</div>
<?php endif;
if(!empty($related_posts['genre1'])): ?>
<div class="p-post__related-heading"><?=$related_genre1_name ?>のおすすめの記事</div>
<div class="p-post__related-wrap">
<?php foreach($related_posts['genre1'] as $post):
setup_postdata($post);
?>
<a class="p-post__related-card" href="<?php the_permalink(); ?>">
<div class="p-post__related-img"><?php display_thumb_image(); ?></div>
<div class="p-post__related-title"><?php the_title(); ?></div>
</a>
<?php endforeach;
wp_reset_postdata();
?>
</div>
<?php endif;
if(!empty($related_posts['genre2'])): ?>
<div class="p-post__related-heading"><?=$related_genre2_name ?>のおすすめの記事</div>
<div class="p-post__related-wrap">
<?php foreach($related_posts['genre2'] as $post):
setup_postdata($post);
?>
<a class="p-post__related-card" href="<?php the_permalink(); ?>">
<div class="p-post__related-img"><?php display_thumb_image(); ?></div>
<div class="p-post__related-title"><?php the_title(); ?></div>
</a>
<?php endforeach;
wp_reset_postdata();
?>
</div>
<?php endif; ?>
<?php endif; ?>
ちなみにサムネを表示させるdisplay_performer()はfunction.phpに以下のように書いています。
// アイキャッチ画像を表示
function display_thumb_image() {
// カスタムフィールドで指定された外部URLを取得
$external_thumbnail_url = get_field('external_thumbnail_url');
// 外部URLが指定されている場合、その画像を表示
if ($external_thumbnail_url) {
echo '<img src="' . esc_url($external_thumbnail_url) . '" alt="' . esc_attr(get_the_title()) . '">';
} elseif (has_post_thumbnail()) {
// 外部URLが指定されていない場合、通常のアイキャッチ画像を表示
the_post_thumbnail();
}
}
まとめ
WordPressでプラグインを使わずに関連記事を表示させる方法を書きました。
SEO的にも内部リンクが多いほうが良さそうなので、関連記事を設置してどうなるかも検証してみたいですね。
この記事が参考になれば幸いです☘️
それでは良いWordPressライフを!