Gostaria de limitar a pesquisa a caracteres usados no idioma inglês + números. O motivo é que, olhando para as consultas mais lentas do log do mysql, as mais encontradas vêm de pesquisas em caracteres árabes, russos e chineses, então eu gostaria de ignorá-las e exibir uma mensagem de erro.
9
Respostas:
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 comoUTF-8
codificada em Unicode.Todos juntos então, o padrão
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 umrequest
filtro .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 comonull
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 osearch.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: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 depre_get_search_form
ação para gerar seu erro imediatamente acima do formulário de pesquisa:Algumas outras possibilidades para exibir uma mensagem de erro incluem:
wp_enqueue_script
gancho com um valor$priority
maior que o que enfileira esse JavaScript e usewp_localize_script()
para definir essa variável para incluir sua mensagem de erro.wp_redirect()
para enviar o usuário ao URL de sua escolha (esse método requer um carregamento adicional da página).s
variável de consulta como em''
vez de' '
e usepage_id
no lugar depost__in
para retornar uma página de sua escolha.loop_start
gancho para injetar umWP_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".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.
fonte
Você faria isso colocando uma função de validação no PHP para testar a entrada com uma expressão regular como
^[a-zA-Z0-9,.!?' ]*
Então ficaria assim:
O RexEx I utilizado para todos os caracteres
A-Z
,a-z
,0-9
, bem como,
,.
,!
,?
,'
,"
, e(espaço).
fonte
EDIT: Esta solução não é recomendada
Um meio de impedir pesquisas usando alfabetos não latinos é usar a
mb_detect_encoding()
função do PHP para verificar se a string de pesquisa está de acordo com uma de uma seleção personalizada de codificações de caracteres. Um bom lugar para fazer isso é apre_get_posts
ação , pois é acionada imediatamente antes da consulta ser executada.O que você realmente faz depois de determinar que uma pesquisa está usando uma codificação inválida é realmente específico do aplicativo. Aqui, configurei a consulta de pesquisa como um espaço único para garantir que o WordPress ainda interprete a consulta como uma pesquisa e, assim, ainda carrega o
search.php
modelo (e não direciona o usuário para a página inicial, como acontece quando a string de pesquisa é uma string vazia). Também tomo uma precaução adicional de definir'post__in'
uma matriz com um ID de postagem impossível para garantir que absolutamente nada seja retornado .Como alternativa, você pode considerar definir a sequência de pesquisa para
null
epage_id
direcionar o usuário a uma página com sua mensagem de erro personalizada.Escolhendo codificações
Eu escrevi um teste de cobertura comparando algumas seqüências fictícias em diferentes alfabetos em relação a todas as codificações padrão suportadas pelo PHP . Não é perfeito de forma alguma (não tenho idéia de quão realistas são minhas cordas fictícias e parece sufocar na detecção japonesa), mas é um pouco útil para determinar os candidatos. Você pode vê-lo em ação aqui .
Depois de pesquisar as possíveis codificações de caracteres sinalizadas por esse teste, parece que
Windows-1252
é a escolha perfeita para suas necessidades, cobrindo o alfabeto latino e os detalhes para idiomas latinos comuns.Uma seleção dos
ISO-8859
conjuntos de caracteres deve ser outra opção viável, no entanto, por razões que não consigo entender, asmb_
funções parecem não diferenciarISO-8859
os diferentes conjuntos de caracteres, apesar de serem listados como codificações separadas.Para permitir outros caracteres comuns, considere também adicionar
HTML-ENTITIES
.fonte
ISO-8859
codificações .Como tentei explicar a @MichaelRogers quando ele postou uma pergunta semelhante há alguns dias, conhecer o conjunto de caracteres (ou script) usado em uma string NÃO é suficiente para detectar o idioma dessa string.
Assim, enquanto o método detalhado por @bosco irá remover russo, etc cordas (com os 2 correções abaixo), ele irá não limitar as suas pesquisas para Inglês.
Para ver isso, tente:
[ nota: as 2 correções mencionadas acima no que o @bosco forneceu são:
/u
modificador (necessário para tratar o padrão e o assunto como codificado em UTF-8, consulte PHP: Modificadores de Padrão Regex ]que produzirá:
[ observação: falo inglês, francês e um pouco de alemão (e um pouco de Lorem ipsum :-), mas confiei no Google Translate para árabe, russo e chinês]
Como você pode ver, depender da verificação do script latino NÃO garantirá que você tenha inglês.
Há vários threads no StackOverflow (por exemplo, Detectar linguagem da string no PHP ) que fornecem mais informações sobre o assunto.
fonte