Asaf
Asaf

Reputation: 2035

How to get the first image and set it as the post thumbnail?

I have these two functions which I found online and edited to my needs.
What I'm trying to do is to set the thumbnail of a wordpress post to either a default, previously set within the function itself image, or the first image embedded in the post.
However, something went wrong somewhere...

wptuts_save_thumbnail($post_id) -> Set the thumbnail of a post to default OR the first image if it's not already set (by the author of the post...)!

function wptuts_save_thumbnail( $post_id ) {
$post_thumbnail = get_post_meta( $post_id, '_thumbnail_id', true );

if (!wp_is_post_revision($post_id)) { // Verify that the post is not a revision
    if (empty($post_thumbnail)) {       // Check if Thumbnail does NOT exist!
        $firstImg = firstImg($post_id); // Get the first image of a post (if available)
        if(!$firstImg){ // if available, update the post thumbnail
            update_post_meta( $post_id, '_thumbnail_id', 'link to default image here' );
        } else { // else -> set thumbnail to default thumbnail
            update_post_meta( $post_id, '_thumbnail_id', $firstImg );
        }
    }
}
}

firstImg($post _id) -> Used to get the first image of a post (by id)

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

  $urlLength = strlen(site_url());
  $first_img = substr($first_img, $urlLength);

  if(empty($first_img)){
    return false;
  }

  return $first_img;
}

The only problem with these functions is in the if(!$firstImg) - else statement.
The image will be always set to default with or without an embedded image in the post.
$firstImg does indeed return the first image if it exists so the problem must be in either of the 2 if's: if(empty($first_img)) OR if(!$firstImg).
I tried to look for any clues for the problem but I found nothing.

Hopefully someone can shed some light on this problem :)
Thanks in advance!

Additional Info:
- Both of the functions are written in the functions.php of my theme.
- wptuts_save_thumbnail($post_id) is set to run every time a NEW post is published.
- When returned, $first_img is the relative path of the image (i.e /wp-contents/uploads/img.jpg), or false.

Upvotes: 0

Views: 790

Answers (1)

CE_REAL
CE_REAL

Reputation: 384

What I can point out by looking at the code, that the check on firstImg:

if(!$firstImg){ // if available, update the post thumbnail
  update_post_meta( $post_id, '_thumbnail_id', 'link to default image here' );
} else { // else -> set thumbnail to default thumbnail
  update_post_meta( $post_id, '_thumbnail_id', $firstImg );
}

seems to return false, which would deliver you the default image.

What you could do is check the result of the $matches[1][0] in a dump or print_r in the firstImg function. Also check what $first_img is when before returning it. This could help you find the answer, because it seems that you're not getting the expected in the $first_img.

Hope that helps.

Upvotes: 2

Related Questions