勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

WordPressでカテゴリに優先順位を決め複数カテゴリが設定されている記事の場合に優先順位の高いカテゴリの記事のみ取得

   2026/08/06  WordPress CMS

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>&nbsp; 関連記事
        </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 add_category_id_columns( $columns ){
    $columns['id'] = 'ID';
    return $columns;
}
add_filter('manage_edit-category_columns', 'add_category_id_columns');

//IDを表示
function add_category_id_display( $value, $column_name, $id ){
    if( $column_name == 'id' ){
        echo $id;
    }
}
add_action('manage_category_custom_column', 'add_category_id_display', 10, 3);

//IDでのソート機能を追加
function add_category_id_sort( $columns ){
    $columns['id'] = 'ID';
    return $columns;
}
add_filter( 'manage_edit-category_sortable_columns', 'add_category_id_sort');

 

タグも設定(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',
);

(必要に応じて)ダッシュボードのタグページにIDを表示

WordPressダッシュボードのカテゴリページにタグIDを表示するためfunctions.phpに以下を追記する。

//一覧ページにカラムを追加
function add_tag_id_columns( $columns ){
    $columns['id'] = 'ID';
    return $columns;
}
add_filter('manage_edit-post_tag_columns', 'add_tag_id_columns');

//IDを表示
function add_tag_id_display( $value, $column_name, $id ){
    if( $column_name == 'id' ){
        echo $id;
    }
}
add_action('manage_post_tag_custom_column', 'add_tag_id_display', 10, 3);

//IDでのソート機能を追加
function add_tag_id_sort( $columns ){
    $columns['id'] = 'ID';
    return $columns;
}
add_filter('manage_edit-post_tag_sortable_columns', 'add_tag_id_sort');

 

所感

カテゴリを追加する度にテーマファイルを書き換えていく必要がありスマートな解決方法とは言えないけれども挙動としてはまあ満足。

 - WordPress CMS

  関連記事

WordPressで特定のGETパラメータがあった場合、ページ内に当該パラメータを出力する方法
WordPressで特定のGETパラメータがあった場合、ページ内に当該パラメータを出力する方法

WordPressの固定ページ内で「uid」というGETパラメータがあった場合、 ...

WordPressのContact Form 7から送信した内容をダッシュボードから確認及びCSVファイル化する方法
WordPressのContact Form 7から送信した内容をダッシュボードから確認及びCSVファイル化する方法

WordPressのContact Form 7プラグインで実装されたお問い合わ ...

WP Social Bookmarking LightでSNSボタンが表示されない際の対応方法
WP Social Bookmarking LightでSNSボタンが表示されない際の対応方法

WordPressでWordPress WP Social Bookmarkin ...

WordPressでスケジュール実行される日時を調べる方法
WordPressでスケジュール実行される日時を調べる方法

WordPressであるシステムを実装し、その際に毎日1回スケジュール実行(WP ...

WordPressダッシュボードに投稿・固定ページ・カテゴリ・タグ一覧ページにIDを表示させてソート可能にする方法
WordPressダッシュボードに投稿・固定ページ・カテゴリ・タグ一覧ページにIDを表示させてソート可能にする方法

WordPressダッシュボードの投稿(記事)・固定ページ・カテゴリー・タグ一覧 ...