Relevanzgewicht für kürzlich veröffentlichte Einträge nach Datum hinzufügen
Standardmäßig gibt SearchWP Ergebnisse zurück, die nach dem Gesamtgewicht sortiert sind, basierend auf den Werten, die in Ihrer Engine-Konfiguration eingegeben wurden. Es gibt Zeiten, in denen Sie die Rangfolge von Suchergebnissen dynamisch beeinflussen möchten, indem Sie das Veröffentlichungsdatum jedes Ergebnisses berücksichtigen.
Mit dem Hook searchwp\query\mods von SearchWP können wir genau das tun! Es gibt drei verschiedene Ansätze, die abgedeckt werden:
Hinweis: Diese Implementierung führt NICHT dazu, dass Ergebnisse nach Datum sortiert werden. Stattdessen erhalten kürzlich veröffentlichte Einträge einfach mehr Gewicht, wie von SearchWP berechnet. Je neuer ein Eintrag veröffentlicht wurde, desto mehr Gewicht erhält er.
- Bonusgewicht für kürzlich veröffentlichte
- Bonusgewicht, das mit der Zeit abnimmt
- Datum als Wert eines benutzerdefinierten Feldes gespeichert
- Beliebiger Multiplikator für Datum als Wert eines benutzerdefinierten Feldes
Siehe auch: Verwendung eines benutzerdefinierten Feldes zur Priorisierung von Suchergebnissen
Bonusgewicht für kürzlich veröffentlichte
Damit kürzlich veröffentlichte Einträge einen Gewichtungsbonus erhalten, fügen Sie dies zu Ihrem SearchWP Customizations Plugin hinzu:
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; | |
| } ); |
Bonusgewicht, das mit der Zeit abnimmt
Alternativ können Sie etwas Ähnliches verwenden, um den Gewichtungsfluss mit zunehmendem Alter der Veröffentlichungsdaten zu verringern. Nur kürzlich veröffentlichte Beiträge erhalten einen Bonus, das Veröffentlichungsdatum älterer Beiträge beeinflusst das Gewicht nicht.
Diese Modifikation ist aggressiver, da der Einfluss mit der Zeit abnimmt, aber das kann für Sie vorteilhafter sein!
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; | |
| } ); |
Mit einer der beiden Implementierungen erhalten Einträge mit neueren Veröffentlichungsdaten mehr Gewicht als solche mit älteren Veröffentlichungsdaten.
Wie im Kommentar erwähnt, experimentieren Sie mit Zeile 8, um den besten $modifier-Wert für Sie zu ermitteln.
Datum als Wert eines benutzerdefinierten Feldes gespeichert
Ein weiteres Beispiel wäre, die Ergebnisse nach Daten zu sortieren, die in einem benutzerdefinierten Feld gespeichert sind. Je neuer das Datum des benutzerdefinierten Feldes, desto mehr Gewicht erhält das Ergebnis:
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; | |
| } ); |
Beliebiger Multiplikator für Datum als Wert eines benutzerdefinierten Feldes
Es ist auch möglich, dem endgültigen, berechneten Gewicht (Relevanz) der Ergebnisse einen beliebigen Multiplikator zuzuweisen. Mit anderen Worten, die Gewichtungsmanipulation ist nicht dynamisch basierend auf dem Zeitstempel, sondern wird mit einem von Ihnen bestimmten Wert multipliziert.
Sie können unterschiedliche Multiplikatoren anwenden, je nachdem, ob das Datum des benutzerdefinierten Feldes in der Vergangenheit oder Zukunft liegt. Reduzieren Sie beispielsweise die berechnete Relevanz, wenn der Wert des benutzerdefinierten Feldes in der Vergangenheit liegt, und erhöhen Sie die berechnete Relevanz, wenn er in der Zukunft liegt:
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(); |
Die Gesamtimplementierung des obigen Snippets besteht darin, dass wir die Abfrage von SearchWP direkt manipulieren, um:
- Eine neue Spalte zur Indexabfrage hinzuzufügen, um unsere benutzerdefinierte Relevanzberechnung zu ermitteln und zu speichern
- Eine Modifikatorberechnung basierend auf dem
UNIX_TIMESTAMPdes Werts des benutzerdefinierten Feldes hinzuzufügen - Benutzerdefinierte
JOINs einzuschließen, um sicherzustellen, dass wir die richtigen Werte des benutzerdefinierten Feldes abrufen - Die
ORDERBY-Klausel von SearchWP zu überschreiben, um die Ergebnisse nach unserer benutzerdefinierten Relevanzberechnung zu sortieren
Indem wir diesen Ansatz verfolgen, können wir die Ausführung der SearchWP-Abfrage vollständig und direkt steuern und in diesem Fall das berechnete Gewicht für Beiträge mit einem benutzerdefinierten Feld namens event_date mit einem direkten Multiplikator anpassen, sodass andere Beitragstypen (oder Beiträge ohne das benutzerdefinierte Feld) vom Multiplikator unberührt bleiben.

