Ce face rest_api_init
rest_api_init rulează doar când se servește o cerere REST (adresele /wp-json/...). Documentația cere ca rutele și endpoint-urile să fie înregistrate aici, ca să fie încărcate doar când e nevoie. Funcția primește obiectul WP_REST_Server, dar de obicei nu ai nevoie de el.
În funcția ta apelezi register_rest_route( 'dex/v1', '/program', $args ): primul argument este spațiul de nume (numele pluginului + versiunea), al doilea ruta. În $args pui metodele HTTP, funcția care răspunde și permission_callback, funcția care decide cine are acces.
Răspunsul este transformat în JSON. WordPress îl codează cu opțiunile implicite ale lui json_encode(), așa că literele cu diacritice apar ca secvențe \u (de exemplu ș devine \u0219); programele care citesc JSON le decodează corect.
Parametri
| Parametru | Descriere |
|---|---|
$wp_rest_server |
Obiectul WP_REST_Server care servește cererea. |
Exemple
Exemplul 1: O rută publică cu programul cafenelei
__return_true ca permission_callback face ruta publică, intenționat. Funcția întoarce un tablou, pe care WordPress îl trimite ca JSON.
add_action( 'rest_api_init', 'dex_rute_rest' );
function dex_rute_rest() {
register_rest_route( 'dex/v1', '/program', array(
'methods' => 'GET',
'callback' => 'dex_rest_program',
'permission_callback' => '__return_true',
) );
}
function dex_rest_program() {
return array(
'oras' => 'Iași',
'luni_vineri' => '08:00-22:00',
'weekend' => '10:00-20:00',
);
}
// curl -s https://exemplu.ro/wp-json/dex/v1/program
Ieșire în terminal
{"oras":"Ia\u0219i","luni_vineri":"08:00-22:00","weekend":"10:00-20:00"}
Exemplul 2: O rută protejată: doar editorii
Ruta primește un ID numeric în URL. Fără autentificare, permission_callback întoarce false și WordPress răspunde cu eroarea rest_forbidden și codul 401.
add_action( 'rest_api_init', 'dex_ruta_rezervare' );
function dex_ruta_rezervare() {
register_rest_route( 'dex/v1', '/rezervari/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'dex_rest_rezervare',
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
) );
}
function dex_rest_rezervare( WP_REST_Request $request ) {
$id = (int) $request['id'];
return rest_ensure_response( array( 'id' => $id, 'nume' => 'Mihai', 'persoane' => 4 ) );
}
// curl -s https://exemplu.ro/wp-json/dex/v1/rezervari/12
Ieșire în terminal
{"code":"rest_forbidden","message":"Sorry, you are not allowed to do that.","data":{"status":401}}
Exemplul 3: Ruta greșită sau înregistrată în alt hook
Dacă ruta nu există (o greșeală în URL sau register_rest_route() nu a rulat), WordPress răspunde cu rest_no_route și codul 404.
curl -s https://exemplu.ro/wp-json/dex/v1/programul
Ieșire în terminal
{"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
Greșeli frecvente
register_rest_route()apelat lainitsau direct înfunctions.php: WordPress semnalează că rutele trebuie înregistrate înrest_api_init.- Lipsește
permission_callback: din WordPress 5.5.0 primești o notificare_doing_it_wrong. Pentru rute publice, scrie explicit'permission_callback' => '__return_true'. - Spațiul de nume fără versiune (
'dex') sau cu bară la început ('/dex/v1'): folosește'dex/v1', ca să poți publica mai târziu unv2fără să strici clienții vechi. - Cu legăturile permanente „Simple”, adresa
/wp-json/nu funcționează; ruta se apelează cu?rest_route=/dex/v1/program.
Comenzi înrudite
register_rest_route: Înregistrează un endpoint propriu în REST API-ul WordPress, accesibil la o adresă de forma /wp-json/dex/v1/meniu.add_action: Leagă o funcție de o acțiune WordPress, ca să ruleze automat când WordPress ajunge în acel punct.current_user_can: Verifică dacă utilizatorul conectat are un anumit drept (capability), de exemplu manage_options sau edit_post pentru un articol.wp_remote_get: Face cereri HTTP din PHP prin HTTP API-ul WordPress și întoarce un tablou cu răspunsul sau un obiect WP_Error.