public function clone_wp_tables($alt_heap)
{
global $wpdb;
$old_prefix = $wpdb->prefix;
$alt_prefix = self::get_alt_prefix($alt_heap);
$tables = self::get_wp_tables();
foreach ($tables as $table) {
$new_table = str_ireplace($old_prefix, $alt_prefix, $table);
set_time_limit(600);
// allow up to 10 minutes for large db queries to finish
$query = wp_sprintf("DROP TABLE IF EXISTS %s;", $new_table);
$wpdb->query($query);
set_time_limit(600);
$query = wp_sprintf("CREATE TABLE %s LIKE %s;", $new_table, $table);
$wpdb->query($query);
set_time_limit(600);
$query = wp_sprintf("INSERT %s SELECT * FROM %s;", $new_table, $table);
$wpdb->query($query);
// $wpdb->prefix is oddly used in other places too in the wp_options and
// usermeta tables. We need to search-replace those.
if (false !== strpos($table, 'options')) {
set_time_limit(600);
$query = wp_sprintf("UPDATE %s SET option_name='%suser_roles' WHERE option_name='%suser_roles';", $new_table, $alt_prefix, $old_prefix);
$wpdb->query($query);
}
if (false !== strpos($table, 'usermeta')) {
$query = $wpdb->prepare("SELECT user_id, meta_key FROM {$new_table} WHERE meta_key LIKE %s;", str_replace('_', '\\_', $old_prefix) . '%');
$meta_keys = $wpdb->get_results($query);
foreach ($meta_keys as $row) {
$old_key = $row->meta_key;
$new_key = str_replace($old_prefix, $alt_prefix, $old_key);
$query = $wpdb->prepare("UPDATE {$new_table} SET meta_key=%s WHERE meta_key=%s;", $new_key, $old_key);
$wpdb->query($query);
}
}
}
}