Wordpress의 사용자 정의 플러그인 경로


12

좋아요. 그래서 제 질문은 아주 간단합니다. 플러그인에 대한 일부 사용자 지정 라우팅 규칙을 구현해야합니다. 이 경로는 하나의 인수 만 취하므로 복잡하지는 않습니다. http://www.example.org/myroute/myargument

이상적으로는 사용자 정의 클래스를 호출하고 클래스에 직접 액세스 할 수있는 사용자 정의 템플릿을 표시합니다.

가장 좋은 방법은 무엇입니까? 건배

답변:


15

세 가지 중요한 일을해야합니다.

  1. URI의 일부를에 전달 된 값으로 변환하는 사용자 정의 다시 쓰기 규칙을 작성하십시오 index.php.
  2. WordPress의 쿼리 변수 화이트리스트를 추가 myroute하고 추가 myargument하여 WordPress가 쿼리 문자열에 표시 될 때이를 무시하지 않도록합니다.
  3. 다시 쓰기 규칙을 비 웁니다.

먼저, 대신 http://www.example.org/myroute/myargumentURI를 이러한 특수 '라우트'중 하나로 간주해야 할 때를 표시하기 위해 일종의 특수 접두사 또는 접미사를 설정 하는 것이 좋습니다 . 이 예제를 위해 접두어를 선택 api했습니다 http://www.example.org/api/myroute/myargument. 나는 api당신이 작업하는 것처럼 RESTful 한 것을 할 때 API를 위해 선택 했기 때문에 선택했습니다 .

코드

add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules() {
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
    $newrules = array();
    $newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
    array_push( $vars, 'myroute', 'myargument' );
    return $vars;
}

빠른 고장

모두 매우 간단합니다. 정규식 패턴은 WordPress의 모든 다시 쓰기 규칙 목록에 추가되며 사용자 정의 패턴은 목록의 맨 위에 있습니다. 패턴이 일치하면 WordPress는 다시 쓰기 규칙 목록을 찾는 것을 중지 $matches[1]하고에 $matches[2]전달 된 쿼리 문자열에서 참조 ( 및 ) 대신 정규식의 캡처 된 값을 사용합니다 index.php.

쿼리 변수 myroutemyargument화이트리스트에 추가 하면 워드 프레스는 변수 를 버리지 않고주의를 기울입니다.

사용자 지정 경로를 '네임 스페이스'하는 다른 방법

/api/접두사로 사용하지 않으려면 대신 쿼리 문자열 변수 / 필드를 사용할 수 있습니다. 이와 같은 작업을 수행하려면 정규식을 다음과 같이 변경 (.*?)/(.+?)\\?api=1한 다음 에서 이루어진 호출에 api추가 매개 변수로 추가하십시오 .array_push()my_insert_query_vars()

그러면 사용자 지정 경로가 변경되어 언제든지 트리거되므로 api=1쿼리 문자열의 첫 번째 요소입니다. 예를 들어 트리거합니다 http://example.com/anytext/anytext?api=1.

'namespacing'이라는 용어의 사용을 무시하십시오.

접두사 또는 접미사로 '네임 스페이스'를 사용하지 않으면 충돌하는 URI 패턴으로 끝납니다. 이는 WordPress에서 사용자 정의 패턴을 게시물 또는 페이지로 의도 된 패턴과 구별 할 방법이 없기 때문입니다. 워드 프레스 myroute는 분류, 용어 또는 상위 페이지가 아닌 것을 어떻게 알 수 있습니까?

도움이 되었기를 바랍니다.


1
유용한 참고 사항 : 정의 my_insert_rewrite_rules순서 에 따라 정의 된 규칙 ! 가장 긴 규칙부터 시작하여 가장 간단한 규칙으로 작업하십시오. 그렇지 않으면 / api / myroute이 / api / myroute / myargument를 재정의합니다.
emc

1
@npc 사용자 지정 다시 쓰기 규칙을 만들 때 알아야 할 중요한 점은 이러한 방식으로 충돌 할 수 있습니다. 그러나 위의 예에서 / api / myroute은 단순히 유효한 경로가 아니기 때문에 문제가되지 않습니다.
eddiemoya 2014 년

example.org/api/myroute/myargument 페이지가 요청 될 때마다 누군가 플러그인 디렉토리에서 사용자 정의 템플릿을로드 할 수 있습니까?
Matt Keys

1
다음은 워드 프레스에 의해 실제와 완벽한 솔루션은 다음과 같습니다 codex.wordpress.org/Rewrite_API/add_rewrite_rule
이므 란 Zahoor

6

eddiemoya가 위에서 한 일을 조금 확장하려면 :

이 질문의 원래 포스터와 마찬가지로 사용자 지정 다시 쓰기를 만들고 해당 다시 쓰기 페이지에 대한 사용자 지정 템플릿을 제공하고 싶었습니다. edditmoya의 코드는 올바른 방향으로 시작되었으며 페이지에 액세스 할 때 사용자 정의 템플릿을 제공하는 추가 기능을 추가했습니다.

사용자 정의 템플릿은 어디에서나 찾을 수 있습니다. 필자의 경우 플러그인 디렉토리에 저장되어 있습니다.

또한 플러그인 활성화 중에 다시 쓰기 규칙을 비울 필요가 있는지 확인하고 싶기 때문에 register_activation_hook에 넣었습니다.

내가 한 일의 전체 예는 아래를 참조하십시오.

milo의 조언을 바탕으로 단순화 된 업데이트

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );

1
을 사용 add_rewrite_endpoint하여 규칙을 생성하고 쿼리 var를 한 번에 추가 할 수도 있습니다. 또한 자신의 다시 쓰기 규칙을 추가하는 경우 add_rewrite_rule필터링 대신 함수를 제안합니다 rewrite_rules_array.
Milo

감사합니다 Milo, 다시 쓰기 배열을 필터링하는 대신 add_rewrite_rule을 사용하도록 코드를 업데이트했습니다. add_rewrite_endpoint를 살펴 보았지만 add_rewrite_tag가 내 요구에 더 잘 맞는다고 생각합니다. add_rewrite_endpoint는 기존 WP 다시 쓰기에 추가 인수를 추가하려는 경우 주로 유용합니다. 내가 틀렸다면 바로 수정하십시오.
매트 키

1
나는 객체 지향 접근법을 좋아합니다. 너무 많은 WP 개발자는 여전히 OOP를 사용하는 방법을 모릅니다. PHP 개발자에게 믿음을 되찾아 주셔서 감사합니다. ;)
Arvid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.