Support » Plugins » Hacks » Can set_post_thumbnail be used like this

  • bigswp

    (@bigswordpress)


    I have a folder in:
    wp-content/uploads/sites/2/thumbs/ (this is a multisite)
    that is being used by a plugin to display images on the front page. I would also like to use these same images as “Featured Images” can I somehow use:
    <?php set_post_thumbnail( $post, $thumbnail_id ); ?>
    for this purpose?

    I should also point out that the images are already using the post id as their name… example: 3301_1.jpg (3301 is the post ID)

    It seems to me this would be a lot easier than trying to go in and set all these manually.

Viewing 7 replies - 1 through 7 (of 7 total)
  • bigswp

    (@bigswordpress)

    I should also say that I keep getting suggestions to use plugins like “Get The Image” but I am still one step before that because these images are not yet actually part of the post so I can’t get those plugins to work.
    These images first need to be added to the post in some way before I can do that.

    Moderator bcworkz

    (@bcworkz)

    Yes, you can use set_post_thumbnail(), but the image has to exist as an attachment, whose ID is passed as $thumbnail_id. If the image is not an attachment but exists as a file somewhere, use media_handle_sideload() to make it an attachment.

    bigswp

    (@bigswordpress)

    Hi bcworkz thanks for the help. I have been fooling with this off and on all week and still can’t get it to work. Maybe it is easier to show you the code that the plugin is using for the thumbs. Would I add media_handle_sideload() to THIS function or would I create a new function?

    function tube_thumb($prefix,$title){
    
        $saved_thmb = get_post_meta( get_the_ID(),'saved_thmb',true);
    
        $subPath = tube_sub_dir_path(get_the_ID()); 
    
        $upload_dir = wp_upload_dir();
        $thumb_url = $upload_dir[baseurl]."/tube-thumbs/".$subPath."/";
    
        if($saved_thmb==1){
          $thumb = $thumb_url."/".get_the_ID()."_1.jpg";
        } elseif($saved_thmb>1) {
    
          $def_thmb = get_post_meta( get_the_ID(),'def_thmb',true);
    
          $thumb = $thumb_url."/".get_the_ID()."_".$def_thmb.".jpg";
    
          $rotate_thumbs = "onmouseover=\"thumbStart('$prefix-".get_the_ID()."', $saved_thmb, '$thumb_url');\"
           onmouseout=\"thumbStop('$prefix-".get_the_ID()."', '$thumb_url', '$def_thmb');\"";
        } else {
          return;
        }
    
        $thumb = "<img class=\"img-responsive\" src=\"$thumb\" $rotate_thumbs id=\"$prefix-".get_the_ID()."\" alt=\"".esc_attr($title)."\">";
        return $thumb;
    }
    bigswp

    (@bigswordpress)

    I did find this code that is supposed t do what you are talking about above but I have no idea how to actually use it ;-)………………..

    When I started using media_sideload_image(), I found it pretty useless as it returned a full html tag, instead of the attachment ID, so I created my own version of it which replicates all the functionality of media_sideload_image() and adds some very useful stuff, like:

    saving the sideloaded file under a completely new filename
    making the submitted image not just an attachment but the post_thumbnail (featured image)
    the ability to specify all sorts of attachment metadata
    Just call the function below instead of media_sideload_image()

    /**
     * Download an image from the specified URL and attach it to a post.
     * Modified version of core function media_sideload_image() in /wp-admin/includes/media.php  (which returns an html img tag instead of attachment ID)
     * Additional functionality: ability override actual filename, and to pass $post_data to override values in wp_insert_attachment (original only allowed $desc)
     *
     * @since 1.4 Somatic Framework
     *
     * @param string $url (required) The URL of the image to download
     * @param int $post_id (required) The post ID the media is to be associated with
     * @param bool $thumb (optional) Whether to make this attachment the Featured Image for the post (post_thumbnail)
     * @param string $filename (optional) Replacement filename for the URL filename (do not include extension)
     * @param array $post_data (optional) Array of key => values for wp_posts table (ex: 'post_title' => 'foobar', 'post_status' => 'draft')
     * @return int|object The ID of the attachment or a WP_Error on failure
     */
    function somatic_attach_external_image( $url = null, $post_id = null, $thumb = null, $filename = null, $post_data = array() ) {
        if ( !$url || !$post_id ) return new WP_Error('missing', "Need a valid URL and post ID...");
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
        // Download file to temp location, returns full server path to temp file, ex; /home/user/public_html/mysite/wp-content/26192277_640.tmp
        $tmp = download_url( $url );
    
        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);   // clean up
            $file_array['tmp_name'] = '';
            return $tmp; // output wp_error
        }
    
        preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $url, $matches);    // fix file filename for query strings
        $url_filename = basename($matches[0]);                                                  // extract filename from url for title
        $url_type = wp_check_filetype($url_filename);                                           // determine file type (ext and mime/type)
    
        // override filename if given, reconstruct server path
        if ( !empty( $filename ) ) {
            $filename = sanitize_file_name($filename);
            $tmppath = pathinfo( $tmp );                                                        // extract path parts
            $new = $tmppath['dirname'] . "/". $filename . "." . $tmppath['extension'];          // build new path
            rename($tmp, $new);                                                                 // renames temp file on server
            $tmp = $new;                                                                        // push new filename (in path) to be used in file array later
        }
    
        // assemble file data (should be built like $_FILES since wp_handle_sideload() will be using)
        $file_array['tmp_name'] = $tmp;                                                         // full server path to temp file
    
        if ( !empty( $filename ) ) {
            $file_array['name'] = $filename . "." . $url_type['ext'];                           // user given filename for title, add original URL extension
        } else {
            $file_array['name'] = $url_filename;                                                // just use original URL filename
        }
    
        // set additional wp_posts columns
        if ( empty( $post_data['post_title'] ) ) {
            $post_data['post_title'] = basename($url_filename, "." . $url_type['ext']);         // just use the original filename (no extension)
        }
    
        // make sure gets tied to parent
        if ( empty( $post_data['post_parent'] ) ) {
            $post_data['post_parent'] = $post_id;
        }
    
        // required libraries for media_handle_sideload
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        require_once(ABSPATH . 'wp-admin/includes/media.php');
        require_once(ABSPATH . 'wp-admin/includes/image.php');
    
        // do the validation and storage stuff
        $att_id = media_handle_sideload( $file_array, $post_id, null, $post_data );             // $post_data can override the items saved to wp_posts table, like post_mime_type, guid, post_parent, post_title, post_content, post_status
    
        // If error storing permanently, unlink
        if ( is_wp_error($att_id) ) {
            @unlink($file_array['tmp_name']);   // clean up
            return $att_id; // output wp_error
        }
    
        // set as post thumbnail if desired
        if ($thumb) {
            set_post_thumbnail($post_id, $att_id);
        }
    
        return $att_id;
    }
    Moderator bcworkz

    (@bcworkz)

    You would use the above function just as you would media_handle_sideload(). The code does need to be placed somewhere, a plugin or a child theme’s functions.php.

    Then in your other code, once all the parameters have been defined, make the call. It should retrieve the file and place it where it belongs.

    bigswp

    (@bigswordpress)

    I think the code above is just for doing one image at a time. It asks for a specific file path and Post ID but I have thousands of them.
    I did manage to find a very useful plugin for getting the images easily called “Add from Server” which will do what I need. I can’t see a way to automate it but it is a start.
    I think this is a little bit above my coding skills.
    Thanks again bcworkz I see your name helping people a lot and certainly appreciate it myself.

    bigswp

    (@bigswordpress)

    OMG bcworkz I ran across some code for something else I was working on. For some reason a lightbulb went off in my head and I came up with this…

    function add_image_to_feed( $thumbz){
    if( is_feed() ){
        $def_thmb = get_post_meta( get_the_ID(),'def_thmb',true);
    
        $subPath = tube_sub_dir_path(get_the_ID()); 
    
        $upload_dir = wp_upload_dir();
        $thumb_ur = $upload_dir[baseurl]."/tube-thumbs/".$subPath."";
    
        $thumbz = $thumb_ur."/".get_the_ID()."_".$def_thmb.".jpg";
    
    } else {
        return;
    }
    $thumbz = "<img class=\"img-responsive\" src=\"$thumbz\" >";
    return $thumbz;
    
    }

    So now my RSS feed is getting these images added to them automatically. Brilliant! This is exactly what I needed.

Viewing 7 replies - 1 through 7 (of 7 total)
  • The topic ‘Can set_post_thumbnail be used like this’ is closed to new replies.