日付による最近公開されたエントリの関連性ウェイトを追加
デフォルトでは、SearchWPはエンジンの設定で入力された値に基づいて計算された総ウェイトでソートされた結果を返します。検索結果のランキングを、各結果の公開日を考慮に入れることで動的に影響を与えたい場合があります。
SearchWPのsearchwp\query\modsフックを使用すると、まさにそれができます!カバーするための3つの異なるアプローチがあります:
注意:この実装では、結果が日付でソートされることはありません。代わりに、最近公開されたエントリは、SearchWPによって計算されたウェイトが大きくなります。エントリが公開された時期が新しいほど、より大きなウェイトが得られます。
最近公開されたものへのボーナスウェイト
最近公開されたエントリにウェイトブーストを与えるには、これをSearchWPカスタマイズプラグインに追加してください:
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // Add search weight to more recently published entries in SearchWP. | |
| // @link https://searchwp.com/documentation/knowledge-base/add-relevance-weight-date/ | |
| add_filter( 'searchwp\query\mods', function( $mods ) { | |
| global $wpdb; | |
| $mod = new \SearchWP\Mod(); | |
| $mod->set_local_table( $wpdb->posts ); | |
| $mod->on( 'ID', [ 'column' => 'id' ] ); | |
| $mod->relevance( function( $runtime ) use ( $wpdb ) { | |
| return " | |
| COALESCE( ROUND( ( ( | |
| UNIX_TIMESTAMP( {$runtime->get_local_table_alias()}.post_date ) | |
| - ( | |
| SELECT UNIX_TIMESTAMP( {$wpdb->posts}.post_date ) | |
| FROM {$wpdb->posts} | |
| WHERE {$wpdb->posts}.post_status = 'publish' | |
| ORDER BY {$wpdb->posts}.post_date ASC | |
| LIMIT 1 | |
| ) | |
| ) / 86400 ), 0 ), 0 )"; | |
| } ); | |
| $mods[] = $mod; | |
| return $mods; | |
| } ); |
時間とともに減衰するボーナスウェイト
あるいは、公開日が古くなるにつれてウェイトの影響が薄れるように、次のようなものを使用することもできます。最近公開された投稿のみがブーストを受け取り、古い投稿の公開日はウェイトに影響しません。
この変更は、影響が時間とともに薄れていくという点でより積極的ですが、それがあなたにとって好ましいかもしれません!
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // Add search weight to more recently published entries in SearchWP. | |
| // Weight decays over time and eventually will not add bonus weight. | |
| // @link https://searchwp.com/documentation/knowledge-base/add-relevance-weight-date/ | |
| add_filter( 'searchwp\query\mods', function( $mods ) { | |
| global $wpdb; | |
| $weight_adjust = 15; | |
| $mod = new \SearchWP\Mod(); | |
| $mod->set_local_table( $wpdb->posts ); | |
| $mod->on( 'ID', [ 'column' => 'id' ] ); | |
| $mod->relevance( function( $runtime_mod ) use ( $weight_adjust ) { | |
| $alias = $runtime_mod->get_local_table_alias(); | |
| return " | |
| ( 100 * EXP( | |
| ( 1 - ABS( ( | |
| UNIX_TIMESTAMP( {$alias}.post_date ) | |
| - UNIX_TIMESTAMP( NOW() ) | |
| ) / 86400 ) ) / 100 ) | |
| * {$weight_adjust} )"; | |
| } ); | |
| $mods[] = $mod; | |
| return $mods; | |
| } ); |
どちらかを実装すると、公開日が新しいエントリは、古い公開日のエントリよりも大きなウェイトが与えられます。
コメントで参照されているように、8行目で$modifier値があなたにとって最適な値を見つけるために実験してください。
カスタムフィールドの値として保存された日付
別の例として、カスタムフィールドに保存された日付で結果をソートすることが挙げられます。カスタムフィールドの日付が新しいほど、その結果はより大きなウェイトを受け取ります:
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // Add bonus weight from Custom Field value in SearchWP. | |
| // @link https://searchwp.com/documentation/knowledge-base/add-relevance-weight-date/ | |
| add_filter( 'searchwp\query\mods', function( $mods ) { | |
| global $wpdb; | |
| // Custom Field name. Needs to store data as YYYYMMDD (ACF does this already). | |
| $my_meta_key = 'date_field'; | |
| $mod = new \SearchWP\Mod(); | |
| $mod->set_local_table( $wpdb->postmeta ); | |
| $mod->on( 'post_id', [ 'column' => 'id' ] ); | |
| $mod->on( 'meta_key', [ 'value' => $my_meta_key ] ); | |
| $mod->relevance( function( $runtime ) use ( $wpdb, $my_meta_key ) { return $wpdb->prepare( " | |
| COALESCE( ROUND( ( ( | |
| UNIX_TIMESTAMP( {$runtime->get_local_table_alias()}.meta_value ) | |
| - ( | |
| SELECT UNIX_TIMESTAMP( meta_value ) | |
| FROM {$wpdb->postmeta} | |
| WHERE meta_key = %s | |
| ORDER BY meta_value ASC | |
| LIMIT 1 | |
| ) | |
| ) / 86400 ), 0 ), 0 )", $my_meta_key ); | |
| } ); | |
| $mods[] = $mod; | |
| return $mods; | |
| } ); |
カスタムフィールドの値としての任意の日付乗数
また、結果の最終的な計算ウェイト(関連性)に任意の乗数を適用することも可能です。言い換えれば、ウェイト操作はタイムスタンプに基づいて動的になるのではなく、あなたが決定した値によって乗算されます。
カスタムフィールドの日付が過去か未来かに基づいて異なる乗数を適用できます。たとえば、カスタムフィールドの値が過去の場合は計算された関連性を減らし、未来の場合は計算された関連性を増やすことができます:
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // Modify SearchWP calculated relevance using multiplier. | |
| // @link https://searchwp.com/documentation/knowledge-base/add-relevance-weight-date/ | |
| class My_SearchWP_Date_Modifier { | |
| private $post_type = 'post'; | |
| private $meta_key = 'event_date'; | |
| private $modifier_past = 0.5; | |
| private $modifier_future = 1.5; | |
| private $alias = 'myswpdm'; | |
| function __construct() { | |
| global $wpdb; | |
| // Modify SearchWP calculated relevance using multiplier. | |
| add_filter( 'searchwp\query', function( $query, $args ) use ( $wpdb ) { | |
| // Calculate a CUSTOM relevance. | |
| $query['select'][] = "( SUM(relevance) * {$this->alias}mod ) AS {$this->alias}rel"; | |
| // Implement a custom weight modifier based on date stored as meta value. | |
| $query['from']['select'][] = " | |
| ( | |
| CASE | |
| WHEN UNIX_TIMESTAMP( {$this->alias}m.meta_value ) < UNIX_TIMESTAMP( NOW() ) | |
| THEN {$this->modifier_past} | |
| WHEN UNIX_TIMESTAMP( {$this->alias}m.meta_value ) > UNIX_TIMESTAMP( NOW() ) | |
| THEN {$this->modifier_future} | |
| ELSE 1 | |
| END | |
| ) AS {$this->alias}mod | |
| "; | |
| // Custom JOINs. | |
| $query['from']['from'][] = " | |
| LEFT JOIN {$wpdb->posts} {$this->alias}p | |
| ON ( {$this->alias}p.ID = {$args['index_alias']}.id | |
| AND {$this->alias}p.post_type = '{$this->post_type}' ) | |
| "; | |
| $query['from']['from'][] = " | |
| LEFT JOIN {$wpdb->postmeta} {$this->alias}m | |
| ON ( {$this->alias}m.post_id = {$this->alias}p.ID | |
| AND {$this->alias}m.meta_key = '{$this->meta_key}' ) | |
| "; | |
| // Use our custom relevance to sort results by overriding the default ORDERBY. | |
| $query['order_by'] = [ "{$this->alias}rel DESC", ]; | |
| return $query; | |
| }, 20, 2 ); | |
| } | |
| } | |
| new My_SearchWP_Date_Modifier(); |
上記のコードスニペットの全体的な実装は、SearchWPのクエリを直接操作して次のことを行うことです:
- カスタム関連性計算を計算して保存するための新しい列をインデックスクエリに追加する
- カスタムフィールド値の
UNIX_TIMESTAMPに基づいたモディファイア計算を追加する - 適切なカスタムフィールド値を取得することを保証するためにカスタム
JOINを含める - カスタム関連性計算で結果をソートするために、SearchWPの
ORDERBY句をオーバーライドする
このアプローチを採用することで、SearchWP のクエリの実行方法を完全に直接制御でき、この場合、event_date という名前のカスタムフィールドを持つ投稿の計算済みウェイトを直接乗数を使用して調整できます。これにより、他の投稿タイプ(またはカスタムフィールドを持たない投稿)は乗数の影響を受けません。

