추가 쿼리가있는 검색 결과를위한 예쁜 영구 링크


10

추가 쿼리 var가 포함 된 검색 URL을 사용 wp_redirect하여 template_redirect후크를 사용하여 예쁜 영구 링크로 다시 작성하는 방법을 알고 싶습니다 .

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 플러그인 과 함께 select 드롭 다운을 사용하여 방문자가 특정 게시물 유형으로 검색 범위를 좁힐 수 있습니다. 이것은 post_type질의 var를 추가합니다 ( 예 :) http://example.com?s=africa&post_type=features. 이 같은 URL을 갖기를 원합니다 http://example.com/search/africa/section/features.

Nice Search 코드는 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를 모두 멋진 영구 링크로 유지할 수있는 방법이 있습니까?

감사합니다 사이먼

답변:


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 );
}

규칙을 확인하려면 내 Rewrite 분석기 플러그인을 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.