Почему я не могу получить блок галереи из моего типа записи для отображения в моем WordPress API

#wordpress #rest #api #gallery

#wordpress #rest #API #Галерея

Вопрос:

В WordPress 5.1.1 у меня есть пользовательский тип сообщения под названием «еда». Он состоит из заголовка и блока галереи изображений.

В пользовательской конечной точке WordPress rest API я хочу получить URL-адреса изображений из галереи.

Перед отправкой данных я просматриваю сообщение и добавляю ACF к сообщению, и мысль, что тот же метод будет работать.

Пробовали следующие функции WordPress:

 get_post_gallery()
get_post_gallery_images()
  

Насколько я понимаю, более новый метод для блоков.

 get_post_galleries()
get_post_galleries_images()
  

Это мой цикл публикации. Метод ACF работает.

 function api_get_all_posts() {
    $args = array(
        'post_type' => array(
           'food',
          ),
        'post_status' => 'publish',
        'order' => 'DESC',
        'post_per_page' => '5'
    );
    $the_query = new WP_Query($args);
    $posts = $the_query->posts;

    if ( empty( $posts ) ) {
        return new WP_Error(array( 'status' => 404 ) );
    } else {
      foreach ($posts as $key => $post) {
          $ID = $post->ID;
          //Set AFC
          $posts[$key]->acf = get_fields($ID);  
          //Set images
          $posts[$key]->images = get_post_galleries_images( $ID );
     }
   }   
  return rest_ensure_response($posts);
}
  

Это JSON, который я отправляю во внешний интерфейс:

 [
 {
    "ID": 44,
    "post_author": "0",
    "post_date": "2019-04-08 22:21:48",
    "post_date_gmt": "2019-04-08 22:21:48",
    "post_content": "<!-- wp:gallery {"ids":    ["88","87","86",91],"columns":4} -->n<ul class="wp-block-gallery columns-4 is-cropped"><li class="blocks-gallery-item"><figure><img src="http://localhost/gwp/wp-content/uploads/2019/04/food-3-823x1024.jpg" alt="" data-id="88" data-link="http://localhost/gwp/food-3/" class="wp-    image-88"/></figure></li></ul>n<!-- /wp:gallery -->",
    "post_title": "Food test",
    "post_excerpt": "",
    "post_status": "publish",
    "comment_status": "closed",
    "ping_status": "closed",
    "post_password": "",
    "post_name": "fodd-test",
    "to_ping": "",
    "pinged": "",
    "post_modified": "2019-04-17 08:33:39",
    "post_modified_gmt": "2019-04-17 08:33:39",
    "post_content_filtered": "",
    "post_parent": 0,
    "guid": "http://localhost/gwp/?post_type=foodamp;#038;p=44",
    "menu_order": 0,
    "post_type": "food",
    "post_mime_type": "",
    "comment_count": "0",
    "filter": "raw",
    "acf": {
        "post_template": "food"
    },
    "images": []
}
]
  

Я вижу, что изображения есть, просмотрев «post_content», но он не может найти галерею. Он продолжает выдавать мне пустой массив в «изображениях»?

Есть предложения? спасибо за чтение.

Ответ №1:

Эти функции работают только со (старым) коротким кодом, используемым в классическом редакторе, поэтому они ничего не вернут с блоком галереи (т. Е. <!-- wp:gallery ... -->...<!-- /wp:gallery --> ):

  • get_post_gallery()
  • get_post_gallery_images()
  • get_post_galleries()
  • get_post_galleries_images()

И я не знаю эквивалентных функций для блока галереи; однако вы можете использовать эту пользовательскую функцию, чтобы получить аналогично тому, что get_post_galleries_images() вернет: (добавьте это в файл темы functions.php )

 function get_post_block_galleries_images( $post_id ) {
    $content = get_post_field( 'post_content', $post_id );
    $srcs = [];

    $i = -1;
    foreach ( parse_blocks( $content ) as $block ) {
        if ( 'core/gallery' === $block['blockName'] ) {
            $i  ;
            $srcs[ $i ] = [];

            preg_match_all( '#src=(['"])(. ?)1#is', $block['innerHTML'], $src, PREG_SET_ORDER );
            if ( ! empty( $src ) ) {
                foreach ( $src as $s ) {
                    $srcs[ $i ][] = $s[2];
                }
            }
        }
    }

    return $srcs;
}
  

А затем в вашем коде просто замените это:

 $posts[$key]->images = get_post_galleries_images( $ID );
  

с:

 $posts[$key]->images = get_post_block_galleries_images( $ID );
  

Я надеюсь, что этот ответ поможет вам и другим людям. 🙂