WP REST API -- Cum să schimbi codul de stare HTTP al răspunsului?

21 ian. 2017, 21:08:50
Vizualizări: 23.8K
Voturi: 16

Am un endpoint personalizat în care vreau să schimb codul de stare HTTP la 404 în anumite scenarii (de exemplu când articolul nu există). Cum pot face asta? Iată un exemplu de endpoint personalizat:

function af_news_single( \WP_REST_Request $data ) {
    global $wpdb;

    $year = (int) $data['year'];
    $month = (int) $data['month'];
    $day = (int) $data['day'];
    $slug = $data['slug'];

    $date = "{$year}-{$month}-{$day}";

    $news = $wpdb->get_row(
        $wpdb->prepare(
            "SELECT
                DATE_FORMAT(post_date, %s) as `post_date`,
                `post_title`,
                `post_name`,
                `post_content`
             FROM {$wpdb->posts}
             WHERE
                `post_status` = 'publish' AND
                `post_type` = 'post' AND
                `post_name` = %s AND
                `post_date` BETWEEN %s AND %s + INTERVAL 1 DAY
             LIMIT 1
             ", '%Y-%m-%dT%TZ', $slug, $date, $date
        )
    );

    if ( $news ) {
        $news->post_title = qtranxf_translate( $news->post_title );
        $news->post_content = wpautop( qtranxf_translate( $news->post_content ) );
    } else { /* Cum să schimb codul răspunsului? */ }

    return [ 'data' => $news ];
}

Cum pot schimba codul răspunsului în această funcție?

1
Comentarii

Scrie antetul și oprește cererea. https://codex.wordpress.org/Function_Reference/wp_die include un argument pentru codul de răspuns.

jgraup jgraup
21 ian. 2017 23:01:02
Toate răspunsurile la întrebare 3
2
25

Puteți returna un obiect WP_Error în care definiți codul de stare. Iată un fragment din documentația API REST:

function my_awesome_func( $data ) {
    $posts = get_posts( array(
        'author' => $data['id'],
    ) );

    if ( empty( $posts ) ) {
        return new WP_Error( 'awesome_no_author', 'Autor invalid', array( 'status' => 404 ) );
    }

    return $posts[0]->post_title;
}

În cazul dvs., ați putea face ceva de genul:

return new WP_Error( 'page_does_not_exist', __('Pagina pe care o căutați nu există'), array( 'status' => 404 ) );
22 ian. 2017 04:41:23
Comentarii

Cum rezist tentației de a face ca toate apelurile API eșuate să returneze statusul 418 I'm a teapot?

Pat J Pat J
1 oct. 2021 20:19:05

@PatJ Verifică dacă metoda de request este BREW.

Walf Walf
3 iul. 2024 10:13:22
0
13

Cea mai simplă metodă este să faci asta:

return new WP_REST_Response(null, 404);

Notă: acesta este încă un răspuns JSON care conține null ca corp. Poți returna o structură de date mai utilă cu coduri de eroare/mesaje etc., sau să folosești filtrele de ieșire REST pentru a afișa un răspuns gol de tip text/plain.

21 aug. 2018 12:38:50
1
-1

Eu nu aș folosi:

return new WP_REST_Response(null, 404);

Am avut o problemă cu furnizorul de hosting când am folosit coduri de stare în această funcție. Cumva, setarea codului de stare a declanșat un răspuns mod_rewrite.

Mesaj: Acces refuzat cu codul 406 (faza 3). Testarea 'REQUEST_URI|REQUEST_HEADERS|REQUEST_HEADERS_NAMES|ARGS|ARGS_NAMES|REQUEST_BODY' împotriva '!@validateByteRange 0-31' este adevărată.

Poate să nu fie o problemă cu WordPress, dar folosind:

return new WP_REST_Response(null);

a rezolvat problema.

Las asta aici în caz că întâlnește cineva aceeași problemă.

12 mai 2021 05:32:49
Comentarii

Îmi pare rău, dar acest lucru nu răspunde deloc la întrebare. WP_REST_Response extinde clasa WP_HTTP_Response, iar al doilea argument al constructorului controlează codul de stare. Dacă îl omiți, nu schimbi codul de stare, care este problema în discuție.

Walf Walf
23 oct. 2023 06:48:46