Как запретить деактивацию важных плагинов?

Часто при написании дополнительного функционала для сайта мы используем плагины, чтобы ускорить разработку. Кто создаёт сайты на заказ наверняка сталкивались с ситуацией, когда слишком додельный и любопытный заказчик отключал нужный плагин и сайт лишался нужного функционала или просто переставал работать.

Чтобы избавиться от проблем такого рода, можно просто убрать кнопку «деактивировать» у плагинов, которые обязательно нужны для работы сайта. А также убрать чекбокс, чтобы нельзя было деактивировать плагин через групповые действия.

На скриншоте показано:

  • Как отсутствует кнопка «деактивировать» и чекбокс у плагинов: 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>
	document.querySelectorAll( '.musthave_js' ).forEach( function( element ){
		element.closest( 'tr' ).querySelector( '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 и забудьте о лишних проблемах от заказчика.