Как запретить деактивацию важных плагинов?
Часто при написании дополнительного функционала для сайта мы используем плагины, чтобы ускорить разработку. Кто создаёт сайты на заказ наверняка сталкивались с ситуацией, когда слишком додельный и любопытный заказчик отключал нужный плагин и сайт лишался нужного функционала или просто переставал работать.
Чтобы избавиться от проблем такого рода, можно просто убрать кнопку «деактивировать» у плагинов, которые обязательно нужны для работы сайта. А также убрать чекбокс, чтобы нельзя было деактивировать плагин через групповые действия.
На скриншоте показано:
-
Как отсутствует кнопка «деактивировать» и чекбокс у плагинов: Advanced Custom Fields PRO, Contact Form 7 и Kama Thumbnail.
- Как у всех плагинов убрана кнопка "Изменить". Эту кнопку еще можно убрать определив константу DISALLOW_FILE_EDIT, тем самым вообще запретив редактирование файлов.
Делается всё это просто, через хук plugin_action_links:
add_filter( 'plugin_action_links', 'disable_plugin_deactivation', 10, 2 ); function disable_plugin_deactivation( $actions, $plugin_file ) { // Удаляет действие "Редактировать" у всех плагинов unset( $actions['edit'] ); // Удаляет действие "Деактивировать" у важных для сайта плагинов $important_plugins = array( 'advanced-custom-fields-pro/acf.php', 'kama-thumbnail/kama_thumbnail.php', 'contact-form-7/wp-contact-form-7.php', ); if ( in_array( $plugin_file, $important_plugins ) ) { unset( $actions['deactivate'] ); $actions[ 'info' ] = '<b class="musthave_js">Обязателен для сайта</b>'; } return $actions; } // удаляем груповые действия: деактивировать и удалить add_filter( 'admin_print_footer_scripts-plugins.php', 'disable_plugin_deactivation_hide_checkbox' ); function disable_plugin_deactivation_hide_checkbox( $actions ){ ?> <script> jQuery(function($){ $('.musthave_js').closest('tr').find('input[type="checkbox"]').remove(); }); </script> <?php }
Кстати, обратите внимание, что для unset() не нужно проверять наличие ключа в массиве. При отсутствии ключа, ошибку уровня PHP notice мы не увидим! Это особенность такая у unset().
Таким образом, из массива всех ссылок, которые должны быть выведены, мы убрали ссылку на редактирование плагина и на его деактивацию. Для лучшего понимания, взглянем на содержание переменных передаваемых в хук.
-
$actions - массив ссылок:
Array ( [0] => <a href="http://skinali.dev/wp-admin/admin.php?page=wpcf7">Настройки</a> [deactivate] => <a href="plugins.php?action=deactivate&plugin=contact-form-7%2Fwp-contact-form-7.php&plugin_status=active&paged=1&s&_wpnonce=5fe6035ae5" aria-label="Деактивировать Contact Form 7">Деактивировать</a> [edit] => <a href="plugin-editor.php?file=contact-form-7%2Fwp-contact-form-7.php" class="edit" aria-label="Изменить Contact Form 7">Изменить</a> )
-
$plugin_file - путь к основному файлу плагина в формате папка-плагина/имя-файла, т.е. от папки плагинов.
contact-form-7/wp-contact-form-7.php
Достаточно простой способ получить такой путь - скопировать его из атрибута data-plugin, открыв исходный код страницы:
-
Измените список важных плагинов в переменной $important_plugins и забудьте о лишних проблемах от заказчика.