带有额外查询变量的搜索结果相当固定


10

我想知道如何使用wp_redirecttemplate_redirect钩子将搜索URL重写为一个漂亮的永久链接,其中还包含一个额外的查询变量。

我已经从Nice Search插件中获取了代码,可以很好地将其更改http://example.com?s=africahttp://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查询变量,例如http://example.com?s=africa&post_type=features。我希望它有一个类似的网址http://example.com/search/africa/section/features

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

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都保持良好的永久链接?

谢谢西蒙

Answers:


7

要修改搜索重写规则,您可以插入search_rewrite_rules过滤器。您可以自己添加与帖子类型匹配的额外重写规则,也可以更改默认的“搜索重写结构”以包含帖子类型,然后重新生成规则(有四个规则:一个标准,一个带有分页的规则和两个供稿)。因为WP_Rewrite::generate_rewrite_rules() 在每一个“目录级别”生成规则,你会得到的规则/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 );
}

要检查规则,请使用我的重写分析器插件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.