add_rewrite_rule 이해


11

나는 얻을 것을 시도하고 add_rewrite_ruleURL에서 PARAM을 추출하고, 요청을 통해 전달하기 위해 노력. 이것에 관한 많은 게시물을 보았지만 제대로 작동하지 않는 것 같습니다.

URL이 특정 문자열로 시작하면 URL에서 URL을 제거하고 쿼리 매개 변수로 전달하고 싶습니다.

요청 URL 예 :

http://domain.com/foo/my_page

이것은

http://domain.com/my_page?param=foo

'foo'가 없으면 정상적인 요청으로 진행해야합니다. 이 논리는 내 사이트의 모든 페이지 URL 또는 사용자 정의 게시물 유형 URL (기본적으로 foo / *)에 적용되어야합니다. URL에 'foo'가 있으면 그것을 제거하고 Wordpress로 전달하여 정상적인 것으로 통과시키는 것으로 생각합니다.

이미 허용 된 query_vars로 'param'이 있습니다.

전체적으로 다음을 위해 작동해야합니다.

  • / foo / my_page (페이지)
  • / foo / my_folder / my_page (하위 페이지)
  • / foo / example_type (맞춤 게시 아카이브)
  • / foo / example_type / example_post (맞춤 게시물 단일)

page게시물 유형이나 페이지가 아니라 게시물, 카테고리, 태그 등을 의미하는 URL이 있습니까? 계층 구조의 부모 / 자식 페이지는 어떻습니까?
Milo

@Milo 나는 당신을 위해 이것을 명확히했습니다. 페이지 및 맞춤 게시물 유형 (보관 및 단일 페이지) 만 사용하고 있습니다.
Louis W

답변:


8

귀하의 예에 맞는 기본 규칙 :

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

이것은 뒤에 오는 foo/것을 가져 와서 pagename쿼리에 대해 설정 한 다음 param정적 값 을 가져옵니다 foo. 다른 URL 패턴이 필요한 경우 고유 한 패턴마다 추가 규칙이 필요합니다. 다시 쓰기 규칙 내에서 설정할 수있는 다양한 쿼리 변수에 대해서는 WP_Query문서 를 참조하십시오 . 새 규칙을 추가 한 후 다시 쓰기 규칙을 플러시하는 것을 잊지 마십시오. 이는 Permalinks 설정 페이지를 방문하여 수행 할 수 있습니다.

이제 예제 URL을 방문하십시오.

http://domain.com/foo/my_page

올바른 페이지가로드되지만 방문과 정확히 동일하게 작동하지는 않습니다.

http://domain.com/my_page?param=foo

내부 재 작성을 사용할 때는 수퍼 글로벌이 아닌 쿼리 오브젝트 param내에 설정 되기 때문 입니다. 에서 값을 찾는 코드를 사용해야하는 경우 해당 값을 설정하려면 추가 단계가 필요합니다.$wp_query$_GET$_GET

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

고려해야 할 또 다른 방법은 끝점을 사용하는 것이므로 /foo/접두사가 아닌 URL 끝에 있습니다. 이것의 장점은 API가 add_rewrite_endpoint페이지 매김 활성화를 포함하여 필요한 모든 규칙을 간단하게 추가 할 수 있다는 것입니다.


설명을 주셔서 감사합니다. 닫히고 페이지에서는 작동하지만 맞춤 게시물 보관 파일 및 단일 URL에 대해 404 오류가 발생합니다.
Louis W

글쎄, 내가 말했듯이 각 패턴과 일치하는 규칙을 추가해야합니다. 설정에서 해당 URL이 어떻게 보이는지 모르겠습니다.
Milo

아카이브 및 단일 페이지가있는 'projects'라는 사용자 정의 페이지 유형이 있습니다. 그에 대한 예를 들어 주시면 나머지는 모두 만들 수 있습니다.
Louis W

또한 하위 페이지에서는 작동하지 않는 것 같습니다.
Louis W

1
규칙이 필요한 각 URL 패턴의 예를 추가하려면 질문을 편집하십시오. 나는 나의 대답이 받아 들여지는 것에 대해 정말로 걱정하지 않는다. 때때로 나는 사람들이 시작할 질문을함으로써 그들 자신의 질문에 대답하도록 속일 수있다.
Milo

6

좋아, 나는 세 가지 유형의 요청 모두에 대한 실무 예제를 얻었다. 그것들을 작동시키기 위해서는 많은 실험과 혼란이 필요했습니다. Milo는 사람들이 자신의 질문에 대답하도록 방해하는 데 능숙하다고 생각합니다.

수많은 변경과 영구 링크를 새로 고친 후 add_rewrite_url 외부의 URL을 알아내는 것이 훨씬 쉽다는 것을 깨달았습니다. 일단 작동하면 다시 쓰기를 정의하십시오. 예 index.php?param=foo&post_type=example_type입니다.

또 다른 명백한 점이지만 여기에 추가하면 다른 사람에게 도움이 될 수 있습니다. 페이지 / 서브 페이지 와일드 카드 규칙을 정의하기 전에 사용자 정의 게시 유형 add_rewrite_rule 규칙을 정의해야합니다. 나는 그 시간에 꽤 많은 시간을 낭비했고 그것이 규칙이 작동하지 않는 이유를 이해하지 못하게하는 주요 원인이라고 생각합니다.

여기 내 모든 요구에 적용되는 3 가지 규칙이 있습니다. 페이지 / 하위 페이지 규칙이 단일 규칙으로 결합되었습니다.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

또한 내가 한 것은 여러 개의 사용자 정의 게시물 유형 규칙을 추가하는 루프를 설정하는 것입니다. 페이지 / 서브 페이지 와일드 카드 규칙을 정의하기 전에 사용자 정의 게시 유형 add_rewrite_rule 규칙을 정의해야합니다.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

재 작성 분석기 더 나은 워드 프레스 페이지 / 게시물에 대한 조회하는 방법을 이해하려고 할 때 마일로가 함께 전달 매우 도움이되었다.


쇼에 늦었지만 다른 예를 위해 핑을 할 수 있습니까? add_rewrite_rule의 $ tag 매개 변수를 완전히 이해하지 못합니다. 그것이 무엇을 의미하는지 전혀 모른다. pagename = $ matches [1] '를 사용하는 예제도 이해하지 못합니다. 허 ??? domain.com/detail?id=2&it=3과 같은 URL이 있습니다. 페이지가 domain.com/detail/2-3/이 되길 원합니다. 기꺼이 하시겠습니까?
Debbie Kurth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.