Last active
February 17, 2025 10:02
-
-
Save nawawi/1a7b9ff1cf37ff43d77b8882996d3373 to your computer and use it in GitHub Desktop.
0-wpstg-reset
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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('@^wpstg\d+@', $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); | |
} | |
} | |
} | |
} | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment