Skip to main content
2 of 3
added 916 characters in body
gmazzap
  • 46.3k
  • 6
  • 95
  • 147

You can use the function get_posts to get all your post, and then use a foreach cycle to replace the img tags using the regex you posted and then use wp_update_post to change post content:

function remove_images_form_past_posts() {    
  if ( get_transient('images_removed_from_past') ) return;
  $posts = get_posts('nopaging=1');    
  if ( $posts ) {
    foreach ( $posts as $post ) {
      $newcontent = preg_replace('/<img[^>]+\>/i', '', $post->post_content);
      $newpost = array( 'ID' => $post->ID, 'post_content' => $newcontent);
      wp_update_post($newpost);
    }
    set_transient('images_removed_from_past', 1);
  }
}
add_action('admin_init','remove_images_form_past_posts');

This code should be used only once, to change the past posts content. To ensure it runs only once I've used a transient. See Codex for Transient API.

Now you have to add a function that hook into 'wp_insert_post_data' filter hook and prevent new posts are added with images:

function remove_images_before_publish( $data, $postarr ) {
  if ( ! empty($data['post_content']) )
    $data['post_content'] = preg_replace('/<img[^>]+\>/i', '', $data['post_content']);
  return $data;
}
add_filter('wp_insert_post_data','remove_images_before_publish', 20, 2);
gmazzap
  • 46.3k
  • 6
  • 95
  • 147