Introduzione
Puoi usare la WordPress REST API internamente sul tuo sito per recuperare ciò che vuoi, ad esempio: il titolo di un post. Questo è utile quando vuoi accedere alle informazioni dal tuo sito in modo dinamico, usando JavaScript o altre chiamate PHP (server-to-server).
Utilizzo dell’API REST per recuperare internamente il titolo di un post
Concettualmente qualsiasi API nasce per rispondere e restituire dei dati. Per farlo dobbiamo chiamare l’endpoint (ossia un URL) al quale passare un argomento. Nel caso di WP gli endpoint standard, per il recupero di dati dai post, è così strutturato:
/wp-json/wp/v2/posts/{ID}
Dove {ID} rappresenta l’ID del post che vuoi recuperare.
Ad esempio, copia e incolla questo codice PHP all’interno del file functions.php del tuo tema child, o di un plugin, per usare wp_remote_get per inviare una richiesta. Questo codice di esempio recupera il titolo del post con ID 123:
$response = wp_remote_get( site_url( '/wp-json/wp/v2/posts/123' ) );
if ( is_wp_error( $response ) ) {
return; // Error handling
}
$body = wp_remote_retrieve_body( $response );
$data = json_decode( $body );
if ( isset( $data->title->rendered ) ) {
$title = $data->title->rendered;
echo $title;
}
Siccome stiamo facendo una chiamata INTERNA al nostro sito, usiamo la funzione site_url per dire a wp_remote_get di lanciare la nostra richiesta all’endpoint, che sarà una stringa del tipo: https://mywebsite.com/wp-json/wp/v2/posts/123
È richiesta l’autenticazione?
- Pubblico vs Privato: Per recuperare post pubblici, non è richiesta l’autenticazione. Se il post è pubblico, puoi usare la REST API senza dover autenticarti.
- Post privati o protetti: se hai bisogno di recuperare post privati o altri dati protetti, devi autenticarti. Puoi usare vari metodi di autenticazione come Autenticazione di base , Autenticazione tramite cookie o OAuth.
Per le richieste interne (ad esempio, se il codice è già in esecuzione sul tuo tema o su un plugin installato, quindi come parte del tuo WordPress), potrebbe non essere necessaria un’autenticazione speciale, poiché si sta già lavorando in un contesto autenticato.
XML-RPC disabilitato: implicazioni
- API REST e XML-RPC: sono due metodi diversi per accedere ai dati di WordPress. Se XML-RPC è disabilitato, API REST continuerà a funzionare senza problemi, poiché sono indipendenti.
- Scopi diversi: XML-RPC è spesso utilizzato per connettersi al sito da applicazioni esterne (come l’app mobile di WordPress), ma disabilitarlo non influisce sulla REST API. Se l’accesso tramite XML-RPC è stato disabilitato per motivi di sicurezza, di solito si preferisce la REST API, poiché è più moderna e generalmente più sicura.
Quindi, se hai XML-RPC disabilitato, non ci saranno conseguenze con l’utilizzo della REST API per recuperare dati internamente sul tuo sito. La REST API continuerà a funzionare normalmente e ti consentirà di recuperare i titoli dei post e altre informazioni.
Se vuoi iniziare a lavorare con gli endpoint predefiniti di WP, ti suggerisco di iniziare leggendo la documentazione ufficiale che trovi qui: https://developer.wordpress.org/rest-api/
Hai bisogno di creare il tuo endpoint personalizzato? Cominciamo:
Per ricevere un payload personalizzato da qualsiasi sito web WordPress è necessario registrare il proprio endpoint su di esso .
Nel mio caso, di solito inserisco il codice all’interno di un plugin personalizzato, ma puoi ottenere lo stesso risultato inserendo il codice all’interno del tuo tema child.
Ad esempio : /wp-content/themes/your-child-theme/api/api_v1.php
Nota: ricordati di includere questo file nel tuo functions.php
Ora facciamo che hai un CPT custom chiamato “books” sul sito 1, e che dal sito 2 desideri recuperare i dati dei “books” presenti sul sito 1. Come si fa?
Passaggio 1: registra l’endpoint personalizzato sul sito 1
//Register my custom endpoints
add_action('rest_api_init', 'register_custom_endpoints');
function register_custom_endpoints() {
$api_endpoint_base = 'books/v1';
//get-item-title
register_rest_route($api_endpoint_base, '/get-item-title/', array(
'methods' => 'GET',
'callback' => 'fn_get_item_title',
'args' => array(
'book_id' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
)
),
'permission_callback' => '__return_true', // Set the authorization as public
));
}
Passaggio 2: crea la funzione callback sul sito 1
// get-item-title callback function
function fn_get_item_title($request) {
// Check security
$api_key = "ABCDEF1234567890";
$api_key_request = $request->get_header('X-API-KEY');
if ($api_key !== $api_key_request) {
return new WP_Error('invalid_api_key', 'Invalid API Key', array('status' => 401));
}
// Get data from request
$book_id= urldecode($request->get_param('book_id'));
// Your query
global $wpdb;
$book_title = $wpdb->get_var( $wpdb->prepare("SELECT title FROM $wpdb->posts WHERE post_type='%s' AND id='%s'", array('books', $book_id ) ));
// Response
if ($book_title) {
$response = array(
'code' => 200,
'message' => 'success',
'book_title' => $book_title
);
// Return JSON response
return rest_ensure_response($response);
} else {
new WP_Error('error', "No book found with id $book_id", array('status' => 401));
}
}
Passaggio 3: testa la chiamata API (io utilizzo Insomnia che è gratuito e facilissimo da usare)
URL di query [GET]
Aggiungi 1 argomento:
- book_id -> 987
Aggiungi intestazioni:
- Tipo di contenuto -> applicazione/json
- X-API-KEY -> ABCDEF1234567890
Cliccando su “Invia” dovresti ottenere la risposta JSON nella scheda “Preview”.
Passaggio 4: chiama la tua API (dallo stesso sito web o dal sito 2) con una funzione
function get_book_title() {
// API URL
$api_url = 'https://www.mywebsite.com/wp-json/books/v1/get-item-title';
// Add params
$book_id = 987; //the post_id
$api_url_with_params = $api_url . '?book_id=' . $book_id;
// opzioni della richiesta HTTP
$headers = array(
'Content-Type' => 'application/json',
'X-API-KEY' => 'ABCDEF1234567890',
);
$args = array(
'method' => 'GET', // (GET, POST, PUT, DELETE, etc.)
'timeout' => 45, // Request Timeout
'headers' => $headers, // Add the headers
);
// API call
$response = wp_remote_request($api_url, $args);
// Check errors
if (is_wp_error($response)) {
//handle errors here
} else {
// Get the JSON response payload
$body = wp_remote_retrieve_body($response);
// Decode the response
$data = json_decode($body);
// Item title
echo $data->book_title;
}
}
Ovviamente questo è solo un esempio. Per testarlo rapidamente, cambia semplicemente il tipo di post da ‘book’ a ‘post’ o ‘page’ e cambia il valore $book_id con uno esistente in “mywebsite.com”.
Da questo esempio dovresti essere in grado di costruire qualsiasi API-REST di cui hai bisogno. Puoi chiamarla dallo stesso sito web (internamente) o da un altro (esternamente).