Cách cài đặt và kích hoạt plugin tự động trong WordPress Theme

Khi xây dựng một theme định hướng hệ sinh thái, việc yêu cầu người dùng tự cài từng plugin là một trải nghiệm không tốt. Theme biết mình cần gì, thì theme nên chủ động cài đặt và kích hoạt những plugin đó.

Cách cài đặt và kích hoạt plugin tự động trong WordPress Theme

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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...