Excluir tipo de postagem personalizada da pesquisa no WordPress

96

Outro problema ocorreu no outro dia em que havia tipos de postagem personalizados aparecendo nos resultados de pesquisa do WordPress. Se você estiver registrando manualmente seus tipos de postagem, basta adicionar o argumento ‘exclude_from_search’ antes de se registrar.

$labels = array(
	// ...
);

$args = array(
	'labels'  => $labels
	// ...
	'exclude_from_search' => true, 
	// ...
);

register_post_type( 'my-custom-type', $args );

Se um plug-in estiver criando o tipo de postagem personalizado, use o gancho ‘init’ com alta prioridade para atualizar esses argumentos após o plug-in ter registrado o tipo de postagem. Para fazer isso, adicione-o ao functions.php.

// functions.php

add_action( 'init', 'update_my_custom_type', 99 );

/**
 * update_my_custom_type
 *
 */
function update_my_custom_type() {
	global $wp_post_types;

	if ( post_type_exists( 'my-custom-type' ) ) {

		// excluir dos resultados da pesquisa
		$wp_post_types['my-custom-type']->exclude_from_search = true;
	}
}

Seu tipo de postagem personalizada não será mais exibido nos resultados da pesquisa do WordPress.

Uma outra questão no mesmo projeto me apareceu.

Como ajustar o argumento de pesquisa no WP_Query para mostrar apenas resultados exatos na busca?

Se você utiliza algo como isso:

$args_search = array( 
    's' => $search,
    'post_type' => array( 'post' )
);

$wp_query = new WP_Query( $args_search );

Mas o problema é que da forma acima exibe todos os resultados semelhantes, que contem parte do que foi buscado.

Por exemplo, se $search contem "2386" e eu tenho no meu DB 3 posts:

"12386111" "23861111" "11112386"

Vou receber 3 resultados.

Mas quero obter 0 resultados. porque não é uma partida completa.

Somente se a pesquisa for exatamente 23861111, que quero obter 1 resultado 23861111.

Ou quando é exatamente 11112386 ao digitar o total 11112386 como uma variável de pesquisa e não apenas 2386 ou 238 para obter o resultado 11112386

Como alterar minha consulta para obter os resultados desejados, em vez de tudo o que contém a string de pesquisa?

Resolvi esse problema utilizando o parâmetro ‘exact’ com valor 1 conforme código abaixo.

$args_search = array( 
    's' => $search,
    'exact' => 1,
    'post_type' => array( 'post' )
);

Não há documentos no Codex para parâmetros ‘exatos’, mas o melhor (certamente o mais confiável) é o próprio código. Veja a linha 2200 do query.php

No meu caso eu utilizava custom post type então meu código ficou assim:

$args = array( 
	'post_type' => 'cartas', 
	'exact' => 1,
	'posts_per_page' => 1, 
	's' => $buscar );
$loop = new WP_Query( $args );

Uma limitação: se você tiver espaços no argumento de pesquisa, ele não funcionará, porque WP_Query considera o termo de pesquisa com espaços como termos de pesquisa diferentes.

Então talvez você possa usar algo semelhante a isso:

$args_search = array( 
    's' => $search,
    'post_type' => array( 'post' )
);
// se não houver espaços na pesquisa, colocamos argumento exato
if ( count(explode(' ', $search)) == 1 ) $args_search['exact'] = 1;

Com isso seus resultados na busca só retornara quando for o valor exato que estiver buscando.

2

Artigos relacionados & Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *