我最近实现了Sitelinks Search Box 我在搜索词和特殊字符方面有问题。
例如,如果我在WP的标准搜索框中引入了一个带重音的字符,它就被正确使用了。如果我在sitelinks搜索框中也这样做,重音字符是URL enconded,WP直接使用它,并且不会正确返回restuls(大多数情况下结果为零)。
实例正在搜索camión
从google搜索框,它重定向到https://example.com/?s=cami%25C3%25B3n
WordPress没有给出任何结果。如果我直接在WP中搜索同一个单词,我会得到正确的结果。
如果我对搜索字符串进行URL解码,似乎一切都正常。但它是安全的?我认为这是因为数据库查询稍后会转义,但不确定。
add_action( \'pre_get_posts\', function( $query ) {
if( $query->is_search() && ! is_admin() && $query->is_main_query() ) {
$query->set( \'s\', urldecode( get_search_query() ) );
}
} );
最合适的回答,由SO网友:cybmeta 整理而成
我可以确认url解码搜索查询是正确的方法。事实上,它是在WordPress core中为WP\\U查询的搜索参数执行的,但当搜索字符串来自$_GET
请求,如中所示WP_Query::parse_search()
方法,wp包括/查询。php#L2061(WP 4.2.2):
if ( empty( $_GET[\'s\'] ) && $this->is_main_query() )
$q[\'s\'] = urldecode( $q[\'s\'] );
稍后在同一方法中,搜索短语被替换。因此,Google SearchBox中的搜索字符串必须经过URL解码,并且是安全的:
add_action( \'pre_get_posts\', function( $query ) {
if( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
$query->set( \'s\', urldecode( $query->get( \'s\' ) ) );
}
} );