如何将搜索$_GET参数传递给新的自定义搜索页面?

时间:2013-11-26 作者:Glorious Kale

到目前为止,在我的wordpress安装中,我有一个完整的wordpress搜索页面,可以通过以下方式调用:

/?s=mysearchstring

这会在wordpress页面中搜索包含“mysearchstring“”字符串。

所以我创建了一个新页面“自定义搜索”(/custom-search/) 并分配了一个模板文件custom-search.php (代码与相同search.php).

如何将关键字参数添加到此中?

/custom-search?s=mysearchstring 不太有效,它只显示404页未找到,而/custom-search/ 仅显示搜索页面作为结果。

custom-search.php code:

<?php
/*
Template Name: Custom Search
*/
//Post ID
    global $wp_query;
    $content_array = $wp_query->get_queried_object();
    if(isset($content_array->ID)){
        $post_id = $content_array->ID;
    }
    else $post_id=0;

$template_uri = get_template_directory_uri();

//Search
    $allsearch = &new WP_Query("s=$s&showposts=-1");
    $count = $allsearch->post_count;
    wp_reset_query();
    $hits = $count == 1 ? $count." ".__("hit for","goodweb") : $count." ".__("hits for","goodweb");

get_header();
 ?>
以及html列表。

如何将参数搜索查询传递到此页面?

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

问题是\'s\' param是WordPress的标准查询参数,当您使用url时/custom-search?s=mysearchstring 您正在告诉WordPress检索页面\'custom-search\' 包含字符串的\'mysearchstring\' 这带来了404。

你有2 可能性:

使用另一个查询字符串名称,例如/custom-search?cs=mysearchstring 然后在页面模板内使用变量$_GET[\'cs\'] 而不是变量$_GET[\'s\']/?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只运行一个查询

SO网友:s_ha_dum

A.GET 字符串的工作方式与任何其他PHP应用程序一样,但不能使用query parameter that WordPress uses. 这就是问题所在。WordPress已使用s. 使用其他东西,如“mys”。

老实说,你的自定义搜索看起来很像普通搜索,所以我真的不明白你为什么要这样做。

结束

相关推荐

WP_User_Query not searching

我目前有以下代码,在user\\u business表中有一个名为“Clark Farm”的用户。下面的代码不返回任何内容。如果删除搜索词,则会列出所有用户。我正在试图确定为什么搜索不起作用。。<?php /** * @package WordPress * @subpackage themename */ get_header(); ?> <?php $url = $_SERVER[\'REQUEST_U