Ajouter du poids de pertinence aux entrées publiées plus récemment par date
Par défaut, SearchWP renvoie les résultats triés par le poids total calculé en fonction des valeurs saisies dans la configuration de votre moteur. Il arrive que vous souhaitiez influencer dynamiquement le classement des résultats de recherche en tenant compte de la date de publication de chaque résultat.
En utilisant le hook searchwp\query\mods de SearchWP, nous pouvons faire exactement cela ! Il existe trois approches différentes pour couvrir :
Note : Cette implémentation ne fait PAS trier les résultats par date, mais plutôt les entrées publiées plus récemment se verront attribuer plus de poids tel que calculé par SearchWP. Plus une entrée a été publiée récemment, plus elle obtient de poids.
- Poids bonus pour les publications récentes
- Poids bonus qui diminue avec le temps
- Date stockée comme valeur de champ personnalisé
- Multiplicateur arbitraire sur la date comme valeur de champ personnalisé
Voir aussi : Utiliser un champ personnalisé pour prioriser les résultats de recherche
Poids bonus pour les publications récentes
Pour que les entrées publiées plus récemment obtiennent un boost de poids, ajoutez ceci à votre plugin de personnalisation 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; | |
| } ); |
Poids bonus qui diminue avec le temps
Alternativement, vous pouvez utiliser quelque chose comme ceci pour que l'influence du poids diminue à mesure que les dates de publication remontent dans le temps. Seules les publications récentes obtiendront un boost, la date de publication des anciennes publications n'influencera pas le poids.
Cette modification est plus agressive car l'influence diminue avec le temps, mais cela peut vous convenir !
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; | |
| } ); |
Avec l'une ou l'autre en place, les entrées avec des dates de publication plus récentes recevront plus de poids que celles avec des dates de publication plus anciennes.
Comme indiqué dans le commentaire, expérimentez avec la ligne 8 pour déterminer quelle valeur de $modifier vous convient le mieux.
Date stockée comme valeur de champ personnalisé
Un autre exemple serait de trier les résultats par dates stockées dans un champ personnalisé. Plus la date du champ personnalisé est récente, plus le résultat recevra de poids :
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; | |
| } ); |
Multiplicateur arbitraire sur la date comme valeur de champ personnalisé
Il est également possible d'attribuer arbitrairement un multiplicateur au poids final calculé (pertinence) des résultats. En d'autres termes, la manipulation du poids ne sera pas dynamique basée sur le timestamp, mais plutôt multipliée par une valeur que vous déterminez.
Vous pouvez appliquer différents multiplicateurs selon que la date du champ personnalisé est dans le passé ou dans le futur, réduisant la pertinence calculée si la valeur du champ personnalisé est dans le passé, et augmentant la pertinence calculée si elle est dans le futur, par exemple :
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(); |
L'implémentation globale du snippet ci-dessus consiste à manipuler directement la requête de SearchWP pour :
- Ajouter une nouvelle colonne à la requête d'index pour calculer et stocker notre calcul de pertinence personnalisé
- Ajouter un calcul de modificateur basé sur le
UNIX_TIMESTAMPde la valeur du champ personnalisé - Inclure des
JOINpersonnalisés pour garantir que nous récupérons les valeurs correctes du champ personnalisé - Remplacer la clause
ORDERBYde SearchWP pour trier les résultats selon notre calcul de pertinence personnalisé
En adoptant cette approche, nous pouvons avoir un contrôle total et direct sur la façon dont la requête de SearchWP s'exécute et, dans ce cas, ajuster le poids calculé pour les articles avec un champ personnalisé nommé event_date à l'aide d'un multiplicateur direct, laissant les autres types d'articles (ou les articles sans le champ personnalisé) non affectés par le multiplicateur.

