tildes reconoce extraños caracteres php string wordpress special-characters decode

php - reconoce - La búsqueda de Wordpress falló en los caracteres especiales debido a una descodificación incorrecta



wordpress caracteres extraños (1)

Estoy implementando la funcionalidad de búsqueda de Wordpress. Cuando busco el texto " Division''s " (que es un texto en una de las publicaciones), devuelve "No se encontraron resultados"

Ahora para investigar más a fondo, verifiqué el archivo core: wp-includes / query.php => function parse_search ()

Y descubrió que el término $ se recibió codificado como: División / xe2 / x80 / x99s

Ahora este término no se decodifica correctamente. Y la declaración SQL final formada es:
(((test_posts.post_title LIKE ''% Division / xe2 / x80 / x99s%'') O (test_posts.post_content LIKE ''% Division / xe2 / x80 / x99s%'')))

Por lo tanto, quiero decodificar los caracteres especiales para buscar con éxito los términos con caracteres especiales también.

Los métodos de decodificación como:

  • $ string = urldecode ($ string);
  • $ string = html_entity_decode ($ string);
  • $ string = rawurldecode ($ string);
  • $ string = base64_decode ($ string);
  • $ string = utf8_decode ($ cadena);

No funcionó. ¿Hay algún plugin / hook / method que pueda ayudar?

Ejemplo proporcionado:

Simple archivo searchform.php aquí:

if (!defined(''ABSPATH'')) exit(0); global $wp_query; $search_query = get_search_query(); $error = get_query_var(''error''); ?> <form role="search" method="get" class="search-form form-inline" action="<?php echo esc_url(home_url(''/'')); ?>"> <input id="mod-search-searchword" type="search" size="30" class="inputbox search-query search-field" placeholder="search products, content" value="<?php echo !empty($search_query) && empty($error) ? $search_query : ''''; ?>" name="s" title="Search for:" /> <input type="submit" class="button btn btn-primary" value="Search" /> </form>

Ahora bien, si escribo caracteres como () se codifican en url, y esa misma cadena urlencoded no se rellena en el campo de texto con los porcentajes, etc.

Si hago esto:

$search_query = !empty($search_query) ? trim(sanitize_text_field(urldecode($search_query))) : '''';

Todavía hay un problema, pero ya no es un problema con la entrada de texto que no tiene la cadena correcta, el problema es que ahora no hay resultados de búsqueda.

¿Cómo solucionar este problema con Wordpress Search?

wp-config.php contiene lo siguiente:

define(''DB_CHARSET'', ''utf8''); define(''DB_COLLATE'', '''');

header.php contiene lo siguiente:

<!DOCTYPE html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=3.0, user-scalable=yes"/> <meta name="HandheldFriendly" content="true" /> <meta name="apple-mobile-web-app-capable" content="YES" /> <link rel="shortcut icon" href="<?php echo get_stylesheet_directory_uri(); ?>/favicon.ico" type="image/vnd.microsoft.icon" /> <title><?php wp_title('' - '', true, ''right''); ?></title> <?php wp_head(); ?> </head>

Tengo lo siguiente en mi archivo functions.php:

function livchem_searchfilter($query) { global $search_query; if ($query->is_search && !is_admin()) { // check if length of query > 3 but < 200 $search_query = trim(get_search_query()); $search_length = strlen($search_query); if ($search_length < 3 || $search_length > 200) { $query->set(''error'', ''Search term must be a minimum of 3 characters and a maximum of 200 characters.''); return $query; } else { $query->set(''post_type'', array(''post'', ''page'', ''product'')); $query->set(''posts_per_page'', 20); } } return $query; } add_filter(''pre_get_posts'',''livchem_searchfilter'');

Entonces, tengo codificación UTF-8 como mi juego de caracteres afaik. ¿Cuál es el problema? ¿Por qué mi búsqueda de: copper(i)/(ii) vuelve ?s=copper%2528i%2529%252F%2528ii%2529 en la URL? Y debería tener 2 resultados encontrados para esto, pero obtengo 0 resultados encontrados. ¿Por qué?

Y si cambio la URL a esto ?s=copper(i)/(ii) Veo mis 2 resultados. ¿Pero por qué no puedo obtener mis resultados, y / o la url es así? Honestamente, me importa poco la estructura de la url, pero quiero que encuentren mis 2 resultados cuando escribo: copper(i)/(ii) en el formulario de búsqueda, pero actualmente no se encuentran resultados.


Ok, entonces tienes que decodificar la consulta de búsqueda y así es como lo tengo funcionando y funciona como un encanto ahora! Esto ahora devuelve los resultados de la búsqueda, pero mantiene la URL codificada para que no haya problemas en ningún lado.

function livchem_search_filter($s) { return urldecode($s); } add_filter(''get_search_query'', ''livchem_search_filter''); add_filter(''the_search_query'', ''livchem_search_filter''); function livchem_query_vars_search_filter($query) { if ($query->is_search && !is_admin()) { $query->query_vars[''s''] = urldecode($query->query_vars[''s'']); } return $query; } add_action(''parse_query'', ''livchem_query_vars_search_filter'');

Como ventaja, esto también funciona bien para las búsquedas relacionadas con rutas, por lo que si agregué lo siguiente a mi .htaccess:

RewriteCond %{QUERY_STRING} s=(.*) RewriteRule ^$ /search/%1? [R,L]

Las búsquedas se estructurarían así: /search/searchterm

Y la consulta con caracteres especiales también funciona ahora. qué dolor en el cuello fue para que funcione correctamente, para algo que es parte del CMS.