WordPress как на ладони
wordpress jino

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

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

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

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

  • Как отсутствует кнопка «деактивировать» и чекбокс у плагинов: 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', '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 и забудьте о лишних проблемах от заказчика.

campusboy 1951youtube.com/c/wpplus
WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Как запретить деактивацию важных плагинов? Комментариев нет

Здравствуйте, !

Ваш комментарий