2016-08-11 2 views
2

WordPress 기반 웹 사이트에 사용자 지정 URL 구조를 추가하려고합니다. 예를 들어WordPress는 사용자 정의 URL을 함수에 매핑합니다.

:

example.com/machines    //list all machines in a table 

example.com/machines?some=params //list filtered machines in a table 

example.com/machines/1   //show single machine 

데이터는 컬를 통해 이미 개발 한 외부 API에서 올 것이다.

데이터를 여러 테이블에서 정규화했기 때문에 데이터를 사용자 정의 게시 유형으로 가져올 수 없습니다. 비즈니스 로직은 복잡하고 어쨌든 다른 장치에서 API를 사용합니다.

내가 add_rewrite_rule의 문서 살펴 보았다하지만, 두 번째 매개 변수가 나를 난처한 상황에 빠진 :

$redirect 
(string) (required) The URL you would like to actually fetch 

가 글쎄, 내가 함수를 실행하려면 가져 오기에 URL이없는, 그와 같은 역할을합니다 간단한 라우터 - url 부분을 가져 와서 외부 API를 호출하고 올바른 데이터가있는 템플릿을 반환하십시오.

API를 호출하는 것은 간단하지만 실제로 URL을 함수에 전달하는 방법과 기존의 WordPress header.php와 footer.php를 활용하여 템플릿을로드하는 방법이 저를 곤두박질로 만듭니다.

답변

2

Google 검색을 많이 수행하고 약간의 goodresources을 읽은 후 해결책을 찾았습니다.

1 차 단계는 쿼리 변수에 매핑됩니다 기본 URL 생성 add_rewrite_endpoint을 사용하는 것입니다 : 재 작성 규칙을 플러시하는 영구 링크 페이지를 방문하면

add_action('init', function(){ 
    add_rewrite_endpoint('machines', EP_ROOT); 
}); 

를, 다음 단계로 후크하는 것입니다 URL이 충돌 할 때 작업 'template_redirect' 실제로 뭔가를 할 수 :

add_action('template_redirect', function(){ 
    if($machinesUrl = get_query_var('machines')){ 
     //var_dump($machinesUrl, $_GET); 
     //$machinesURl contains the url part after example.com/machines 
     //eg if url is example.com/machines/some/thing/else 
     //then $machinesUrl == 'some/thing/else' 
     //and params can be got at simply via $_GET 
     //after parsing url and calling api, its just a matter of loading a template: 
     locate_template('singe-machine.php', TRUE, TRUE); 
     //then stop processing 
     die(); 
    } 
}); 

유일한 다른 점은이 URL에 더 이상의 부품, 예를 들어 example.com/machines와 URL로 히트를 처리 할 수 ​​있습니다. 그것은 withing에이 용기를 wordpresses 어떤 시점에서 밝혀, 빈 문자열은 false로 평가되고, 따라서 생략, 그래서 마지막 단계는 필터 'request'에 끼어 기본값을 설정하는 것입니다됩니다 :

add_filter('request', function($vars=[]){ 
    if(isset ($vars['machines']) && empty ($vars['machines'])){ 
     $vars['machines'] = 'default'; 
    } 
    return $vars; 
}); 

이 쉽게 할 수있다 클래스에서 모든 것을 래핑하여 향상되었습니다. URL 구문 분석 및 템플릿로드 논리는 기본 라우터, 심지어 기초적인 MVC 설정, 파일 등에서 경로로드 등을 통해 전달 될 수 있지만 위의 시작 지점

관련 문제