Como construir uma API como um plugin

4

Eu quero criar um ponto de extremidade da API REST para um site wordpress no qual posso obter uma resposta JSON para diferentes consultas. Eu tentei o tutorial aqui , mas eu não consigo descobrir como funciona. Preciso registrar todas as variáveis de consulta para usá-las? Também acho que seria melhor usar o add_rewrite_endpoint , mas não usei nada disso antes. Então eu gostaria de saber como usar essa função no código abaixo.

Eu quero enviar uma consulta como <url>/wp-api/version , onde ele retornará o número da versão do wordpress. Mas agora ele não está tomando nenhuma pergunta além de 'pugs'. Eu não tenho certeza do que exatamente está acontecendo com o regex, então eu não mudei isso. Alguém por favor pode me ajudar a entender isso?

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();
    
por user3312508 21.04.2015 / 02:14

1 resposta

3

A primeira coisa é a função de regra add rewrite. Você tem -

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

wp-api/pugs/?([0-9]+) significa que, quando você solicitar <url>/wp-api/pugs/123 , você obterá uma variável de consulta pugs com o parâmetro 123 .

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

Agora, você realmente não precisa de pugs no URL, de acordo com suas necessidades. Então, apenas remova dessa maneira. Além disso, a regex correspondente não deve ser apenas numérica. então o código alterado seria -

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

O uso final é:

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');
}
    
por Shazzad 21.04.2015 / 02:35

Tags