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