web-dev-qa-db-ja.com

プラグインとしてAPIを構築する方法

さまざまなクエリに対してJSONレスポンスを取得できるWordpressサイト用のREST AP​​Iエンドポイントを作成したいです。私はチュートリアル ここ を試してみましたが、私はそれがどのように機能するのか理解できないようです。それらを使用するために全てのクエリ変数を登録する必要がありますか?また、私はadd_rewrite_endpointを使うのが最善であると思いますが、私は以前にこれのどれも使ったことがないです。だから私は以下のコードでその関数を使用する方法を知りたいのですが。

Wordpressのバージョン番号を返す<url>/wp-api/versionのようなクエリを送りたい。しかし現在のところ、「pugs」以外のクエリは受けていません。正規表現で何が起こっているのか正確にはわからないので、変更しませんでした。誰かが私がこれを理解するのを手伝ってもらえますか?

class WP_API_Endpoint{

//  Hook WordPress
public function __construct(){
    add_filter('query_vars', array($this, 'add_query_vars'), 0);
    add_action('parse_request', array($this, 'sniff_requests'), 0);
    add_action('init', array($this, 'add_endpoint'), 0);
}   

/*  
    Add public query vars
    @param array $vars List of current public query vars
    @return array $vars     
*/
public function add_query_vars($vars){
    $vars[] = '__wp-api';
    $vars[] = 'pugs';
    return $vars;
}

//  Add API Endpoint
public function add_endpoint(){
    add_rewrite_rule('^wp-api/pugs/?([0-9]+)?/?','index.php?__wp-api=1&pugs=$matches[1]','top');
}

/*  
    Sniff Requests
    This is where we Hijack all API requests
    If $_GET['__api'] is set, we kill WP and serve our data
    @return die if API request
*/
public function sniff_requests(){
    global $wp;
    if(isset($wp->query_vars['__wp-api'])){
        $this->handle_request();
        exit;
    }
}

protected function get_wp_version() {
    return get_bloginfo('version');
}

//  This is where we handle incoming requests
protected function handle_request(){

    global $wp;

    $pugs = $wp->query_vars['pugs'];
    if($pugs)
        $this->send_response('wp-version', $this->get_wp_version());
    else
        $this->send_response('Something went wrong with the pug bomb factory');

}

//  This sends a JSON response to the browser
protected function send_response($key, $val){
    $response[$key] = $val;
    header('content-type: application/json; charset=utf-8');
    echo json_encode($response)."\n";
    exit;
}
}
new WP_API_Endpoint();
5
user3312508

まず、書き換え規則の追加機能です。あなたが持っている -

add_rewrite_rule('^wp-api/pugs/?([0-9]+)?/?','index.php?__wp-api=1&pugs=$matches[1]','top');

wp-api/pugs/?([0-9]+)これは、あなたが<url>/wp-api/pugs/123を要求すると、パラメータ 123 を持つクエリ変数pugsを取得することを意味します。

$var = get_query_var('pugs'); // = 123

さて、あなたは本当にあなたが必要としているURLの中に pugs を必要としません。だから、これを削除するだけです。また、一致する正規表現は数値だけではいけません。変更されたコードは以下のようになります -

add_rewrite_rule('^wp-api/?([^/]+)?/?','index.php?__wp-api=1&pugs=$matches[1]','top');

最終的な使い方は次のとおりです。

protected function handle_request(){

    global $wp;

    $pugs = $wp->query_vars['pugs'];

    // <url>/wp-api/version/
    if( 'version' == $pugs )
        $this->send_response( 'wp-version', $this->get_wp_version() );


    // <url>/wp-api/something/
    elseif( 'something' == $pugs )
        $this->send_response( 'something', 'something' );

    else
        $this->send_response( 'Something went wrong with the pug bomb factory');
}
3
Shazzad