クライアントのWebサイトにセキュリティ機能を実装し始めているので、WPデータベースプレフィックスを変更したいと思います。ただし、Webサイトはマルチサイトインストール(WPMU)であるため、通常のようにプレフィックスを変更する 通常 は機能せず、手動で変更したくない 各サブサイトのwp-configファイル(つまり、サブサイトの作成を監視しません)。
私はオールインワンWPセキュリティプラグインのデータベースプレフィックス変更オプションも使ってみましたが、運が悪いです。
誰もがこれに取り組む方法を知っていますか?どんな考えでも感謝されるでしょう。
ウェブサイトはWP 3.6を実行しています
以下の関数を呼び出すだけですが、new_prefixを追加したいテーブル接頭辞を付けて変更するようにしてください。また、設定ファイルのパスが正しいかどうかを確認してください。
function find_wp_config_path() {
$dir = dirname(__FILE__);
do {
if( file_exists($dir."/wp-config.php") ) {
return $dir;
}
} while( $dir = realpath("$dir/..") );
return null;
}
function change_table_prefix() {
global $wpdb, $table_prefix;
$old_table_prefix = $table_prefix;
$old_prefix_length = strlen( $old_table_prefix );
$table_new_prefix = 'new_prefix';
/* Config file path */
$path = find_wp_config_path();
$error = $wpdb->set_prefix( $table_new_prefix );
if ( is_wp_error( $error ) )
wp_die( '<strong style="color: #ff0000;">ERROR</strong>: table prefix can only contain numbers, letters, and underscores.' );
//Get the table resource
$result = mysql_list_tables(DB_NAME);
//Count the number of tables
$num_rows = mysql_num_rows( $result );
$table_count = 0;
//Rename all the tables name
for ($i = 0; $i < $num_rows; $i++) {
//Get table name with old prefix
$table_old_name = mysql_tablename($result, $i);
if ( strpos( $table_old_name, $old_table_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($wpdb->prepare($sql, $table_old_name, $table_new_name)) ) {
$error = 1;
echo "<p class='error'>", $table_old_name, " table name not updated.</p>";
} else {
//echo "<p class='success'>$table_old_name table name updated to $table_new_name.</p>";
$table_count++;
}
} else {
continue;
}
}
if ( @$error == 1 ) {
echo "<p class='error'>Please change the above tables prefix to ", $table_new_prefix, " manualy.</p>";
} else {
echo "<p class='success'>", $table_count, " tables prefix updated successfully.</p>";
}
//Update the wp-config.php file
$configFile = file($path);
foreach ($configFile as $line_num => $line) {
switch (substr($line,0,16)) {
case '$table_prefix =':
$configFile[$line_num] = str_replace($old_table_prefix, $table_new_prefix, $line);
break;
}
}
//making the the config readable to change the prefix
@chmod($path, 0777);
if ( is_writeable($path) ) {
$handle = fopen($path, 'w');
foreach( $configFile as $line ) {
fwrite($handle, $line);
}
fclose($handle);
echo '<p class="success">wp-config.php file updated successfully.</p>';
} else {
echo "<p class='error'>File Not Writeable: Please open wp-config.php file in your favurite editor and search
for variable", $table_prefix, " and assign ", $table_new_prefix, " to the same variable.";
}
//Create query to update option table
$update_option_table_query = "UPDATE " . $table_new_prefix . "options
SET option_name='" . $table_new_prefix . "user_roles'
WHERE option_name='" . $old_table_prefix . "user_roles'
LIMIT 1";
//Execute the update query to update option table user_roles row
if ( false === $wpdb->query($update_option_table_query) ) {
echo "<p class='error'>Changing value: ",
$old_table_prefix,
"user_roles in table ",
$table_new_prefix,
"options to ",
$table_new_prefix,
"user_roles</p>";
echo "<p class='error'>End of updating options table data with above error.</p>";
} else {
echo "<p class='success'>Updated options table data successfully.</p>";
}
//Create query to update user_meta table
$custom_sql = "SELECT user_id, meta_key
FROM " . $table_new_prefix . "usermeta
WHERE meta_key
LIKE '" . $old_table_prefix . "%'";
$meta_keys = $wpdb->get_results( $custom_sql );
//Update all the meta_key field value which having 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
SET meta_key='" . $new_meta_key . "'
WHERE meta_key='" . $meta_key->meta_key . "'
AND user_id=" . $meta_key->user_id;
$wpdb->query($update_user_meta_sql);
}
echo "<p class='success'>Updated usermeta table data successfully.</p>";
}
または、このプラグインを直接使用することもできます http://wordpress.org/plugins/change-table-prefix