1
votes

I have a bunch of old posts on a blog that I would like to assign a featured image to.

I have retrieved all the images I would like to use for each post.

I saved each image file name after the slug of each post.

I would like to retrieve all posts, grab the slug name from each post, search the specified directory where the image files are uploaded, when the post slug matches the image file name, set that image as the featured image for that particular post, and iterate through all posts.

I am not sure how to go about doing this, but I have provided some example code I found, along with a few useful (hopefully) links.

The following code is used to retrieve all posts and update a particular post:

$allPosts = get_posts(array('numberposts' => -1, 'post_type' => 'post'));
foreach($allPosts as $thePost){
    $my_post = array();
    $my_post['post_type'] = $thePost->post_type;
    $my_post['ID'] = $thePost->ID;
    $my_post['post_name'] = autoSlug($thePost->post_title);
    wp_update_post($my_post);
}

Note: I have a special function for generating post slugs based off the post_title. (I don't use the WP default slug.)

Useful links:

  1. http://codex.wordpress.org/Template_Tags/get_posts
  2. http://codex.wordpress.org/Function_Reference/wp_update_post
  3. http://codex.wordpress.org/Post_Thumbnails
  4. http://codex.wordpress.org/Function_Reference/wp_upload_dir
  5. http://codex.wordpress.org/Function_Reference/wp_insert_attachment
2

2 Answers

2
votes

Wrote a script myself, along with a blog post. Contributions for improvements are appreciated. Refer to this link for answer Set WordPress Featured Image For All Post Slugs Matching Image File Name in Specified Directory:

<?php
// Get All Posts.
$allPosts = get_posts(array('numberposts' => -1, 'post_type' => 'post'));
// Specify where the images are located.
$themePATH = get_theme_root().'/'.get_template().'/thumbs/';
// The uploads directory for your blog.
$uploads= wp_upload_dir();
// List of images including extensions.
$images = listImages($themePATH,true);
// List of images without extensions.
$imageNames = listImages($themePATH,false);

function reverseSlug($string){
    $string = str_replace("-", " ", $string);// Convert hyphen to space
    $string = ucwords($string);// Capitalize the beginning of each word
    return $string;
}

// Retrieve all images from the specified directory.
// Output array with and without file extensions.
function listImages($dirname=".",$display) {
    $ext = array("jpg", "png", "jpeg", "gif");
    $files = array();
    if($handle = opendir($dirname)){
        while(false !== ($file = readdir($handle))){
            for($i=0;$i<sizeof($ext);$i++){
                if(strstr($file, ".".$ext[$i])){
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
    }
    sort($files);
    foreach($files as $theFile){
        $info = pathinfo($theFile);
        $fileName = basename($theFile,'.'.$info['extension']);
        $files1[] = $fileName;
    }
    if($display == false){
        return ($files1);
    }
    if($display == true){
        return($files);
    }
}

for($i = 0; $i < count($allPosts); $i++){
    // Check if post slugs match image slugs.
    $check[$i] = in_array($allPosts[$i]->post_name, $imageNames);
    if($check[$i] == 1){
        echo 'Yes, post title matches image name.<br />'.PHP_EOL;
        // Search through the image slugs for a direct match with the post slug.
        $search[$i] = array_search($allPosts[$i]->post_name, $imageNames);
        $filename = $images[$search[$i]];
        $newfile = $uploads['path'].'/'.$filename;
        // Copy the image from theme folder to uploads directory.
        copy($themePATH.$filename, $newfile);
        // Delete image from theme folder.
        unlink($themePATH.$filename);
        // Retrieve the file type from the file name.
        $wp_filetype = wp_check_filetype(basename($filename), null);
        // Construct the attachment array.
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'guid' => $uploads['url'].'/'.$filename,
            'post_title' => preg_replace('/\.[^.]+$/', '', reverseSlug(basename($filename))),
            'post_content' => '',
            'post_status' => 'inherit'
        );
        // This function inserts an attachment into the media library.
        $attach_id = wp_insert_attachment($attachment, $newfile, $allPosts[$i]->ID);
        // You must first include the image.php file
        // For the function wp_generate_attachment_metadata() to work.
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        // This function generates metadata for an image attachment.
        // It also creates a thumbnail and other intermediate sizes
        // of the image attachment based on the sizes defined on
        // the Settings_Media_Screen.
        $attach_data = wp_generate_attachment_metadata($attach_id, $newfile);
        if(!is_wp_error($attach_id)){
            // Update metadata for an attachment.
            wp_update_attachment_metadata($attach_id, $attach_data);
            // Updates the value of an existing meta key (custom field) for the specified post.
            update_post_meta($allPosts[$i]->ID, '_thumbnail_id', $attach_id);
        }
    }
    else{
        echo 'No matches found.<br />'.PHP_EOL;
    }
}
?>
0
votes

you save my life, your code just needs some adjustments and works like a charm. here it is.

<?php
// Get All Posts.
$allPosts = get_posts(array('numberposts' => -1, 'post_type' => 'wpdmpro'));
// Specify where the images are located.
$themePATH = get_theme_root().'/'.get_stylesheet().'/thumbs/';
// The uploads directory for your blog.
$uploads= wp_upload_dir();
// List of images including extensions.
$images = listImages($themePATH,true);
// List of images without extensions.
$imageNames = listImages($themePATH,false);

function reverseSlug($string){
    $string = str_replace("-", " ", $string);// Convert hyphen to space
    $string = ucwords($string);// Capitalize the beginning of each word
    return $string;
}

// Retrieve all images from the specified directory.
// Output array with and without file extensions.
function listImages($dirname=".",$display) {
    $ext = array("jpg", "png", "jpeg", "gif");
    $files = array();
    if($handle = opendir($dirname)){
        while(false !== ($file = readdir($handle))){
            for($i=0;$i<sizeof($ext);$i++){
                if(strstr($file, ".".$ext[$i])){
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
    }
    sort($files);
    foreach($files as $theFile){
        $info = pathinfo($theFile);
        $fileName = basename($theFile,'.'.$info['extension']);
        $files1[] = $fileName;
    }
    if($display == false){
        return ($files1);
    }
    if($display == true){
        return($files);
    }
}


for($i = 0; $i < count($allPosts); $i++){
    // Check if post slugs match image slugs.
    if (is_array($imageNames)) {
        $check[$i] = in_array($allPosts[$i]->post_name, $imageNames);
    } else {
        echo 'error';
    };


    if($check[$i] == 1){
        echo 'Yes, post title matches image name.<br />'.PHP_EOL;
        // Search through the image slugs for a direct match with the post slug.
        $search[$i] = array_search($allPosts[$i]->post_name, $imageNames);
        $filename = $images[$search[$i]];
        $newfile = $uploads['path'].'/'.$filename;
        // Copy the image from theme folder to uploads directory.
        copy($themePATH.$filename, $newfile);
        // Delete image from theme folder.
        unlink($themePATH.$filename);
        // Retrieve the file type from the file name.
        $wp_filetype = wp_check_filetype(basename($filename), null);
        // Construct the attachment array.
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'guid' => $uploads['url'].'/'.$filename,
            'post_title' => preg_replace('/\.[^.]+$/', '', reverseSlug(basename($filename))),
            'post_content' => '',
            'post_status' => 'inherit'
        );
        // This function inserts an attachment into the media library.
        $attach_id = wp_insert_attachment($attachment, $newfile, $allPosts[$i]->ID);
        // You must first include the image.php file
        // For the function wp_generate_attachment_metadata() to work.
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        // This function generates metadata for an image attachment.
        // It also creates a thumbnail and other intermediate sizes
        // of the image attachment based on the sizes defined on
        // the Settings_Media_Screen.
        $attach_data = wp_generate_attachment_metadata($attach_id, $newfile);
        if(!is_wp_error($attach_id)){
            // Update metadata for an attachment.
            wp_update_attachment_metadata($attach_id, $attach_data);
            // Updates the value of an existing meta key (custom field) for the specified post.
            update_post_meta($allPosts[$i]->ID, '_thumbnail_id', $attach_id);
        }
    }
    else{
        echo 'No matches found.<br />'.PHP_EOL;
    }
}
?>