検索結果のカテゴリー制限

閲覧数: 47(1)

検索ネタを連発しておりますが、、、今回はテーマとプラグインどっちで修正するかという課題に挑戦しました。ワードプレスの検索は標準ではデータベースに対してSQLクエリを発行することで実現しています。リレーショナルデータベース(RDB)とSQLクエリは切っても切れない関係で30年前はRDBで世界が変わると言われていました。が、実際にはそんな事はなく、複雑なクエリを投げてはサーバーがオーバーフローする、ということの繰り返しでした。キャッシュを作ってみたり、メモリ上にテーブルを展開してみたり、様々は方法がトライされましたが、結局、解決する方法はなく、単にハードウェアの性能が向上したために現在ではあまり語られなくなりましたが、企業の古いシステムは、今でもバカみたいなSQLを発行しては無駄なリソースを費やしています。電気代勿体ねーw

最近では人工知能(AI)が持て囃されていますが、今のテクノロジーでコンピュータが「考える」という事はあり得ず、結局のところ膨大な過去データをどれだけ素早く検索・分岐判断して一番近しい答えにたどり着くか、だけです。これを知能と呼んでしまうところに欧米人のエゴがあると個人的には思います。真面目な日本人にはあれを「知能」とは呼べないですね。訳語の誤りも多少あるかもしれませんがw

前フリが長くなりましたがワードプレス標準の検索機能の話でした。標準のインストールではMySQLか互換DBが選択されることが多いのですが、そのMySQLに対して検索ワードをSQL文にして実行するわけです。実はRDBと言うのはこの手の検索にはあまり向いていません。そもそもデータベースというのはどれでも自然語での検索には不向きなのですが、例えばRDB以前のネットワーク型DBなどではカテゴリを前後に辿るCPUコストはほぼゼロですがRDBではインデックスが無ければテーブルの全件サーチしかありません。多少誇張して書いていますがそんな感じです。

まさか古いテクノロジーに戻るわけにいかないので出てきたのがサーチエンジンという訳です。このサイトでは「Elasticsearch」を採用しています。実態は巨大なインデックスの塊と言う事が出来ると思います。あらかじめ定義された形に形態素解析した単語をインデックスデータベースに格納しておく。検索の際にはあらかじめ定義した形に検索語を解析してインデックスを検索する。だいたいそんな感じです。

標準機能ではサーチエンジンを使えないのでプラグインを追加します。ここでは「ElasticPress」を採用しています。自分で試した限りでは日本語対応していないようなので多少手直しはしていますが基本機能は変えていません。このプラグインが標準の検索機能を置き換えているのですが、ここで多少問題が発生します。このサイトのほぼ全ての記事が「公開」設定なのですが、ごく一部に「非公開」の記事が含まれています。表示の時点では制限がかかっているので非公開記事を表示する事はありませんが、検索結果の一覧には表示されてしまいます。今回はこの制限を入れるお話です。前フリ長いなw

検索ボタンを押すと「検索フォーム」が表示されます。これはテーマが持つ「searchform.php」が使われます。検索結果を表示するのが「search.php」です。検索フォームの中から呼ばれる関数が「ElasticPress」によって置換え&拡張されています。テーマかプラグインかどちらを修正するのか決めなければなりません。巨大なデータベースを相手にしている訳ではないので手っ取り早く検索結果を表示するところで修正することにします。この辺はデータベースの規模にもよると思います。

                    <?php /* Start the Loop */ ?>
                    <?php while ( have_posts() ) : the_post(); ?>

                        <?php
                        /*
                         * Include the Post-Format-specific template for the content.
                         * If you want to override this in a child theme, then include a file
                         * called content-___.php (where ___ is the Post Format name) and that will be used instead.
                         */
                        get_template_part( 'components/post/content', get_post_format() );
                        ?>

                    <?php endwhile; ?>

オリジナルのコードに対して、ログインしているかどうかで制御を入れています。ログインしている場合にはそのまま全てを表示、ログインしていない場合には「カテゴリ=公開」の記事だけ表示しています。

                    <?php /* Start the Loop */ ?>
                    <?php while ( have_posts() ) : the_post(); ?>
                    <?php if ( is_user_logged_in() || in_category( '公開') ): ?>

                        <?php
                        /*
                         * Include the Post-Format-specific template for the content.
                         * If you want to override this in a child theme, then include a file
                         * called content-___.php (where ___ is the Post Format name) and that will be used instead.
                         */
                        get_template_part( 'components/post/content', get_post_format() );
                        ?>

                    <?php endif; ?>
                    <?php endwhile; ?>

※上の「公開」の部分は実際にはカテゴリーIDを入れます
検索結果は綺麗に表示して欲しいのでこういう細かい制御を入れるのは楽しいです。笑

【最終更新日: 2019年6月6日】
カテゴリーIT閑話, 公開タグ, , , , , ,
カテゴリーを制限する
2020年5月11日

過去に何度も書いた「カテゴリー制限」の話、元はと言えば初期に書かれた「非公開」の記事が原因です。トッ  続きを読む

カテゴリー制限
blank
2019年6月6日

カテゴリー制限はこのサイトでは過去に何度も出題された「頻出過去問題」です。初期の頃は「Allow C  続きを読む

Elasticsearch 5.6.5
blank
2017年12月17日

少し古い記事の「検索に悩む」で紹介した「Elasticsearch」ですがWordPressやMed  続きを読む

Sticky Headerその後
blank
2016年11月5日

Sticky Headerをやりたくて、その名もずばり「Sticky Header」と言うプラグイン  続きを読む

カテゴリー制限をかける
blank
2015年11月24日

一般公開とログイン後公開と非公開、この3パターンをカテゴリー制限で実現するプラグインとして、「Hom  続きを読む

マイナーチェンジ
blank
2020年3月23日

かれこれ一年近くほったらかしだったので、気合をいれて「テーマ変更」と思っていたのですが、、、いろいろ  続きを読む

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください