インデックスとソースのモッドの比較
\SearchWP\Mod は、SearchWP の検索クエリに対する専用のインタラクションです。
Mod には、主に 2 つのタイプがあります。
- インデックスベース
- インデックス全体に修正を適用する
- ソースベース
- 修正を単一の
Sourceに制限する
実装している Mod のタイプを指定する主な方法は、Mod をインスタン化する際に Source (または Source name) を渡すことです。
注: これは 2 つのインスタンス化の比較であり、これらの Mod はまだ何も実行しないことに注意してください。
| <?php | |
| // @link https://searchwp.com/documentation/knowledge-base/comparing-index-source-mods/ | |
| // Instantiate an index Mod that applies to the entire index. | |
| $mod = new \SearchWP\Mod(); | |
| // Instantiate a Source Mod that applies only to Posts. | |
| $source = \SearchWP\Utils::get_post_type_source_name( 'post' ); | |
| $mod = new \SearchWP\Mod( $source ); |
最初の Mod は、クエリの実行時にインデックス全体に適用されるようにインスタンス化されています。比較すると、2 番目の Mod は単一の Source にのみ適用されます。
インデックスベースの Mod を使用する
インデックスベースの Mod は、SearchWP インデックスのみをコンテキストとして持ちます。インデックスベースの Mod は、そのジョブを実行するためにその直接的なコンテキストのみを必要とするものに限定されるべきです。
インデックスベースの Mod を使用して追加の JOIN を実行することは確かに可能ですが、そうするとクエリ時間が長くなる可能性があり、これは Source ベースの Mod ではそれほど顕著ではないかもしれません。
例: 適用可能なインデックスベースの Mod は、結果として返された特定の Source に「ボーナス」の重みを追加するものです。
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // @link https://searchwp.com/documentation/knowledge-base/comparing-index-source-mods/ | |
| // Add relevance weight to a single SearchWP Source (Posts). | |
| add_filter( 'searchwp\query\mods', function( $mods ) { | |
| global $wpdb; | |
| $mod = new \SearchWP\Mod(); | |
| $source = \SearchWP\Utils::get_post_type_source_name( 'post' ); | |
| $mod->weight( $wpdb->prepare( "IF(s.source = %s, 9999999, 0)", $source ) ); | |
| $mods[] = $mod; | |
| return $mods; | |
| } ); |
この Mod では、「ボーナス」の関連性重み 9999999 がすべての投稿に与えられます。このようなフックの使用例としては、Source を明示的にグループ化するように強制することなく、投稿が他のすべての Source よりも (ほぼ) 確実に上位に表示されるようにしたい場合があります。
ソースベースの Mod を使用する
ソースベースの Mod は、単一の Source にのみ適用されるクエリ修正を容易にします。この場合、Source を定義するデータベーステーブルとの JOIN が既に存在しており、修正の新しい可能性が開かれます。
例: ソースベースの Mod は、特定の条件が満たされた場合に検索結果から特定の投稿を除外するために使用できます。
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // @link https://searchwp.com/documentation/knowledge-base/comparing-index-source-mods/ | |
| add_filter( 'searchwp\query\mods', function( $mods ) { | |
| if ( ! isset( $_GET['my_mod_trigger'] ) ) { | |
| return $mods; | |
| } | |
| // Exclude Posts 97 and 188 from search results. | |
| $source = \SearchWP\Utils::get_post_type_source_name( 'post' ); | |
| $mod = new \SearchWP\Mod( $source ); | |
| $mod->set_where( [ [ | |
| 'column' => 'ID', | |
| 'value' => ['97', '188'], | |
| 'compare' => 'NOT IN', | |
| 'type' => 'NUMERIC' | |
| ] ] ); | |
| $mods[] = $mod; | |
| return $mods; | |
| }, 30, 2 ); |
この Mod を使用すると、$_GET['my_mod_trigger'] が定義されている場合にのみ、投稿 97 と 188 が検索結果から除外されます。
別の例: ソースベースの Mod は、タイトルに単語 coffee が含まれるページを除外するために使用できます。
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // @link https://searchwp.com/documentation/knowledge-base/comparing-index-source-mods/ | |
| add_filter( 'searchwp\query\mods', function( $mods ) { | |
| // Exclude Pages with 'coffee' in the Title. | |
| $source = \SearchWP\Utils::get_post_type_source_name( 'page' ); | |
| $mod = new \SearchWP\Mod( $source ); | |
| $mod->set_where( [ [ | |
| 'column' => 'post_title', | |
| 'value' => 'coffee', | |
| 'compare' => 'LIKE', | |
| ] ] ); | |
| $mods[] = $mod; | |
| return $mods; | |
| }, 30, 2 ); |
ソースベースの Mod は、SearchWP の検索方法をプログラムで変更するための強力な方法です。

