问题描述

我想知道如何使用 wp_redirecttemplate_redirect 钩子重写一个包含一个额外的查询 var 的搜索 URL 到一个漂亮的永久链接。

我已经从 Nice Search 插件的代码,工作正常,将 http://example.com?s=africa 更改为 http://example.com/search/africa

add_action( 'template_redirect', 'my_rewrite' ) );

function my_rewrite() {

        if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
            exit();
        }

    }

但是我正在使用一个选择下拉列表与 Relevanssi 插件相结合,以便访问者将搜索范围缩小到特定的帖子类型。这增加了一个 post_type 查询 var,例如 http://example.com?s=africa&post_type=features 。我想这样有一个像 http://example.com/search/africa/section/features 的 URL 。

尼斯搜索代码导致 post_type 查询 var 丢失。所以我尝试了以下代码:

function my_rewrite() {

    if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
        if ( isset( $_GET['post_type'] ) and '' !== $_GET['post_type'] ) {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) . '/section/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 'post_type' ) ) ) );
        } else {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
        }
        exit();
    }

}

但 WordPress 现在认为搜索项是 africa/section/features

有没有办法我可以保持搜索词和查询 var 全部在一个很好的永久链接?

谢谢西蒙

最佳解决方案

要修改搜索重写规则,您可以挂接到 search_rewrite_rules 过滤器。您可以自己添加匹配帖子类型的额外重写规则,也可以将默认的 「搜索重写结构」 更改为包含帖子类型,然后是 re-generate 规则 (有四个规则:一个标准,一个是分页和两个为饲料) 。因为 WP_Rewrite::generate_rewrite_rules() generates rules at every “directory level”,您将获得/search/[keyword]/section/[post_type]//search/[keyword]/section//search/[keyword]/的规则。你不需要中间的规则,但不要伤害它。

add_filter( 'search_rewrite_rules', 'wpse15418_search_rewrite_rules' );
function wpse15418_search_rewrite_rules( $search_rewrite_rules )
{
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag( '%post_type%', '([^/]+)', 'post_type=' );
    $search_structure = $wp_rewrite->get_search_permastruct();
    return $wp_rewrite->generate_rewrite_rules( $search_structure . '/section/%post_type%', EP_SEARCH );
}

要检查规则,请使用 my Rewrite analyzer plugin

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。