Custom URL going to 404

时间:2016-09-26 作者:dmgig

我有一个非常好用的东西——一个带有自定义url的搜索页面。除了添加404外,它工作正常。php页面到我的主题。然后是404s页。如果我把它取下来,它又开始工作了。

有没有办法检查这个url的404并“取消”它?我试过,通过检查$GLOBALS[\'wp_query\']->is_404 = false; 但那没用。我可以将我的函数放入在404检查发生之前执行的操作中吗?我尝试过用这个slug创建一篇帖子,但很明显,这会把我带到那个页面,而不是我的自定义页面。

以下是我创建自定义url时使用的代码:

add_action( \'parse_request\', \'allow_blank_search\');
function allow_blank_search(){
  $path = $_SERVER[\'REQUEST_URI\'];
  if(substr($path, 0, 16) == \'/catalog-of-work\'){
    $_GET[\'s\'] = \'\';
    $GLOBALS[\'wp_query\']->is_search = true;
  }
  $GLOBALS[\'wp_rewrite\']->search_base = \'catalog-of-work\';  
}

function search_url_rewrite_rule() {
    if (!empty($_GET[\'s\'])) {
        wp_redirect(home_url("/catalog-of-work/") . urlencode(get_query_var(\'s\')));
        exit();
    }   
}
add_action(\'parse_request\', \'search_url_rewrite_rule\');

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

提前重定向

首先,你的重定向函数应该提前挂接:你不依赖那里的查询变量,所以你可以使用init 挂钩:

function search_redirect() {
    if (!empty($_GET[\'s\'])) {
       $home = trailingslashit(home_url(\'catalog-of-work\'));
       wp_safe_redirect($home.urlencode(get_query_var(\'s\')));
       exit();
    }   
}

add_action(\'init\', \'search_redirect\');
原因是这将更早地重定向请求,节省大量处理。

正确设置查询变量现在,您需要告诉WordPress当URL/catalog-of-work 被访问时,必须考虑搜索请求。

function custom_search_query_var($do, $wp) {
    $path = trim(parse_url(esc_url_raw(add_query_arg([])), PHP_URL_PATH), \'/\');
    $home_path = trim(parse_url(esc_url_raw(home_url()), PHP_URL_PATH), \'/\');
    $home_path and $path = trim(substr($path, strlen($home_path)), \'/\');
    if (strpos($path, \'catalog-of-work\') === 0) {
        $wp->query_vars[\'s\'] = trim(substr($path, 15), \'/\');
        $do = false;
    }

    return $do;
}

add_action(\'do_parse_request\', \'custom_search_query_var\', 10, 2);
在上面的代码中需要注意以下几点:

我用过do_parse_request 钩子代替parse_request. 这允许我在URL/catalog-of-work 已访问。由于处理查询变量的过程可能很慢,因此这可以提高页面性能add_query_arg 而不是直接访问$_SERVER. 这更好,因为该函数处理一些边缘情况example.com/wp 而不是example.com. 由于主页URL可以很容易地更改,这确保了该功能更稳定,并且可以在不同的情况下工作$wp->query_vars 大堆$wp 是的当前实例WP 通过的类do_parse_request 钩这样做更好,原因有二:避免直接访问全局变量,将变量设置为全局变量$wp_query 在上不可靠do_parse_request (均未打开parse_request 你用过)因为挂钩以前发生过$wp_query 已处理,并且可能仍会发生一些重置,删除s 通过将查询变量设置为$wp 对象,它将注意将变量传递给$wp_query.

    • 阻止404做我描述的事情,拥有404模板不会影响任何事情,因为WordPressnot 为搜索查询设置404状态。

      但是,我的代码(就像你的代码一样,至少是你发布的代码)不会作用于模板,因此默认情况下,WordPress将加载search.php.

      您的search.php 模板(或您正在使用的模板)检查have_posts() 并在没有帖子时加载404模板(如果找到)。

      这取决于你使用的主题。

      例如,主题Twenty15包含如下内容:

      <?php if ( have_posts() ) : ?>
          // ... redacted loop code here...    
      else :
          // If no content, include the "No posts found" template.
          get_template_part( \'content\', \'none\' );
      endif;
      ?>
      
      如果您的主题包含类似的内容,则可以在没有帖子的情况下加载404模板,这在搜索查询为空时发生。

      如果这是一个问题,你应该编辑你的搜索模板(或者如果主题是第三方或核心主题,你应该创建一个child theme) 让搜索模板根据您的需要处理没有帖子的情况。

SO网友:cjbj

我认为你在寻找一个错误的解决方案。我不会试图阻止在404模板上搜索结果为零的搜索,我会尝试在那里捕获它。换句话说,在404模板中包括一个测试,如果搜索失败,如果是重定向。像这样:

if (!empty($_GET[\'s\']))
  { search_url_rewrite_rule();}
else
  { normal 404 }

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &