Reputation: 2035
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
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