WordPress自定义主题中get_post_galleries_images返回空数组问题求助
解决get_post_galleries_images返回空数组的问题
这个坑我之前踩过!get_post_galleries_images()这个函数有个很容易忽略的限制——它只识别文章内容里的传统[gallery]短代码,如果你的文章是用Gutenberg块编辑器添加的图库(也就是现在WordPress默认的图库块),它根本读不到这些图片,所以才会返回空数组,哪怕文章里明明有5张图。
下面给你两种针对性的解决方案,还有兼容新旧图库的通用写法:
1. 针对Gutenberg块编辑器的图库获取
块编辑器的图库是用JSON格式的块结构存在文章内容里的,我们可以用parse_blocks()函数解析出这些块,再提取图片:
<?php $post = get_page_by_title('aaa', OBJECT, 'post'); if ($post) { $gallery_images = array(); // 解析文章中的所有块 $blocks = parse_blocks($post->post_content); foreach ($blocks as $block) { // 定位到核心图库块 if ($block['blockName'] === 'core/gallery') { // 遍历图库中的所有图片ID foreach ($block['attrs']['ids'] as $image_id) { // 获取指定尺寸的图片URL,这里用'full'可以换成'thumbnail'等自定义尺寸 $image_url = wp_get_attachment_image_url($image_id, 'full'); if ($image_url) { $gallery_images[] = $image_url; } } } } echo '<ul>'; if (empty($gallery_images)) { echo "Empty gallery $post->ID"; } else { foreach ($gallery_images as $image_url) { // 用esc_url确保URL安全 echo '<li><img src="' . esc_url($image_url) . '"></li>'; } } echo '</ul>'; } ?>
2. 兼容短代码和块编辑器的通用方法
如果你的网站同时存在旧的短代码图库和新的块图库,可以把两种获取方式结合起来,确保所有图片都能被抓取到:
<?php $post = get_page_by_title('aaa', OBJECT, 'post'); if ($post) { $gallery_images = array(); // 先尝试获取传统短代码图库的图片 $shortcode_galleries = get_post_galleries_images($post->ID); if (!empty($shortcode_galleries)) { foreach ($shortcode_galleries as $gallery) { $gallery_images = array_merge($gallery_images, $gallery); } } // 再获取块编辑器中的图库图片 $blocks = parse_blocks($post->post_content); foreach ($blocks as $block) { if ($block['blockName'] === 'core/gallery' && isset($block['attrs']['ids'])) { foreach ($block['attrs']['ids'] as $image_id) { $image_url = wp_get_attachment_image_url($image_id, 'full'); // 避免重复添加同一张图片 if ($image_url && !in_array($image_url, $gallery_images)) { $gallery_images[] = $image_url; } } } } echo '<ul>'; if (empty($gallery_images)) { echo "Empty gallery $post->ID"; } else { foreach ($gallery_images as $image_url) { echo '<li><img src="' . esc_url($image_url) . '"></li>'; } } echo '</ul>'; } ?>
额外需要排查的点
- 先确认
get_page_by_title('aaa')拿到的是不是你真正想要的文章,有时候标题重复会导致获取到错误的post,可以加一行var_dump($post)来验证post的ID和内容是否正确。 - 如果你的图库是用第三方插件添加的,那上面两种方法都不管用,需要去查插件的官方文档,用插件提供的专属函数来获取图片。
内容的提问来源于stack exchange,提问作者Mayank Arora
相关产品推荐
相关产品推荐

