태그 보관물: url-rewriting

url-rewriting

WordPress에서 “가상”페이지를 작성하는 방법 실제 API

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 엔드 포인트 파일을 플러그인과 함께 제공하는 것과 비슷 하지만) .

첫 번째 찌르기는 사용자 지정 다시 쓰기 규칙을 추가하는 것이 었습니다. 그러나 이것은 두 가지 문제가 있었다.

  1. 끝점에는 항상 슬래시가있었습니다. 그것은되었다http://mysite.com/my-api.php/
  2. 내 재 작성 규칙은 부분적으로 만 적용되었습니다. 로 리디렉션되지 않고으로 wp-content/plugins...리디렉션됩니다 index.php&wp-content/plugins.... 이로 인해 WordPress에 페이지를 찾을 수 없음 오류가 표시되거나 홈페이지가 기본값으로 표시됩니다.

아이디어? 제안?



답변

WordPress에는 내부 규칙 (데이터베이스에 저장되고 WP :: parse_request ()에 의해 구문 분석 )과 외부 규칙 ( .htaccessApache에 저장 되고 구문 분석 됨)의 두 가지 유형의 재 작성 규칙이 있습니다. 호출 한 파일에 필요한 WordPress의 양에 따라 두 가지 방법 중 하나를 선택할 수 있습니다.

외부 규칙 :

외부 규칙은 설정하고 따르는 것이 가장 쉽습니다. my-api.phpWordPress에서 아무것도로드하지 않고 플러그인 디렉토리에서 실행 됩니다.

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

소원,-마이크


답변

대신 이런 식으로 행동하지 않는 이유는 무엇입니까?

http://mysite.com/?my-api=1

그런 다음 플러그인을 ‘init’에 연결하고 get 변수를 확인하십시오. 존재하는 경우 플러그인이 수행해야 할 작업을 수행하고 die ()


답변

질문을 완전히 이해하지 못할 수도 있지만 간단한 단축 코드로 문제를 해결할 수 있습니까?

단계 :

  1. 클라이언트에게 페이지를 작성하도록하십시오 (예 :
    http://mysite.com/my-api)
  2. 클라이언트가 해당 페이지에 단축 코드를 추가하도록합니다 (예 : [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 페이지 생성