勉強したことのメモ

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

  関連記事

Advanced Custom Fieldsでセレクトメニューを動的に生成する方法

WordPressでカスタムフィールド設定用のプラグインAdvanced Cus ...

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

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

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

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

Advanced Custom Fieldsで設定した項目を条件に記事一覧を取得する方法

WordPressでAdvanced Custom Fieldsにて設定した項目 ...

WordPressのxmlrpc.phpに対する攻撃の対策方法

サーバーの死活監視をしているシステムから、1つのサイトが落ちているとアラートがき ...