좋아요. 그래서 제 질문은 아주 간단합니다. 플러그인에 대한 일부 사용자 지정 라우팅 규칙을 구현해야합니다. 이 경로는 하나의 인수 만 취하므로 복잡하지는 않습니다. http://www.example.org/myroute/myargument
이상적으로는 사용자 정의 클래스를 호출하고 클래스에 직접 액세스 할 수있는 사용자 정의 템플릿을 표시합니다.
가장 좋은 방법은 무엇입니까? 건배
좋아요. 그래서 제 질문은 아주 간단합니다. 플러그인에 대한 일부 사용자 지정 라우팅 규칙을 구현해야합니다. 이 경로는 하나의 인수 만 취하므로 복잡하지는 않습니다. http://www.example.org/myroute/myargument
이상적으로는 사용자 정의 클래스를 호출하고 클래스에 직접 액세스 할 수있는 사용자 정의 템플릿을 표시합니다.
가장 좋은 방법은 무엇입니까? 건배
답변:
세 가지 중요한 일을해야합니다.
index.php
.myroute
하고 추가 myargument
하여 WordPress가 쿼리 문자열에 표시 될 때이를 무시하지 않도록합니다.먼저, 대신 http://www.example.org/myroute/myargument
URI를 이러한 특수 '라우트'중 하나로 간주해야 할 때를 표시하기 위해 일종의 특수 접두사 또는 접미사를 설정 하는 것이 좋습니다 . 이 예제를 위해 접두어를 선택 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
.
쿼리 변수 myroute
와 myargument
화이트리스트에 추가 하면 워드 프레스는 변수 를 버리지 않고주의를 기울입니다.
사용자 지정 경로를 '네임 스페이스'하는 다른 방법
/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' ) );
add_rewrite_endpoint
하여 규칙을 생성하고 쿼리 var를 한 번에 추가 할 수도 있습니다. 또한 자신의 다시 쓰기 규칙을 추가하는 경우 add_rewrite_rule
필터링 대신 함수를 제안합니다 rewrite_rules_array
.
my_insert_rewrite_rules
순서 에 따라 정의 된 규칙 ! 가장 긴 규칙부터 시작하여 가장 간단한 규칙으로 작업하십시오. 그렇지 않으면 / api / myroute이 / api / myroute / myargument를 재정의합니다.