rest_api_init în WordPress

Hooks folosite des WordPress 4.4.0

Acțiunea care rulează când WordPress pregătește o cerere către REST API; aici înregistrezi rutele proprii cu register_rest_route().

Sintaxă
do_action( 'rest_api_init', WP_REST_Server $wp_rest_server )
add_action( 'rest_api_init', 'dex_functie' );

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 la init sau direct în functions.php: WordPress semnalează că rutele trebuie înregistrate în rest_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 un v2 fă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.