Bài viết này trình bày một cách tiếp cận thực tế để cài đặt và kích hoạt plugin WordPress hoàn toàn bằng code, không cần thao tác thủ công trong admin.
Khi nào nên tự động cài plugin
Cách này phù hợp khi:
- Theme phụ thuộc vào một nhóm plugin cụ thể để hoạt động đúng
- Plugin nằm trên WordPress.org hoặc server riêng
- Bạn muốn giảm số bước setup ban đầu cho người dùng
Không phù hợp nếu plugin chỉ mang tính tùy chọn hoặc có license thương mại.
Chuẩn bị các thư viện cần thiết
WordPress không load sẵn các class cài plugin ở frontend hay hook theme, vì vậy cần include thủ công các file cần thiết:
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
include_once ABSPATH . 'wp-admin/includes/file.php';
include_once ABSPATH . 'wp-admin/includes/misc.php';
include_once ABSPATH . 'wp-admin/includes/plugin.php';
Đây là các file lõi để tải, giải nén, cài đặt và kích hoạt plugin.
Khai báo danh sách plugin cần cài
Plugin nên được mô tả dưới dạng mảng cấu hình, để dễ mở rộng và bảo trì:
$plugins = [
[
'name' => 'Init Live Search',
'source' => 'wporg',
'slug' => 'init-live-search',
'file' => 'init-live-search/init-live-search.php',
],
[
'name' => 'Init View Count',
'source' => 'wporg',
'slug' => 'init-view-count',
'file' => 'init-view-count/init-view-count.php',
],
];
Trong đó:
- slug: tên thư mục plugin
- file: đường dẫn file main để activate
- source: wporg hoặc server riêng
Kiểm tra plugin đã tồn tại hay chưa
Trước khi tải plugin, cần kiểm tra thư mục plugin để tránh cài trùng:
$plugin_dir = WP_PLUGIN_DIR . '/' . $plugin['slug'];
if (file_exists($plugin_dir)) {
if (!is_plugin_active($plugin['file'])) {
activate_plugin($plugin['file']);
}
continue;
}
Nếu plugin đã có nhưng chưa active, chỉ cần kích hoạt.
Tải và cài plugin từ WordPress.org
Với plugin trên WordPress.org, có thể tải trực tiếp file zip:
$url = "https://downloads.wordpress.org/plugin/{$plugin['slug']}.latest-stable.zip";
$tmp = download_url($url);
if (is_wp_error($tmp)) {
continue;
}
download_url sẽ tải file về thư mục tạm của WordPress.
Cài đặt và kích hoạt plugin bằng Plugin_Upgrader
$upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
$result = $upgrader->install($tmp);
if (!is_wp_error($result) && $result === true) {
activate_plugin($plugin['file']);
}
@unlink($tmp);
Sau khi cài xong, nên xóa file zip tạm để tránh rác hệ thống.
Hàm hoàn chỉnh: init_html_setup_install_plugins
function init_html_setup_install_plugins() {
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
include_once ABSPATH . 'wp-admin/includes/file.php';
include_once ABSPATH . 'wp-admin/includes/misc.php';
include_once ABSPATH . 'wp-admin/includes/plugin.php';
$plugins = [
[
'name' => 'Init Live Search',
'source' => 'wporg',
'slug' => 'init-live-search',
'file' => 'init-live-search/init-live-search.php',
],
[
'name' => 'Init View Count',
'source' => 'wporg',
'slug' => 'init-view-count',
'file' => 'init-view-count/init-view-count.php',
],
];
foreach ($plugins as $plugin) {
$plugin_dir = WP_PLUGIN_DIR . '/' . $plugin['slug'];
if (file_exists($plugin_dir)) {
if (!is_plugin_active($plugin['file'])) {
activate_plugin($plugin['file']);
}
continue;
}
$url = "https://downloads.wordpress.org/plugin/{$plugin['slug']}.latest-stable.zip";
$tmp = download_url($url);
if (is_wp_error($tmp)) continue;
$upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
$result = $upgrader->install($tmp);
if (!is_wp_error($result) && $result === true) {
activate_plugin($plugin['file']);
}
@unlink($tmp);
}
}
Nên hook hàm này ở đâu
Cách phổ biến:
- Sau khi activate theme
- Trong admin_init (có điều kiện)
- Trong setup wizard của theme
Không nên chạy ở frontend hoặc mỗi request.
Kết luận
Tự động cài và kích hoạt plugin giúp theme trở nên chủ động, liền mạch và thân thiện hơn với người dùng. Quan trọng nhất là: theme biết rõ mình cần gì và không bắt người dùng phải đoán.
Viết code cho người dùng ít phải động não hơn, đó là một dạng tối ưu UX rất đáng giá.
Bình luận