zee*_*tit 22 php string wordpress decode special-characters
我正在实现Wordpress搜索功能.当我搜索文本" 分区 "(这是其中一个帖子中的文本)时,它返回"未找到结果"
现在进一步调查,我检查了核心文件: wp-includes/query.php => function 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%')))
所以,我想解码特殊字符,以便成功搜索带有特殊字符的术语.
解码方法如:
不工作.有没有可以帮助的插件/钩子/方法?
示例提供:
简单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>
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入字符,就像()
他们得到urlencoded,并且相同的urlencoded字符串不会填充百分比等文本字段.
如果我这样做:
$search_query = !empty($search_query) ? trim(sanitize_text_field(urldecode($search_query))) : '';
Run Code Online (Sandbox Code Playgroud)
仍然存在问题,但是文本输入不具有正确字符串的问题不再存在,问题变得现在没有搜索结果.
如何使用Wordpress Search解决此问题?
wp-config.php包含以下内容:
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
我的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');
Run Code Online (Sandbox Code Playgroud)
所以,我确实有UTF-8编码作为我的charset afaik.有什么问题,我为什么要搜索:在URL中copper(i)/(ii)
返回?s=copper%2528i%2529%252F%2528ii%2529
?我应该找到2个结果,但我找到了0个结果.为什么?
如果我将网址更改为: ?s=copper(i)/(ii)
我看到了我的2个结果.但为什么我不能得到我的结果,和/或网址是这样的?我可以诚实地关心url结构是什么,但我确实希望在输入时找到我的2个结果: copper(i)/(ii)
进入搜索表单,但目前它没有找到任何结果.
好的,所以你必须解码搜索查询,这就是我如何工作和现在的魅力!现在返回搜索结果,但保持编码的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');
Run Code Online (Sandbox Code Playgroud)
作为一个加号,这也适用于路径相关的搜索,所以如果我将以下内容添加到我的.htaccess:
RewriteCond %{QUERY_STRING} s=(.*)
RewriteRule ^$ /search/%1? [R,L]
Run Code Online (Sandbox Code Playgroud)
搜索结构如下: /search/searchterm
现在,带有特殊字符的查询也可以使用.对于CMS的一部分而言,这对于正常工作是多么痛苦.
归档时间: |
|
查看次数: |
2750 次 |
最近记录: |