Можно ли изменить встроенное поле ответа WordPress REST API?

В моей установке WordPress я хочу добавить префикс к заголовкам наших сообщений, доступ к которым осуществляется через REST API.

В частности, я вызываю конечную точку /wp-json/wp/v2/posts, которая возвращает:

//....
"title": {
  "rendered": "A Title"
},
//....

Я намерен добавлять префикс каждый раз, когда вызывается REST API, во всех заголовках сообщений. Что-то вроде:

//....
"title": {
  "rendered": "[TEST] A Title"
},
//....

Мне кажется, что я должен добавить фильтр относительно вызова конечной точки REST. Я также рассматривал это, однако я не хочу добавлять новое поле или метаданные, просто изменить существующее. Это возможно как-то?

Вы должны создать свою собственную конечную точку и заблокировать стандартные - это будет меньше головной боли, поверьте мне...

Fresz 11.12.2020 17:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
2 462
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что вы не хотите создавать свою собственную «пользовательскую» конечную точку:

Я бы сохранил полученный вами запрос, так как он в формате JSON. тогда, возможно, используйте json_decode, который создает массив ответа.

Вы можете прокрутить массив и отредактировать то, что хотите отредактировать, перед его выводом.

Будет ли этого достаточно?

Спасибо за ваш ответ, однако я хочу сделать это на стороне сервера, а не в момент обслуживания. Необходимо, чтобы я изменил формат на конечной точке.

Nick Louloudakis 11.12.2020 13:29
Ответ принят как подходящий

Есть способ, но он какой-то хакерский.

Контроллеры/обработчики маршрутов довольно жесткие и WP_REST_Posts_Controller используют get_posts() и WP_Query, поэтому я не знаю разумного способа.

Но вы можете использовать фильтр rest_request_after_callbacks , используемый в WP_REST_Server::respond_to_request.

Вы можете сделать это следующим образом:

add_filter(
    'rest_request_after_callbacks',
    function( $response, array $handler, \WP_REST_Request $request ) {
        if ( is_get_posts_request( $request ) ) {
            mutate_get_posts_response( $response );
        }
        return $response;
    },
    10,
    3
);

function is_get_posts_request( \WP_REST_Request $request ) {
    return '/wp/v2/posts' === $request->get_route()
        && 'GET' === $request->get_method();
}

function mutate_get_posts_response( $response ) {
    if ( ! ( $response instanceof \WP_REST_Response ) ) {
        return;
    }
    $data = array_map(
        'prefix_post_response',
        $response->get_data()
    );
    $response->set_data( $data );
}

function prefix_post_response( array $post ) {
    if ( isset( $post['title']['rendered'] ) ) {
        $post['title']['rendered'] = '[TEST] ' . $post['title']['rendered'];
    }
    return $post;
}

Для каждого маршрута вам придется преобразовать ответ. К счастью, ответы следуют той же схеме.

Другие вопросы по теме