SearchWP Documentation

Veja o guia de instalação, navegue pela Base de Conhecimento, descubra os muitos hooks do SearchWP

Adicionar Peso de Relevância a Entradas Publicadas Mais Recentemente por Data

Por padrão, o SearchWP retorna resultados classificados pelo peso total calculado com base nos valores inseridos na configuração do seu motor. Há momentos em que você pode querer influenciar dinamicamente a classificação dos resultados da pesquisa, levando em consideração a data de publicação de cada resultado.

Usando o hook `searchwp\query\mods` do SearchWP, podemos fazer exatamente isso! Existem três abordagens diferentes para cobrir:

Observação: Esta implementação NÃO faz com que os resultados sejam classificados por data, em vez disso, as entradas publicadas mais recentemente receberão mais peso conforme calculado pelo SearchWP. Quanto mais recentemente uma entrada foi publicada, mais peso ela recebe.

Veja também: Usando um Campo Personalizado para Priorizar Resultados de Pesquisa

Peso bônus para publicações recentes

Para que as entradas publicadas mais recentemente recebam um impulso de peso, adicione isto ao seu plugin de Personalizações do 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 bônus que decai com o tempo

Alternativamente, você pode usar algo como isto para que a influência do peso diminua à medida que as datas de publicação ficam mais antigas. Apenas posts publicados recentemente receberão um impulso, a data de publicação de posts mais antigos não influenciará o peso.

Esta modificação é mais agressiva no sentido de que a influência diminui com o tempo, mas isso pode ser preferível para você!

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;
} );

Com qualquer uma delas implementada, as entradas com datas de publicação mais recentes receberão mais peso do que aquelas com datas de publicação mais antigas.

Conforme referenciado no comentário, experimente a linha 8 para determinar qual valor de ` $modifier ` funciona melhor para você.

Data armazenada como valor de Campo Personalizado

Outro exemplo seria ter os resultados classificados por datas armazenadas em um Campo Personalizado. Quanto mais recente a data do Campo Personalizado, mais peso o resultado receberá:

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 arbitrário na data como valor de Campo Personalizado

Também é possível atribuir arbitrariamente um multiplicador ao peso final calculado (relevância) dos resultados. Em outras palavras, a manipulação do peso não será dinâmica com base no timestamp, mas sim multiplicada por um valor que você determinar.

Você pode aplicar diferentes multiplicadores com base se a data do Campo Personalizado está no passado ou no futuro, reduzindo a relevância calculada se o valor do Campo Personalizado estiver no passado, e aumentando a relevância calculada se estiver no futuro, por exemplo:

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();

A implementação geral do trecho acima é que estamos manipulando diretamente a consulta do SearchWP para:

  1. Adicionar uma nova coluna à consulta de índice para calcular e armazenar nosso cálculo de relevância personalizado
  2. Adicionar um cálculo de modificador baseado no `UNIX_TIMESTAMP` do valor do Campo Personalizado
  3. Incluir `JOIN`s personalizados para garantir que estamos recuperando os valores corretos do Campo Personalizado
  4. Substituir a cláusula `ORDERBY` do SearchWP para classificar os resultados pelo nosso cálculo de relevância personalizado

Ao adotar essa abordagem, podemos ter controle total e direto sobre como a consulta do SearchWP é executada e, neste caso, ajustar o peso calculado para Posts com um campo personalizado chamado event_date usando um multiplicador direto, deixando outros tipos de post (ou Posts sem o campo personalizado) inalterados pelo multiplicador.

Crie uma Experiência de Pesquisa WordPress Melhor Hoje

Nunca mais perca visitantes para resultados de pesquisa inúteis. O SearchWP torna a criação de sua própria pesquisa inteligente do WordPress rápida e fácil.

Get SearchWP Now
Ícone de Múltiplos Mecanismos de Busca