Wordpress得到帖子的附件不起作用

时间:2013-05-18 18:07:05

标签: wordpress post attachment

我正在尝试检索特定帖子的所有附件,但暂时不起作用。这是代码:

    $args = array(
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'post_parent' => $id
    );
    $attachments = get_posts($args);

其中Id是我的帖子的ID。我也尝试过使用新的WP_Query(),但它也没有用。两种方式都返回空结果。

有没有人知道我在这里做错了什么?

由于

修改

好的,我想我知道会发生什么事。 将此参数用于get_posts函数时,它将返回通过特定帖子中的“添加媒体”按钮上传的图像。

所以基本上,让我们说在我的第一篇文章中,我已经上传了我将来发布的所有图片。如果我在第一篇文章中应用请求,我将检索所有图像,甚至是我在这篇文章中没有使用的图像。 如果我将此函数应用于其他帖子,因为我没有在此帖子中上传任何文件,该函数将检索一个空数组。

有谁知道如何检索特定帖子中使用的所有图片?那么不仅上传了,而且真正集成到帖子中或添加到自定义字段中?

由于

2 个答案:

答案 0 :(得分:0)

使用get_posts获取附件时,您需要将post_status设置为inherit。另外,请查看get_children功能:

$args = array(
    'post_type' => 'attachment',
    'post_mime_type' => 'image',
    'numberposts' => -1,
    'post_status' => 'inherit',
    'post_parent' => $id
);
$attachments = get_children( $args );

答案 1 :(得分:0)

案例:我使用ACF为我的画廊创建了一个转发器字段'resort_pics',其中有两个字段'picture_title'作为文本,而'picture'作为图片类型。

然后愉快地上传了100张照片,其中一些是相同的,因此我只单击了上传图库中的照片(我将使用“参考图像”一词)。

问题:然后有一个快乐的日子,我发现我们的api中缺少所有“参考图像”。

原因: 如“ Uriahs Victor”(https://developer.wordpress.org/reference/functions/get_attached_media/)的文档评论所述

  

重要的是,此函数仅返回附件   首先上传/添加到帖子中。将图片上传到帖子A(ID   1),然后稍后将该图像添加到帖子B(ID 2)中,   如果使用以下代码,则返回空数组:

$media = get_attached_media( 'image', 2 );
var_dump( $media );

真实原因: 所有这些问题的真正根源是关于“参考图像”的信息未存储在“ wp_posts”表中,但实际上存储在“ wp_postmeta”中,因此只需查询“ wp_posts”表或使用仅在其中查找的get_attached_media()同样,您也不会获得所有附件。

解决方案: 让我们以ID为$ postId的帖子为例,该帖子已定义 中继器-“ resort_pics”,中继器中带有图片“ picture”的字段。 (使用ACF插件创建)

首先以经典方式(也可以使用“ get_attached_media”)获取我们的帖子(度假村)的所有附件(包括图片/ pdf等):

$images = $wpdb->get_results("select ID,guid from wp_posts where post_parent = " . $postId . " and `post_type`= 'attachment'");

其中guid是附件的'url',让索引那些数组中键将是附件的ID的

$mapImages = [];
foreach ($images as $image) {
    $mapImages[$image->ID] = $image->guid;
}

现在我们有了所有的努力,但是缺少了所有引用的图像/文件。

让我们为我们的帖子(度假村)选择所有元继续。

$metas = $wpdb->get_results("select meta_key,meta_value from wp_postmeta where post_id=" . $postId);

并通过一个元键对其进行索引

$mapMetas = [];
foreach ($metas as $meta) {
    $mapMetas[$meta->meta_key] = $meta->meta_value;
}

让我们说我们的帖子($ postId)在'resort_pics'中有9个条目,并且有一个图像上传到了'picture'字段,那么$ mapMetas ['resort_pics']的值为8。 现在,中继器字段键如何存储在$ mapMetas数组中的方式实际上是一个:

'resort_pics_0_picture' -> itsPostId (5640 for example)
'resort_pics_1_picture' -> itsPostId (5641 for example)
'resort_pics_2_picture' -> itsPostId (5642 for example)
...
'resort_pics_8_picture' -> itsPostId (5648 for example)

知道了这一点,我们可以简单地获取“ resort_pics”的所有图像网址

for ($i = 0; $i < $mapMetas['resort_pics']; $i++) {
    $picture = [];
    $picture['name'] = $mapMetas['resort_pics_' . $i . '_picture_title'];
    $picture['url'] = $mapImages[$mapMetas['resort_pics_' . $i . '_picture']];
    $pictures[] = $picture;
}

您可能已经到了这一点,只需从$ mapMetas获取图像ID,然后使用它从$ mapImages获取图像URL。

让我们说“ resort_pics_1_picture”是“引用”的(不是直接上传的图片),我们的ID为“ 5641”,但是由于它实际上未与$ postID关联,而是与其他帖子ID关联。它在我们的$ mapImages数组中丢失了,所以让我们编辑一下这段代码。

for ($i = 0; $i < $mapMetas['resort_pics']; $i++) {
    $picture = [];
    $picture['name'] = $mapMetas['resort_pics_' . $i . '_picture_title'];
    $picture['url'] = getAttachmentOrItsReferenceUrl('resort_pics_' . $i . '_picture', $mapImages, $mapMetas);
    $pictures[] = $picture;
}

我们添加了一个 getAttachementOrItsReferenceUrl()方法,该方法将首先简单地检查我们是否已拥有该图像(全部已上传到该帖子),如果没有,将通过其帖子ID从“中”获取图像数据。 wp_posts的表格。

function getAttachmentOrItsReferenceUrl($code, $allAttachmentById, $allPostMetaByKey) {
    global $wpdb;
    $attachmentUrl = $allAttachmentById[$allPostMetaByKey[$code]];
    if($attachmentUrl === null && isset($allPostMetaByKey[$code]) && $allPostMetaByKey[$code] !== '') {
        $attachments = $wpdb->get_results("select ID,guid from wp_posts where ID = " . $allPostMetaByKey[$code]);
        foreach ($attachments as $image) {
            return $image->guid;
            break;
        }
    } else {
        return $attachmentUrl;
    }
    return "";
}

最终想法: 如果您知道自己的字段结构,则可以非常简单地建立其密钥 举个例子 在“ room_gallery”转发器内部的“ rooms”转发器,在“ image”图像字段内部。

'rooms_0_room_gallery_0_image'
--
$mapMetas['rooms'] - number of rooms
$mapMetas['rooms_' . $i . '_room_gallery'] - number of gallery images for room 
--
'rooms_' . $i . '_room_gallery_' . $j . '_image'

它有多重?并非如此,如果您像我一样,仅拥有少量参考图像,您甚至都不会感觉到。我们添加的全部内容是一个帖子的一个元查询,如果仅不引用任何图像,则对于每个引用的图像,还有一个查询,但是其对ID的查询应该很快。有很多方法可以减少负载,例如不对每个丢失的图像进行查询,而是在末尾使用“ where in(id1,id2 ..)”进行单个查询,以使单个查询获得全部结果,或在获取新的图像数据之后,通过ID将其存储在某个全局数组中,并在获取图像以获取下一个帖子之前检查此数组(因此,如果一个图像存储在200个帖子中,而您获取的所有图像将只进行1个查询) ,您明白我的意思了,因为即使没有该内容,这也是很长的篇幅:)

希望这对以后的所有人都有帮助。