WordPressには、統計学的手法で「この記事を読んだ人は、こちらの記事も読んでいます」を実装できる「CFiltering」というプラグインがあります。
CFilteringを使うと、ユーザーの閲覧履歴から統計的に関連性の高い記事を表示することができます。
とても便利なプラグインなのですが、管理画面の設定では、カテゴリによって記事の表示をコントロールすることができません。
今回は、特定のカテゴリの記事をCFilteringの関連記事表示から除外する方法を紹介します。
CFilteringのプラグインファイルを編集する
CFilteringのプラグインファイルを直接編集します。プラグインをアップデートした場合は、編集したファイルが元に戻るので、再度編集する必要があります。
「/wp-content/plugins/cfiltering/services/calculate.php
」のファイルを編集します。calculate.php
はCFilteringで関連記事を取得するときの関連度計算を行うファイルです。
284-294行目に以下のようなコードがあります。
$ret = array_map( function ( $d ) use ( $post_types, $post_statuses ) { $post = get_post( $d['post_id'] ); if ( !$post ) { return false; } if ( !empty( $post_types ) && !in_array( $post->post_type, $post_types ) ) { return false; } if ( !empty( $post_statuses ) && !in_array( $post->post_status, $post_statuses ) ) { return false; } $d['post'] = $post; return $d; }, $ret );
「if ( !empty( $post_types ) && !in_array( $post->post_type, $post_types ) ) {
」の上に以下のようにコードを追加します。
$ret = array_map( function ( $d ) use ( $post_types, $post_statuses ) { $post = get_post( $d['post_id'] ); if ( !$post ) { return false; } // 追加 ここから(カテゴリID10、20の記事を除外する) $categories = get_the_category( $d['post_id'] ); foreach( $categories as $category ) { if( in_array( $category->term_id, array('10','20') ) ) { return false; } } // 追加 ここまで if ( !empty( $post_types ) && !in_array( $post->post_type, $post_types ) ) { return false; } if ( !empty( $post_statuses ) && !in_array( $post->post_status, $post_statuses ) ) { return false; } $d['post'] = $post; return $d; }, $ret );
「return false;
」を返すことで、条件に該当する記事を非表示にすることができます。
if文を書き換えれば、カテゴリ以外にも様々な条件で記事の表示をコントロールすることができます。
「保存する計算結果の最大数」を変更する
CFilteringの設定で、「保存する計算結果の最大数」を変更します。
「保存する計算結果の最大数」は、先ほど追加した条件が適用される前の関連記事数が対象になります。つまり、実際に保存される関連記事数は、条件が厳しいとそれだけ少なくなります。
そのため、必要に応じて「保存する計算結果の最大数」を増やしておきます。
デフォルトでは20になっています。私は100に設定しています。