SWELLの関連記事エリアで「タグ」→「カテゴリー」の順に取得するカスタマイズ
SWELLのカスタマイザー「投稿・固定ページ > 記事下エリア」にある「関連記事エリアの設定」に「関連記事の取得方法」という設定項目があります。ここで用意されている絞り込み条件は「カテゴリー」と「タグ」の二択です。
この記事は、絞り込み条件に「タグ」を選択している場合に、次のように処理に変更を加えるカスタマイズ方法を書いたものです。
- 記事にタグがある場合は、タグに基づいて関連記事を取得する。
- 記事にタグがない場合は、カテゴリーに基づいて関連記事を取得する。
背景
前述しましたが、SWELLのカスタマイザーにある関連記事の取得方法という設定項目では、カテゴリーとタグの二択より絞り込みを行うことができます。カテゴリーとタグのAND条件やOR条件はありません。
また選択している取得方法に該当する条件が記事に付与されていない場合、絞り込みが行えず、絞り込み条件を無視した全ての記事を対象にした取得になります。つまり「カテゴリー」を選択しているが記事にカテゴリーが付与されていない場合、「タグ」を選択しているが記事にタグが付与されていない場合に、全ての記事を対象にした取得が起きます。
本サイトでは取得方法を「タグ」にしているのですが、記事によってはタグを付与していないため、一部の記事で全ての記事を対象にした取得が起きてしまい、関連記事といいながら無関係な記事が表示されてしまう状態でした。
そのため、前述したように「記事にタグがある場合は、タグに基づいて関連記事を取得する」「記事にタグがない場合は、カテゴリーに基づいて関連記事を取得する」ようにカスタマイズを行いました。
カスタマイズ
swell_related_post_args
のフックを利用したカスタマイズを行いました。以下のコードは、まずタグ情報を取得し、タグが存在すればタグに基づいて関連記事を取得します。タグが存在しない場合は、カテゴリ情報を取得してカテゴリに基づいて関連記事を取得します。
add_filter( 'swell_related_post_args', function($args){
global $post;
$the_id = $post->ID;
/* タグ情報から関連記事をランダムに呼び出す */
$tags = wp_get_post_tags( $the_id );
$tag_array = [];
foreach ( $tags as $the_tag ) {
array_push( $tag_array, $the_tag->term_id );
}
if ( ! empty( $tag_array ) ) {
$args['tag__in'] = $tag_array;
$args['tax_query'] = array(
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => $tag_array,
),
);
} else {
/* カテゴリ情報から関連記事をランダムに呼び出す */
$categories = get_the_category( $the_id );
$cat_array = [];
foreach ( $categories as $the_cat ) {
array_push( $cat_array, $the_cat->cat_ID );
}
if ( ! empty( $cat_array ) ) {
$args['category__in'] = $cat_array;
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $cat_array,
),
);
}
}
$args['orderby'] = 'rand';
return $args;
});
PHP以上です。
よろしければご利用ください。