WordPress에서 사용자 지정 API 끝점을 만들려고하는데 WordPress 루트의 가상 페이지로 요청을 플러그인과 함께 제공되는 실제 페이지로 리디렉션해야합니다. 따라서 기본적으로 한 페이지에 대한 모든 요청은 실제로 다른 페이지로 라우팅됩니다.
예 :
http://mysite.com/my-api.php
=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php
요점은 API 엔드 포인트의 URL을 가능한 짧게 http://mysite.com/xmlrpc.php
만드는 것입니다 (사용자가 설치 및 / 또는 핵 코어에서 파일을 이동하도록 요구하지 않고 실제 API 엔드 포인트 파일을 플러그인과 함께 제공하는 것과 비슷 하지만) .
첫 번째 찌르기는 사용자 지정 다시 쓰기 규칙을 추가하는 것이 었습니다. 그러나 이것은 두 가지 문제가 있었다.
- 끝점에는 항상 슬래시가있었습니다. 그것은되었다
http://mysite.com/my-api.php/
- 내 재 작성 규칙은 부분적으로 만 적용되었습니다. 로 리디렉션되지 않고으로
wp-content/plugins...
리디렉션됩니다index.php&wp-content/plugins...
. 이로 인해 WordPress에 페이지를 찾을 수 없음 오류가 표시되거나 홈페이지가 기본값으로 표시됩니다.
아이디어? 제안?
답변
WordPress에는 내부 규칙 (데이터베이스에 저장되고 WP :: parse_request ()에 의해 구문 분석 됨 )과 외부 규칙 ( .htaccess
Apache에 저장 되고 구문 분석 됨)의 두 가지 유형의 재 작성 규칙이 있습니다. 호출 한 파일에 필요한 WordPress의 양에 따라 두 가지 방법 중 하나를 선택할 수 있습니다.
외부 규칙 :
외부 규칙은 설정하고 따르는 것이 가장 쉽습니다. my-api.php
WordPress에서 아무것도로드하지 않고 플러그인 디렉토리에서 실행 됩니다.
add_action( 'init', 'wpse9870_init_external' );
function wpse9870_init_external()
{
global $wp_rewrite;
$plugin_url = plugins_url( 'my-api.php', __FILE__ );
$plugin_url = substr( $plugin_url, strlen( home_url() ) + 1 );
// The pattern is prefixed with '^'
// The substitution is prefixed with the "home root", at least a '/'
// This is equivalent to appending it to `non_wp_rules`
$wp_rewrite->add_external_rule( 'my-api.php$', $plugin_url );
}
내부 규칙 :
내부 규칙에는 더 많은 작업이 필요합니다. 먼저 쿼리 vars를 추가하는 다시 쓰기 규칙을 추가 한 다음이 쿼리를 var로 공개 한 다음 제어를 플러그인 파일에 전달하려면이 쿼리 var가 있는지 확인해야합니다. 이 작업을 수행 할 때 일반적인 WordPress 초기화가 수행됩니다 (일반적인 사후 쿼리 직전 분리).
add_action( 'init', 'wpse9870_init_internal' );
function wpse9870_init_internal()
{
add_rewrite_rule( 'my-api.php$', 'index.php?wpse9870_api=1', 'top' );
}
add_filter( 'query_vars', 'wpse9870_query_vars' );
function wpse9870_query_vars( $query_vars )
{
$query_vars[] = 'wpse9870_api';
return $query_vars;
}
add_action( 'parse_request', 'wpse9870_parse_request' );
function wpse9870_parse_request( &$wp )
{
if ( array_key_exists( 'wpse9870_api', $wp->query_vars ) ) {
include 'my-api.php';
exit();
}
return;
}
답변
이것은 나를 위해 일했습니다. 나는 결코 다시 쓰기 API를 건드리지 않지만 항상 새로운 방향으로 나아갈 것입니다. 다음은 localhost의 하위 폴더에있는 3.0의 테스트 서버에서 작동했습니다. WordPress가 웹 루트에 설치되어 있으면 아무런 문제가 없습니다.
이 코드를 플러그인에 드롭하고 “taco-kittens.php”라는 파일을 플러그인 폴더에 직접 업로드하십시오. 영구 링크에 대해 하드 플러시를 작성해야합니다. 나는 이것이 가장 좋은 시간은 플러그인 활성화에 있다고 생각합니다.
function taco_kitten_rewrite() {
$url = str_replace( trailingslashit( site_url() ), '', plugins_url( '/taco-kittens.php', __FILE__ ) );
add_rewrite_rule( 'taco-kittens\\.php$', $url, 'top' );
}
add_action( 'wp_loaded', 'taco_kitten_rewrite' );
소원,-마이크
답변
대신 이런 식으로 행동하지 않는 이유는 무엇입니까?
그런 다음 플러그인을 ‘init’에 연결하고 get 변수를 확인하십시오. 존재하는 경우 플러그인이 수행해야 할 작업을 수행하고 die ()
답변
질문을 완전히 이해하지 못할 수도 있지만 간단한 단축 코드로 문제를 해결할 수 있습니까?
단계 :
- 클라이언트에게 페이지를 작성하도록하십시오 (예 :
http://mysite.com/my-api) - 클라이언트가 해당 페이지에 단축 코드를 추가하도록합니다 (예 : [my-api-shortcode]).
새 페이지는 API 엔드 포인트 역할을하며 단축 코드는 http://mysite.com/wp-content/plugins/my-plugin/my-api.php 의 플러그인 코드로 요청을 보냅니다 .
(물론 이것은 my-api.php에 단축 코드가 정의되어 있음을 의미합니다)
플러그인을 통해 1 단계와 2 단계를 자동화 할 수 있습니다.
답변
나는 그렇게 많이 다시 작성하지 않았으므로 아마도 약간 거칠지 만 작동하는 것 같습니다.
function api_rewrite($wp_rewrite) {
$wp_rewrite->non_wp_rules['my-api\.php'] = 'wp-content/plugins/my-plugin/my-api.php';
file_put_contents(ABSPATH.'.htaccess', $wp_rewrite->mod_rewrite_rules() );
}
이것을 ‘generate_rewrite_rules’에 연결하면 작동하지만 각 페이지로드마다 .htaccess를 다시 쓰지 않으려면 더 좋은 방법이 있어야합니다.
내 게시물 편집을 멈출 수없는 것 같습니다 … 콜백을 활성화하고 대신 글로벌 $ wp_rewrite를 참조해야합니다. 그런 다음 non_wp_rules에서 항목을 제거하고 콜백을 비활성화하면 다시 .htaccess로 출력됩니다.
그리고 마지막으로 .htaccess에 쓰는 것은 좀 더 정교해야합니다. 거기에있는 워드 프레스 섹션 만 바꾸고 싶습니다.
답변
비슷한 요구 사항이 있었고 플러그인에서 생성 된 내용을 가리키는 고유 한 슬러그를 기반으로 여러 끝점을 만들고 싶었습니다.
내 플러그인의 소스를 살펴보십시오 : https://wordpress.org/extend/plugins/picasa-album-uploader/
내가 사용한 기술 the_posts
은 들어오는 요청을 검사하기 위해 필터를 추가하여 시작합니다 . 플러그인이 처리해야하는 경우 더미 게시물이 생성되고에 대한 작업이 추가됩니다 template_redirect
.
때 template_redirect
조치가 호출 될 때,이 페이지의 전체 내용을 출력이되어야합니다 표시하고 종료하거나 생성없이 출력을 반환해야한다. 코드를 wp_include/template-loader.php
보면 왜 그런지 알 수 있습니다.
답변
홈페이지에 사용자 정의 제목, 콘텐츠 및 페이지 템플릿 을 강제로로드하는 다른 접근 방식을 사용 하고 있습니다.
사용자가 http://example.com/ ? plugin_page = myfakepage 와 같은 친숙한 링크를 따라갈 때 구현 될 수 있으므로이 솔루션은 매우 깔끔합니다.
구현하기가 매우 쉽고 무제한 페이지를 허용해야합니다.
코드 및 지침 : 즉시 사용자 정의 / 가짜 / 가상 WordPress 페이지 생성