由于解码不当,WordPress 搜索特殊字符失败

更新于 2021年12月26日 wordpress教程

我正在实施 WordPress 搜索功能。 当我搜索文本“ Division’s ”(其中一个帖子中的文本)时,它返回“未找到结果”

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

并发现收到的 $term 编码为: Divisionxe2x80x99s

现在这个词没有被正确解码。 最终形成的 SQL 语句是:
(((test_posts.post_title LIKE ‘%Divisionxe2x80x99s%’) 或 (test_posts.post_content LIKE ‘%Divisionxe2x80x99s%’)))

所以,我想解码特殊字符以成功搜索带有特殊字符的术语。

解码方法如:

  • $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="https://stackoverflow.com/questions/38889007/wordpress-search-failed-on-special-characters-due-to-improper-decode/<?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 个结果。 为什么?

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

解决方案

好的,所以您必须对搜索查询进行解码,这就是我的工作方式,现在就像魅力一样! 现在返回搜索结果,但保留 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前台搜索功能

{$query->is_search。false;$query->query_vars。false;$query->query。//跳转到首页$query->is_404。

如挖掘找长尾词如挖掘找长尾词

利用自然语言处理工具:使用自然语言处理(NLP)工具,如谷歌的自然语言处理工具、百度指数等,可以分析和比较一些关键词的搜索量、竞争度等,从而得出一些可行的长尾词。问答平台挖掘:在问答平台上搜索和回答与你的业务相关的问题,可以发现用户疑问和需求

wordpress插件哪里下载wordpress插件哪里下载

步骤:1、进入WordPress管理后台,点击左侧的“插件”按钮,然后点击“安装插件”,进入在线安装插件页面,在搜索框中输入你想要的插件名称。3、系统会自动下载安装包-解压安装包-安装插件,待系统系统安装完成之后,点击“启用插件”就可以开始使

什么是关键字蚕食什么是关键字蚕食

关键词蚕食意味着什么关键字蚕食意味着你的网站上有很多文章在搜索引擎的同一个搜索结果中参与了排名。改善内部链接你可以通过建立一个像样的内部链接结构来帮助搜索引擎找出哪一篇文章是最重要的。

如何在WordPress文本小工具中运行PHP代码如何在WordPress文本小工具中运行PHP代码

文件:add_filter(‘widget_text’,。php_text($text)。$text;}之后,可以将一个文本小工具添加到侧边栏中,并在其中输入PHP函数代码,看看是不是可以正常运行了。

WordPress自动内链插件wpkal,网站全自动增加锚链接必备插件WordPress自动内链插件wpkal,网站全自动增加锚链接必备插件

什么是内链内链,顾名思义就是在同一网站域名下的内容页面之间的互相链接(自己网站的内容链接到自己网站的内部页面,也称之为站内链接)。自动内链工作原理简单来说,我们设定一些词表以及词表对应的链接,比如词是wordpress插件,链接是http。

wordpress可以承载多少数据wordpress可以承载多少数据

支撑几百万没问题,不过需要自己改写部分代码,去掉WordPress一些耗时大的功能。WordPress搜索功能,可以用一些开源搜索代替,或者去掉这个功能,否则一个like,数据库基本就瘫了。

wordpress网站上线之前,之后应该做的工作wordpress网站上线之前,之后应该做的工作

一个网站上线需要做许多的准备,这里就针对wordpress谈谈站点上线前后应该做的工作上线之前的工作挑选一款好的主题一款好的主题至关重要,明确做什么类型的站点,就用什么样的主题,主题一旦确定之后,就不能轻易的更改,因此一个功能完备的主题十分重