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

#php #wordpress #api #rest

#php #wordpress #API #отдых

Вопрос:

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

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

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

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

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

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

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

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

Ответ №1:

Есть способ, но он довольно хитрый.

Контроллеры / обработчики маршрутов довольно жесткие и 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()
        amp;amp; '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;
}
 

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

Ответ №2:

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

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

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

Этого будет достаточно?

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

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