В моей установке WordPress я хочу добавить префикс к заголовкам наших сообщений, доступ к которым осуществляется через REST API.
В частности, я вызываю конечную точку /wp-json/wp/v2/posts
, которая возвращает:
//....
"title": {
"rendered": "A Title"
},
//....
Я намерен добавлять префикс каждый раз, когда вызывается REST API, во всех заголовках сообщений. Что-то вроде:
//....
"title": {
"rendered": "[TEST] A Title"
},
//....
Мне кажется, что я должен добавить фильтр относительно вызова конечной точки REST. Я также рассматривал это, однако я не хочу добавлять новое поле или метаданные, просто изменить существующее. Это возможно как-то?
Я предполагаю, что вы не хотите создавать свою собственную «пользовательскую» конечную точку:
Я бы сохранил полученный вами запрос, так как он в формате JSON. тогда, возможно, используйте json_decode, который создает массив ответа.
Вы можете прокрутить массив и отредактировать то, что хотите отредактировать, перед его выводом.
Будет ли этого достаточно?
Спасибо за ваш ответ, однако я хочу сделать это на стороне сервера, а не в момент обслуживания. Необходимо, чтобы я изменил формат на конечной точке.
Есть способ, но он какой-то хакерский.
Контроллеры/обработчики маршрутов довольно жесткие и 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;
}
Для каждого маршрута вам придется преобразовать ответ. К счастью, ответы следуют той же схеме.
Вы должны создать свою собственную конечную точку и заблокировать стандартные - это будет меньше головной боли, поверьте мне...