在POST保存/更新时,检索POST中的第一张图像并将其设置为特色图像

时间:2012-03-14 作者:Gixty

我需要为我发布的每个帖子设置一个特色图片。因此,当发布/更新帖子时,脚本将使用以下脚本扫描帖子以查找第一幅图像:

   // Get URL of first image in a post
   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];

   // no image found display default image instead
   if(empty($first_img)){
   $first_img = "/images/default.jpg";
   }
   return $first_img;
   }
因此,它将获取该图像并将其设置为该帖子的特色图像。如果没有图像,则什么也不做。我研究了许多脚本和插件,但没有一个像我要求的那样。

2 个回复
SO网友:Michelle

这也可能对你有用。它扫描帖子,然后将图像集提取为“特色”。如果不存在,则返回附加到帖子的第一个图像。如果没有,它会在帖子中查找任何图像;如果没有,它会抓取一个YouTube截图。把这个放在你的主题函数中。php文件:

// Note that your theme must support post thumbnails for this function to work. 
// If you are getting an error try adding add_theme_support(\'post-thumbnails\'); to your functions. php file  
function vp_get_thumb_url($text, $size){
    global $post;
    $imageurl="";

    // Check to see which image is set as "Featured Image"
    $featuredimg = get_post_thumbnail_id($post->ID);
    // Get source for featured image
    $img_src = wp_get_attachment_image_src($featuredimg, $size);
    // Set $imageurl to Featured Image
    $imageurl=$img_src[0];

    // If there is no "Featured Image" set, move on and get the first image attached to the post
    if (!$imageurl) {
        // Extract the thumbnail from the first attached imaged
        $allimages =&get_children(\'post_type=attachment&post_mime_type=image&post_parent=\' . $post->ID );

        foreach ($allimages as $img){
            $img_src = wp_get_attachment_image_src($img->ID, $size);
            break;
        }
        // Set $imageurl to first attached image
        $imageurl=$img_src[0];
    }

    // If there is no image attached to the post, look for anything that looks like an image and get that
    if (!$imageurl) {
        preg_match(\'/<\\s*img [^\\>]*src\\s*=\\s*[\\""\\\']?([^\\""\\\'>]*)/i\' ,  $text, $matches);
        $imageurl=$matches[1];
    }

    // If there\'s no image attached or inserted in the post, look for a YouTube video
    if (!$imageurl){
        // look for traditional youtube.com url from address bar
        preg_match("/([a-zA-Z0-9\\-\\_]+\\.|)youtube\\.com\\/watch(\\?v\\=|\\/v\\/)([a-zA-Z0-9\\-\\_]{11})([^<\\s]*)/", $text, $matches2);
        $youtubeurl = $matches2[0];
        $videokey = $matches2[3];
    if (!$youtubeurl) {
        // look for youtu.be \'embed\' url
        preg_match("/([a-zA-Z0-9\\-\\_]+\\.|)youtu\\.be\\/([a-zA-Z0-9\\-\\_]{11})([^<\\s]*)/", $text, $matches2);
        $youtubeurl = $matches2[0];
        $videokey = $matches2[2];
    }
    if ($youtubeurl)
        // Get the thumbnail YouTube automatically generates
        // \'0\' is the biggest version, use 1 2 or 3 for smaller versions
        $imageurl = "http://i.ytimg.com/vi/{$videokey}/0.jpg";
    }

    // Spit out the image path
    return $imageurl;
}
要在主题文件中显示此内容,请首先插入以下内容:

<?php
if (function_exists(\'vp_get_thumb_url\')) {
                                // Set the desired image size. Swap out \'thumbnail\' for \'medium\', \'large\', or custom size
                                $thumb=vp_get_thumb_url($post->post_content, \'large-feature\'); 
                            }
?>
在这之后的某个地方,要显示实际的图像,在这种情况下,用指向帖子的链接包装:

<?php if ($thumb!=\'\') { ?>
                                        <a href="<?php the_permalink() ?>" title="<?php the_title(); ?>" rel="bookmark"><img src="<?php echo $thumb; ?>" alt="<?php get_the_title(); ?>" /></a>
                                    <?php } ?>
在vp\\u get\\u thumb\\u url函数名上搜索Google,以获取有关如何实现此功能的其他文章。祝你好运!

SO网友:Bainternet

将您的函数用于这两个函数阅读代码中的注释以理解

/**
 * If the the image is an attachment we just set the id as the post thumbnail,
 * if not then we get the first image from the post content , upload it using media_sideload_image and then we set the thumbnail
 * 
 * @param (int) $post_id post id
 * 
 * @return Void
 */
function set_featured_image_on_save($post_id){
    $attachments = get_posts(array(\'numberposts\' => \'1\', \'post_parent\' => $post_id, \'post_type\' => \'attachment\', \'post_mime_type\' => \'image\', \'order\' => \'ASC\'));
    if(sizeof($attachments) > 0){
        set_post_thumbnail($post_id, $attachments[0]->ID);
    }else{
        // not loaded the we upload it as an attachment
        // required libraries for media_sideload_image
        require_once(ABSPATH . \'wp-admin/includes/file.php\');
        require_once(ABSPATH . \'wp-admin/includes/media.php\');
        require_once(ABSPATH . \'wp-admin/includes/image.php\');

        // load the image
        $img  = catch_that_image();
        if ("/images/default.jpg" != $img){
            $result = media_sideload_image($img, $post_id);
            $attachments = get_posts(array(\'numberposts\' => \'1\', \'post_parent\' => $post_id, \'post_type\' => \'attachment\', \'post_mime_type\' => \'image\', \'order\' => \'ASC\'));
            if(sizeof($attachments) > 0)
                set_post_thumbnail($post_id, $attachments[0]->ID);
        }else{
            //no images found
            return;
        }
    }
}



add_action( \'save_post\', \'auto_set_post_image\' );

/**
 * runs on post save and check\'s if we already have a post thumbnail, if not it gets one
 * 
 * @param  (int) $post_id 
 * @return Void
 */
function auto_set_post_image( $post_id ) {
    // verify if this is an auto save routine. 
      // If it is our form has not been submitted, so we dont want to do anything
      if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) 
          return;

    // Check permissions
    if ( \'page\' == $_POST[\'post_type\'] ){
        if ( !current_user_can( \'edit_page\', $post_id ) )
        return;
    }else{
        if ( !current_user_can( \'edit_post\', $post_id ) )
            return;
    }

    // OK, we\'re authenticated: we need to find and save the data

    //check if we have a post thumnail set already
    $attch = get_post_meta($post_id,"_thumbnail_id",true);
    if (empty($attch)){
        set_featured_image_on_save($post_id);
    }
}

结束

相关推荐