WordPress自定义模板中is_search()返回false问题求助
问题原因及解决方法
为什么is_search()返回false?
WordPress的is_search()函数判断的根本不是当前加载的模板文件,而是当前请求是否属于WP原生的搜索查询——也就是是否是通过?s=xxx参数或者/search/这类搜索路由触发的请求。
你现在的代码只是通过template_include钩子强制让特定URL加载了search.php模板,但完全没有改变WP对当前请求的类型识别。当用户访问mywebsite.com/type/blablabla时,WP会把这个请求识别为自定义分类(或自定义路由)的存档请求,此时is_tax()或is_archive()会返回true,但is_search()依然是false,因为这本质上不是搜索请求。
怎么让is_search()返回true?
如果需要在加载search.php的同时让is_search()生效,得修改WP的查询对象,把它标记为搜索类型。可以用pre_get_posts钩子实现:
add_action('pre_get_posts', 'mark_custom_request_as_search'); function mark_custom_request_as_search($query) { // 只针对前台主查询生效 if (!is_admin() && $query->is_main_query()) { // 匹配你的触发条件 if (isset($_GET['type']) || isset($_GET['teacher']) || is_tax('type')) { $query->is_search = true; // 可选:如果需要让搜索逻辑生效,可以设置s参数(根据你的需求调整) // $query->set('s', get_query_var('term')); } } }
这段代码会在WP处理查询前,把符合条件的请求标记为搜索类型,这样is_search()就会返回true了。注意要根据你实际的路由规则调整判断条件(比如is_tax('type')是针对自定义分类type的情况,如果你的/type/blablabla是其他路由,要改成对应的判断)。
内容的提问来源于stack exchange,提问作者Abbas Haghayeghi
相关产品推荐
相关产品推荐

