WP REST API -- Как изменить код статуса HTTP-ответа?

21 янв. 2017 г., 21:08:50
Просмотры: 23.8K
Голосов: 16

У меня есть пользовательская конечная точка, где я хочу изменить статус HTTP-ответа на 404 в определенных сценариях (например, когда пост не существует). Как это можно сделать? Вот пример пользовательской конечной точки:

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 { /* Как изменить код ответа? */ }

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

Как я могу изменить код ответа в этой функции?

1
Комментарии

Напишите заголовок и завершите запрос. https://codex.wordpress.org/Function_Reference/wp_die включает аргумент для кода ответа.

jgraup jgraup
21 янв. 2017 г. 23:01:02
Все ответы на вопрос 3
2
25

Вы можете вернуть объект WP_Error, в котором определите код состояния. Вот пример из документации REST API:

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

    if ( empty( $posts ) ) {
        return new WP_Error( 'awesome_no_author', 'Неверный автор', array( 'status' => 404 ) );
    }

    return $posts[0]->post_title;
}

В вашем случае можно сделать так:

return new WP_Error( 'page_does_not_exist', __('Страница, которую вы ищете, не существует'), array( 'status' => 404 ) );
22 янв. 2017 г. 04:41:23
Комментарии

Как же мне удержаться от соблазна сделать так, чтобы все неудачные вызовы API возвращали статус 418 I'm a teapot?

Pat J Pat J
1 окт. 2021 г. 20:19:05

@PatJ Проверь, является ли метод запроса BREW.

Walf Walf
3 июл. 2024 г. 10:13:22
0
13

Самый простой способ сделать это:

return new WP_REST_Response(null, 404);

Примечание: это всё ещё JSON-ответ с телом, содержащим null. Вы можете вернуть более полезную структуру данных с кодами ошибок, сообщениями и т.д., или использовать фильтры вывода REST, чтобы вернуть пустой ответ в формате text/plain.

21 авг. 2018 г. 12:38:50
1
-1

Я бы не использовал:

return new WP_REST_Response(null, 404);

У меня возникла проблема с хостинг-провайдером, когда я использовал коды статуса в этой функции. По какой-то причине установка кода статуса вызывала ответ mod_rewrite.

Message: Access denied with code 406 (phase 3). Test 'REQUEST_URI|REQUEST_HEADERS|REQUEST_HEADERS_NAMES|ARGS|ARGS_NAMES|REQUEST_BODY' against '!@validateByteRange 0-31' is true.

Возможно, это не проблема WordPress, но использование:

return new WP_REST_Response(null);

решило проблему.

Оставлю это здесь на случай, если кто-то столкнётся с такой же проблемой.

12 мая 2021 г. 05:32:49
Комментарии

Извините, но это вообще не отвечает на вопрос. WP_REST_Response расширяет класс WP_HTTP_Response, и второй аргумент конструктора управляет кодом состояния. Если вы его опустите, вы не изменяете код состояния, что и является текущей проблемой.

Walf Walf
23 окт. 2023 г. 06:48:46