SearchWP Documentation

Sehen Sie sich die Installationsanleitung an, durchsuchen Sie die Wissensdatenbank und erfahren Sie mehr über die vielen Hooks von SearchWP

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.

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:

  1. Eine neue Spalte zur Indexabfrage hinzuzufügen, um unsere benutzerdefinierte Relevanzberechnung zu ermitteln und zu speichern
  2. Eine Modifikatorberechnung basierend auf dem UNIX_TIMESTAMP des Werts des benutzerdefinierten Feldes hinzuzufügen
  3. Benutzerdefinierte JOINs einzuschließen, um sicherzustellen, dass wir die richtigen Werte des benutzerdefinierten Feldes abrufen
  4. 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.

Erstellen Sie noch heute eine bessere WordPress-Sucherfahrung

Verlieren Sie nie wieder Besucher an unzureichende Suchergebnisse. SearchWP macht die Erstellung Ihrer eigenen intelligenten WordPress-Suche schnell und einfach.

Get SearchWP Now
Symbol für mehrere Suchmaschinen