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

时间:2012-07-31 作者:byronyasgur

我直接从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

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

我是做错了什么,还是代码有什么问题?

4 个回复
最合适的回答,由SO网友:Diana 整理而成

如果你愿意display an image that is inserted into your content (例如,热链接图像),必须使用如下函数(source):

外接程序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() ?> 显示图像的位置。

注意:刚放在内容中的热链接图像不能设置为特色图像,即bultin WordPress\'feature。

SO网友:vmassuchetto

我建议两种方式:

使用插件时,我会考虑使用Get The Image 插件,因此您可以执行以下操作:

$args = array(
    \'post_id\' => <id>
    \'image_scan\' => true
);
get_the_image($args);
上述人员将尝试按以下顺序进行操作:

查找帖子缩略图查找第一个附加图像扫描帖子内容以查找插入的图像

    在您的主题中构建支持plugin 实现上述列表的前两项。

    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; ?>
    

SO网友:pcarvalho

代码似乎非常安全。就像你说的,你没有任何形象attached 去邮局。

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

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

SO网友:wp-mario.ru

此代码适用于我:

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;
    }
}

结束

相关推荐

Host Images from Link

最近,我从Blogger导入了我的所有帖子,因此帖子中显示的所有图片目前都位于Blogger的服务器上。我想将所有这些图像导入/放入我的服务器,并自动更改每个图像的每个链接。因为有这么多的图片和这么多的帖子,我不能一个接一个地单独去。请指导我如何做到这一点,或者将我重定向到一个插件来完成这项工作。