Kiểm tra plugin bắt buộc và hiển thị admin notice trong WordPress Theme

Với các theme có hệ sinh thái plugin riêng, việc theme hoạt động thiếu plugin thường dẫn đến lỗi khó đoán, chức năng không chạy, hoặc trải nghiệm người dùng kém. Cách tốt nhất là kiểm tra ngay trong admin và thông báo rõ ràng plugin nào đang thiếu.

Kiểm tra plugin bắt buộc và hiển thị admin notice trong WordPress Theme

Bài viết này trình bày một cách kiểm tra plugin bắt buộc dựa trên hằng số (constant) và hiển thị admin notice khi plugin chưa được cài đặt hoặc kích hoạt.

Nguyên tắc tiếp cận

Cách làm này dựa trên một số nguyên tắc:

  • Plugin bắt buộc sẽ định nghĩa constant phiên bản khi được load
  • Theme chỉ cần kiểm tra constant, không cần dò file plugin
  • Chỉ hiển thị notice trong admin, không ảnh hưởng frontend
  • Không spam kiểm tra mỗi request nhờ sử dụng transient

Hook kiểm tra plugin trong admin

Việc kiểm tra được thực hiện ở admin_init, đảm bảo chỉ chạy trong admin:

add_action('admin_init', 'init_html_check_required_plugins');
add_action('admin_notices', 'init_html_show_missing_plugins_notice');

Hàm kiểm tra plugin bắt buộc

Hàm này thu thập danh sách plugin còn thiếu và lưu tạm vào transient:

function init_html_check_required_plugins() {
    $missing = init_html_get_missing_plugins();

    if (!empty($missing)) {
        set_transient('init_html_missing_plugins', $missing, 30);
    } else {
        delete_transient('init_html_missing_plugins');
    }
}

Transient chỉ tồn tại ngắn hạn để giảm chi phí xử lý.

Xác định plugin thiếu dựa trên constant

Thay vì kiểm tra file plugin, mỗi plugin định nghĩa một constant khi active. Nếu constant không tồn tại, plugin chưa sẵn sàng.

function init_html_get_missing_plugins() {
    $required_plugins = [
        'Init Ad Engine'        => ['INIT_PLUGIN_SUITE_AD_ENGINE_VERSION',   'init-ad-engine'],
        'Init Chat Engine'      => ['INIT_PLUGIN_SUITE_CHAT_ENGINE_VERSION', 'init-chat-engine'],
        'Init Embed Posts'      => ['INIT_PLUGIN_SUITE_IEP_VERSION',         'init-embed-posts'],
        'Init FX Engine'        => ['INIT_PLUGIN_SUITE_FX_ENGINE_VERSION',   'init-fx-engine'],
        'Init Live Search'      => ['INIT_PLUGIN_SUITE_LS_VERSION',          'init-live-search'],
        'Init Reading Position' => ['INIT_PLUGIN_SUITE_RP_VERSION',          'init-reading-position'],
        'Init Recent Comment'   => ['INIT_PLUGIN_SUITE_IRC_VERSION',         'init-recent-comments'],
        'Init Review System'    => ['INIT_PLUGIN_SUITE_RS_VERSION',          'init-review-system'],
        'Init User Engine'      => ['INIT_PLUGIN_SUITE_IUE_VERSION',         'init-user-engine'],
        'Init View Count'       => ['INIT_PLUGIN_SUITE_VIEW_COUNT_VERSION',  'init-view-count'],
    ];

    $missing = [];

    foreach ($required_plugins as $name => [$constant, $slug]) {
        if (!defined($constant)) {
            $missing[$name] = $slug;
        }
    }

    return $missing;
}

Cách này rất ổn định và tránh false positive khi plugin tồn tại nhưng chưa load.

Hiển thị admin notice khi thiếu plugin

Notice chỉ hiển thị khi người dùng có quyền activate plugin.

function init_html_show_missing_plugins_notice() {
    if (!current_user_can('activate_plugins')) return;

    $missing = get_transient('init_html_missing_plugins');
    if (!$missing) return;

    $locale   = determine_locale();
    $base_url = (strpos($locale, 'vi') === 0)
        ? 'https://inithtml.com'
        : 'https://en.inithtml.com';

    echo '<div class="notice notice-error">';
    echo '<p><strong>' . esc_html__('Init HTML Theme requires the following plugins:', 'init-html') . '</strong></p>';
    echo '<ul style="list-style:disc;margin-left:10px">';

    foreach ($missing as $name => $slug) {
        $url = $base_url . '/plugin/' . $slug . '/';
        printf(
            '<li style="margin-left:15px">%s — <a href="%s" target="_blank">%s</a></li>',
            esc_html($name),
            esc_url($url),
            esc_html__('Download plugin', 'init-html')
        );
    }

    echo '</ul>';
    echo '<p>' . esc_html__('Please install and activate them to ensure the theme works correctly.', 'init-html') . ' ';
    echo esc_html__('You can also install them automatically via the Setup Wizard.', 'init-html') . '</p>';
    echo '</div>';
}

Vì sao nên dùng constant thay vì kiểm tra file

  • Plugin có thể tồn tại nhưng bị lỗi khi load
  • Constant chỉ được define khi plugin chạy thành công
  • Tránh phụ thuộc vào đường dẫn file dễ thay đổi

Đây là cách kiểm tra “plugin sẵn sàng hoạt động”, không chỉ “plugin tồn tại”.

Kết luận

Kiểm tra plugin bắt buộc và hiển thị notice rõ ràng giúp giảm rất nhiều bug khó hiểu cho người dùng. Theme không nên im lặng khi thiếu thành phần quan trọng.

Một admin notice đúng lúc tốt hơn hàng chục ticket hỗ trợ sau này.

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...