Cómo construir una API como un complemento

4

Quiero crear un punto final de REST API para un sitio de wordpress donde pueda obtener una respuesta JSON para diferentes consultas. He intentado el tutorial aquí , pero parece que no entiendo cómo funciona. ¿Necesito registrar todas las variables de consulta para usarlas? También creo que sería mejor usar el add_rewrite_endpoint pero no he usado nada de esto antes. Así que me gustaría saber cómo usar esa función en el siguiente código.

Quiero enviar una consulta como <url>/wp-api/version a donde devolverá el número de versión de wordpress. Pero en este momento no está tomando ninguna otra consulta que no sea 'pugs'. No estoy seguro de qué está pasando exactamente con la expresión regular, así que no cambié eso. ¿Puede alguien ayudarme por favor a entender esto?

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

1 respuesta

3

Lo primero es agregar la función de regla de reescritura. Usted tiene -

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

wp-api/pugs/?([0-9]+) esto significa que, cuando solicites <url>/wp-api/pugs/123 , obtendrás un pug de variable de consulta con el parámetro 123 .

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

Ahora, realmente no necesita pugs en la url según sus necesidades. Entonces, solo remuévelo de esta manera Además, las expresiones regulares coincidentes no deben ser solo números. por lo que el código modificado sería -

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

El uso final es:

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

Lea otras preguntas en las etiquetas