勉強したことのメモ

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

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

   2024/02/25  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 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 CMS

  関連記事

WordPressで画像にカテゴリを設定し、記事投稿の際の画像選択時に指定したカテゴリの画像のみ表示させる方法

WordPressのメディアライブラリに画像を沢山登録していると、記事投稿の際の ...

さくらvpsにワードプレスを導入

さくらvpsで立ち上げたサーバーにWordPressを導入した際のメモ。 ①ダウ ...

CSVファイルをアップロードしてWordPressに記事を投稿する方法

CSVファイルをアップロードすることでWordPressに記事を投稿したかった。 ...

WordPressのユーザー画像とプロフィールの登録及び表示方法

WordPressでユーザー毎に画像とプロフィール部分にHTMLタグを登録したか ...

WordPress Popular Postsのサムネイルが表示されない

WordPressの人気記事を表示させるWordPress Popular Po ...