提取并显示附加到后期扩展的实际第一个图像。

时间:2010-09-17 作者:NetConstructor.com

我有一个有趣的问题,我相信这里有人能解决。我浏览了大量不同的插件和代码片段,以寻找提取与帖子关联的主图像的完美代码。

如果使用了新的WP 3.0特色图像元素,那么当然没有问题,但在很多情况下,帖子可能没有指定“特色图像”。在这些情况下,如果您要使用以下标准代码:

<?php echo the_post_thumbnail( array(200,200) ); ?>
在模板中。。。不会显示任何内容。

对于这种情况,我正在寻找完美的解决方案。从本质上讲,我需要的是在\\u post\\u缩略图不存在时能够进行一种类型的“故障切换”,但我还需要能够像使用\\u post\\u缩略图中的代码一样设置图像大小。

我认为这种“故障切换”应该有两个步骤:

检查此帖子的“媒体库”,找到排序顺序最高的图像(或添加的帖子父级,如下面的插件所示)

  • 如果未设置排序顺序或为空,则从帖子内容中提取第一幅图像

    因此,概括一下:我希望有人能够提供一个干净的/组合的函数,允许我回显单个函数以及可以实现上述所有三个目标的大小变量,而不是执行一系列if/then调用来检查帖子缩略图是否存在,然后对下面的代码进行检查。

    下面是上面提到的代码位:


    FOR #1: Get the First Image based off the order from the Media Gallery:此代码首先在wp\\U posts数据库表中查找具有与当前帖子匹配的“post\\u parent”ID的任何附件,然后对于具有多个图像附件的帖子,返回其“menu\\u order”字段设置为“1”的附件。如果没有图像附件与当前帖子ID匹配,插件将返回“false”。

    // AUTOMATICALLY EXTRACT IMAGES BASED ON ASSOCIATED GALLERY ORDER
    // THIS CODE EXTRACTS THE FIRST IMAGE BASED ON THE ORDER IN THE MEDIA GALLERY
    // PLUGIN FROM: http://mekosh.org/projects/ordered-thumbnails
       function ordered_thumbnails( $display = \'true\', $class=\'\' ) {
        global $post;
        // get all image attachments for this post
        $images = get_children( array( \'post_type\' => \'attachment\', \'post_parent\' => $post->ID, \'post_mime_type\' => \'image\', order=>"asc" ) );
        // if the post has image attachments
        if( $images !== false ) {
            // find the image in position 1
            foreach($images as $i) {
                if ( $i->menu_order == 1 ) {
                    $img_id = $i->ID;
                }
            }
            // if the images were unordered
            if ( $img_id == \'\' ) {
                $i = array_slice( $images, 0, 1 );
                $img_id = $i[0]->ID;
            }
            // get image data
            $image = wp_get_attachment_image_src( $img_id, \'thumbnail\' );
            $result = array(
                \'url\'       => $image[0],
                \'width\' => $image[1],
                \'height\'    => $image[2]
            );
            // should the image be displayed or should data be returned as an array?
            if ( $display == \'true\' ) {
                return _e( \'<img src="\'.$result[\'url\'].\'" width="\'.$result[\'width\'].\'" height="\'.$result[\'height\'].\'" class="\'.$class.\'" />\' );
            } else {
                return $result;
            }
        } else {
            // post does not have any image attachments
            return (bool) false;
        }
       }
    // create template tag "ordered_thumbnails"
       add_action( \'ordered_thumbnails\', \'ordered_thumbnails\', 2 );
    
    <小时>

    FOR #2: Extract the first image from the post content

    // THIS CODE GETS THE FIRST IMAGE EXTRACTED DIRECTLY FROM THE POST CONTENT
    
        function bm_extract_string($start, $end, $original) {
        $original = stristr($original, $start);
        $trimmed = stristr($original, $end);
        return substr($original, strlen($start), -strlen($trimmed));
        }
        function getFirstImage() {
        $content = get_the_content();
        $pic_string = bm_extract_string(\'src="\',\'" \',$content);
        $imagesize = getimagesize($pic_string);
        list($width, $height, $type, $attr) = getimagesize($pic_string);
        $link = get_permalink();
        $title = get_the_title($post->post_title);
        echo \'<a href="\'.$link.\'" style="background:url(\'.$pic_string.\'); display:block; width:\'.$width.\'px; height:\'.$height.\'px;" title="\'.$title.\'"></a>\';
        }
    

  • 4 个回复
    最合适的回答,由SO网友:NetConstructor.com 整理而成

    这是我的问题的解决方案,供感兴趣的人参考。

    在您的功能中包括此功能。php文件

    require_once(\'custom/extract-post-thumbnail.php\');
        $extract_img = new extract_post_image();
        add_filter( \'post_thumbnail_html\', array(&$extract_img, \'get_post_image\'),1,5 );
    
    创建一个新文件并将其命名为“extract post thumbnail.php”,将其放置到名为“custom”的文件夹中,并将其放置在主题功能所在的同一目录中。php文件位于。最后,将下面的代码传递到此文件中。

    <?php
    class extract_post_image {
        public $html;
        public $post_id;
        public $post_image_id;
        public $size;
        public $attr;
        public function extract_post_image()  {
        }
        public function get_post_image ($html,$post_id, $post_image_id, $size, $attr) {
    $this->html = $html;
            $this->post_id = $post_id;
            $this->post_image_id = $post_image_id;
            $this->size = $size;
            $this->attr = $attr;
        if ($this->html == \'\') {
             $this->post_image_id = $this->get_post_image_id ();
             if ($this->post_image_id) {
               do_action( \'begin_fetch_post_thumbnail_html\', $this->post_id, $this->post_image_id, $this->size ); 
            $this->html = wp_get_attachment_image( $this->post_image_id, $this->size, false, $this->attr );
            do_action( \'end_fetch_post_thumbnail_html\', $this->post_id, $this->post_image_id, $this->size );
        } else {
            $this->html = $this->get_image_in_content ();
        }
        }
        return $this->html;
    }
    public function get_post_image_id () {
        $images = get_children(
        array(
            \'post_parent\' => $this->post_id,
            \'post_status\' => \'inherit\',
            \'post_type\' => \'attachment\',
            \'post_mime_type\' => \'image\',
            \'order\' => \'ASC\',
            \'orderby\' => \'menu_order\',
            \'numberposts\' => 1
            )
        );
        if ($images) {
            foreach ($images as $img) {
            $img_id = $img->ID;
            }
            return $img->ID;
            } else {
               return NULL;
            }
    }
    public function remote_file_exists($image) {
        if ( @file($image)) {
            return true;
        }
        return false;
    }
    public function get_image_in_content () {
        $my_post = get_post($this->post_id);
        preg_match_all( \'|<img.*?src=[\\\'"](.*?)[\\\'"].*?>|i\', $my_post->post_content, $matches );
        if ( isset( $matches ) ) {
                $image = $matches[1][0];
        if ( $matches[1][0] && $this->remote_file_exists($image) ) {
                $altpattern = \'/alt=([\\\'"])?(.*?)\\\\1/\';
                preg_match($altpattern, $matches[0][0], $m);
                $alt = $m[2];
                $default_attr = array(
                \'src\'   => $image,
                \'class\' => "attachment-$size",
                \'alt\'   => $alt
            );
                $this->attr = wp_parse_args($this->attr, $default_attr);
            $attr = array_map( \'esc_attr\', $this->attr );
            $attributes = \'\';
            foreach ( $this->attr as $name => $value ) {
                $attributes .= " $name=" . \'"\' . $value . \'"\';
            }
               $imgwh = getimagesize($image);
               $imgsize = image_constrain_size_for_editor($imgwh[0], $imgwh[1], $this->size);
               $wh = image_hwstring($imgsize[0], $imgsize[1]);
               $this->html = \' <img \'.$attributes.\' \'.$wh.\' />\';
                    return $this->html;
            }
            } else {
            return NULL;
            }
    }
    }
    ?>
    

    SO网友:Rarst

    我建议退房Get the Image 插件。基本上,它是一个单一的功能,可以作为灵活且可配置的包装器,通过不同的方法(帖子元字段、特色图片、附加图片、帖子正文中的图片)挖掘帖子中的图片。

    SO网友:Chris_O

    @NetConstructor,

    这个函数不会解决你所有的问题,但我认为它会有所帮助。它获取附加到帖子的第一个图像,并将中等大小的图像添加到the_content 如果未设置排序顺序,则将获得排序顺序为“0”的图像。它不会从帖子内容中提取任何内容,如果图像位于帖子内容中,则会显示2次。

    我把它用于一个在帖子中插入图像时遇到问题的客户。使用此功能,他只需单击“添加媒体”按钮,上传图像并单击“保存”,而无需“插入”。

    function the_image($size = \'medium\' , $class = ”){
    global $post;
    
    //setup the attachment array
    $att_array = array(
    \'post_parent\' => $post->ID,
    \'post_type\' => \'attachment\',
    \'post_mime_type\' => \'image\',
    \'order_by\' => \'menu_order\'
    );
    
    //get the post attachments
    $attachments = get_children($att_array);
    
    //make sure there are attachments
    if (is_array($attachments)){
    //loop through them
    foreach($attachments as $att){
    //find the one we want based on its characteristics
    if ( $att->menu_order == 0){
    $image_src_array = wp_get_attachment_image_src($att->ID, $size);
    
    //get url – 1 and 2 are the x and y dimensions
    $url = $image_src_array[0];
    $caption = $att->post_excerpt;
    $image_html = \'<img src="%s" alt="%s" />\';
    
    //combine the data
    $html = sprintf($image_html,$url,$caption,$class);
    
    //echo the result
    echo $html;
    }
    }
    }
    }
    

    SO网友:me-too

    您可以查看有用的代码片段here 我发现它们对从帖子中取出第一张图片很有用。

    结束

    相关推荐