WP REST API -- Come cambiare il codice di stato della risposta HTTP?
Ho un endpoint personalizzato dove voglio cambiare lo stato della risposta HTTP a 404 in determinati scenari (ad esempio quando il post non esiste). Come posso farlo? Ecco un esempio di endpoint personalizzato:
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 { /* Come cambiare il codice di risposta? */ }
return [ 'data' => $news ];
}
Come posso cambiare il codice di risposta in questa funzione?

Puoi restituire un oggetto WP_Error
in cui definisci il codice di stato. Ecco uno snippet tratto dalla documentazione della REST API:
function my_awesome_func( $data ) {
$posts = get_posts( array(
'author' => $data['id'],
) );
if ( empty( $posts ) ) {
return new WP_Error( 'awesome_no_author', 'Autore non valido', array( 'status' => 404 ) );
}
return $posts[0]->post_title;
}
Nel tuo caso potresti fare qualcosa come:
return new WP_Error( 'page_does_not_exist', __('La pagina che stai cercando non esiste'), array( 'status' => 404 ) );

Il modo più semplice per farlo è:
return new WP_REST_Response(null, 404);
Nota: questa è ancora una risposta JSON che contiene null
come corpo. Puoi restituire una struttura dati più utile con codici di errore/messaggi, ecc., oppure agganciarti ai filtri di output REST per restituire una risposta vuota in formato text/plain
.

Non utilizzerei:
return new WP_REST_Response(null, 404);
Ho avuto un problema con il provider di hosting quando ho utilizzato i codici di stato in questa funzione. In qualche modo l'impostazione del codice di stato ha attivato una risposta di mod_rewrite.
Messaggio: Accesso negato con codice 406 (fase 3). Il test 'REQUEST_URI|REQUEST_HEADERS|REQUEST_HEADERS_NAMES|ARGS|ARGS_NAMES|REQUEST_BODY' su '!@validateByteRange 0-31' è vero.
Potrebbe non essere un problema con WordPress, ma utilizzando:
return new WP_REST_Response(null);
ho risolto il problema.
Lo lascio qui nel caso qualcuno incontri lo stesso problema.
