Eu tinha certeza de que a função wp_update_user
deveria fazer isso ( enlace ).
Até pega user_login como param, mas parece que o ignora quando você configura este parâmetro.
Portanto, este código parece OK, mas não funciona como você queria :(:
wp_update_user( array ( 'ID' => $user_id, 'user_login' => $new_login ) ) ;
Você precisa chamar uma consulta SQL personalizada para atualizar user_login:
$wpdb->update($wpdb->users, array('user_login' => $new_user_login), array('ID' => $user_id));
Funciona bem e não acho que tenha consequências sérias, pois o WP usa o ID de usuários para atribuir posts / comentários (e assim por diante) ao usuário.
O único problema que posso imaginar é que, quando este usuário estiver logado, ele será desconectado após a mudança de user_login.