Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/phudigital/mu-plugins/archive/refs/heads/main.zipPDL MU-Plugins — Sổ Tay Deploy VPS
Tài liệu này dùng để bạn đọc lại nhanh khi cần:
- dò các website WordPress trên VPS
- upload bộ
mu-plugin - cài hàng loạt vào tất cả site WordPress
- chạy thử trước khi chạy thật
- kiểm tra sau deploy
- rollback nếu cần
Repo hiện tại đang chứa:
pdl-loader.phppdl-modules/admin-utilities.phppdl-modules/admin-menu.phppdl-modules/brand-widget.phppdl-modules/hidden-plugins.phppdl-modules/hide-login.phppdl-modules/login-branding.phpbrand.jsonscripts/deploy-mu-plugins-from-folder.shscripts/deploy-mu-plugins-from-archive.sh
Mục Tiêu
Deploy bộ mu-plugin PDL vào tất cả website WordPress trên VPS FastPanel mà không đụng các website không phải WordPress. Bộ này dùng để chuẩn hoá lớp quản trị khách hàng: hiển thị thông tin hỗ trợ PDL trong Dashboard, tuỳ biến trang đăng nhập, đổi đường dẫn đăng nhập, dọn giao diện quản trị, cấu hình ẩn menu/plugin khỏi tài khoản thường và thêm chức năng sao chép nội dung.
Script deploy hiện tại chỉ nhận site nào có wp-config.php, nên:
- WordPress: có xử lý
- HTML tĩnh / Laravel / Node / PHP custom: bỏ qua
Cấu Trúc MU-Plugin
Trên mỗi website WordPress, bộ plugin sẽ nằm ở:
wp-content/mu-plugins/
├── pdl-loader.php
└── pdl-modules/
├── admin-utilities.php
├── admin-menu.php
├── brand-widget.php
├── hidden-plugins.php
├── hide-login.php
└── login-branding.php
Chức Năng Chính
brand-widget: thêm widget “Thông tin & Hỗ trợ - PDL” trong Dashboard, đọc dữ liệu từhttps://hosting.pdl.vn/brand.jsonvà liên kết quản trị tớihttps://hosting.pdl.vn/.login-branding: tuỳ biến giao diện đăng nhập WordPress theo logo/site icon và thêm credit PDL.hide-login: đổi URL đăng nhập mặc định sang/dang-nhap/và chặn truy cập trực tiếpwp-login.php/wp-register.php.admin-menu: thêm trang PDL Admin Menu để user gốc cấu hình ẩn menu/submenu admin, có tùy chọn áp dụng hoặc bỏ qua với super admin.hidden-plugins: thêm trang PDL Hidden Plugins để super admin cấu hình plugin cần ẩn khỏi trang Plugins của tài khoản thường.admin-utilities: dọn thanh quản trị theo cấu hình mặc định, ẩn notice quản trị, tắt các widget Dashboard đã chọn, thêm thao tác Sao chép cho post/page/public post type và giới hạn upload chỉ cho phép hình ảnh nhỏ hơn 2MB.
Phiên bản hiện tại: 1.4.1.
Cách Triển Khai Khuyên Dùng
Khuyên dùng cách copy từ thư mục nguồn, không dùng .zip.
Lý do:
- đơn giản nhất
- ít lỗi nhất
- không phụ thuộc
zip/unzip - dễ cập nhật: chỉ thay file trong thư mục nguồn rồi chạy lại script
Chuẩn Bị Trên VPS
Đăng nhập root, rồi tạo 2 thư mục:
mkdir -p /root/pdl-mu-source/pdl-modules
mkdir -p /root/pdl-deploy
Upload các file sau lên VPS:
/root/pdl-mu-source/
├── pdl-loader.php
└── pdl-modules/
├── admin-utilities.php
├── admin-menu.php
├── brand-widget.php
├── hidden-plugins.php
├── hide-login.php
└── login-branding.php
Upload script:
/root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Cấp quyền chạy:
chmod +x /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Detect VPS Chỉ Đọc WordPress
Dùng lệnh này để liệt kê tất cả website WordPress trên VPS:
find /var/www /home /srv /opt -type f -name wp-config.php 2>/dev/null | sort -u | while read -r cfg; do
root="$(dirname "$cfg")"
wp_content="$root/wp-content"
mu_dir="$wp_content/mu-plugins"
echo "---"
echo "WP_CONFIG=$cfg"
echo "SITE_ROOT=$root"
echo "ROOT_OWNER=$(stat -c '%U:%G' "$root" 2>/dev/null || echo UNKNOWN)"
echo "WP_CONTENT=$wp_content"
if [ -d "$mu_dir" ]; then
echo "MU_DIR=$mu_dir"
echo "MU_EXISTS=yes"
find "$mu_dir" -maxdepth 2 -mindepth 1 2>/dev/null | sort | sed 's/^/ /'
else
echo "MU_DIR=$mu_dir"
echo "MU_EXISTS=no"
fi
done
Mục đích:
- biết VPS có bao nhiêu site WordPress
- biết site nào đã có
mu-plugins - biết owner/group để script set permission đúng
Script Deploy Từ Thư Mục
File script chính:
scripts/deploy-mu-plugins-from-folder.sh
Script này sẽ:
- quét tất cả WordPress trong
/var/www - tạo
wp-content/mu-pluginsnếu chưa có - backup
pdl-loader.phpcũ nếu có - backup
pdl-modulescũ nếu có - ghi đè phần PDL mới
- không xóa các file mu-plugin khác không thuộc PDL
- set owner/group đúng theo từng website
Chạy thử trước
DRY_RUN=1 SOURCE_DIR=/root/pdl-mu-source /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Ý nghĩa:
- chỉ in ra lệnh sẽ chạy
- chưa ghi file thật
- dùng để kiểm tra xem script có chạm đúng các site WordPress không
Chạy thật
SOURCE_DIR=/root/pdl-mu-source /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Nếu muốn đổi root tìm kiếm
Mặc định script tìm trong /var/www.
Nếu VPS của bạn có site ở nhiều nơi hơn:
DRY_RUN=1 SOURCE_DIR=/root/pdl-mu-source SEARCH_ROOTS="/var/www /home /srv /opt" /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Hành Vi Ghi Đè
Script copy hiện tại:
- có ghi đè
pdl-loader.php - có ghi đè toàn bộ thư mục
pdl-modules - không xóa toàn bộ
mu-plugins - không đụng các mu-plugin khác
Ví dụ:
installatron_hide_status_test.phpsẽ được giữ nguyên
Thư Mục Backup
Mỗi lần chạy thật, backup nằm ở:
/root/pdl-mu-backups/<timestamp>/<site_slug>/
Ví dụ:
/root/pdl-mu-backups/20260420-120000/var_www_phudigital_data_www_pdl.vn/
Kiểm Tra Sau Deploy
1. Kiểm tra file đã có trên từng site
find /var/www -path '*/wp-content/mu-plugins/pdl-loader.php' 2>/dev/null | sort
2. Kiểm tra thư mục modules
find /var/www -path '*/wp-content/mu-plugins/pdl-modules' -type d 2>/dev/null | sort
3. Kiểm tra nhanh một site cụ thể
Ví dụ với pdl.vn:
ls -la /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins
ls -la /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins/pdl-modules
4. Kiểm tra cú pháp PHP
php -l /root/pdl-mu-source/pdl-loader.php
php -l /root/pdl-mu-source/pdl-modules/admin-utilities.php
php -l /root/pdl-mu-source/pdl-modules/admin-menu.php
php -l /root/pdl-mu-source/pdl-modules/brand-widget.php
php -l /root/pdl-mu-source/pdl-modules/hidden-plugins.php
php -l /root/pdl-mu-source/pdl-modules/hide-login.php
php -l /root/pdl-mu-source/pdl-modules/login-branding.php
5. Kiểm tra WordPress đã load mu-plugin
Nếu site có wp CLI chạy được:
wp plugin list --path=/var/www/phudigital/data/www/pdl.vn
Lưu ý:
mu-pluginthường không hiện như plugin thường- kiểm tra thực tế tốt nhất là vào Dashboard xem widget PDL xuất hiện
Rollback Thủ Công
Nếu cần rollback một site, ví dụ pdl.vn:
cp -a /root/pdl-mu-backups/<timestamp>/var_www_phudigital_data_www_pdl.vn/pdl-loader.php /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins/pdl-loader.php
rm -rf /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins/pdl-modules
cp -a /root/pdl-mu-backups/<timestamp>/var_www_phudigital_data_www_pdl.vn/pdl-modules /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins/pdl-modules
chown phudigital:phudigital /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins/pdl-loader.php
chown -R phudigital:phudigital /var/www/phudigital/data/www/pdl.vn/wp-content/mu-plugins/pdl-modules
Khi Dùng 2 VPS
Quy trình giống nhau:
- upload source lên VPS đó
- chạy detect WordPress
- chạy
DRY_RUN=1 - đọc output
- chạy thật
- kiểm tra Dashboard
Nếu VPS vẫn là FastPanel và site ở dạng:
/var/www/<user>/data/www/<domain>
thì script hiện tại dùng lại được nguyên.
Cập Nhật brand.json
File:
brand.json
Dùng để cấp dữ liệu cho widget brand-widget.php.
Kiểm tra JSON hợp lệ
python3 -m json.tool brand.json >/dev/null && echo OK
Các trường chính
{
"company": "Công Ty TNHH Giải Pháp PDL",
"address": "Phường Bình Hòa, Tp. Hồ Chí Minh",
"website": "https://pdl.vn",
"logo": "https://pdl.vn/wp-content/uploads/2025/12/logopdlphudigital.png",
"updated_at": "2025-04-20",
"notify": {
"active": true,
"type": "info",
"message": "Thông báo chung",
"button_text": "Xem thêm",
"button_url": "https://pdl.vn"
}
}
Mỗi domain
"example.com": {
"expire": "2026-11-16",
"hosting_note": "",
"notify": { "active": false, "type": "info", "message": "" }
}
Nếu chưa có ngày hết hạn thì để:
"expire": ""
Cách Tạo Script Trực Tiếp Trên VPS
Nếu không muốn upload file .sh, có thể tạo trực tiếp:
nano /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Hoặc:
cat > /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Sau đó:
- dán nội dung script
- nhấn
Ctrl + D
Rồi cấp quyền:
chmod +x /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Bản Archive
Repo cũng có script:
scripts/deploy-mu-plugins-from-archive.sh
Nhưng hiện tại không khuyên dùng, vì bạn đã gặp lỗi .zip từ macOS trên Linux.
Nếu cần dùng archive thì nên dùng .tar.gz, không dùng .zip.
Checklist Mỗi Lần Deploy
1. Sửa file local: pdl-loader.php / pdl-modules / brand.json
2. Kiểm tra cú pháp PHP
3. Upload source lên VPS: /root/pdl-mu-source
4. Detect WordPress trên VPS
5. Chạy DRY_RUN=1
6. Đọc output
7. Chạy thật
8. Kiểm tra file đã copy
9. Vào Dashboard vài site để xác nhận widget hoạt động
10. Nếu lỗi thì rollback từ /root/pdl-mu-backups
Lệnh Dùng Nhanh
Deploy thử
DRY_RUN=1 SOURCE_DIR=/root/pdl-mu-source /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Deploy thật
SOURCE_DIR=/root/pdl-mu-source /root/pdl-deploy/deploy-mu-plugins-from-folder.sh
Kiểm tra site đã có pdl-loader.php
find /var/www -path '*/wp-content/mu-plugins/pdl-loader.php' 2>/dev/null | sort
Kiểm tra JSON
python3 -m json.tool brand.json >/dev/null && echo OK
Kiểm tra PHP
php -l pdl-loader.php
php -l pdl-modules/admin-utilities.php
php -l pdl-modules/admin-menu.php
php -l pdl-modules/brand-widget.php
php -l pdl-modules/hidden-plugins.php