The problem:
I’m posting from the WordPress iPhone app. When adding an image, the image shows up in the description itself, which I don’t like.
What I’m trying to do:
Remove the image from the description and do one of the following (don’t know the benefits of one option over the other):
- Get the image source from the removed image and add it to a custom field. -OR-
- Set the image as the featured image
I figure either one of those options would help me to isolate the image URL for use in my post templates.
What I’ve tried:
Literally everything under the sun. Right now I’m adding code to functions.php but would eventually like to make this a plugin.
I think the code below is way off, but I want to post it to show some of the attempts I’ve made:
I’ve added an action to run a function mpb_remove_post_image on content_save_pre …
add_action('content_save_pre', 'mpb_remove_post_image');
Problem with that is I don’t have access to the post_id (which I need in order to set the featured image) using content_save_pre so I have to get the image url and look for a post with the guid equal to the image src…
function mpb_remove_post_image( $content ){
// strip slashes, I guess we need to readd slashes when we're done?
$content = stripslashes($content);
// get the first image src
$image_src = get_first_image($content);
// if there's an image src we can jam
if(!is_null($image_src)){
global $wpdb;
// query the db for an attachment with this image
//$thumb_id = $wpdb->get_var($wpdb->prepare("SELECT DISTINCT ID FROM $wpdb->posts WHERE guid='$image_src'"));
$result = $wpdb->get_results("SELECT ID, post_parent FROM {$wpdb->posts} WHERE guid ='$image_src'");
$thumb_id = $result[0]->ID;
$post_id = $result[0]->post_parent;
// set the featured image
mpb_set_featured_image($thumb_id,$post_id);
// update_post_meta( $post_id, '_thumbnail_id', $thumb_id );
}
// remove any images in the content
$content = preg_replace("/<img[^>]+>/i", "", $content);
$content = addslashes($content);
return $content;
}
the code above references this function I wrote to get the image…
function get_first_image($html){
require_once('simple_html_dom.php');
$post_dom = str_get_dom($html);
// get the first image
$first_img = $post_dom->find('img', 0);
// if any images then return the src attribute
if($first_img !== null) {
return $first_img->src;
}
return null;
}
And to set the featured image …
// set the featured image
function mpb_set_featured_image( $thumb_id, $post_id ){
update_post_meta( $post_id, '_thumbnail_id', $thumb_id );
}
I’ve also tried to add an action for save_post, but anything I do inside the function that runs seems to trigger another hook that runs save_post again so it turns into an endless loop.
Does anyone know (even if it’s at a high level) what steps I can take to accomplish this? To recap here’s what I want to do…
On inserting a post 1) get the first image src 2) set it as a custom field or set it as a featured image 3) remove the image from the post.
edit – I should mention the code I posted does work if you add the post through the wp admin. But not if you add it via the mobile app.
Why not utilize two hooks, one before post saved and one after post saved?
content_save_pre : Function attached with this hook will remove image from content and store it in session/transient.
save_post : With this hook you will have id of post. Function attached with this hook will set featured image for the post with that id and delete session/transient data.
Alternatively, If you want to go with your approach, I think you should use
post_name
, instead ofguid
, to retrieve post id from database.Not sure if it’s any use in your particular scenario, but might be worth checking out the get_the_image plugin
http://wordpress.org/extend/plugins/get-the-image/
It checks multiple sources to try and find an image to display – according to the FAQ: