web-dev-qa-db-fra.com

Comment changer user_login avec wp-cli?

Comment changer le nom d'utilisateur avec wp-cli ?

Cela ne fonctionne pas:

wp user update old_login --user-login=new_login
4
guaka

Non autorisé par la conception:

Si nous essayons de changer le login de l'utilisateur par l'email:

wp user update [email protected] --user_login=mary_new

ou par l'ID utilisateur:

wp user update 123 --user_login=mary_new

nous obtenons l'avertissement suivant:

Les connexions utilisateur ne peuvent pas être modifiées.

C'est la raison:

if ( isset( $assoc_args['user_login'] ) ) {
    WP_CLI::warning( "User logins can't be changed." );
    unset( $assoc_args['user_login'] );
}

dans la userupdateméthode .

Solutions possibles:

Requêtes SQL personnalisées:

Si nous voulons seulement cibler la table wp_users et le champ user_login, il est possible d'exécuter la requête SQL avec:

wp db query "UPDATE wp_users SET user_login = 'mary_new' WHERE user_login = 'mary'"

Mais nous devons nous assurer que les identifiants de connexion des utilisateurs sont unique .

J'ai expérimenté avec ce genre de requête:

wp db query "UPDATE wp_users u, 
    ( SELECT 
          COUNT(*) as number_of_same_login_users
          FROM wp_users u 
          WHERE user_login = 'mary_new' 
    ) tmp 
    SET u.user_login = 'mary_new' 
    WHERE 
            u.user_login = 'mary_old' 
        AND tmp.number_of_same_login_users = 0"

pour appliquer l'unicité du champ user_login, en ne mettant à jour que si l'utilisateur non a le même nom d'utilisateur.

Cette réponse sans lien m'a aidé à construire une mise à jour avec une sous-requête.

Voici la même commande en une seule ligne:

wp db query "UPDATE wp_users u, ( SELECT COUNT(*) as number_of_same_login_users FROM wp_users WHERE user_login = 'mary_new' ) tmp SET u.user_login = 'mary_new' WHERE u.user_login = 'mary_old' AND tmp.number_of_same_login_users = 0"

mais ce genre de requête devrait être à l'intérieur d'une commande personnalisée ;-)

Notez que le préfixe de la table peut être différent de wp_.

Commandes WP-CLI personnalisées:

Comme expliqué dans le Commandes Cookbook , il est possible de créer des commandes WP-CLI personnalisées.

Nous pourrions essayer de construire une commande personnalisée comme:

    WP_CLI::add_command( 'wpse_replace_user_login', 'WPSE_Replace_User_Login' );

ou:

    WP_CLI::add_command( 'wpse_user', 'WPSE_User_Command' );

WPSE_User_Command étend la classe User_Command. Cela nécessiterait des travaux supplémentaires.

8
birgire

search-replace fait l'affaire mais peut avoir des effets secondaires indésirables si old_login apparaît dans d'autres contextes de la base de données:

wp search-replace old_login new_login

Mais avant de faire cette course

wp sql dump
wp search-replace old_login new_login --dry-run

Faire un dump SQL et voir ce qui va être remplacé.

5
guaka