WordPressでカテゴリに優先順位を決め複数カテゴリが設定されている記事の場合に優先順位の高いカテゴリの記事のみ取得
2024/02/25
WordPressで精度の高い関連記事を表示させたい。色々試したところテーマファイル側でカテゴリに優先順位を決めておき、複数カテゴリが設定されている記事の場合は優先順位の高いカテゴリの記事のみ取得することで希望の挙動になった。割と力技でスマートな解決方法ではないと思うが一つの手段として実装方法をメモ。
背景
当サイトの場合、1つの記事に対して「CSS / jQuery / PHP」というバラバラのカテゴリを設定するケースがある。
その際にYARPP等のプラグインを導入したり、テーマファイルでカテゴリIDをcategory__inに入れて検索したりしても結果としては当然だけど「CSS / jQuery / PHP」カテゴリの記事が表示され、関連記事としては精度が低い。
1番精度が高いのは1つの記事に対して手動で関連記事を設定していくような方法だと思うが、過去記事のことを考えるとさすがにそれは面倒。
そのような背景があり「WordPressでカテゴリに優先順位を決め複数カテゴリが設定されている記事の場合に優先順位の高いカテゴリの記事のみ取得」という方法を取った。
ソースコード
テーマファイル
テーマファイルの関連記事表示部分に以下を追記する。
<div id="kanren">
<?php
$categories = get_the_category($post->ID);
$category_ID = array();
foreach($categories as $category):
array_push( $category_ID, $category -> cat_ID);
endforeach ;
//検索が有効なカテゴリIDリスト(優先順)
$kanren_category_list = array(
80 => 'カテゴリA',
95 => 'カテゴリB',
89 => 'カテゴリC',
);
//検索用カテゴリID
$search_category_id = 0;
//カテゴリIDリストをループ処理し、有効なIDがあった場合は1つのみ取得してループ終了
foreach( (array)$kanren_category_list as $key => $val ){
if( in_array($key, $category_ID) ){
$search_category_id = $key;
break;
}
}
//カテゴリIDをセット(有効なカテゴリが無い場合は0が入り関連記事は表示されない)
$category_ID = array($search_category_id);
$args = array(
'post__not_in' => array($post -> ID),
'posts_per_page'=> 5,
'category__in' => $category_ID,
'orderby' => 'rand',
);
$st_query = new WP_Query($args);
?>
<?php if( $st_query -> have_posts() ): ?>
<h4 class="point">
<i class="fa fa-th-list"></i> 関連記事
</h4>
<?php while ($st_query -> have_posts()) : $st_query -> the_post(); ?>
<dl class="clearfix">
<dt>
<a href="<?php the_permalink(); ?>">
<?php if ( has_post_thumbnail() ): // サムネイルを持っているときの処理 ?>
<?php the_post_thumbnail( 'thumb150' ); ?>
<?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; ?>
</a>
</dt>
<dd>
<h5>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h5>
</dd>
</dl>
<?php endwhile; ?>
<?php else: ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</div>
「$kanren_category_list」の配列でkeyをカテゴリIDに、valueは何でもいいけどカテゴリ名を入れておくと分かりやすい。
(必要に応じて)ダッシュボードのカテゴリページでカテゴリIDを表示
WordPressダッシュボードのカテゴリページでカテゴリIDを表示するためfunctions.phpに以下を追記する。
//ヘッダとカラムの追加
function addCategoryID($columns){
$columns['id'] = 'ID';
return $columns;
}
add_filter('manage_edit-category_columns','addCategoryID');
//項目の出力
function addCategoryIDvalue($value, $column_name, $id){
if($column_name == 'id'){
echo $id;
}
}
add_action('manage_category_custom_column','addCategoryIDvalue',10,3);
//ソート可能にする
function addCategoryIDsort($columns) {
$columns['id'] = 'ID';
return $columns;
}
add_filter( 'manage_edit-category_sortable_columns', 'addCategoryIDsort' );
タグも設定(2024/02/21追記)
タグも設定した方がより精度が上がった。
具体的には以下で記事に紐づくタグを取得する。
$tags = get_the_tags($post->ID);
$tag_ID = array();
foreach( (array)$tags as $tag ):
if( isset($tag->term_id) ){
array_push( $tag_ID, $tag->term_id);
}
endforeach;
また、以下でカテゴリも検索対象に含める。
$args = array(
'post__not_in' => array($post -> ID),
'posts_per_page'=> 5,
'category__in' => $category_ID,
'tag__in' => $tag_ID,
'orderby' => 'rand',
);
所感
カテゴリを追加する度にテーマファイルを書き換えていく必要がありスマートな解決方法とは言えないけれども挙動としてはまあ満足。
関連記事
-
-
WordPressのWP-Mail-SMTPプラグインが動かない
PHPのバージョンを下げてからWordPressで外部メールサーバが使えるWP- ...
-
-
WordPressで運用中のサイトを停止しないままサーバ移設する方法
WordPressを設置しているサーバのリソースがそろそろ危ういので移設を検討す ...
-
-
WordPressにて指定したユーザでログイン中の場合のみ表記を変更する方法
WordPressを用いたサイトを開発中の際に指定したユーザでログイン中の場合に ...
-
-
WordPressで特定のGETパラメータがあった場合、ページ内に当該パラメータを出力する方法
WordPressの固定ページ内で「uid」というGETパラメータがあった場合、 ...
-
-
WordPressでコンテンツ(記事)内に広告を差し込む方法
WordPress内でヘッダーやフッターではなく、コンテンツ内にバナー広告を差し ...