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数据库中域名”

发表回复

本站承接:网站web修改及维护;网站推广(SEM,SEO);软件安装与调试;服务器部署;APP开发与维护;
各财务软件安装调试服务(如,金蝶,用友,管家婆,速达,星宇等);OA系列,客户管理系统,人力资源,超市POS,医药管理等;

立即查看 了解详情