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

Posted

技术标签:

【中文标题】由于解码不当,Wordpress 搜索在特殊字符上失败【英文标题】:Wordpress search failed on special characters due to improper decode 【发布时间】:2016-12-17 18:12:24 【问题描述】:

我正在实现 Wordpress 搜索功能。 当我搜索文本“Division's”(其中一篇文章中的文本)时, 它返回“未找到结果”

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

发现接收到的$term编码为:Division\xe2\x80\x99s

现在这个词没有被正确解码。最终形成的 SQL 语句是: ((((test_posts.post_title LIKE '%Division\xe2\x80\x99s%') OR (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 搜索解决此问题?

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。有什么问题,为什么我在 URL 中搜索:copper(i)/(ii) 返回?s=copper%2528i%2529%252F%2528ii%2529?我应该为此找到 2 个结果,但我找到了 0 个结果。为什么?

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

【问题讨论】:

这不是关于编码,而是关于字符集,使用utf8 我偶然发现了这一点,并且不在干净的 wordpress 安装面前。您应该在问题中添加的一些细节包括,您是使用自定义帖子类型还是据您所知这是默认帖子类型。据我所知,wordpress 只搜索帖子标题、标签和类别,而不是帖子正文(我可能错了,但我觉得我在搜索结果中遇到了类似的问题,并通过其中一个核心文件解决了这个问题) .正如@Lashane 指出的那样,如果这是一个定制的东西,UTF-8 可能是答案。 您能否提供出现在数据库中的术语?这样我们就可以将它与我们正在搜索的那个进行比较,看看它们是否相同。 wp-config.php 有以下内容:define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); 所以,我在这里使用 ut8 作为字符集。 【参考方案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 的一部分,要正常工作是多么令人头疼的事情。

【讨论】:

以上是关于由于解码不当,Wordpress 搜索在特殊字符上失败的主要内容,如果未能解决你的问题,请参考以下文章

关于wordpress IP验证不当漏洞的解决办法

DB2 错误 字符串列、主变量、常量或函数的使用不当

如何在wordpress中递归解码简码

为啥由于 java.lang.OutOfMemoryError,Spark Streaming 在字符串解码时失败?

无法解码gmail中的特殊字符 - python 3.6

德语特殊字符在 WordPress 架构中不起作用