#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. Спасибо за ваш ответ, однако я хочу сделать это на стороне сервера, а не в точке обслуживания. Необходимо, чтобы я изменил формат в конечной точке.