Я создаю сайт Gatsby, который использует исходные тексты WP-интерфейса с GraphQL. У меня проблемы с подготовкой данных для отправки через API.
У меня есть специальный пост, который называется тематические исследования. В этих примерах есть категории, избранные изображения и несколько полей ACF, к которым мне нужно иметь доступ через REST. Я создал пользовательскую конечную точку API REST для своих примеров:
/************************************************
* Case Study REST API Endpoint
* *************************************************/
function caseStudyEndpoint( $request_data ) {
// setup query argument
$args = array(
'post_type' => 'case-study',
'posts_per_page' => -1
);
// get posts
$posts = get_posts($args);
// add custom field data to posts array
foreach ($posts as $key => $post) {
$posts[$key]->acf = get_fields($post->ID);
$posts[$key]->link = get_permalink($post->ID);
$posts[$key]->image = get_the_post_thumbnail_url($post->ID);
$posts[$key]->categories = wp_get_post_categories($post->ID);
}
return $posts;
}
// register the endpoint;
add_action( 'rest_api_init', function () {
register_rest_route( 'case_study_endpoint/v2', '/case-studies/', array(
'methods' => 'GET',
'callback' => 'caseStudyEndpoint',
)
);
});
Через эту конечную точку я могу легко получить доступ ко всем полям, включая избранные изображения, ACF и категории.
Кроме того, у меня есть блок ACF под названием «Связанные тематические исследования», в котором есть ряд полей отношений, которые связаны с тематическими исследованиями. Из этого блока я также могу получить ACF для соответствующего тематического исследования, а также категории, изображения и тому подобное. Я могу сделать это sh благодаря этому рекурсивному фрагменту.
/**
* ACF, Image and Category Data in Post Object Response
*/
$types = ['post', 'page', 'case-study'];
foreach ( $types as $type ) {
add_filter( 'acf/rest_api/'.$type.'/get_fields', function( $data, $response ) use ( $types ) {
if ( $response instanceof WP_REST_Response ) {
$data = $response->get_data();
}
array_walk_recursive( $data, 'deepIncludeFields', $types );
return $data;
}
, 10, 3 );
}
function deepIncludeFields( &$item, $key, $postTypes ) {
if ( isset( $item->post_type ) && in_array( $item->post_type, $postTypes ) ) {
$item->acf = get_fields( $item->ID );
$item->image = get_the_post_thumbnail_url($item->ID);
$item->categories = wp_get_post_categories($item->ID, array( 'fields' => 'names' ));
}
}
Таким образом, у меня есть возможность получить все мои данные для тематического исследования путем доступа к конечной точке Case Study, и я также могу рекурсивно извлечь все данные из поля отношений при использовании моего обычная конечная точка WordpressPage.
Однако в рамках самих тематических исследований я также надеюсь получить блок «Связанные тематические исследования» и получить рекурсивный доступ к данным для других тематических исследований. Но это не работает.
Это данные, к которым я могу получить доступ для блока «Связанные тематические исследования» в моем запросе WordpressPage из GraphQL:
Как вы можно увидеть, ACF, изображения и категории там.
Но когда я пытаюсь получить доступ к тому же блоку из Case Study, используя мой запрос allWordpressCaseStudyEndpointCaseStudies, я не вижу те же результаты.
Там нет ни ACF, ни изображений, ни категорий.
Я знаю, что я очень близок, и может быть решение использовать другой фильтр WP для моей рекурсивной функции ACF или что-то в этом роде. По существу, рекурсия ACF отсутствует в конечной точке пользовательского конкретного примера.
Я использую ACF для REST API на Wordpress.
Надеюсь, все это имеет смысл. Дайте мне знать, если у вас есть какие-либо отзывы.