API REST de WP -- ¿Cómo cambiar el código de estado de respuesta HTTP?

21 ene 2017, 21:08:50
Vistas: 23.8K
Votos: 16

Tengo un endpoint personalizado donde quiero cambiar el estado de respuesta HTTP a 404 en ciertos escenarios (por ejemplo, cuando el post no existe). ¿Cómo puedo hacer eso? Aquí hay un ejemplo del endpoint personalizado:

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 { /* ¿Cómo cambiar el código de respuesta? */ }

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

¿Cómo puedo cambiar el código de respuesta en esta función?

1
Comentarios

Escribe la cabecera y termina la solicitud. https://codex.wordpress.org/Function_Reference/wp_die incluye un argumento para el código de respuesta.

jgraup jgraup
21 ene 2017 23:01:02
Todas las respuestas a la pregunta 3
2
25

Puedes devolver un objeto WP_Error donde defines el código de estado. Aquí hay un fragmento de la documentación de la 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 inválido', array( 'status' => 404 ) );
    }

    return $posts[0]->post_title;
}

En tu caso podrías hacer algo como:

return new WP_Error( 'page_does_not_exist', __('La página que buscas no existe'), array( 'status' => 404 ) );
22 ene 2017 04:41:23
Comentarios

¿Cómo resisto la tentación de hacer que todas las llamadas API fallidas devuelvan el estado 418 I'm a teapot?

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

@PatJ Verifica si el método de la solicitud es BREW.

Walf Walf
3 jul 2024 10:13:22
0
13

La forma más sencilla es hacer esto:

return new WP_REST_Response(null, 404);

Nota: esto sigue siendo una respuesta JSON que contiene null como cuerpo. Puedes devolver una estructura de datos más útil con códigos de error/mensajes, etc., o conectar los filtros de salida REST para mostrar una respuesta en blanco con text/plain.

21 ago 2018 12:38:50
1
-1

No usaría:

return new WP_REST_Response(null, 404);

Tuve un problema con el proveedor de hosting cuando usé códigos de estado en esta función. De alguna manera, establecer el código de estado activó una respuesta de mod_rewrite.

Mensaje: Acceso denegado con código 406 (fase 3). La prueba 'REQUEST_URI|REQUEST_HEADERS|REQUEST_HEADERS_NAMES|ARGS|ARGS_NAMES|REQUEST_BODY' contra '!@validateByteRange 0-31' es verdadera.

Puede que no sea un problema con WordPress, pero usar:

return new WP_REST_Response(null);

resolvió el problema.

Lo dejo aquí por si alguien se encuentra con el mismo problema.

12 may 2021 05:32:49
Comentarios

Lo siento, pero esto no responde a la pregunta en absoluto. WP_REST_Response extiende la clase WP_HTTP_Response, y el segundo argumento del constructor controla el código de estado. Si lo omites, no estás cambiando el código de estado, que es el problema en cuestión.

Walf Walf
23 oct 2023 06:48:46