web-dev-qa-db-fra.com

Comment construire une API en tant que plugin

Je souhaite créer un noeud final d'API REST pour un site wordpress sur lequel je peux obtenir une réponse JSON pour différentes requêtes. J'ai essayé le tutoriel ici , mais je n'arrive pas à comprendre comment cela fonctionne. Dois-je enregistrer toutes les variables de la requête pour les utiliser? Aussi, je pense qu'il serait préférable d'utiliser le add_rewrite_endpoint mais je n'ai jamais utilisé cela auparavant. Je voudrais donc savoir comment utiliser cette fonction dans le code ci-dessous.

Je veux envoyer une requête comme <url>/wp-api/version où il retournera le numéro de version de wordpress. Mais pour l'instant, il ne prend aucune autre requête que celle de "carlins". Je ne suis pas sûr de ce qui se passe exactement avec la regex, donc je n'ai pas changé cela. Quelqu'un peut-il m'aider s'il vous plaît à comprendre cela?

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

La première chose est la fonction de règle add rewrite. Tu as -

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

wp-api/pugs/?([0-9]+) cela signifie que lorsque vous demandez <url>/wp-api/pugs/123, vous obtiendrez une variable de requête pugs avec le paramètre 123 .

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

Maintenant, vous n'avez pas vraiment besoin de carlins dans l'URL selon vos besoins. Alors, retirez-le simplement de cette façon. En outre, l'expression rationnelle correspondante ne doit pas être un nombre uniquement. donc le code modifié serait -

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

L'utilisation finale est:

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