Crear un nuevo sitio WordPress predeterminado en blanco – Restablecer WordPress

Este artículo es para ti si quieres crear un nuevo sitio WordPress predeterminado en blanco sin tomar ningún contenido del sitio en producción existente.

Lee aquí cómo restablecer la base de datos de WordPress a sus valores predeterminados y eliminar todas las personalizaciones y el contenido de la base de datos, como si acabaras de instalar un sitio WordPress nuevo desde cero.

Usando un MU-Plugin de WP Staging

Necesitas instalar este plugin como mu-plugin en tu sitio en producción. Si no sabes cómo añadir mu-plugins a tu sitio web, consulta primero esta guía.

PHP
<?php

add_action('wpstg.clone_first_run', function () {
    // Set to false for actual operation
    $isDryRun = true;

    // Abort if not wp-staging staging site
    if (empty($GLOBALS['table_prefix']) || !preg_match('@^wpstgd+@', $GLOBALS['table_prefix'])) {
        return;
    }

    // Run at shutdown to avoid any issue with loaded plugins
    add_action('shutdown', function () use ($isDryRun) {
        $logFile = WP_CONTENT_DIR . "/wpstg-reset.log";

        $config = (object)[
            'dbName'     => DB_NAME,
            'dbUser'     => DB_USER,
            'dbPassword' => DB_PASSWORD,
            'dbHost'     => DB_HOST,
            'dbPrefix'   => $GLOBALS['table_prefix'],
            'rootPath'   => rtrim(ABSPATH, '/'),
            'parentPath' => rtrim(dirname(ABSPATH), '/')
        ];

        $wpTables = [
            'commentmeta',
            'comments',
            'links',
            'options',
            'postmeta',
            'posts',
            'term_relationships',
            'term_taxonomy',
            'termmeta',
            'terms',
            'usermeta',
            'users',
            /*mu*/
            'blogs',
            'blogmeta',
            'signups',
            'site',
            'sitemeta',
            'registration_log'
        ];

        $preservedTables = [
            'options',
            'users',
            'usermeta',
            'site',
            'sitemeta',
            'signups'
        ];

        $wpOptions = [
            'siteurl',
            'home',
            'blogname',
            'blogdescription',
            'users_can_register',
            'admin_email',
            'start_of_week',
            'use_balanceTags',
            'use_smilies',
            'require_name_email',
            'comments_notify',
            'posts_per_rss',
            'rss_use_excerpt',
            'mailserver_url',
            'mailserver_login',
            'mailserver_pass',
            'mailserver_port',
            'default_category',
            'default_comment_status',
            'default_ping_status',
            'default_pingback_flag',
            'posts_per_page',
            'date_format',
            'time_format',
            'links_updated_date_format',
            'comment_moderation',
            'moderation_notify',
            'permalink_structure',
            'rewrite_rules',
            'hack_file',
            'blog_charset',
            'moderation_keys',
            'active_plugins',
            'category_base',
            'ping_sites',
            'comment_max_links',
            'gmt_offset',
            'default_email_category',
            'recently_edited',
            'template',
            'stylesheet',
            'comment_registration',
            'html_type',
            'use_trackback',
            'default_role',
            'db_version',
            'uploads_use_yearmonth_folders',
            'upload_path',
            'blog_public',
            'default_link_category',
            'show_on_front',
            'tag_base',
            'show_avatars',
            'avatar_rating',
            'upload_url_path',
            'thumbnail_size_w',
            'thumbnail_size_h',
            'thumbnail_crop',
            'medium_size_w',
            'medium_size_h',
            'avatar_default',
            'large_size_w',
            'large_size_h',
            'image_default_link_type',
            'image_default_size',
            'image_default_align',
            'close_comments_for_old_posts',
            'close_comments_days_old',
            'thread_comments',
            'thread_comments_depth',
            'page_comments',
            'comments_per_page',
            'default_comments_page',
            'comment_order',
            'sticky_posts',
            'widget_categories',
            'widget_text',
            'widget_rss',
            'uninstall_plugins',
            'timezone_string',
            'page_for_posts',
            'page_on_front',
            'default_post_format',
            'link_manager_enabled',
            'finished_splitting_shared_terms',
            'site_icon',
            'medium_large_size_w',
            'medium_large_size_h',
            'wp_page_for_privacy_policy',
            'show_comments_cookies_opt_in',
            'admin_email_lifespan',
            'disallowed_keys',
            'comment_previously_approved',
            'auto_plugin_theme_update_emails',
            'auto_update_core_dev',
            'auto_update_core_minor',
            'auto_update_core_major',
            'wp_force_deactivated_plugins',
            'wp_attachment_pages_enabled',
        ];

        $wpCoreFiles = [
            "index.php",
            "license.txt",
            "readme.html",
            "wp-activate.php",
            "wp-admin",
            "wp-blog-header.php",
            "wp-comments-post.php",
            "wp-config.php",
            "wp-config-sample.php",
            "wp-content",
            "wp-cron.php",
            "wp-includes",
            "wp-links-opml.php",
            "wp-load.php",
            "wp-login.php",
            "wp-mail.php",
            "wp-settings.php",
            "wp-signup.php",
            "wp-trackback.php",
            "xmlrpc.php",
        ];

        // avoid db.php dropins
        $dbh = new wpdb($config->dbUser, $config->dbPassword, $config->dbName, $config->dbHost);

        file_put_contents($logFile, "");

        $dbh->query("SET SESSION SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'");
        $dbh->query("SET FOREIGN_KEY_CHECKS = 0");
        $dbh->query("SET UNIQUE_CHECKS = 0");
        $dbh->query("SET AUTOCOMMIT = 0");
        $dbh->query("START TRANSACTION");

        // Cleanup tables
        $tableArrays = $dbh->get_results("SHOW TABLES LIKE '" . $config->dbPrefix . "%'", ARRAY_N);
        if (!empty($tableArrays) && is_array($tableArrays)) {
            foreach ($tableArrays as $tables) {
                $tableName = substr($tables[0], strlen($config->dbPrefix));
                if (!in_array($tableName, $wpTables)) {
                    $dropQuery = "DROP TABLE `" . $tables[0] . "`";
                    file_put_contents($logFile, "query: " . $dropQuery . "n", FILE_APPEND);

                    if (!$isDryRun) {
                        $dbh->query($dropQuery);
                    }

                    continue;
                }

                if (!in_array($tableName, $preservedTables)) {
                    $truncateQuery = "TRUNCATE TABLE `" . $tables[0] . "`";
                    file_put_contents($logFile, "query: " . $truncateQuery . "n", FILE_APPEND);

                    if (!$isDryRun) {
                        $dbh->query($truncateQuery);
                    }
                }
            }
        }

        // Cleanup options
        $tableOptions        = $config->dbPrefix . "options";
        $optionActivePlugins = [];
        $activeTheme         = $dbh->get_var("SELECT `option_value` FROM `" . $tableOptions . "` WHERE `option_name`='template' LIMIT 1");
        $adminEmail          = $dbh->get_var("SELECT `option_value` FROM `" . $tableOptions . "` WHERE `option_name`='admin_email' LIMIT 1");

        $optionArrays = $dbh->get_results("SELECT `option_id`,`option_name`,`option_value` FROM `" . $tableOptions . "` WHERE `option_name` NOT LIKE 'wpstg%'", ARRAY_A);
        if (!empty($optionArrays) && is_array($optionArrays)) {
            foreach ($optionArrays as $options) {
                $optionId    = $options['option_id'];
                $optionName  = $options['option_name'];
                $optionValue = $options['option_value'];

                if (in_array($optionName, $wpOptions) || strpos($optionName, "wpstg") === 0 || strpos($optionName, "_wpstg_") !== false) {
                    if ($optionName === 'active_plugins' && !empty($optionValue)) {
                        $optionActivePlugins = maybe_unserialize($optionValue);
                    }

                    continue;
                }

                $deleteQuery = "DELETE FROM `" . $tableOptions . "` WHERE `option_id`='" . $optionId . "'";
                file_put_contents($logFile, "query: " . $deleteQuery . "n", FILE_APPEND);

                if (!$isDryRun) {
                    $dbh->query($deleteQuery);
                }
            }
        }

        // Cleanup plugins, preserved wp-staging
        if (!empty($optionActivePlugins) && is_array($optionActivePlugins)) {
            $optionActivePlugins = array_filter(array_map(function ($a) {
                if (strpos($a, "wp-staging") === 0) {
                    return $a;
                }
            }, $optionActivePlugins));

            $updateQuery = "UPDATE `" . $tableOptions . "` SET `option_value`='" . serialize($optionActivePlugins) . "' WHERE `option_name`='active_plugins'";
            file_put_contents($logFile, "query: " . $updateQuery . "n", FILE_APPEND);

            if (!$isDryRun) {
                $dbh->query($updateQuery);
            }
        }

        // Cleanup user
        $tableUser     = $config->dbPrefix . "users";
        $tableUsermeta = $config->dbPrefix . "usermeta";
        $userArrays    = $dbh->get_results("SELECT `ID` FROM `" . $tableUser . "` WHERE `user_email` NOT LIKE '" . $adminEmail . "' and `user_login` NOT LIKE 'wpstg_%'", ARRAY_A);
        if (!empty($userArrays) && is_array($userArrays)) {
            foreach ($userArrays as $users) {
                $userId      = $users['ID'];
                $deleteQuery = "DELETE FROM `" . $tableUsermeta . "` WHERE `user_id`='" . $userId . "'";
                file_put_contents($logFile, "query: " . $deleteQuery . "n", FILE_APPEND);

                if (!$isDryRun) {
                    $dbh->query($deleteQuery);
                }

                $deleteQuery = "DELETE FROM `" . $tableUser . "` WHERE `ID`='" . $userId . "'";
                file_put_contents($logFile, "query: " . $deleteQuery . "n", FILE_APPEND);

                if (!$isDryRun) {
                    $dbh->query($deleteQuery);
                }
            }
        }

        // Update db
        $dbh->query("COMMIT");

        // Use parent files
        if (!class_exists(WP_Filesystem_Direct::class, false)) {
            require_once($config->parentPath . '/wp-admin/includes/class-wp-filesystem-base.php');
            require_once($config->parentPath . '/wp-admin/includes/class-wp-filesystem-direct.php');
        }

        $wpFileSystemDirect = new WP_Filesystem_Direct(false);

        // Cleanup wp-content/plugins
        $pluginPath = WP_CONTENT_DIR . "/plugins";
        if (file_exists($pluginPath) && is_dir($pluginPath) && !is_link($pluginPath)) {
            $pluginArrays = glob($pluginPath . "/*");
            foreach ($pluginArrays as $plugin) {
                if (is_link($plugin)) {
                    continue;
                }

                $baseName = basename($plugin);
                if ($baseName === "index.php" || strpos($baseName, "wp-staging") === 0) {
                    continue;
                }

                if (is_file($plugin)) {
                    file_put_contents($logFile, "unlink: " . $plugin . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        unlink($plugin);
                    }

                    continue;
                }

                if (is_dir($plugin)) {
                    file_put_contents($logFile, "rmdir: " . $plugin . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        $wpFileSystemDirect->rmdir($plugin, true);
                    }
                }
            }
        }

        // Cleanup wp-content/themes
        $themePath = WP_CONTENT_DIR . "/themes";
        if (file_exists($themePath) && is_dir($themePath) && !is_link($themePath)) {
            $themeArrays = glob($themePath . "/*");
            foreach ($themeArrays as $theme) {
                if (is_link($theme)) {
                    continue;
                }

                $baseName = basename($theme);
                if ($baseName === "index.php" || !empty($activeTheme) && $baseName === $activeTheme) {
                    continue;
                }

                if (is_file($theme)) {
                    file_put_contents($logFile, "unlink: " . $theme . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        unlink($theme);
                    }

                    continue;
                }

                if (is_dir($theme)) {
                    file_put_contents($logFile, "rmdir: " . $theme . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        $wpFileSystemDirect->rmdir($theme, true);
                    }
                }
            }
        }

        // Cleanup wp-content/uploads
        $uploadPath = WP_CONTENT_DIR . "/uploads";
        if (file_exists($uploadPath) && is_dir($uploadPath) && !is_link($uploadPath)) {
            $uploadArrays = glob($uploadPath . "/*");
            foreach ($uploadArrays as $upload) {
                if (is_link($upload)) {
                    continue;
                }

                $baseName = basename($upload);
                if ($baseName === "index.php" || strpos($baseName, "wp-staging") === 0) {
                    continue;
                }

                if (is_file($upload)) {
                    file_put_contents($logFile, "unlink: " . $upload . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        unlink($upload);
                    }

                    continue;
                }

                if (is_dir($upload)) {
                    file_put_contents($logFile, "rmdir: " . $upload . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        $wpFileSystemDirect->rmdir($upload, true);
                    }
                }
            }
        }

        // Cleanup wp-content/
        $wpContentPath = WP_CONTENT_DIR;
        if (file_exists($wpContentPath) && is_dir($wpContentPath) && !is_link($wpContentPath)) {
            $wpContentArrays = glob($wpContentPath . "/*");
            foreach ($wpContentArrays as $wpContent) {
                if (is_link($wpContent)) {
                    continue;
                }

                $baseName = basename($wpContent);
                if ($baseName === "index.php" || strpos($baseName, "wp-staging") === 0 || strpos($baseName, "wpstg-") === 0) {
                    continue;
                }

                if (in_array($baseName, ["plugins", "themes", "uploads", "mu-plugins", "languages"])) {
                    continue;
                }

                if (is_file($wpContent)) {
                    file_put_contents($logFile, "unlink: " . $wpContent . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        unlink($wpContent);
                    }

                    continue;
                }

                if (is_dir($wpContent)) {
                    file_put_contents($logFile, "rmdir: " . $wpContent . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        $wpFileSystemDirect->rmdir($wpContent, true);
                    }
                }
            }
        }

        // Cleanup ABSPATH/
        $absRootPath = $config->rootPath;
        if (file_exists($absRootPath) && is_dir($absRootPath) && !is_link($absRootPath)) {
            $rootPathArrays = glob($absRootPath . "/*");
            foreach ($rootPathArrays as $rootPath) {
                if (is_link($rootPath)) {
                    continue;
                }

                $baseName = basename($rootPath);
                if ($baseName === "index.php" || strpos($baseName, "wp-staging") === 0 || strpos($baseName, "wpstg-") === 0) {
                    continue;
                }

                if (in_array($baseName, $wpCoreFiles)) {
                    continue;
                }

                if (is_file($rootPath)) {
                    file_put_contents($logFile, "unlink: " . $rootPath . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        unlink($rootPath);
                    }

                    continue;
                }

                if (is_dir($rootPath)) {
                    file_put_contents($logFile, "rmdir: " . $rootPath . "n", FILE_APPEND);
                    if (!$isDryRun) {
                        $wpFileSystemDirect->rmdir($rootPath, true);
                    }
                }
            }
        }
    });
});
Expand

Tras instalar el mu-plugin, debes:

  1. Cambiar esta línea en el código del plugin $isDryRun = true; a $isDryRun = false;
  2. Crear un nuevo sitio de staging e iniciar sesión en él, y verás que ha sido restablecido.
  3. Cambiar $isDryRun = false; a $isDryRun = true; cuando hayas terminado o eliminar el mu-plugin si ya no lo necesitas.

Usando un plugin de terceros

Para ello, crea un nuevo sitio de staging usando el plugin WP Staging. Luego, instala y activa el plugin WordPress Reset en el nuevo sitio de staging.
Nota: Este plugin está desactualizado y no ha sido actualizado desde hace mucho tiempo, por lo que recomendamos usar el mu-plugin descrito arriba.

Este plugin permite restablecer la base de datos de WordPress a sus valores predeterminados.

Updated on mayo 22, 2026

Rene Hermenau

Autor: Rene Hermenau

About the author: René Hermenau is the founder of WP STAGING. He works on WordPress backups, staging, migrations, database handling, and safe deployment workflows.