从帖子内容中获取第一张图片(例如:热链接图片)


10

我直接从Codex使用此代码。

function echo_first_image ($postID)
{                   
    $args = array(
    'numberposts' => 1,
    'order'=> 'ASC',
    'post_mime_type' => 'image',
    'post_parent' => $postID,
    'post_status' => null,
    'post_type' => 'attachment'
    );

    $attachments = get_children( $args );

    //print_r($attachments);

    if ($attachments) {
        foreach($attachments as $attachment) {
            $image_attributes = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' )  ? wp_get_attachment_image_src( $attachment->ID, 'thumbnail' ) : wp_get_attachment_image_src( $attachment->ID, 'full' );

            echo '<img src="'.wp_get_attachment_thumb_url( $attachment->ID ).'" class="current">';

        }
    }
}

我这样称呼它 echo_first_image ($post->ID);

该函数确实会调用,但没有任何输出……据我所知 $attachments

我使用的帖子中确实有一张图片。它不是帖子中的特色图片,也不是在画廊中。

我是在做错什么,还是代码最初有问题?

Answers:


22

如果要显示插入到内容中的图像(例如,热链接图像),则必须使用类似以下功能(源)

添加functions.php

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  $first_img = $matches [1] [0];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

然后放置<?php echo catch_that_image() ?>在要显示图像的位置。

注意:无法将仅放置在您的内容中的热链接图像设置为“特色图像”,这是WordPress的独特功能。


是的,我已经看到了周围的代码...似乎有点hack,您会认为会有一种“ WordPress”方式...我想知道为什么当编解码器说您可以做时为什么需要使用preg_match如我上面发布的。老实说,这是我的问题。我发布的代码错误吗?...比尝试真正发挥作用还要多。但是,谢谢,我最终可能不得不使用它。我不明白“不能将仅放置在您的内容中的图像设置为精选图像”的意义。这会在某种程度上影响这一点吗?我只是想显示帖子中的第一张图片,而不是精选图片。
byronyasgur,2012年

将图片链接置于您的帖子/页面内容和附加图片之间有很大的区别。您可以附加图像而不显示任何图像。Codex的示例是将文件附加到您的帖子/页面上,无法通过链接将图像放置在内部,而且热链接不是WP如果没有PHP正则表达式将无法处理的功能。
戴安娜(Diana)

关于COdex参考:您可以看到doc是在函数名之后调用的get_childre,附件是子帖子,因此此示例仅适用于附件内容。
戴安娜(Diana)

是的,我知道我可以在不插入图像的情况下附加图像,这一点很清楚...但是我看不到如何在不附加图像的情况下插入图像...当我按上载/插入时,从计算机上载文件然后按插入到帖子中并进行更新,然后转到媒体库库,它告诉我上传的图像已“附加”到帖子中?...还是我们在这里谈论语义,因为我了解您在说的那部分代码仅适用于附加图像。
byronyasgur,2012年

1
您可以在任何地方热链接图像文件。单击“插入图像/媒体”时,有一个“来自URL”选项卡,您可以在其中通知图像URL,即imageshack服务。正则表达式将能够获取此图像(“按原样”),但是WP将无法将该图像用作“特色图像”。
戴安娜

3

我建议两种方法:

使用插件

我会考虑使用“ 获取图像”插件,因此您可以执行以下操作:

$args = array(
    'post_id' => <id>
    'image_scan' => true
);
get_the_image($args);

上面将尝试按此顺序执行操作:

  1. 寻找帖子缩略图
  2. 查找第一个附加的图像
  3. 扫描帖子内容以查找插入的图像。

建立主题支持

但是,我在插件中使用一个函数来实现上面列表的前两个项目。

function gpi_find_image_id($post_id) {
    if (!$img_id = get_post_thumbnail_id ($post_id)) {
        $attachments = get_children(array(
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'numberposts' => 1,
            'post_mime_type' => 'image'
        ));
        if (is_array($attachments)) foreach ($attachments as $a)
            $img_id = $a->ID;
    }
    if ($img_id)
        return $img_id;
    return false;
}

您可以对其进行调整,使其也与Diana代码段中的第三项匹配:

function find_img_src($post) {
    if (!$img = gpi_find_image_id($post->ID))
        if ($img = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches))
            $img = $matches[1][0];
    if (is_int($img)) {
        $img = wp_get_attachment_image_src($img);
        $img = $img[0];
    }
    return $img;
}

只需将这两个函数粘贴在functions.php文件中,然后在循环中使用它们即可,例如:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>

主题是要在商业上出售的,所以我不想告诉最终用户他们必须安装插件,但是谢谢。
byronyasgur,2012年

@byronyasgur编辑了答案,以澄清我给了您两个解决方案。您无需安装插件即可跟随第二个插件。
vmassuchetto 2012年

2

该代码似乎非常安全。就像您说的那样,您没有附加任何图片到后。

考虑进入媒体管理面板并将图像附加到该帖子。

或者,使用正则表达式删除其中的帖子内容。


我对“附加”的含义有误解吗?....我确实在帖子中有图片...单击“添加到帖子”时没有附加图片吗?
byronyasgur,2012年

1
从您的问题看来,您键入的html代码链接到不一定由wp附加的图像。
pcarvalho 2012年

1

我知道这是一个非常老的问题,但是我将我的答案放在这里,因为大多数投票的答案不适合PHP新手。

preg_match不是在PHP中解析HTML的好方法,因为preg_match用于正则表达式,而HTML不是正则表达式。

我们可以改用DOM。

function firstImg($html){
  $dom = new DOMDocument;
  $dom->loadHTML($html);
  $images = $dom->getElementsByTagName('img');
  foreach ($images as $image) {
    return $image->getAttribute('src');
  }
  return false;
}

使用DOM真的很好,因为除了获取第一张图片之外,您还可以做更多的事情,这是解析html的正确方法。

我希望我可以回答使用wordpress函数(来自CODEX和core的函数)以获取第一张图片的问题,但这也是我正在处理的问题。

这不是每种情况的答案!

考虑图像尺寸优化的情况。在这种情况下,您不能仅使用此代码,因为帖子可以包含任何大小的图像。


0

该代码对我有用:

function get_first_image( $post_id ) {
    $attach = get_children( array(
        'post_parent'    => $post_id,
        'post_type'      => 'attachment',
        'post_mime_type' => 'image',
        'order'          => 'DESC',
        'numberposts'    => 1
    ) );
    if( is_array( $attach ) && is_object( current( $attach ) ) ) {
        return current( $attach )->guid;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.