ACF, Категории и Избранные изображения для пользовательских сообщений / отношений в WP REST API - PullRequest
2 голосов
/ 14 марта 2020

Я создаю сайт 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:

enter image description here

Как вы можно увидеть, ACF, изображения и категории там.

Но когда я пытаюсь получить доступ к тому же блоку из Case Study, используя мой запрос allWordpressCaseStudyEndpointCaseStudies, я не вижу те же результаты.

enter image description here

Там нет ни ACF, ни изображений, ни категорий.

Я знаю, что я очень близок, и может быть решение использовать другой фильтр WP для моей рекурсивной функции ACF или что-то в этом роде. По существу, рекурсия ACF отсутствует в конечной точке пользовательского конкретного примера.

Я использую ACF для REST API на Wordpress.

Надеюсь, все это имеет смысл. Дайте мне знать, если у вас есть какие-либо отзывы.

...