WordPress의 사용자 정의 플러그인 경로 그래서 제 질문은 아주 간단합니다. 플러그인에 대한

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

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

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



답변

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

  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는 분류, 용어 또는 상위 페이지가 아닌 것을 어떻게 알 수 있습니까?

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


답변

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