add_rewrite_rule에 대한 도움이 필요합니다


55

해결책


업데이트 3을 사용하고 작동했습니다. 내가 오해 한 것을, 나는 재 작성 규칙이 변경 것이라고 믿었다이었다 designers/?designer=some-designer&bid=9/designers/some-designer. 그러나 그것은 물론 다른 방법입니다.


나는 약간의 연구를 해왔지만 add_rewrite_rule () 을 사용하는 방법을 얻지 못했습니다 .

이 게시물 은 내가 필요한 것과 매우 가깝지만 실제로 많은 코드가 필요합니까?

: 내 현재 링크는 이것이다
http://www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9
내가 원하는 것은 이것이다
http://www.norwegianfashion.no/designers/Batlak-og-Selvig /

  1. 어떻게 사용 add_rewrite_rule()합니까?
  2. 디자이너 ID를 전달해야합니다 (입찰). URL에 표시되지 않은 상태에서 re.write 규칙을 사용할 때 어떻게해야합니까?

업데이트 1

나는 이것이 좀 더 설명적인 것을 발견했다 . 그러나 작동하지 않습니다.

function add_rewrite_rules( $wp_rewrite ) 
{
    $new_rules = array(
        '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
        $wp_rewrite->preg_index(1).'&bid='.
        $wp_rewrite->preg_index(2)
    );
       // Always add your rules to the top, to make sure your rules have priority
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');

function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}
add_filter('query_vars', 'query_vars')

업데이트 2

Jan Fabry 가 다른 스레드에서 제안한 다른 솔루션이 있습니다. 나는 이것을 functions.php에 넣었지만 효과가 없다.

add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');

/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite ) 
{
    add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
    flush_rewrite_rules(false);
}


function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}

3 업데이트
내가 여기에 몇 가지 예를 찾을 뿐만 아니라. 그러나 이것은 작동하지 않습니다 :(

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
    return $newrules + $rules;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'designer');
    return $vars;
}

업데이트 4 나는 또한이 솔루션을 시도했지만 여전히 성공하지 못했습니다.

add_filter('search_rewrite_rules', 'designers_createRewriteRules');

function designers_createRewriteRules($rewrite) {
global $wp_rewrite;

// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');

$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');

$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);

return ( $rewrite + $keywords_rewrite );

}

업데이트 5
내 다시 쓰기 규칙이 추가되지 않은 것 같습니다. 다음 print_r($wp_rewrite)과 같은 새로운 규칙을 무시하면서 다음과 같은 새로운 규칙을 실행합니다 .

업데이트 6
Jan의 솔루션을 테스트했습니다. 그러나 URL은 변경되지 않습니다 :(

/* Initiation script for NF template
------------------------------------------------------------------------------*/   
add_action('after_setup_theme','norwegianfashion_setup');

if ( ! function_exists( 'norwegianfashion_setup' ) ):

  function norwegianfashion_setup() { 
    /* Here I do a lot of stuff */

    // SEO friendly URL for desigenrs
    add_action( 'init', 'wpa5413_init' );
    add_filter( 'query_vars', 'wpa5413_query_vars' );
  }

endif;


/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        'designers/([^/]+)/?',
        'index.php?pagename=designers&designer=$matches[1]',
        'top' );
}

function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer';
    return $query_vars;
}

나는 것이 정말 누군가가 나이 문제를 해결하는 데 도움이 할 수 있다면 그것을 주셔서 감사합니다.


이것은 당신이 여기에 요청하고있는 나는 첫 번째 질문에 대한 매우 비슷 대답을했다 . 그 이후 상황이 바뀌 었으므로 더 이상 답변이 유효하지 않습니까? URL에 디자이너 ID가 필요하지 않으면 "슬러그"를 ID로 직접 변환해야합니다. WordPress에서는이 작업을 수행 할 수 없습니다. 디자이너는 여전히 외부 객체입니까?
Jan Fabry

@ Jan Fabry 네, 게시 한 후 (잊어 버렸습니다) 것을 발견했습니다. 이제 나는 당신의 제안을 더 잘 이해합니다. 내 업데이트 된 코드를 여기에서 확인하십시오. 내 디자이너는 여전히 커스텀 DB의 항목입니다. POST insteed og GET을 사용하여 bid? 를 통과 할 수 있습니까?
Steven

