Essa solução filtra as cadeias de pesquisa aplicando uma expressão regular que corresponde apenas aos caracteres dos scripts Common e Latin Unicode.
Correspondência de caracteres latinos com expressões regulares
Eu acabei de pensar no Stack Overflow . Como se vê, expressões regulares possuem um mecanismo para corresponder a categorias Unicode inteiras, incluindo valores para especificar "scripts" Unicode inteiros , cada um correspondendo a grupos de caracteres usados em diferentes sistemas de escrita.
Isso é feito usando o \p
meta-caractere seguido por um identificador de categoria Unicode entre chaves - para [\p{Common}\p{Latin}]
corresponder a um único caractere nos scripts em latim ou em comum - isso inclui pontuação, numerais e símbolos diversos.
Como o @Paul 'Sparrow Hawk' Biron aponta , o u
sinalizador modificador de padrão deve ser definido no final da expressão regular para que as funções PCRE do PHP tratem a sequência de assunto como UTF-8
codificada em Unicode.
Todos juntos então, o padrão
/^[\p{Latin}\p{Common}]+$/u
corresponderá a uma sequência inteira composta por um ou mais caracteres nos scripts Latin e Common Unicode.
Filtrando a cadeia de pesquisa
Um bom lugar para interceptar uma sequência de pesquisa é a pre_get_posts
ação que é acionada imediatamente antes do WordPress executar a consulta. Com mais cuidado , isso também pode ser realizado usando um request
filtro .
function wpse261038_validate_search_characters( $query ) {
// Leave admin, non-main query, and non-search queries alone
if( is_admin() || !$query->is_main_query() || !$query->is_seach() )
return;
// Check if the search string contains only Latin/Common Unicode characters
$match_result = preg_match( '/^[\p{Latin}\p{Common}]+$/u', $query->get( 's' ) );
// If the search string only contains Latin/Common characters, let it continue
if( 1 === $match_result )
return;
// If execution reaches this point, the search string contains non-Latin characters
//TODO: Handle non-Latin search strings
//TODO: Set up logic to display error message
}
add_action( 'pre_get_posts', 'wpse261038_validate_search_characters' );
Respondendo a pesquisas não permitidas
Depois de determinar que uma string de pesquisa contém caracteres não latinos, você pode usá-la WP_Query::set()
para modificar a consulta, alterando o nome de vars de consulta - afetando a consulta SQL que o WordPress posteriormente compõe e executa.
As variáveis de consulta mais relevantes são provavelmente as seguintes:
s
é a variável de consulta correspondente a uma cadeia de pesquisa. Configurá-lo como null
uma string vazia ( ''
) fará com que o WordPress não trate mais a consulta como uma pesquisa - muitas vezes isso resulta em um modelo de arquivo que exibe todas as postagens ou a página inicial do site, dependendo dos valores dos outros vars de consulta. A configuração para um único espaço ( ' '
), no entanto, fará com que o WordPress o reconheça como uma pesquisa e, assim, tente exibir o search.php
modelo.
page_id
pode ser usado para direcionar o usuário para uma página específica de sua escolha.
post__in
pode restringir a consulta a uma seleção específica de postagens. Ao configurá-lo para uma matriz com um ID de postagem impossível, ele pode servir como uma medida para garantir que a consulta não retorne absolutamente nada .
Com o exposto acima, você pode fazer o seguinte para responder a uma pesquisa incorreta carregando o search.php
modelo sem resultados:
function wpse261038_validate_search_characters( $query ) {
// Leave admin, non-main query, and non-search queries alone
if( is_admin() || !$query->is_main_query() || !$query->is_seach() )
return;
// Check if the search string contains only Latin/Common Unicode characters
$match_result = preg_match( '/^[\p{Latin}\p{Common}]+$/u', $query->get( 's' ) );
// If the search string only contains Latin/Common characters, let it continue
if( 1 === $match_result )
return;
$query->set( 's', ' ' ); // Replace the non-latin search with an empty one
$query->set( 'post__in', array(0) ); // Make sure no post is ever returned
//TODO: Set up logic to display error message
}
add_action( 'pre_get_posts', 'wpse261038_validate_search_characters' );
Exibindo um erro
A maneira como você realmente exibe a mensagem de erro depende muito do seu aplicativo e das habilidades do seu tema - há várias maneiras de fazer isso. Se o seu tema chamar get_search_form()
o modelo de pesquisa, a solução mais fácil é provavelmente usar um gancho de pre_get_search_form
ação para gerar seu erro imediatamente acima do formulário de pesquisa:
function wpse261038_validate_search_characters( $query ) {
// Leave admin, non-main query, and non-search queries alone
if( is_admin() || !$query->is_main_query() || !$query->is_seach() )
return;
// Check if the search string contains only Latin/Common Unicode characters
$match_result = preg_match( '/^[\p{Latin}\p{Common}]+$/u', $query->get( 's' ) );
// If the search string only contains Latin/Common characters, let it continue
if( 1 === $match_result )
return;
$query->set( 's', ' ' ); // Replace the non-latin search with an empty one
$query->set( 'post__in', array(0) ); // Make sure no post is ever returned
add_action( 'pre_get_search_form', 'wpse261038_display_search_error' );
}
add_action( 'pre_get_posts', 'wpse261038_validate_search_characters' );
function wpse261038_display_search_error() {
echo '<div class="notice notice-error"><p>Your search could not be completed as it contains characters from non-Latin alphabets.<p></div>';
}
Algumas outras possibilidades para exibir uma mensagem de erro incluem:
- Se seu site usa JavaScript, que pode exibir mensagens "flash" ou "modal" (ou você pode adicionar essas habilidades por conta própria), adicione a lógica para exibir mensagens no carregamento da página quando uma variável específica for definida e adicione um
wp_enqueue_script
gancho com um valor $priority
maior que o que enfileira esse JavaScript e use wp_localize_script()
para definir essa variável para incluir sua mensagem de erro.
- Use
wp_redirect()
para enviar o usuário ao URL de sua escolha (esse método requer um carregamento adicional da página).
- Defina uma variável PHP ou chame um método que informe seu tema / plugin sobre o erro, de forma que ele possa ser exibido quando apropriado.
- Defina a
s
variável de consulta como em ''
vez de ' '
e use page_id
no lugar de post__in
para retornar uma página de sua escolha.
- Use um
loop_start
gancho para injetar um WP_Post
objeto falso que contenha seu erro nos resultados da consulta - esse é definitivamente um truque feio e pode não parecer adequado ao seu tema específico, mas tem o efeito colateral potencialmente desejável de suprimir a mensagem "Sem resultados".
- Use um
template_include
gancho de filtro para trocar o modelo de pesquisa por um personalizado no seu tema ou plug-in, que exibe seu erro.
Sem examinar o tema em questão, é difícil determinar qual caminho você deve seguir.