【STINGER7】関連記事をより関連したものにする方法【カスタマイズ】

このブログはテーマにSTINGER7を使用しています。

見た目や機能に関してはほぼ満足していますが、関連記事に関しては多少不満があります。

関連記事を取得している部分ですが、同じカテゴリーの記事からランダムで5つ取ってくる記述になっています。

今回はテーマを直接いじらないで取得する記事を変更したいと思います。

スポンサーリンク

割り込めそうなところを探す

Queryに関してはたいてい「pre_get_posts」をフックすれば取得するものを変更可能です。

pre_get_postsはDBにクエリを投げる前に呼ばれるアクションです。

引数にクエリクラス自体が渡されるので、それを使用してクエリの内容を書き換えることが可能です。

今回は関連記事のみで処理をしたいので、少し工夫が必要です。

関連記事は「single.php」から「kanren.php」を「get_template_part( ‘kanren’ )」で呼び出すことで表示されています。

「get_template_part( ‘kanren’ )」の場合は「get_template_part_kanren」をフックするとkanren.php読み込み前に割り込むことができます。

そこでpre_get_postsをadd_actionし、add_actionした中でremove_actionすることで関連記事のみでpre_get_postsを実行させることができます。

「kanren.php」が使用されるという情報を利用して「pre_get_posts」内で関連記事用の処理をするかどうかを決定するという方法をとることもできます。

上の例では表示される記事が3つになります。

動作を確かめる場合は適当なプラグインを作成して上記コードを追加してください。

Elasticsearchを使用してみる

全文検索が可能なElasticsearchを使用して関連記事を取得します。

Elasticsearchの導入に関しては以下のリンクを参考にしてください。

ここでは「Fantastic Elasticsearch」を使用して関連記事を表示させます。

「Fantastic Elasticsearch」の検索は以下の特徴があります。

  • メインクエリ以外では検索を行えない
  • 一度しか検索を行えない

記事ページにおいてはURLから表示する記事の特定をする検索がメインクエリになっています。

したがってこの検索の時に「Fantastic Elasticsearch」にはメインクエリでないと勘違いさせなければいけません。

メインクエリかどうかはグローバル変数「$wp_the_query」が現在のクエリと等しいかどうかで判断するため、上のコードではいったんグローバル変数の方をnullにしています。

その後、「Fantastic Elasticsearch」のpre_get_postsのフックのpriorityが100なのでpriority 101でフックしてグローバル変数を戻しています。

関連記事の場合は逆にメインクエリであると勘違いさせなければいけません。

「$wp_the_query」に引数「$query」を代入して対応します。

また「Fantastic Elasticsearch」の通常検索の実行条件に「is_search()」があります。

is_searchはグローバル変数「$wp_query」のis_searchなので、これをtrueにします。

こちらもpriority 101でpre_get_postsをフックした関数とpriority 11でthe_postsをフックした関数内で元の状態に戻しています。

もう一つ重要な操作があります。

全文検索用の文字列の生成です。

単純に現在表示しているページのタイトルでも悪くはありませんが、今回は本文も使用しました。

タイトルと本文をつなげたものではヒットしなかったため短くし、できるだけ本文全体を使用するように適当に切り取ってくるようにしました。

動作確認

【WordPress】Elasticsearchを導入してみた1の関連記事です。

最も関連がありそうな【WordPress】Elasticsearchを導入してみた2がトップに出てきました。

またおそらく「プラグイン」という単語が多めなので、タイトルと本文に「プラグイン」の多い投稿が関連記事として出ているのだと考えられます。

kanren

おおむね満足する動作になりました。

コメント

  1. より:

    恐れ入ります。

    私も作者様同様STINGERを使用しているのですが、STINGERでCFilteringを使用するためのコード例を、記事にてお示し下さいませんでしょうか?
    いろいろとfunction.phpのコーディングを試行錯誤したのですが上手くいかず、、
    作者様もSTINGERご使用とのことなので、コード例頂けたら幸いです。

    • technote より:

      以前はSTINGER7(バージョン20160501)を使用していたのですが、今は別のテーマを使用させていただいています。
      STINGER7であれば以下のコードを追加すれば、設定されたデータ数以上のデータが存在する場合に関連記事を表示するようになります。
      サムネイルをOFFにしている場合は「get_template_part_kanren-thumbnai-on」を「get_template_part_kanren-thumbnail-off.php」にします。

      私が使用していたバージョンでは「get_template_part_kanren-thumbnai-on」ですが、明らかにスペルミスがあるためバージョンによっては違うかもしれません。
      より正確には関連記事用のテンプレートパーツを呼び出している部分、例えば

      のような箇所を探して、「get_template_part_「引数の文字列」」をフックして上と同じような実装をすれば動作します。
      STINGER7の場合はkanren.phpにあります。