링크를 복사하여 다른 사람에게 보내면 POST 요청을 사용하면 문제가 발생하지 않습니다. 슬러그를 독특하게 만들고 거기에서 데이터를 조회하는 것이 문제입니까?
Jan Fabry

@Jan Fabry : 무슨 뜻 slug인가요? `디자이너 데이터 검색은 사용 bid하는 것보다 훨씬 쉽습니다.designer
Steven

답변:


87

다시 쓰기 규칙에 대한 일부 배경

WP Rewrite 시스템은 복잡해 보이지만 실제로는 어떻게 작동하는지 이해하기 어렵지 않습니다. 예쁘지 않은 URL ( /designers/)을 예쁘지 않은 ( ) 파싱하는 데 사용됩니다 /index.php?pagename=designers. 기본 아이디어는 재 작성 규칙 목록 , 들어오는 URL과 일치 할 수있는 정규식을 가지고 있으며 대부분 index.php쿼리 변수 형태로 다른 URL로 재 작성한다는 것입니다 . 이러한 변수는 URL과 일치하는 정규식의 일부로 설정됩니다. 규칙은 위에서 아래로 평가되므로 두 규칙이 일치 할 경우 첫 번째 규칙이 "승리"됩니다.

이러한 다시 쓰기 규칙은을 호출하여 데이터베이스에 저장 flush_rewrite_rules()되지만 이러한 규칙을 생성하고 작성하는 작업은 많은 비용이 소요되므로 모든 작업을 수행해서는 안됩니다 init. 대신, 플러그인을 활성화 register_activation_hook()하거나 (을 사용하여 ) 수동으로 또는 Permalinks 설정 페이지 를 방문하여 수동으로 규칙을 변경하는 경우에만 수행합니다 ( 테마 활성화시 자동으로 수행하기 어렵 기 때문에 ). 규칙을 플러시하지 않으면 호출 add_rewrite_rule()이 효과가 없습니다. 규칙을 플러시 한 후에도 add_rewrite_rule()every 를 호출 init해도 문제가 없습니다 .

다시 쓰기 규칙을 추가하는 방법에는 여러 가지가 있으며 하나의 규칙 만 추가하려는 경우을 사용하여이 작업을 수행 할 수 있습니다 add_rewrite_rule(). 게시물, 페이지, 분류 체계에 대한 규칙이 ... 여러 규칙을 초래할 때문에,이 같은 높은 수준의 기능을 사용하여 만든 add_rewrite_tag(), add_permastruct()... 그러나 이것들은 우리가 여기 간단한 경우에 필요하지 않습니다.

일부 필터도 있으므로 generate_rewrite_rules또는 generate_rewrite_rules_array후크를 사용하여 규칙을 추가 할 수도 있습니다 . 이를 통해 전체 규칙을 매우 세부적으로 제어 할 수 있지만 규칙 add_rewrite_rule()하나만 추가하려는 경우에도 충분합니다.

현재 재 작성 규칙을 분석 할 수있는 작은 플러그인을 만들었습니다 . 물론 변경하려고 할 때 사용하는 것이 좋습니다.

URL에서 추가 정보 얻기

당신이 준 예를 바탕으로하자. Batlak og Selvig번호가 ID ( bid) 인 디자이너 브랜드가 9있습니다. URL에이 ID를 원하지 않고 이름 만 사용하십시오. 공백이나 특수 문자없이 URL 친화적 인 이름을 slug :라고 Batlak-og-Selvig합니다.

일반적으로 URL에는 페이지에 표시 할 컨텐츠를 식별하기위한 모든 정보가 포함되어야합니다. 쿠키 또는 POST 요청을 사용하여 표시하려는 실제 디자이너 ID를 저장할 수 있지만, 누군가 링크를 공유하거나, 메일, Facebook, Twitter를 통해 링크를 보내거나 전화로 크게 읽으면 링크가 끊어집니다. URL에서 숫자 ID를 사용하지 않으려면 슬러그가 고유한지 확인해야합니다. 그런 다음 먼저 슬러그를 기반으로 ID를 조회하고 이전과 같이 계속합니다.

그래서 지금 우리가 배운 것은 우리가 패턴에 대한 재 작성 규칙을 추가 할 것입니다 " /designers/다음까지 아무것도 다음에 /" , 그리고 저장 "아무것도" 에서 designer_slug쿼리 변수를. 귀하의 경우 designers에는 일반 페이지 내용으로 슬러그가있는 페이지를 사용하고 싶다고 생각 하므로 WordPress에도 알려드립니다.

add_action( 'init', 'wpa5413_init' );
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'designers/([^/]+)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=designers&designer_slug=$matches[1]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

남은 것은 워드 프레스에 designer_slug쿼리 변수를 유지하도록 지시 하는 것이므로 나중에 액세스 할 수 있습니다. WordPress는 허용 된 쿼리 변수의 화이트리스트를 사용하여 사람들이 URL을 통해 게시물 쿼리의 모든 매개 변수를 수정하지 못하게합니다. 이 목록에없는 모든 내용은 무시됩니다. 후크에 query_vars연결하고 추가 변수를 추가하십시오.

add_filter( 'query_vars', 'wpa5413_query_vars' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer_slug';
    return $query_vars;
}

보시다시피,이 답변은 기본적으로 이전 답변 과 동일 하지만 규칙을 코드에서 플러시하지 않고 ( functions.php플러그인 대신 테마에서 사용할 수 있음 ), 내가 배웠기 때문에 좀 더 확실하고 설명합니다 첫 번째 질문에 답한 이후 (그리고 그로 인해) 다시 쓰기 규칙에 대해 많이 설명합니다.

대화방 토론

우리 는 대화방 에서이 질문 대한 최종 문제를 해결했습니다 . 결국, Steven generate_rewrite_rules은 그 add_rewrite_rule()기능이 그에게 효과가없는 것처럼 보이기 때문에 후크를 사용 했습니다.


2
@Steven : pagename표시하려는 WordPress 페이지의 슬러그입니다 (데이터베이스에 기록). 이 페이지는 designers.phpWP 관리 영역에서 템플릿 파일 을 사용하고 싶다고 표시 할 수 있습니다. 따라서 동일한 템플릿을 여러 페이지에 사용할 수 있으므로 템플릿 이름이 아닌 페이지 슬러그를 가리 킵니다.이 경우 WordPress는 원하는 것을 알 수 없습니다.
Jan Fabry

1
@Steven : 후크 설정 방법이 너무 복잡하다고 생각합니다. add_rewrite_rules()함수를 제거하고 add_filter()/add_action()직접 호출 하십시오 . 테마 파일에있는 경우를 제거하고 flush_rewrite_rules()퍼머 링크 설정 페이지를 방문하여 규칙을 플러시하거나 wpse5413_init()나중에 추가 하고 제거하십시오. 그리고 내 플러그인에는 현재 다시 쓰기 규칙이 표시됩니다. 이렇게하면 코드에서 HTML로 URL을 작성하는 방식이 아니라 들어오는 URL 처리 방식 만 변경됩니다.
Jan Fabry

1
@ 스티븐 : 저장 버튼을 눌러야한다고 생각하지 않습니다. 퍼머 링크 페이지를 열면 플러시됩니다. 그리고 다시 말하면, WordPress가 /designers/designer-slug/URL 을 받아 들일 수있는 기능 만 추가 할 것이므로 HTML에서 이러한 URL을 작성하는 위치를 직접 변경해야합니다. 로 이동하여 테스트 /designers/Batlak-og-Selvig/, 자신이이 작동하는 경우, 이러한 URL을 생성하고 새로운 구조를 사용하도록 변경하는 모든 장소를 찾을 수 있습니다.
Jan Fabry

1
아, 이제 나는 자꾸 시작하는 것 같아. 다시 쓰기 규칙이 브라우저 URL 필드에서 URL이 표시되는 방식을 변경한다고 생각했습니다. 그러나 의미는 실제로 URL을 출력해야한다는 것입니다. www.mysite.com/batlat-og-selvig/9그리고 이것은 다음과 같이 "번역됩니다"/?designer=Batlak-og-Selvig&bid=9
Steven

1
@Steven : 예, 실제로 : 다시 쓰기 규칙은 들어오는 링크를 처리하며 (선택한 경우에만) 코드에서 생성 된 링크에 영향을 미치지 않습니다.
Jan Fabry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.