借助gulp watch与browser-sync实现本地WordPress与线上站点同步咨询
我刚好折腾过类似的WordPress本地到线上同步工作流,结合你用Gulp Watch + BrowserSync的开发场景,分文件自动部署和数据库同步两部分给你具体方案:
一、文件自动同步(含Sass编译部署)
核心思路是用Gulp监听文件变更,编译Sass后自动把增量文件同步到线上服务器,同时用BrowserSync刷新本地预览。
1. 安装必要依赖
先装Gulp相关插件,gulp-rsync比SFTP更适合增量同步(速度快),当然你也可以用gulp-sftp替代:
npm install gulp-sass browser-sync gulp-rsync --save-dev
2. 配置Gulp任务
修改你的gulpfile.js,加入以下任务(记得替换成你自己的本地/线上路径和服务器信息):
const gulp = require('gulp'); const sass = require('gulp-sass')(require('sass')); const browserSync = require('browser-sync').create(); const rsync = require('gulp-rsync'); // 1. Sass编译任务:编译后同步到本地主题目录,同时刷新BrowserSync gulp.task('sass', function() { return gulp.src('./wp-content/themes/your-theme/sass/**/*.scss') .pipe(sass().on('error', sass.logError)) .pipe(gulp.dest('./wp-content/themes/your-theme/css')) .pipe(browserSync.stream()); }); // 2. 线上同步任务:增量同步主题文件到服务器 gulp.task('deploy', function() { return gulp.src('./wp-content/themes/your-theme/**/*') .pipe(rsync({ root: './wp-content/themes/your-theme', hostname: '你的服务器IP/域名', username: 'SSH用户名', destination: '/服务器上WordPress主题的绝对路径', incremental: true, // 只传变更的文件,提升速度 progress: true, exclude: ['.git', 'node_modules', '.DS_Store', 'sass'] // 排除不需要同步的目录/文件 })); }); // 3. 监听任务:整合编译、同步、本地刷新 gulp.task('watch', function() { // 初始化BrowserSync,代理你的本地WordPress站点(比如localhost:8080) browserSync.init({ proxy: 'localhost:8080', open: true }); // 监听Sass文件,变更时自动编译 gulp.watch('./wp-content/themes/your-theme/sass/**/*.scss', gulp.series('sass')); // 监听主题下的PHP/JS/图片等文件,变更时同步到线上并刷新本地 gulp.watch('./wp-content/themes/your-theme/**/*.{php,js,png,jpg}', gulp.series('deploy', browserSync.reload)); }); // 默认启动任务:先编译一次Sass,再开启监听 gulp.task('default', gulp.series('sass', 'watch'));
注意事项
- 确保你的服务器开启了SSH服务,且本地能通过SSH密钥登录(避免每次输密码,更安全)
- 如果用SFTP替代rsync,只需把
gulp-rsync换成gulp-sftp,配置类似,不过增量同步效率会低一些
二、数据库同步方案
WordPress数据库同步的核心问题是本地/线上站点URL的替换,不然同步后会出现链接错误,分两种场景:
1. 手动同步(适合变更不频繁的场景)
- 用phpMyAdmin导出本地数据库,然后导入线上数据库
- 导入后,用WordPress插件比如Better Search Replace,搜索本地站点URL(比如
http://localhost:8080),替换成线上URL(比如https://your-domain.com),记得勾选“替换GUID”选项
2. 自动同步(适合开发中频繁变更数据库的场景)
可以用Gulp结合mysqldump命令,实现一键导出本地数据库、替换URL、导入线上的自动化流程:
步骤1:安装依赖(需要本地和服务器都有MySQL命令行工具)
npm install dotenv --save-dev # 用来管理敏感信息,避免硬编码密码
步骤2:配置环境变量
在项目根目录创建.env文件:
# 本地数据库配置 LOCAL_DB_HOST=localhost LOCAL_DB_USER=root LOCAL_DB_PASS=your-local-db-password LOCAL_DB_NAME=your-local-wp-db LOCAL_SITE_URL=http://localhost:8080 # 线上数据库配置 REMOTE_DB_HOST=your-remote-db-host REMOTE_DB_USER=remote-db-user REMOTE_DB_PASS=your-remote-db-password REMOTE_DB_NAME=remote-wp-db REMOTE_SITE_URL=https://your-domain.com REMOTE_SSH_USER=your-ssh-username REMOTE_SSH_HOST=your-server-ip
步骤3:添加Gulp同步数据库任务
require('dotenv').config(); const exec = require('child_process').exec; gulp.task('sync-db', function(cb) { const cmd = `mysqldump -h ${process.env.LOCAL_DB_HOST} -u ${process.env.LOCAL_DB_USER} -p${process.env.LOCAL_DB_PASS} ${process.env.LOCAL_DB_NAME} | sed 's/${process.env.LOCAL_SITE_URL}/${process.env.REMOTE_SITE_URL}/g' | ssh ${process.env.REMOTE_SSH_USER}@${process.env.REMOTE_SSH_HOST} "mysql -h ${process.env.REMOTE_DB_HOST} -u ${process.env.REMOTE_DB_USER} -p${process.env.REMOTE_DB_PASS} ${process.env.REMOTE_DB_NAME}"`; exec(cmd, function(err, stdout, stderr) { if (stdout) console.log('数据库同步输出:', stdout); if (stderr) console.log('同步警告/错误:', stderr); cb(err); }); });
使用方式
需要同步数据库时,直接在终端运行:
gulp sync-db
注意事项
- 确保本地能通过SSH无密码登录服务器(配置SSH密钥对)
- 不要把
.env文件提交到Git,加入.gitignore里 - 如果觉得命令行方式太麻烦,也可以用付费插件WP Migrate DB Pro,支持一键同步数据库+媒体文件,自动处理URL替换,非常省心
内容的提问来源于stack exchange,提问作者asdf




