Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This is the tool for WordPress to manually deactivate any plugins and rollback to default theme.
<?php
/**
* WordPress Emergency Tools v1.0
*
* This is a tool to manually deactivate a theme and any plugins when you can not
* access the admin panel due to WordPress theme or plugins bug etc.
* Usage it please place this file in the same directory as "wp-config.php" and
* access it directly from the browser.
* Please delete this file promptly after use (If this file will remain, it will
* be a serious security hole for your service).
*
* Note: The author is not responsible for any trouble that occurred using this tool.
*
* @author: ka2
*
*/
if ( ! defined( 'WP_DEFAULT_THEME' ) )
define( 'WP_DEFAULT_THEME', 'twentyseventeen' );
session_start();
require_once( dirname(__FILE__) . '/wp-config.php' );
function dbConnect() {
try {
$_host = explode( ':', DB_HOST );
$_dsn = 'mysql:';
$_dsn .= 'host=' . $_host[0] . ';';
$_dsn .= ! empty( $_host[1] ) ? 'port=' . $_host[1] . ';' : '';
$_dsn .= 'dbname=' . DB_NAME .';';
$_dsn .= 'charset=' . DB_CHARSET;
$db = new PDO( $_dsn, DB_USER, DB_PASSWORD, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
] );
return $db;
} catch ( PDOException $e ) {
die( 'Database connection failed.' . $e->getMessage() );
}
}
$db = dbConnect();
$result = '';
if ( ! empty( $_POST ) ) {
$result .= deactivateComponents( $db, $table_prefix );
}
$result .= listComponents( $db, $table_prefix );
function listComponents( $db, $table_prefix ) {
$components = array();
// Get active plugins
$sql = "SELECT option_value FROM {$table_prefix}options WHERE option_name = 'active_plugins'";
$query = $db->query( $sql, PDO::FETCH_ASSOC );
$res = $query->fetch();
$components['plugins'] = unserialize( $res['option_value'] );
// Get current theme
$sql = "SELECT option_value FROM {$table_prefix}options WHERE option_name = 'current_theme'";
$query = $db->query( $sql, PDO::FETCH_ASSOC );
$res = $query->fetch();
$components['theme'] = $res['option_value'];
// Create list
$doc = '<form method="post" action="'. $_SERVER['PHP_SELF'] .'">';
$doc .= '<ul style="list-style-type: none;">';
$doc .= '<li><strong>Active Plugins</strong></li>';
foreach ( $components['plugins'] as $_plugin ) {
$doc .= '<li><label><input type="checkbox" name="plugins[]" value="'. $_plugin .'">'. substr( $_plugin, 0, strpos( $_plugin, '/' ) ) .'</label></li>';
}
$doc .= '<li><hr></li>';
$doc .= '<li><strong>Current Theme</strong></li>';
if ( ! empty( $components['theme'] ) ) {
$doc .= '<li><label><input type="checkbox" name="theme" value="'. $components['theme'] .'">'. $components['theme'] .'</label></li>';
} else {
$doc .= '<li><span style="color:grey;margin-left:1em;">Undefiend</span></li>';
}
$doc .= '</ul>';
$doc .= '<p>Submit after checked the components you want to deactivate.</p>';
$doc .= '<input type="submit" value="Submit">';
$doc .= '</form>';
return $doc;
}
function deactivateComponents( $db, $table_prefix ) {
$message = array();
if ( array_key_exists( 'plugins', $_POST ) ) {
$sql = "SELECT option_value FROM {$table_prefix}options WHERE option_name = 'active_plugins'";
$query = $db->query( $sql, PDO::FETCH_ASSOC );
$res = $query->fetch();
$active_plugins = unserialize( $res['option_value'] );
foreach ( $active_plugins as $_i => $_plugin ) {
if ( in_array( $_plugin, $_POST['plugins'] ) ) {
unset( $active_plugins[$_i] );
}
}
$active_plugins = serialize( $active_plugins );
$stmt = $db->prepare( "UPDATE {$table_prefix}options SET option_value = :value WHERE option_name = 'active_plugins'" );
$stmt->bindParam( ':value', $active_plugins );
if ( $stmt->execute() ) {
$message[] = '<p style="color:green;">Deactivated the specified plugins.</p>';
} else {
$message[] = '<p style="color:red;">Could not deactivate the plugins.</p>';
}
}
if ( array_key_exists( 'theme', $_POST ) ) {
$default_theme = WP_DEFAULT_THEME;
$stmt1 = $db->prepare( "UPDATE {$table_prefix}options SET option_value = :theme WHERE option_name = 'current_theme'" );
$stmt1->bindParam( ':theme', $default_theme );
$stmt2 = $db->prepare( "UPDATE {$table_prefix}options SET option_value = :theme WHERE option_name = 'template'" );
$stmt2->bindParam( ':theme', $default_theme );
$stmt3 = $db->prepare( "UPDATE {$table_prefix}options SET option_value = :theme WHERE option_name = 'stylesheet'" );
$stmt3->bindParam( ':theme', $default_theme );
if ( $stmt1->execute() && $stmt2->execute() && $stmt3->execute() ) {
$message[] = '<p style="color:green;">Deactivated the current theme.</p>';
} else {
$message[] = '<p style="color:red;">Could not deactivate the current theme.</p>';
}
}
session_destroy();
return implode( "\n", $message );
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WP Emergency Tool</title>
</head>
<body>
<p>Now connecting to database of WordPress.</p>
<?php echo $result; ?>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment