Añadir Peso de Relevancia a Entradas Publicadas Más Recientemente por Fecha
Por defecto, SearchWP devuelve resultados ordenados por el peso total calculado basándose en los valores introducidos en la configuración de su motor. Hay ocasiones en las que podría querer influir dinámicamente en la clasificación de los resultados de búsqueda teniendo en cuenta la fecha de publicación de cada resultado.
Usando el hook searchwp\query\mods de SearchWP, ¡podemos hacer precisamente eso! Hay tres enfoques diferentes para cubrir:
Nota: Esta implementación NO hace que los resultados se ordenen por fecha, en su lugar, las entradas publicadas más recientemente simplemente recibirán más peso según lo calculado por SearchWP. Cuanto más recientemente se publicó una entrada, más peso obtiene.
- Peso adicional por publicación reciente
- Peso adicional que decae con el tiempo
- Fecha almacenada como valor de Campo Personalizado
- Multiplicador arbitrario de la fecha como valor de Campo Personalizado
Ver también: Usar un Campo Personalizado para Priorizar Resultados de Búsqueda
Peso adicional por publicación reciente
Para que las entradas publicadas más recientemente obtengan un impulso de peso, añada esto a su plugin de Personalizaciones de 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 adicional que decae con el tiempo
Alternativamente, puede usar algo como esto para que la influencia del peso disminuya a medida que las fechas de publicación se remontan en el tiempo. Solo las publicaciones recientes obtendrán un impulso, la fecha de publicación de las publicaciones antiguas no influirá en el peso.
¡Esta modificación es más agresiva en el sentido de que la influencia disminuye con el tiempo, pero eso puede ser preferible para usted!
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 cualquiera de las dos implementaciones, las entradas con fechas de publicación más recientes recibirán más peso que aquellas con fechas de publicación más antiguas.
Como se referencia en el comentario, experimente con la línea 8 para determinar qué valor de $modifier funciona mejor para usted.
Fecha almacenada como valor de Campo Personalizado
Otro ejemplo sería ordenar los resultados por fechas almacenadas en un Campo Personalizado. Cuanto más reciente sea la fecha del Campo Personalizado, más peso recibirá el resultado:
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; | |
| } ); |
Multiplicador arbitrario de la fecha como valor de Campo Personalizado
También es posible asignar arbitrariamente un multiplicador al peso final calculado (relevancia) de los resultados. En otras palabras, la manipulación del peso no será dinámica basada en la marca de tiempo, sino que se multiplicará por un valor que usted determine.
Puede aplicar diferentes multiplicadores según si la fecha del Campo Personalizado está en el pasado o en el futuro, reduciendo la relevancia calculada si el valor del Campo Personalizado está en el pasado, y aumentando la relevancia calculada si está en el futuro, por ejemplo:
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(); |
La implementación general del fragmento anterior es que estamos manipulando directamente la consulta de SearchWP para:
- Añadir una nueva columna a la consulta de índice para calcular y almacenar nuestro cálculo de relevancia personalizado
- Añadir un cálculo de modificador basado en la
UNIX_TIMESTAMPdel valor del Campo Personalizado - Incluir
JOINs personalizados para asegurar que estamos recuperando los valores adecuados del Campo Personalizado - Anular la cláusula
ORDERBYde SearchWP para ordenar los resultados por nuestro cálculo de relevancia personalizado
Al adoptar este enfoque podemos tener un control total y directo sobre cómo se ejecuta la consulta de SearchWP y, en este caso, ajustar el peso calculado para las Publicaciones con un Campo Personalizado llamado event_date usando un multiplicador directo, dejando otros tipos de publicación (o Publicaciones sin el Campo Personalizado) sin verse afectados por el multiplicador.

