wp_redirect
とtemplate_redirect
フックを使用して、余分なクエリvarも含む検索URLをかなりパーマリンクに書き換えることができる方法を知りたいです。
http://example.com?s=africa
をhttp://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
であると考えています。
検索語とクエリ変数をすべてニースパーマリンクに保持する方法はありますか?
ありがとうサイモン
検索書き換え規則を変更するには、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 を使用します。