I have a blog with a lot (over 1000) images. Each image has a meaningful descriptive filename. Wordpress has title caption and description fields for images. What's the easiest way to batch process all images and copy the file name to the title alt description and caption fields. Also if I could update yoast seo fields too that would be great.
3 Answers
You can make a query to loop through all the attachments, and then update the attachment info for each attachment in the while loop.
Something like
$args = array(
'post_type' => 'attachments',
'post_status' => 'any',
'posts_per_page' => -1,
)
$query = new WP_Query($args)
if($query->have_posts()):
while($query->have_posts()): $query->the_post();
// 1. Get the attachment filename here and store it in a variable eg. $filename. See comment at the end of this answer
// 2. Update the post title
$attachment_post = array(
'ID' => get_the_id();
'post_title' => $filename
)
wp_update_post($attachment_post);
endwhile; wp_reset_postdata(); endif;
Did a quick search on how to get the attachment filename but couldn't find it but this should get you started. Within the loop you should also be able to update the description. You can look at wp_update_attachment_metadata and als check this post (related to the filename).
-
Thanks eskimo, I ended up just writing a php file to quickly do it for me. Your solution works I'm sure, but would have involved making a plugin. Next I need to find a way to set the other attributes to filename on upload..– S..Commented Nov 15, 2013 at 12:55
-
1NP. It wouldn't involve making a plugin though, you can paste the code from my answer about anywhere (in a page template for example). I'm sure there's a hook for when files get uploaded that you can use.– eskimoCommented Nov 18, 2013 at 16:58
I ended up writing a php file to quickly solve the problem.
$s_query = "SELECT ID, post_title FROM `wp_posts` WHERE NOT post_content <=> post_title AND post_type='attachment'";
$r_result = mysql_query($s_query);
if($r_result)
{
while($row = mysql_fetch_row($r_result)){
$s_update_query = 'UPDATE `wp_posts` SET post_content="'.$row[1].'", post_excerpt="'.$row[1].'" WHERE ID="'.$row[0].'"';
mysql_query($s_update_query);
}
}
Well, I was using lightbox gallery, and I needed to have the post title for my images as the alt text.
What I did was create a query on the database to update the post_excerpt to match the post title.
UPDATE wp_posts SET `post_excerpt` = `post_title` WHERE post_type = 'attachment'
This seem to work for me and the lightbox gallery.
-
This doesn't answer the question. The alt field is in the post meta table, not the posts table. Commented Feb 28 at 9:07