由于解码不正确,Wordpress搜索在特殊字符上失败

时间:2016-08-11 06:39:57

标签: php string wordpress special-characters decode

我正在实施Wordpress搜索功能。 当我搜索文本“分部”(这是其中一个帖子中的文字)时, 它返回“未找到结果”

现在进一步调查,我检查了核心文件: wp-includes / query.php => function parse_search()

发现$ term被接收编码为: Division \ 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);

没用。 有没有可以提供帮助的插件/钩子/方法?

示例提供:

简单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编码作为我的charset afaik。有什么问题,我为什么要搜索:copper(i)/(ii)在网址中返回?s=copper%2528i%2529%252F%2528ii%2529?我应该找到2个结果,但我找到了0个结果。为什么呢?

如果我将网址更改为:?s=copper(i)/(ii)我会看到我的2个结果。但为什么我不能得到我的结果,和/或网址是这样的?我可以诚实地关注url结构是什么,但我确实希望在我输入copper(i)/(ii)到搜索表单时找到我的2个结果,但目前它没有找到任何结果。

1 个答案:

答案 0 :(得分:9)

好的,所以你必须解码搜索查询,这就是我如何使它工作,现在就像一个魅力!现在返回搜索结果,但保持编码的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的一部分来说,这对于正常工作是多么痛苦。