Aggiungi peso di rilevanza alle voci pubblicate più di recente per data
Per impostazione predefinita, SearchWP restituisce i risultati ordinati in base al peso totale calcolato in base ai valori inseriti nella configurazione del tuo motore. Ci sono momenti in cui potresti voler influenzare dinamicamente la classifica dei risultati di ricerca tenendo conto della data di pubblicazione di ciascun risultato.
Utilizzando l'hook di SearchWP searchwp\query\mods, possiamo fare proprio questo! Ci sono tre diversi approcci da considerare:
Nota: questa implementazione NON causa l'ordinamento dei risultati per data, invece le voci pubblicate più di recente riceveranno semplicemente più peso come calcolato da SearchWP. Più di recente è stata pubblicata una voce, più peso riceve.
- Peso bonus per le pubblicazioni recenti
- Peso bonus che decade nel tempo
- Data memorizzata come valore di Campo Personalizzato
- Moltiplicatore arbitrario sulla data come valore di Campo Personalizzato
Vedi anche: Utilizzo di un Campo Personalizzato per Dare Priorità ai Risultati di Ricerca
Peso bonus per le pubblicazioni recenti
Per far sì che le voci pubblicate più di recente ottengano un aumento di peso, aggiungi questo al tuo plugin di personalizzazioni 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; | |
| } ); |
Peso bonus che decade nel tempo
In alternativa, puoi usare qualcosa di simile per far sì che l'influenza del peso diminuisca man mano che le date di pubblicazione si allontanano nel tempo. Solo i post pubblicati di recente riceveranno un bonus, la data di pubblicazione dei post più vecchi non influenzerà il peso.
Questa modifica è più aggressiva in quanto l'influenza diminuisce nel tempo, ma questo potrebbe essere preferibile per te!
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; | |
| } ); |
Con una delle due implementazioni, le voci con date di pubblicazione più recenti riceveranno più peso rispetto a quelle con date di pubblicazione più vecchie.
Come indicato nel commento, sperimenta con la riga 8 per determinare quale valore di $modifier funziona meglio per te.
Data memorizzata come valore di Campo Personalizzato
Un altro esempio sarebbe ordinare i risultati per date memorizzate in un Campo Personalizzato. Più recente è la data del Campo Personalizzato, più peso riceverà il risultato:
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; | |
| } ); |
Moltiplicatore arbitrario sulla data come valore di Campo Personalizzato
È anche possibile assegnare arbitrariamente un moltiplicatore al peso finale (rilevanza) calcolato dei risultati. In altre parole, la manipolazione del peso non sarà dinamica in base al timestamp, ma verrà invece moltiplicata per un valore da te determinato.
Puoi applicare moltiplicatori diversi a seconda che la data del Campo Personalizzato sia nel passato o nel futuro, riducendo la rilevanza calcolata se il valore del Campo Personalizzato è nel passato, e aumentando la rilevanza calcolata se è nel futuro, ad esempio:
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'implementazione generale dello snippet sopra è che stiamo manipolando direttamente la query di SearchWP per:
- Aggiungere una nuova colonna alla query di indicizzazione per calcolare e memorizzare il nostro calcolo di rilevanza personalizzato
- Aggiungere un calcolo modificatore basato sul
UNIX_TIMESTAMPdel valore del Campo Personalizzato - Includere
JOINpersonalizzati per garantire che stiamo recuperando i valori corretti del Campo Personalizzato - Sovrascrivere la clausola
ORDERBYdi SearchWP per ordinare i risultati in base al nostro calcolo di rilevanza personalizzato
Adottando questo approccio possiamo avere il controllo completo e diretto su come viene eseguita la query di SearchWP e in questo caso regolare il peso calcolato per i Post con un Custom Field chiamato event_date utilizzando un moltiplicatore diretto, lasciando inalterati altri tipi di post (o Post senza il Custom Field) dal moltiplicatore.

