Tout savoir sur WordPress

Empêcher la désactivation de certains plugins sensibles

Pour empêcher la désactivation de certains plugins, on supprime les liens d’édition et de suppression des plugins que l’on trouve sensible.

Pour éviter que vos clients ne touchent aux plugins auxquels ils ne devraient pas, voici une petite astuce. On va supprimer les liens “Editer” et “Supprimer”, puis on ajoutera un message d’erreur si la personne tente de désactiver le plugin par un autre moyen.

Il suffit d’ajouter le code ci-dessous dans votre function.php présent à la racine de votre thème. Le client n’aura plus accès aux liens de modification et de suppression pour la liste de plugins qui vous lui donnerez.

Pour définir les plugins dit “préservés”, il faut seulement compléter l’array $plugins_to_preserve avec vos plugins sensibles.

global $plugins_to_preserve;

//plugins pour lesquels les liens seront supprimés
$plugins_to_preserve = array('FOLDER_DU_PLUGIN/FILE_PHP_DU_PLUGIN.php');
					   			   
add_filter( 'plugin_action_links', 'disable_plugin_link_delete', 10, 4);
function disable_plugin_link_delete( $actions, $plugin_file ) {
   
    global $plugins_to_preserve;
    
    // Enleve le lien 'Modifier' des plugins "préservés"
    if ( array_key_exists( 'edit', $actions ) && in_array( $plugin_file, $plugins_to_preserve ))
        unset( $actions['edit'] );
        
    // Enleve le lien 'Supprimer' des plugins "préservés'
    if ( array_key_exists( 'deactivate', $actions ) && in_array( $plugin_file, $plugins_to_preserve ) )
        unset( $actions['deactivate'] );
        
    return $actions;
}

add_action( 'deactivate_plugin' , 'disable_deactivate_plugin');
function disable_deactivate_plugin( $plugin_file ) {
	
	global $plugins_to_preserve;
	
	if( in_array( $plugin_file, $plugins_to_preserve ) )
		wp_die( 'Désole, mais ce plugin ne peut pas être désactivé.' );
}
Cet article a été publié il y a 4309 jours - Il n'est peut être plus à jour !

Article écrit par Evil Fox

12 Commentaires

  1. Hello, je te propose de raccourcir le code et d’utiliser le hook spécifique au plugin :

    add_filter( 'plugin_action_links_FOLDER_DU_PLUGIN/FILE_PHP_DU_PLUGIN.php', 'disable_plugin_link_delete' );
    add_filter( 'plugin_action_links_AUTRE_PLUGIN/AUTRE_FILE_DU_PLUGIN.php', 'disable_plugin_link_delete' );
    function disable_plugin_link_delete( $actions )
    {
        // Enleve les lien 'Modifier' et 'Supprimer" des plugins "préservés"
    	foreach( array( 'edit', 'deactivate' ) as $act )
    		if( isset( $actions[$act] ) )
    			unset( $actions[$act] );
    
        return $actions;
    }
    

    Comme tu le vois, au lieu de remplir un tableau global avec les plugin que je veux garder, j’ajoute un hook par plugin que je veux garder.
    Plus besoin de vérifier si nous sommes pour le plugin en question, j’ai aussi modifié array_key_exists en isset pour faire plus court. Encore, au lieu de dupliquer le code pour chaque lien action que je veux supprimer, j’ai un ptit array dans lequel je peux mettre ça et je boucle dessus.
    Pour la 2eme fonction, remplace alors la ligne “global $plugins_to_preserve;” par la déclaration du tableau des plugins, comme en première ligne du code.
    A bientôt !

  2. Et j’oubliais, il faut coupler cette astuce avec la constante “define( ‘DISALLOW_FILE_EDIT’, true );” à mettre dans wp-config.php sinon il peut quand même éditer les plugins.
    Enfin, je vais utiliser cette astuce et je vais même faire ça :
    add_filter( ‘plugin_action_links’, ‘__return_null’ ); pour supprimer TOUS les liens actions pour TOUS les plugins ;)
    Astuce dans l’astuce : Astuception !

  3. @Julio : Personnellement, je préfère la méthode à Julien qui est plus facile à maintenir pour ajouter des plugins. Il y a juste à modifier un tableau au lien d’ajouter 2 hooks pour chaque plugin.

    Si il y a une dizaine de plugin à protéger, ça fait pas mal de hook à ajouter :(

    Pour l’astuce dans l’astuce, tu sais ce qu’il te reste à faire =D

  4. J’ajoute un hook, pas 2.
    Donc au lieu d’ajouter une ligne dans l’array, j’ajoute 1 ligne de hook.

  5. Pareil, le tableau reste plus simple à gérer je trouve :D
    C’est plus “lisible” à mon goût.

  6. Allez, je vois que tu tiens au tableau, mais je tiens à mon hook :
    global $plugins_to_preserve;

    //plugins pour lesquels les liens seront supprimés
    $plugins_to_preserve = array(‘FOLDER_DU_PLUGIN/FILE_PHP_DU_PLUGIN.php’, ‘AUTRE_PLUGIN/AUTRE_FILE_DU_PLUGIN.php’);

    foreach( $plugins_to_preserve as $ptp )
    add_filter( ‘plugin_action_links_’ . $ptp, ‘disable_plugin_link_delete’ );

    function disable_plugin_link_delete( $actions )
    {
    // Enleve les lien ‘Modifier’ et ‘Supprimer” des plugins “préservés”
    foreach( array( ‘edit’, ‘deactivate’ ) as $act )
    if( isset( $actions[$act] ) )
    unset( $actions[$act] );

    return $actions;
    }

    ;)

  7. Bonjour,

    J’essaie d’utiliser la fonction mais pour l’instant je peux toujours désactiver mes plugins. Quand tu dis Folder du plugin dans le tableau que faut-il mettre exactement ?

    par exemple faut-il mettre le chemin depuis la racine du site ?

    A Bientôt.

  8. @Guillaume: Quand on parle de folder, il s’agit du nom du dossier du plugin et non de son chemin.

  9. Bonjour,

    merci pour l’astuce :) encore valable en 2016 ^^

    existe t’il un moyen identique pour les thèmes ?

    Merci d’avance