PHP单文件实现不登录WordPress数据库批量替换工具“一键替换WordPress数据库中域名”
[重要通告]如您遇疑难杂症,本站支持知识付费业务,扫右边二维码加博主微信,可节省您宝贵时间哦!
有时候大家在使用Wordpress建站,偶尔也会想着更换域名,其实从A域名到B域名, 网上很多教程是让修改wp-config.php文件,或者是直接修改数据库中的wp_options表,有些时候还得登录数据库或后台之类的,相对比较麻烦,这不就有一个无需登录后台就能完美修改wordpress网站域名的文件
PHP单文件实现不登录WordPress数据库批量替换工具
ajax_next();
} elseif ($_POST['action'] === 'sql_replace_submit') {
$replacer->ajax_submit();
}
exit; // 处理完 API 后退出
}
// 3. 类定义 (精简版)
class SqlReplaceSingle {
// 获取需要搜索的表和列
public function get_db_table_args() {
global $wpdb;
$args = array(
array('table_name' => $wpdb->posts, 'column_name' => 'post_content'),
array('table_name' => $wpdb->posts, 'column_name' => 'guid'),
array('table_name' => $wpdb->posts, 'column_name' => 'post_excerpt'),
array('table_name' => $wpdb->posts, 'column_name' => 'post_title'),
array('table_name' => $wpdb->postmeta, 'column_name' => 'meta_value'),
array('table_name' => $wpdb->comments, 'column_name' => 'comment_content'),
array('table_name' => $wpdb->comments, 'column_name' => 'comment_author_url'),
array('table_name' => $wpdb->commentmeta, 'column_name' => 'meta_value'),
array('table_name' => $wpdb->users, 'column_name' => 'user_url'),
array('table_name' => $wpdb->usermeta, 'column_name' => 'meta_value'),
array('table_name' => $wpdb->termmeta, 'column_name' => 'meta_value'),
array('table_name' => $wpdb->term_taxonomy, 'column_name' => 'description'),
);
$eliminate_table_names = array_column($args, 'table_name');
$eliminate_table_names[] = $wpdb->options;
$sql = "SELECT t.TABLE_NAME as table_name ,c.COLUMN_NAME as column_name FROM information_schema.TABLES t,INFORMATION_SCHEMA.Columns c WHERE c.TABLE_NAME=t.TABLE_NAME AND c.TABLE_SCHEMA = '" . DB_NAME . "' AND c.DATA_TYPE in ('longtext','text') AND t.TABLE_NAME NOT IN ('" . implode("','", $eliminate_table_names) . "')";
$result = $wpdb->get_results($sql);
if ($result) {
$args = array_merge($args, $result);
}
$args[] = array('table_name' => $wpdb->options, 'column_name' => 'option_value');
return $args;
}
// 搜索
public function db_select($key, $new = '') {
global $wpdb;
$is_str_strlen_same = true;
if ($new && strlen($new) !== strlen($key)) {
$is_str_strlen_same = false;
}
$table_args = $this->get_db_table_args();
$data = array();
$statistics = array('count' => 0, 'serialize_count' => 0);
foreach ($table_args as $args) {
$args = (array) $args;
$s_name = $args['table_name'];
$s_columns = $args['column_name'];
// 检查表是否存在,防止报错
if($wpdb->get_var("SHOW TABLES LIKE '$s_name'") != $s_name) continue;
$sql = "SELECT count(*) FROM `$s_name` WHERE `$s_columns` like '%$key%'";
$count = $wpdb->get_var($sql);
$statistics['count'] += $count;
if ($count) {
$serialize_count = 0;
$serialize_sql = '';
if (!$is_str_strlen_same) {
$serialize_sql = $sql . " and `$s_columns` LIKE '%{%' and `$s_columns` LIKE '%}'";
$serialize_count = $wpdb->get_var($serialize_sql);
$statistics['serialize_count'] += $serialize_count;
}
$data[] = array(
'table_name' => $s_name,
'column_name' => $s_columns,
'count' => $count,
'serialize_count' => $serialize_count,
);
}
}
return array('data' => $data, 'statistics' => $statistics);
}
// 执行替换
public function db_replace($old, $new) {
global $wpdb;
$is_str_strlen_same = strlen($old) === strlen($new);
$table_args = $this->get_db_table_args();
$data = array(
'serialize' => array('count' => 0, 'detail' => array()),
'routine' => array('count' => 0, 'detail' => array())
);
if (!$is_str_strlen_same) {
$data['serialize'] = $this->db_replace_serialize($old, $new);
if (!empty($data['serialize']['time_over'])) {
$data['time_over'] = true;
return $data;
}
}
foreach ($table_args as $args) {
$args = (array) $args;
$s_name = $args['table_name'];
$s_columns = $args['column_name'];
// 检查表是否存在
if($wpdb->get_var("SHOW TABLES LIKE '$s_name'") != $s_name) continue;
$sql = "UPDATE `$s_name` SET `$s_columns` = replace(`$s_columns`,'$old','$new')";
if (!$is_str_strlen_same) {
$sql .= " WHERE `$s_columns` NOT LIKE '%{%' OR `$s_columns` NOT LIKE '%}'";
}
$count = $wpdb->query($sql);
$data['routine']['detail'][] = array(
'table_name' => $s_name,
'column_name' => $s_columns,
'count' => $count,
);
$data['routine']['count'] += $count;
}
return $data;
}
// 序列化替换
public function db_replace_serialize($old, $new) {
global $wpdb;
$time_over_second = 8;
$table_args = $this->get_db_table_args();
$data = array('count' => 0, 'detail' => array());
$start_time = microtime(true);
foreach ($table_args as $args) {
$args = (array) $args;
$s_name = $args['table_name'];
$s_columns = $args['column_name'];
if($wpdb->get_var("SHOW TABLES LIKE '$s_name'") != $s_name) continue;
$sql_paged_size = 100;
$sql_paged_start = 0;
while(true) {
$sql = "SELECT `$s_columns` as `s_val` FROM `$s_name` WHERE `$s_columns` like '%$old%' and `$s_columns` LIKE '%{%' and `$s_columns` LIKE '%}' LIMIT $sql_paged_start,$sql_paged_size";
$results = $wpdb->get_results($sql);
if ($results && is_array($results)) {
$i = 0;
foreach ($results as $result) {
if ($this->db_save_serialize_data($s_name, $s_columns, $result->s_val, $old, $new)) {
$i++;
}
}
$data['detail'][] = array('table_name' => $s_name, 'column_name' => $s_columns, 'count' => $i);
$data['count'] += $i;
}
$sql_paged_start += $sql_paged_size;
if ((microtime(true) - $start_time) > $time_over_second) {
$data['time_over'] = true;
return $data;
}
if (count($results) < $sql_paged_size) break;
}
}
return $data;
}
public function db_save_serialize_data($s_name, $s_columns, $result, $old, $new) {
global $wpdb;
if (is_serialized($result)) {
$new_val = $this->serialize_data_replace(maybe_unserialize($result), $old, $new);
} else {
$new_val = str_replace($old, $new, $result);
}
$new_val = maybe_serialize($new_val);
return $wpdb->update($s_name, array($s_columns => $new_val), array($s_columns => $result));
}
public function serialize_data_replace($result, $old, $new) {
if (is_array($result)) {
foreach ($result as $k => $v) {
$result[$k] = $this->serialize_data_replace($v, $old, $new);
}
} elseif (is_object($result)) {
$result = (object) $this->serialize_data_replace((array) $result, $old, $new);
} else {
$result = str_replace($old, $new, $result);
}
return $result;
}
public function ajax_next() {
$old = wp_unslash($_POST['old']);
$new = wp_unslash($_POST['new']);
if (!$old || !$new) wp_send_json_error('请输入内容');
if ($new === $old) wp_send_json_error('新内容不能与旧内容相同');
$db_select = $this->db_select($old, $new);
if (empty($db_select['data'])) wp_send_json_error('数据库未查询到可替换的内容');
$send_msg = '';
if (strlen($new) < 5 || strlen($old) < 5) {
$send_msg = '警告:输入内容过短,容易误伤数据,请谨慎!';
}
if ($db_select['statistics']['serialize_count'] > 500) {
$send_msg .= '
序列化数据较多,请耐心等待。';
}
wp_send_json_success(['msg' => $send_msg, 'old' => $old, 'new' => $new, 'data' => $db_select['data'], 'statistics' => $db_select['statistics']]);
}
public function ajax_submit() {
$old = wp_unslash($_POST['old']);
$new = wp_unslash($_POST['new']);
$db_result = $this->db_replace($old, $new);
$count = $db_result['routine']['count'] + $db_result['serialize']['count'];
$time_over = !empty($db_result['time_over']);
$send_msg = $time_over ? '正在处理中...' : '数据库替换完成!如修改了域名,请使用新域名访问。';
wp_cache_flush();
wp_send_json_success(['msg' => $send_msg, 'time_over' => $time_over, 'count' => $count, 'old' => $old, 'new' => $new, 'data' => $db_result]);
}
}
?>
PHP单文件实现不登录WordPress数据库批量替换工具模样
PHP单文件实现不登录WordPress数据库批量替换工具本站下载链接:
问题未解决?付费解决问题加Q或微信 2589053300 (即Q号又微信号)右上方扫一扫可加博主微信
所写所说,是心之所感,思之所悟,行之所得;文当无敷衍,落笔求简洁。 以所舍,求所获;有所依,方所成!
赏
支付宝赞助
微信赞助
支付宝赞助
微信赞助免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。
您必须遵守我们的协议,如您下载该资源,行为将被视为对《免责声明》全部内容的认可->联系老梁投诉资源 LaoLiang.Net部分资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。
敬请谅解! 侵权删帖/违法举报/投稿等事务联系邮箱:service@laoliang.net
意在交流学习,欢迎赞赏评论,如有谬误,请联系指正;转载请注明出处: » PHP单文件实现不登录WordPress数据库批量替换工具“一键替换WordPress数据库中域名”

