问题是\'s\'
param是WordPress的标准查询参数,当您使用url时/custom-search?s=mysearchstring
您正在告诉WordPress检索页面\'custom-search\'
包含字符串的\'mysearchstring\'
这带来了404。
你有2 可能性:
使用另一个查询字符串名称,例如/custom-search?cs=mysearchstring
然后在页面模板内使用变量$_GET[\'cs\']
而不是变量$_GET[\'s\']
将所有搜索发送到主页url:/?s=mysearchstring
但是挂钩\'template_include\'
使用custom-search.php
而不是search.php
. 这可以在不创建“自定义搜索”页面的情况下完成
解决方案1
唯一需要做的就是使用查询字符串\'cs\'
而不是\'s\'
, 然后在模板内使用:// ...
$s = filter_input(INPUT_GET, \'cs\', FILTER_SANITIZE_STRING);
$allsearch = &new WP_Query("s=$s&showposts=-1");
// ...
删除使用模板的页面“自定义页面”"Custom Search"
: 你不需要它。如果需要,可以完全删除模板标题。将所有搜索请求发送到/?s=mysearchstring
.
现在请注意functions.php
添加
add_filter(\'template_include\', \'my_custom_search_template\');
function my_custom_search_template( $template ) {
if ( is_search() ) {
$ct = locate_template(\'custom-search.php\', false, false);
if ( $ct ) $template = $ct;
}
return $template;
}
这样,所有搜索请求都将使用custom-search.php
(如果存在)。请注意,搜索已在主查询中完成,因此如果要设置posts_per_page
to-1使用pre_get_posts
:add_action(\'pre_get_posts\', \'search_no_paging\');
function search_no_paging( $q ) {
if ( $q->is_main_query() && $q->is_search() && ! is_admin() ) {
$q->set(\'posts_per_page\', -1);
}
}
在你的custom-search.php
使用:global $wp_query;
$count = $wp_query->post_count;
$hits = $count == 1 ? $count." ".__("hit for","goodweb") : $count." ".__("hits for","goodweb");
get_header();
while( have_posts() ) { the_post();
// your loop here
}
正如您所看到的,您不需要运行自定义查询,因为主查询完成了这项工作。如果您想在搜索结果旁边显示页面内容,那么解决方案1是最佳选择,但如果您创建的页面没有内容,只是为了使用搜索结果的自定义模板,那么解决方案2更好,因为:
与主题无关:代码可以放在插件中并与任何主题一起使用,也不需要在后端创建该页面。性能更高:如果使用解决方案1,将运行两个查询,第一个查询获取页面,第二个查询获取搜索结果;使用解决方案2只运行一个查询