由于解码不当,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 的一部分,这对于正常工作来说是多么痛苦。
你可能还喜欢下面这些文章

wpac是一款wordpress自动配图插件,可以丰富文章内容,对提升排名有很大帮助。p style=”font-size:18px;”>你可能还喜欢下面这些文章<p>{excerpt}<

一个理想的相关文章推荐插件应该是什么样子的?wprec就是一个能够提升用户体验,提升搜索引擎排名的相关文章推荐插件!插件的后台在 WP工具箱-文章推荐,进入即可看到设置。

我们可以使用百度、360等实现站内搜索,并禁止前台使用WordPress自带的搜索功能,在当前主题的 functions.php 文件里加入以下代码即可。注:可以选择执行搜索后显示的错误页面,是跳转到404或者网站首页。

WordPress怎么增加文章排序方式?实现过程也比较简单,一个是构造链接,另外一个是使用query_posts来改变一下主循环就可以了。 $orderby, ‘order’ =>

有没有办法在 WordPress 循环代码中获取多个项目: if ($count<a href=”https://stackoverflow.com/questions/19303556/wordpress-loop-how-to-co

让WordPress一个页面显示全部分类的文章cat=’ . $cat->php echo $cat->a href=”<$cats = get_categories(array(‘include’ =>

wordpress强大的hook能够让我们去自定义路由,在使用框架的时候一般路由是写在一个配置文件中,wordpress作为一个cms系统,自然是不能这么干,实际上,wordpress路由规则是写在数据库中,自定义路由其实就是修改这个数据库的