SearchWP Documentation

Consultez le guide d’installation, parcourez la base de connaissances, découvrez les nombreux hooks de SearchWP

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.

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 :

  1. Ajouter une nouvelle colonne à la requête d'index pour calculer et stocker notre calcul de pertinence personnalisé
  2. Ajouter un calcul de modificateur basé sur le UNIX_TIMESTAMP de la valeur du champ personnalisé
  3. Inclure des JOIN personnalisés pour garantir que nous récupérons les valeurs correctes du champ personnalisé
  4. Remplacer la clause ORDERBY de 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.

Créez dès aujourd'hui une meilleure expérience de recherche WordPress

Ne perdez plus jamais de visiteurs à cause de résultats de recherche inutiles. SearchWP rend la création de votre propre recherche WordPress intelligente rapide et facile.

Get SearchWP Now
Icône de moteurs de recherche multiples