WP REST API -- Cum să schimbi codul de stare HTTP al răspunsului?
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?

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 ) );

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
.

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ă.
