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のxmlrpc.phpに対する攻撃の対策方法
サーバーの死活監視をしているシステムから、1つのサイトが落ちているとアラートがき ...
-
Contact form7で送信数を測定(トラッキングタグ)
contact form7でフォーム送信が完了した時点で計測されるようにトラッキ ...
-
WordPressサイトのロードアベレージが高い際の対応方法
あるWordPressサイトのロードアベレージが先月ぐらいまでは通常0.5前後で ...
-
WordPressでテーマファイル内で共通の変数を設定及び使用する方法
WordPressでテーマ内の共通変数を設定し使用したかった。例えば記事一覧ペー ...
-
WordPressの管理画面で記事一覧にアイキャッチ画像を表示
WordPressの管理画面で記事一覧にアイキャッチ画像を表示させる方法のメモ。 ...