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.
- Peso bônus para publicações recentes
- Peso bônus que decai com o tempo
- Data armazenada como valor de Campo Personalizado
- Multiplicador arbitrário na data como valor de Campo Personalizado
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:
- Adicionar uma nova coluna à consulta de índice para calcular e armazenar nosso cálculo de relevância personalizado
- Adicionar um cálculo de modificador baseado no `UNIX_TIMESTAMP` do valor do Campo Personalizado
- Incluir `JOIN`s personalizados para garantir que estamos recuperando os valores corretos do Campo Personalizado
- 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.

