web-dev-qa-db-ja.com

追加のクエリ変数による検索結果へのかなりのパーマリンク

wp_redirecttemplate_redirectフックを使用して、余分なクエリvarも含む検索URLをかなりパーマリンクに書き換えることができる方法を知りたいです。

http://example.com?s=africahttp://example.com/search/africaに変更するのに問題なく動作する Nice Search /プラグインからコードを取得しました。

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のようなURLが欲しいのですが。

ナイスサーチコードは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であると考えています。

検索語とクエリ変数をすべてニースパーマリンクに保持する方法はありますか?

ありがとうサイモン

10

検索書き換え規則を変更するには、search_rewrite_rulesフィルタにフックします。自分で投稿の種類に一致する追加の書き換え規則を追加するか、既定の "検索書き換え構造"を変更して投稿の種類も含めてから規則を再生成することができます(4つの規則があります。フィード用に2つ) 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 );
}

ルールを確認するには、 my Rewrite analyzer plugin を使用します。

7
Jan Fabry