Tạo staging WordPress: thử thay đổi an toàn trước khi lên site thật
Hướng dẫn tạo staging WordPress trên VPS bằng panel hoặc thủ công với wp-cli, cách chặn index, đẩy lên site thật và những lỗi làm mất đơn hàng cần tránh.

Ý chính
- Staging WordPress là bản sao đầy đủ file và database trên một tên miền khác để thử thay đổi.
- Bản staging phải bị chặn index, gửi email và cổng thanh toán thật.
- Đẩy staging lên site thật sẽ ghi đè database, nên đơn hàng và bình luận mới trên site thật có thể mất.
- Với cửa hàng WooCommerce, nên dùng staging để thử rồi áp dụng lại thay đổi trên site thật thay vì đẩy cả database.
Để tạo staging WordPress, bạn sao chép toàn bộ file và database của website sang một tên miền khác (thường là staging.tenmien.com), đổi URL trong database sang tên miền mới, chặn công cụ tìm kiếm và khoá truy cập. Sau đó mọi bản cập nhật plugin, đổi giao diện hay sửa code đều được thử ở đó trước. Trên VPS, việc này mất vài phút nếu panel hỗ trợ sẵn, hoặc khoảng nửa giờ nếu làm thủ công với wp-cli.
Bài viết này giải thích khi nào cần staging, những gì một bản staging phải có để không gây hại, cách tạo bằng ZoPanel và cách tạo thủ công trên Ubuntu/Debian, rồi đến phần dễ sai nhất: đưa thay đổi từ staging trở lại site thật.
Staging WordPress là gì và khi nào bạn cần nó?
Staging là môi trường thử nghiệm giống hệt site thật: cùng phiên bản WordPress, cùng plugin, cùng giao diện, cùng dữ liệu. Khác biệt duy nhất là nó chạy trên một địa chỉ riêng mà khách truy cập không thấy.
Bạn cần staging khi thay đổi có thể làm hỏng website:
- Cập nhật lớn: WordPress lên phiên bản chính mới, WooCommerce, page builder, plugin thành viên.
- Đổi hoặc nâng cấp giao diện, đặc biệt khi có child theme hay CSS tuỳ chỉnh.
- Nâng phiên bản PHP, ví dụ từ 8.1 lên 8.3. Plugin cũ hay gặp lỗi ở bước này.
- Thêm plugin mới có tác động lên toàn site: cache, bảo mật, SEO, đa ngôn ngữ.
- Sửa code trong
functions.phphoặc plugin tự viết.
Với một blog cá nhân, sao lưu trước khi cập nhật có thể là đủ. Với website bán hàng, website của khách hàng agency, hay bất kỳ site nào mà một giờ ngừng hoạt động là mất tiền, staging gần như bắt buộc.
Một bản staging an toàn cần những gì?
Bản staging là bản sao dữ liệu thật, nên nếu để mở, nó có thể gây hại theo những cách không ngờ tới. Trước khi bắt tay làm, hãy kiểm tra danh sách sau.
| Việc cần làm | Vì sao |
|---|---|
| Chặn công cụ tìm kiếm | Google index bản staging sẽ tạo nội dung trùng lặp với site thật. |
| Khoá truy cập (mật khẩu HTTP hoặc giới hạn IP) | Staging chứa dữ liệu khách hàng thật, không nên để ai cũng mở được. |
| Chặn hoặc chuyển hướng email gửi đi | Tránh gửi email xác nhận đơn hàng, newsletter cho khách thật từ bản thử. |
| Chuyển cổng thanh toán sang chế độ test | Tránh tạo giao dịch thật từ staging. |
| Tắt tích hợp ra ngoài (đồng bộ kho, CRM, webhook) | Staging không được ghi dữ liệu vào hệ thống thật. |
| Đánh dấu môi trường | Đặt WP_ENVIRONMENT_TYPE là staging để plugin biết đây không phải site thật. |
Hằng số WP_ENVIRONMENT_TYPE có từ WordPress 5.5, nhận các giá trị local, development, staging và production; giá trị khác bị coi là production (tài liệu WordPress). Không phải plugin nào cũng đọc hằng số này, nên đừng coi nó là cách duy nhất để tắt email hay thanh toán.
Một lưu ý về "chặn công cụ tìm kiếm": tuỳ chọn Search engine visibility của WordPress chỉ thêm thẻ noindex và sửa robots.txt. Nó là lời đề nghị, không phải khoá. Mật khẩu HTTP mới thật sự ngăn cả bot lẫn người lạ.
Cách tạo staging WordPress với ZoPanel
Trong ZoPanel, staging nằm ở tab WordPress của website. Tab này đọc thông tin bằng wp-cli nên dùng được cả với site bạn tự upload hoặc chuyển từ hosting khác về.
Bước 1: Tạo bản staging
- Mở website, vào tab WordPress và bấm Tạo staging.
- Tên miền mặc định là
staging.<tên-miền-của-bạn>. Bạn có thể dùng bất kỳ tên miền hay subdomain nào thuộc tài khoản. - ZoPanel sao chép file và database sang website mới, đổi URL trong database và ẩn bản staging với công cụ tìm kiếm.
Bước 2: Trỏ DNS và chờ SSL
Tạo bản ghi A cho staging.tenmien.com trỏ về IP của server. Khi DNS đã phân giải, chứng chỉ SSL được cấp tự động. Nếu chưa quen trỏ DNS, xem hướng dẫn trỏ tên miền về VPS.
Bước 3: Làm việc trên staging
Tab WordPress của bản staging hiển thị staging của example.com, nên bạn không nhầm hai site với nhau. Ở đây bạn dùng được đủ công cụ: Đăng nhập WordPress bằng link dùng một lần, cập nhật plugin, đổi phiên bản PHP trong tab PHP & cấu hình, bật Ghi log debug trong thẻ Vận hành để xem lỗi trong wp-content/debug.log.
Nếu muốn khoá cả bản staging bằng mật khẩu, dùng Thư mục có mật khẩu trong tab Công cụ với đường dẫn /.
Bước 4: Đẩy lên site thật
Khi đã hài lòng, mở tab WordPress của bản staging và bấm Đẩy lên site thật. ZoPanel:
- thay file của site thật bằng file staging, trừ
wp-config.php,.user.inivà.maintenance; - thay database của site thật bằng database staging, rồi đổi URL staging thành URL thật trong toàn bộ database bằng wp-cli search-replace;
- giữ nguyên thiết lập hiển thị với công cụ tìm kiếm của site thật và xoá cache;
- chụp snapshot site thật trước, và tự khôi phục nếu site hỏng sau khi đẩy.
Bản staging tính vào giới hạn website và database của gói hosting. Trên gói Free (3 tài khoản hosting, 10 website, 10 database), mỗi bản staging dùng mất một website và một database. Xem chi tiết trong tài liệu WordPress Toolkit.
Tạo staging WordPress thủ công trên VPS
Nếu bạn quản lý server bằng tay, quy trình dưới đây dùng được trên Ubuntu 24.04 và Debian 12 với nginx, PHP-FPM, MariaDB và wp-cli. Ví dụ giả định site thật ở /var/www/example.com, file thuộc user www-data. Hãy thay đường dẫn, tên user và tên miền cho đúng server của bạn.
Bước 1: Sao chép file
sudo rsync -a --exclude 'wp-content/cache/' \
/var/www/example.com/ /var/www/staging.example.com/
Bỏ thư mục cache vì nó chứa trang đã render với URL cũ.
Bước 2: Tạo database riêng cho staging
sudo mariadb -e "CREATE DATABASE wp_staging;
CREATE USER 'wp_staging'@'localhost' IDENTIFIED BY 'đổi-mật-khẩu-mạnh';
GRANT ALL PRIVILEGES ON wp_staging.* TO 'wp_staging'@'localhost';"
Dùng user database riêng, không dùng chung user của site thật. Nếu code staging có lỗi, nó không thể ghi nhầm vào database thật.
Bước 3: Sửa wp-config.php của staging
cd /var/www/staging.example.com
sudo -u www-data wp config set DB_NAME wp_staging
sudo -u www-data wp config set DB_USER wp_staging
sudo -u www-data wp config set DB_PASSWORD 'đổi-mật-khẩu-mạnh'
sudo -u www-data wp config set WP_ENVIRONMENT_TYPE staging
Làm bước này trước khi nhập database, nếu không lệnh wp-cli tiếp theo sẽ kết nối vào database thật.
Bước 4: Sao chép database và đổi URL
sudo -u www-data wp --path=/var/www/example.com db export /tmp/live.sql
sudo -u www-data wp db import /tmp/live.sql
sudo rm /tmp/live.sql
sudo -u www-data wp search-replace 'https://example.com' \
'https://staging.example.com' --all-tables-with-prefix \
--skip-columns=guid --dry-run
Xem kết quả --dry-run, rồi chạy lại không có cờ đó. Đừng sửa URL bằng câu lệnh SQL UPDATE thông thường: WordPress lưu nhiều dữ liệu ở dạng serialized, và wp search-replace xử lý đúng kiểu dữ liệu này (tài liệu lệnh). Cột guid được bỏ qua vì GUID của bài viết không nên thay đổi.
Cuối cùng, chặn công cụ tìm kiếm và xoá cache:
sudo -u www-data wp option update blog_public 0
sudo -u www-data wp cache flush
Bước 5: Cấu hình nginx, SSL và mật khẩu
Sao chép server block của site thật, đổi server_name và root, rồi sudo nginx -t && sudo systemctl reload nginx. Cấp SSL bằng Certbot như với site thật. Sau đó thêm mật khẩu HTTP:
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd-staging dev
auth_basic "Staging";
auth_basic_user_file /etc/nginx/.htpasswd-staging;
location /.well-known/acme-challenge/ {
auth_basic off;
}
Khối location cuối giúp Let's Encrypt vẫn gia hạn được chứng chỉ khi site có mật khẩu. Nhớ đặt nó cùng cấp với các location khác trong server block.
Đẩy staging lên site thật: phần dễ mất dữ liệu nhất
Tạo staging thì dễ. Đưa thay đổi về lại mới là chỗ nhiều người mất dữ liệu. Vấn đề nằm ở database: trong lúc bạn làm việc trên staging, site thật vẫn chạy. Khách vẫn đặt hàng, để lại bình luận, đăng ký tài khoản. Nếu bạn ghi đè database thật bằng database staging, mọi thứ phát sinh sau thời điểm sao chép sẽ biến mất.
| Loại website | Cách đưa thay đổi về an toàn |
|---|---|
| Blog, site giới thiệu ít cập nhật | Đẩy cả file lẫn database, miễn là trong lúc làm staging không ai đăng bài mới trên site thật. |
| Site có bình luận, form liên hệ lưu vào database | Tạm khoá đăng bài và bình luận, hoặc tạo staging mới ngay trước khi đẩy. |
| WooCommerce, site thành viên, khoá học | Không đẩy database. Dùng staging để thử, rồi lặp lại đúng các bước đó trên site thật. |
Với cửa hàng, quy trình thực tế là: thử cập nhật trên staging, ghi lại plugin và phiên bản nào chạy ổn, rồi cập nhật đúng các plugin đó trên site thật. Trong ZoPanel, nút Cập nhật tất cả trên site thật chạy cập nhật an toàn: chụp snapshot file và database, cập nhật, kiểm tra / và /wp-login.php, và tự khôi phục nếu site lỗi. Staging cho bạn biết trước bản cập nhật có ổn không; cập nhật an toàn là lưới đỡ thứ hai nếu site thật vẫn khác staging.
Nếu bạn đẩy thủ công, hãy làm theo thứ tự: sao lưu site thật (file và database), bật chế độ bảo trì, đẩy file bằng rsync, xuất database staging, nhập vào site thật, chạy wp search-replace theo chiều ngược lại, bật lại blog_public, xoá cache, tắt bảo trì. Bỏ sót bước đổi URL là lỗi phổ biến nhất: site thật sẽ chuyển hướng khách sang tên miền staging.
Những lỗi thường gặp khi dùng staging
- Quên
blog_publickhi đẩy thủ công. Site thật bị đặtnoindexvà tụt khỏi Google sau vài tuần. Kiểm tra Settings → Reading ngay sau khi đẩy. - Staging gửi email cho khách thật. WooCommerce, plugin form và plugin newsletter đều gửi thư. Hãy chuyển SMTP sang hộp thư thử nghiệm hoặc dùng plugin chặn email trên staging.
- Cron chạy song song trên hai site. Tác vụ định kỳ như gửi email nhắc giỏ hàng hay đồng bộ kho sẽ chạy cả trên staging. Tắt các tích hợp này trên staging.
- Staging cũ bị bỏ quên. Một bản staging vài tháng không cập nhật là một website WordPress lỗi thời, chứa dữ liệu thật, đang mở trên internet. Xoá nó khi xong việc.
- Staging khác môi trường thật. Nếu staging chạy PHP 8.3 còn site thật chạy 8.1, kết quả thử không còn ý nghĩa. Giữ cùng phiên bản PHP, cùng cấu hình cache.
- Page cache và CDN. Sau khi đẩy, khách có thể vẫn thấy trang cũ cho tới khi cache hết hạn. Xoá cache ở server và ở CDN.
Staging có làm chậm server không?
Bản staging là một website WordPress đầy đủ nên dùng thêm dung lượng đĩa bằng kích thước site và một database nữa. Về CPU và RAM, nó gần như không tốn gì khi bạn không dùng. Trên ZoPanel, pool PHP của site không có truy cập sẽ tự ngủ sau thời gian rảnh (mặc định 30 phút), nên một bản staging nằm im không giữ RAM. Chúng tôi đã đo cách cơ chế này ảnh hưởng tới mật độ website trong bài một VPS 4 GB chạy được bao nhiêu website WordPress.
Kết luận
Staging không phức tạp: một bản sao đầy đủ, URL được đổi đúng cách, bị khoá khỏi Google và người lạ, không gửi email hay tạo giao dịch thật. Phần cần cẩn trọng là đưa thay đổi về: với site có dữ liệu phát sinh liên tục như cửa hàng, đừng ghi đè database thật.
Nếu bạn muốn làm việc này bằng vài cú bấm, ZoPanel có sẵn Tạo staging, Đẩy lên site thật với snapshot tự khôi phục, và cập nhật an toàn cho site thật. Staging và cập nhật an toàn đều có trên gói Free (3 tài khoản hosting, 10 website, 10 database, không giới hạn thời gian); xem bảng giá và hướng dẫn sao lưu để bắt đầu.
Câu hỏi thường gặp
Staging WordPress có bị Google index không?
Có thể, nếu bạn để mở. Tuỳ chọn ẩn với công cụ tìm kiếm của WordPress chỉ thêm thẻ noindex, bot vẫn vào được. Cách chắc chắn là đặt mật khẩu HTTP cho bản staging, và xoá bản staging khi không dùng nữa.
Có cần plugin để tạo staging WordPress không?
Không bắt buộc. Có nhiều plugin làm việc này, nhưng trên VPS bạn có thể tạo staging bằng wp-cli và nginx như hướng dẫn ở trên, hoặc dùng tính năng staging của control panel. Cách làm ở cấp server thường ổn định hơn với site lớn vì không bị giới hạn thời gian chạy và dung lượng upload của PHP trên web.
Đẩy staging lên site thật có làm mất đơn hàng WooCommerce không?
Có, nếu bạn đẩy cả database. Database staging không chứa đơn hàng phát sinh trên site thật sau lúc tạo staging. Với cửa hàng, hãy dùng staging để thử rồi lặp lại các thay đổi trên site thật, hoặc tạm ngừng bán hàng trong lúc đẩy.
Nên đặt staging ở subdomain hay thư mục con?
Nên dùng subdomain như staging.tenmien.com. Thư mục con chia sẻ cookie, .htaccess và quy tắc cache với site thật, dễ gây xung đột. Subdomain tách biệt hoàn toàn và có chứng chỉ SSL riêng.
Bản staging có tính vào giới hạn của gói hosting không?
Trong ZoPanel có: mỗi bản staging hoặc bản nhân bản tính là một website và một database trong gói. Hãy xoá bản staging khi xong việc để giải phóng chỗ.
Đọc tiếp

Nâng cấp WordPress lên PHP 8.3 hoặc 8.4 an toàn
Cách nâng cấp PHP cho WordPress lên 8.3 hoặc 8.4 an toàn: kiểm tra tương thích, thử trên staging, đổi PHP-FPM, theo dõi log và quay lại khi cần.

Cài WordPress trên VPS: hướng dẫn từ A đến Z (thủ công và bằng panel)
Hướng dẫn cài WordPress trên VPS Ubuntu 24.04 hoặc Debian 12 theo hai cách, thủ công với Nginx, PHP, MariaDB, SSL hoặc bằng control panel, kèm bảo mật sau cài.

Deploy tự động từ GitHub lên VPS: webhook, Actions, không downtime
Ba cách deploy tự động từ GitHub lên VPS: GitHub Actions qua SSH, webhook, hoặc Git deploy của panel, kèm script release, health check và rollback.