Me gustaría limitar la búsqueda a los caracteres utilizados en el idioma inglés + números. La razón es que, al observar las consultas más lentas en el registro de mysql, la mayoría provino de búsquedas en caracteres árabes, rusos y chinos, por lo que me gustaría omitirlas y mostrar un mensaje de error.
9
Respuestas:
Esta solución filtra las cadenas de búsqueda aplicando una expresión regular que solo coincide con los caracteres de los scripts Common y Latin Unicode.
Relacionar caracteres latinos con expresiones regulares
Simplemente me voló la cabeza en Stack Overflow . Como resultado, las expresiones regulares tienen un mecanismo para unir categorías Unicode completas, incluidos valores para especificar "scripts" Unicode completos , cada uno correspondiente a grupos de caracteres utilizados en diferentes sistemas de escritura.
Esto se realiza mediante el uso de
\p
metacaracteres seguido de un identificador de categoría Unicode entre llaves, por lo que[\p{Common}\p{Latin}]
coincide con un solo carácter en los guiones latinos o comunes , esto incluye signos de puntuación, números y símbolos misceláneos.Como señala @Paul 'Sparrow Hawk' Biron , el
u
indicador del modificador de patrón debe establecerse al final de la expresión regular para que las funciones PCRE de PHP traten la cadena de asunto comoUTF-8
codificada Unicode.Todos juntos entonces, el patrón
coincidirá con una cadena completa compuesta por uno o más caracteres en los scripts de Unicode latino y común.
Filtrando la cadena de búsqueda
Un buen lugar para interceptar una cadena de búsqueda es la
pre_get_posts
acción, ya que se dispara inmediatamente antes de que WordPress ejecute la consulta. Con más cuidado , esto también podría lograrse utilizando unrequest
filtro .Responder a búsquedas no permitidas
Una vez que se ha determinado que una cadena de búsqueda contiene caracteres no latinos, puede usarla
WP_Query::set()
para modificar la consulta cambiando sus nombres de consulta , lo que afecta la consulta SQL que WordPress posteriormente compone y ejecuta.Las variables de consulta más relevantes son probablemente las siguientes:
s
es la variable de consulta correspondiente a una cadena de búsqueda. Si se configura comonull
una cadena vacía (''
), WordPress ya no considerará la consulta como una búsqueda, a menudo esto da como resultado una plantilla de archivo que muestra todas las publicaciones o la página principal del sitio, dependiendo de los valores del otro consulta vars.' '
Sin embargo, si lo configura en un solo espacio ( ), WordPress lo reconocerá como una búsqueda y, por lo tanto, intentará mostrar lasearch.php
plantilla.page_id
podría usarse para dirigir al usuario a una página específica de su elección.post__in
puede restringir la consulta a una selección específica de publicaciones. Al configurarlo en una matriz con una ID de publicación imposible, puede servir como medida para garantizar que la consulta no devuelva absolutamente nada .Lo anterior en mente, puede hacer lo siguiente para responder a una búsqueda incorrecta cargando la
search.php
plantilla sin resultados:Mostrar un error
La forma en que realmente muestra el mensaje de error depende en gran medida de su aplicación y de las capacidades de su tema; hay muchas maneras de hacerlo. Si su tema
get_search_form()
aparece en su plantilla de búsqueda, la solución más fácil es probablemente usar un enlace depre_get_search_form
acción para generar su error inmediatamente arriba del formulario de búsqueda:Algunas otras posibilidades para mostrar un mensaje de error incluyen:
wp_enqueue_script
gancho con un valor$priority
mayor que el que pone en cola ese JavaScript, y se usawp_localize_script()
para configurar esa variable para incluir su mensaje de error.wp_redirect()
para enviar al usuario a la URL de su elección (este método requiere una carga de página adicional).s
variable de consulta en''
lugar de' '
y usepage_id
en lugar depost__in
para devolver una página de su elección.loop_start
gancho para inyectar unWP_Post
objeto falso que contenga su error en los resultados de la consulta; este es definitivamente un truco feo y puede no verse bien con su tema en particular, pero tiene el efecto secundario potencialmente deseable de suprimir el mensaje "Sin resultados".template_include
gancho de filtro para intercambiar la plantilla de búsqueda con una personalizada en su tema o complemento que muestre su error.Sin examinar el tema en cuestión, es difícil determinar qué ruta debe tomar.
fuente
Haría esto poniendo una función de validación en PHP para probar la entrada contra una expresión regular como
^[a-zA-Z0-9,.!?' ]*
Entonces se vería así:
El RexEx utilicé para todos los caracteres
A-Z
,a-z
,0-9
, así como,
,.
,!
,?
,'
,"
, y(espacio).
fuente
EDITAR: no se recomienda esta solución
Una manera de evitar búsquedas usando alfabetos no latinos es usar la
mb_detect_encoding()
función de PHP para ver si la cadena de búsqueda se ajusta a una de una selección personalizada de codificaciones de caracteres. Un buen lugar para hacerlo es lapre_get_posts
acción , ya que se dispara justo antes de que se ejecute la consulta.Lo que realmente hace después de haber determinado que una búsqueda está utilizando una codificación no válida es realmente específico de la aplicación. Aquí configuré la consulta de búsqueda en un solo espacio para garantizar que WordPress todavía interprete la consulta como una búsqueda y, por lo tanto, todavía cargue la
search.php
plantilla (y no dirija al usuario a la página principal, como sucede cuando la cadena de búsqueda es una cadena vacía). También tomo una precaución adicional de configurar'post__in'
una matriz con una ID de publicación imposible para asegurarme de que no se devuelva absolutamente nada .Alternativamente, puede considerar establecer la cadena de búsqueda
null
y establecerlapage_id
para dirigir al usuario a una página con su mensaje de error personalizado.Elegir codificaciones
Escribí una prueba de cobertura que compara algunas cadenas ficticias en diferentes alfabetos con todas las codificaciones predeterminadas compatibles con PHP . No es perfecto de ninguna manera (no tengo idea de cuán realistas son mis cadenas falsas, y parece ahogarse con la detección japonesa), pero es algo útil para determinar candidatos. Puedes verlo en acción aquí .
Después de investigar posibles codificaciones de caracteres marcadas por esa prueba, parece que
Windows-1252
es la elección perfecta para sus necesidades, ya que cubre el alfabeto latino y los acentos para los idiomas latinos comunes.Una selección de los
ISO-8859
conjuntos de caracteres debería ser otra opción viable, sin embargo, por razones que no puedo entender, lasmb_
funciones no parecen diferenciar entreISO-8859
los diferentes conjuntos de caracteres, a pesar de enumerarlos como codificaciones separadas.Para permitir algunos otros caracteres comunes, también puede considerar agregar
HTML-ENTITIES
.fuente
ISO-8859
codificaciones .Como traté de explicarle a @MichaelRogers cuando publicó una pregunta similar hace varios días, conocer el conjunto de caracteres (o script) utilizado en una cadena NO es suficiente para detectar el idioma de esa cadena.
Por lo tanto, mientras que el método detallado por @bosco se retire Rusa, etc cuerdas (con las correcciones 2 abajo), será NO limitar las búsquedas a Inglés.
Para ver esto, intente:
[ nota: las 2 correcciones mencionadas anteriormente a lo que @bosco proporcionó son:
/u
modificador (requerido para tratar el patrón y el sujeto como codificado UTF-8, vea PHP: Modificadores de patrón de expresiones regulares ]que producirá:
[ nota: hablo inglés, francés y algo de alemán (y un poco de Lorem ipsum :-), pero confié en Google Translate para el árabe, ruso y chino]
Como puede ver, confiar en buscar el script latino NO asegurará que tenga inglés.
Hay varios subprocesos en StackOverflow (por ejemplo, Detect language from string in PHP ) que proporcionan más información sobre el tema.
fuente