Strip Images from All WordPress Posts

After importing a blog from Blogger to self-hosted WordPress recently I discovered that all the inline images remain hosted on Blogger.

There were various hacks for moving them to my local server and updating the posts and suchlike – but in my case all the posts had a single image, and the importer had managed to set that image as the featured image. So all I really wanted to do was to strip the image and leave my theme to display the featured image.

I’ve got a scripts folder in my project root for just such occasions, here’s the script I used to remove all images from all WordPress posts:

<?php
$wordpressBasePath = __DIR__.'/../public/wp-load.php';
include_once $wordpressBasePath;

$query = new WP_Query([
	'post_type' => 'post',
	'nopaging' => true,
]);

// I figured I'd also use this opportunity to make sure the post content adheres to the new blog restrictions too
// plus kses is a handy way to strip the image tags.
$allowed_tags = wp_kses_allowed_html( 'post' );
unset($allowed_tags['img']);

while ($query->have_posts()) {
	$query->the_post();
	// Everyone loves an update, especially big websites
	echo "\r".($query->current_post + 1).' of '.$query->found_posts.'. '.round((($query->current_post + 1) / $query->found_posts) * 100).'%';
	$newPost = [
		'ID' => get_the_ID(),
		'post_content' => wp_kses(get_the_content(), $allowed_tags),
	];
	$error = wp_update_post($newPost, true);
	if (is_wp_error($error)) {
		print_r($errors);
	}
}
echo "\n";

I’d like to also make this remove any empty anchor tags which get left behind (most of the images were wrapped in one) but without removing other anchors. If you have a reliable method for doing this, let me know in the comments!

Tags:
Category: