function change_db_prefix($table_old_prefix, $table_new_prefix) { global $wpdb, $aio_wp_security; $old_prefix_length = strlen($table_old_prefix); $error = 0; //Config file path $config_file = AIOWPSecurity_Utility_File::get_wp_config_file_path(); //Get the table resource //$result = mysql_list_tables(DB_NAME); $result = $this->get_mysql_tables(DB_NAME); //Fix for deprecated php mysql_list_tables function //Count the number of tables if (is_array($result) && count($result) > 0) { $num_rows = count($result); } else { echo '<div class="aio_red_box"><p>' . __('Error - Could not get tables or no tables found!', 'all-in-one-wp-security-and-firewall') . '</p></div>'; return; } $table_count = 0; $info_msg_string = '<p class="aio_info_with_icon">' . __('Starting DB prefix change operations.....', 'all-in-one-wp-security-and-firewall') . '</p>'; $info_msg_string .= '<p class="aio_info_with_icon">' . sprintf(__('Your WordPress system has a total of %s tables and your new DB prefix will be: %s', 'all-in-one-wp-security-and-firewall'), '<strong>' . $num_rows . '</strong>', '<strong>' . $table_new_prefix . '</strong>') . '</p>'; echo $info_msg_string; //Do a back of the config file if (!AIOWPSecurity_Utility_File::backup_and_rename_wp_config($config_file)) { echo '<div class="aio_red_box"><p>' . __('Failed to make a backup of the wp-config.php file. This operation will not go ahead.', 'all-in-one-wp-security-and-firewall') . '</p></div>'; return; } else { echo '<p class="aio_success_with_icon">' . __('A backup copy of your wp-config.php file was created successfully!', 'all-in-one-wp-security-and-firewall') . '</p>'; } //Get multisite blog_ids if applicable if (AIOWPSecurity_Utility::is_multisite_install()) { $blog_ids = AIOWPSecurity_Utility::get_blog_ids(); } //Rename all the table names foreach ($result as $db_table) { //Get table name with old prefix $table_old_name = $db_table; if (strpos($table_old_name, $table_old_prefix) === 0) { //Get table name with new prefix $table_new_name = $table_new_prefix . substr($table_old_name, $old_prefix_length); //Write query to rename tables name $sql = "RENAME TABLE `" . $table_old_name . "` TO `" . $table_new_name . "`"; //$sql = "RENAME TABLE %s TO %s"; //Execute the query if (false === $wpdb->query($sql)) { $error = 1; echo '<p class="aio_error_with_icon">' . sprintf(__('%s table name update failed', 'all-in-one-wp-security-and-firewall'), '<strong>' . $table_old_name . '</strong>') . '</p>'; $aio_wp_security->debug_logger->log_debug("DB Security Feature - Unable to change prefix of table " . $table_old_name, 4); } else { $table_count++; } } else { continue; } } if ($error == 1) { echo '<p class="aio_error_with_icon">' . sprintf(__('Please change the prefix manually for the above tables to: %s', 'all-in-one-wp-security-and-firewall'), '<strong>' . $table_new_prefix . '</strong>') . '</p>'; } else { echo '<p class="aio_success_with_icon">' . sprintf(__('%s tables had their prefix updated successfully!', 'all-in-one-wp-security-and-firewall'), '<strong>' . $table_count . '</strong>') . '</p>'; } //Get wp-config.php file contents and modify it with new info $config_contents = file($config_file); $prefix_match_string = '$table_prefix='; //this is our search string for the wp-config.php file foreach ($config_contents as $line_num => $line) { $no_ws_line = preg_replace('/\\s+/', '', $line); //Strip white spaces if (strpos($no_ws_line, $prefix_match_string) !== FALSE) { $config_contents[$line_num] = str_replace($table_old_prefix, $table_new_prefix, $line); break; } } //Now let's modify the wp-config.php file if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents)) { echo '<p class="aio_success_with_icon">' . __('wp-config.php file was updated successfully!', 'all-in-one-wp-security-and-firewall') . '</p>'; } else { echo '<p class="aio_error_with_icon">' . sprintf(__('The "wp-config.php" file was not able to be modified. Please modify this file manually using your favourite editor and search for variable "$table_prefix" and assign the following value to that variable: %s', 'all-in-one-wp-security-and-firewall'), '<strong>' . $table_new_prefix . '</strong>') . '</p>'; $aio_wp_security->debug_logger->log_debug("DB Security Feature - Unable to modify wp-config.php", 4); } //Now let's update the options table $update_option_table_query = "UPDATE " . $table_new_prefix . "options \r\r\n SET option_name = '" . $table_new_prefix . "user_roles' \r\r\n WHERE option_name = '" . $table_old_prefix . "user_roles' \r\r\n LIMIT 1"; if (false === $wpdb->query($update_option_table_query)) { echo '<p class="aio_error_with_icon">' . sprintf(__('Update of table %s failed: unable to change %s to %s', 'all-in-one-wp-security-and-firewall'), $table_new_prefix . 'options', $table_old_prefix . 'user_roles', $table_new_prefix . 'user_roles') . '</p>'; $aio_wp_security->debug_logger->log_debug("DB Security Feature - Error when updating the options table", 4); //Log the highly unlikely event of DB error } else { echo '<p class="aio_success_with_icon">' . sprintf(__('The options table records which had references to the old DB prefix were updated successfully!', 'all-in-one-wp-security-and-firewall')) . '</p>'; } //Now let's update the options tables for the multisite subsites if applicable if (AIOWPSecurity_Utility::is_multisite_install()) { if (!empty($blog_ids)) { foreach ($blog_ids as $blog_id) { if ($blog_id == 1) { continue; } //skip main site $new_pref_and_site_id = $table_new_prefix . $blog_id . '_'; $old_pref_and_site_id = $table_old_prefix . $blog_id . '_'; $update_ms_option_table_query = "UPDATE " . $new_pref_and_site_id . "options\r\r\n SET option_name = '" . $new_pref_and_site_id . "user_roles'\r\r\n WHERE option_name = '" . $old_pref_and_site_id . "user_roles'\r\r\n LIMIT 1"; if (false === $wpdb->query($update_ms_option_table_query)) { echo '<p class="aio_error_with_icon">' . sprintf(__('Update of table %s failed: unable to change %s to %s', 'all-in-one-wp-security-and-firewall'), $new_pref_and_site_id . 'options', $old_pref_and_site_id . 'user_roles', $new_pref_and_site_id . 'user_roles') . '</p>'; $aio_wp_security->debug_logger->log_debug("DB change prefix feature - Error when updating the subsite options table: " . $new_pref_and_site_id . 'options', 4); //Log the highly unlikely event of DB error } else { echo '<p class="aio_success_with_icon">' . sprintf(__('The %s table records which had references to the old DB prefix were updated successfully!', 'all-in-one-wp-security-and-firewall'), $new_pref_and_site_id . 'options') . '</p>'; } } } } //Now let's update the user meta table $custom_sql = "SELECT user_id, meta_key \r\r\n FROM " . $table_new_prefix . "usermeta \r\r\n WHERE meta_key \r\r\n LIKE '" . $table_old_prefix . "%'"; $meta_keys = $wpdb->get_results($custom_sql); $error_update_usermeta = ''; //Update all meta_key field values which have the old table prefix in user_meta table foreach ($meta_keys as $meta_key) { //Create new meta key $new_meta_key = $table_new_prefix . substr($meta_key->meta_key, $old_prefix_length); $update_user_meta_sql = "UPDATE " . $table_new_prefix . "usermeta \r\r\n SET meta_key='" . $new_meta_key . "' \r\r\n WHERE meta_key='" . $meta_key->meta_key . "'\r\r\n AND user_id='" . $meta_key->user_id . "'"; if (false === $wpdb->query($update_user_meta_sql)) { $error_update_usermeta .= '<p class="aio_error_with_icon">' . sprintf(__('Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s.', 'all-in-one-wp-security-and-firewall'), $new_meta_key, $meta_key->meta_key, $meta_key->user_id) . '</p>'; echo $error_update_usermeta; $aio_wp_security->debug_logger->log_debug("DB Security Feature - Error updating user_meta table where new meta_key = " . $new_meta_key . " old meta_key = " . $meta_key->meta_key . " and user_id = " . $meta_key->user_id, 4); //Log the highly unlikely event of DB error } } echo '<p class="aio_success_with_icon">' . __('The usermeta table records which had references to the old DB prefix were updated successfully!', 'all-in-one-wp-security-and-firewall') . '</p>'; //Display tasks finished message $tasks_finished_msg_string = '<p class="aio_info_with_icon">' . __('DB prefix change tasks have been completed.', 'all-in-one-wp-security-and-firewall') . '</p>'; echo $tasks_finished_msg_string; }