How to disable and remove old post revisions in WordPress (including multisite)

Ciprian on Thursday, September 7, 2023 in WordPress

NEW! Learn JavaScript by example. Code snippets, how-to's and tutorials. Try now!

If you don’t want to use a plugin to clean up your WordPress website and insist on custom coding it, here is how to remove post revisions in a single website or a multisite network.

Add the code below to your theme or plugin, and trigger it using an action or a form or an event.

Disclaimer: Do not run it immediately, and do not activate it in production.

/**
 * Delete all revisions from all posts in a single WordPress installation or a network.
 */

// Give the script 5 minutes to run.
set_time_limit( 60 * 5 );

/**
 * Get a list of all blogs in our network.
 */
$blog_list = get_blog_list_full( 0, 'all' );

// Delete revisions for each blog.
foreach ( $blog_list as $blog ) {
    echo '<p>Deleting from ' . $blog['domain'] . ':</p>';
    echo delete_revisions_for_blog( $blog['blog_id'] ) . ' revisions.';
    flush();
}

echo '<p>Done.<p>';

/**
 * Delete all revisions for posts in a blog.
 *
 * @param int $blog_id The ID of the blog to delete revisions from.
 *
 * @return int The number of revisions deleted.
 */
function delete_revisions_for_blog( $blog_id ) {
    global $wpdb;

    if ( is_multisite() ) {
        switch_to_blog( $blog_id );
    }

    // Retrieve revision IDs that are not autosave revisions.
    $revision_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type = 'revision' AND post_name NOT LIKE '%-autosave%'" );

    // Delete each revision, including related meta and taxonomy terms.
    foreach ( $revision_ids as $revision_id ) {
        wp_delete_post_revision( (int) $revision_id );
    }



    if ( is_multisite() ) {
        restore_current_blog();
    }

    // Return the number of revisions deleted.
    return count( $revision_ids );
}

/**
 * Get a list of blogs in a multisite network.
 *
 * @param int    $start      Offset for the list.
 * @param string $num        Number of blogs to retrieve. Use 'all' to get all blogs.
 * @param string $deprecated Deprecated parameter (not used).
 *
 * @return array An array of blog details (blog_id and domain).
 */
function get_blog_list_full( $start = 0, $num = 10, $deprecated = '' ) {
    global $wpdb, $blog_id;

    // For single blogs
    if ( ! is_multisite() ) {
        return [
            $blog_id => [
                'blog_id' => $blog_id,
                'domain'  => preg_replace( '%https?://%i', '', get_bloginfo( 'url', 'raw' ) ),
            ]
        ];
    }

    // For multisite setups
    $blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id, domain FROM $wpdb->blogs WHERE site_id = %d AND deleted = '0' ORDER BY registered ASC", $wpdb->siteid ), ARRAY_A );

    $blog_list = [];

    // Build an array of blog details.
    foreach ( (array) $blogs as $details ) {
        $blog_list[ $details['blog_id'] ] = $details;
    }

    // Ensure $blog_list is an array.
    if ( ! is_array( $blog_list ) ) {
        return [];
    }

    // Return blogs based on the specified number.
    if ( (string) $num === 'all' ) {
        return array_slice( $blog_list, $start );
    } else {
        return array_slice( $blog_list, $start, (int) $num );
    }
}

To disable revisions in WordPress, you can define the WP_POST_REVISIONS constant in your wp-config.php file. To completely disable post revisions, you can set it to false or 0. Here’s how to do it:

  1. Open your wp-config.php file for editing. You can find it in the root directory of your WordPress installation.
  2. Add the following line to your wp-config.php file, preferably just above the line that says /* That's all, stop editing! Happy publishing. */:
define('WP_POST_REVISIONS', false);
  1. Save the wp-config.php file.

This will disable post revisions for all your posts and prevent WordPress from creating and storing revisions in the database.

Photo by Laura Rivera on Unsplash

Related posts

Leave a Reply

Your email address will not be published. Required fields are marked *