Поиск в Wordpress не удался по специальным символам из-за неправильного декодирования

Я реализую функцию поиска Wordpress. Когда я ищу текст " Отдел" (который является текстом в одном из сообщений) Он возвращает "Результаты не найдены"

Теперь, чтобы продолжить исследование, я проверил основной файл: wp-includes/query.php = > function parse_search()

И обнаружил, что $term получен закодирован как: Отдел \xe2\x80\x99s

Теперь этот термин неправильно декодируется. И сформированный окончательный оператор SQL:
(((test_posts.post_title LIKE '% Division\xe2\x80\x99s%') ИЛИ (test_posts.post_content LIKE '% Division\xe2\x80\x99s%')))

Итак, я хочу декодировать специальные символы для успешного поиска терминов со специальными символами.

Методы декодирования, такие как:

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

Не работает. Есть ли какой-либо способ подключения /hook/method, который может помочь?

Пример:

Простой searchform.php файл здесь:

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>

Теперь, если я ввожу символы типа (), они получают urlencoded, и эта же строка urlencoded не заполняется в текстовое поле с процентами и т.д.

Если я это сделаю:

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

По-прежнему существует проблема, но уже не проблема с вводом текста, не имеющая правильной строки, проблема в том, что результатов поиска нет.

Как исправить эту проблему в Wordpress Search?

wp-config.php содержит следующее:

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

header.php содержит следующее:

<!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>

В моем файле 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');

Итак, у меня есть кодировка UTF-8 в качестве моей кодировки afaik. В чем проблема, почему мой поиск: copper(i)/(ii) возврат ?s=copper%2528i%2529%252F%2528ii%2529 в URL-адрес? И у меня должно быть 2 результата для этого, но я получаю 0 найденных результатов. Почему?

И если я изменю url на это: ?s=copper(i)/(ii) Я вижу свои 2 результата. Но почему я не могу получить свои результаты и/или URL-адрес, чтобы быть таким? Я мог бы честно позаботиться о структуре url, но я хочу, чтобы мои 2 результата были найдены, когда я ввожу: copper(i)/(ii) в форму поиска, но в настоящее время он не находит никаких результатов.

Ответы

Ответ 1

Хорошо, так что вам нужно декодировать поисковый запрос, и вот как я работаю и работаю как шарм! Это теперь возвращает результаты поиска, но сохраняет URL-адрес, поэтому никаких проблем здесь нет.

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');

В качестве плюса это также хорошо работает для поиска по пути, поэтому, если я добавил следующее в мой .htaccess:

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

Поиск будет структурирован так: /search/searchterm

И запрос со специальными символами также теперь работает. какая боль в шее была для того, чтобы нормально работать, для чего-то, что является частью CMS.