Skip to content

Instantly share code, notes, and snippets.

@apermo
Created April 20, 2025 17:30
Show Gist options
  • Save apermo/9510d2f2a1976517a847ec2dadd0596b to your computer and use it in GitHub Desktop.
Save apermo/9510d2f2a1976517a847ec2dadd0596b to your computer and use it in GitHub Desktop.
Anonymizing WordPress Database
<?php
/**
* Plugin Name: User Migration CLI Command (MU)
* Author: Christoph Daum
* Author URL: https://christoph-daum.com
* Description: Adds a WP-CLI command 'migrate' to anonymize user data, reset passwords, and update meta.
*
* Version: 1.0
* License: GPL2
*/
if ( defined( 'WP_CLI' ) && WP_CLI ) {
class Anonymize_Users_CLI_Command {
/**
* Generate Lorem Ipsum text with a specific word count.
*/
private function lorem_ipsum( $word_count ) {
$lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.";
$words = preg_split( '/\s+/', $lorem );
$result = [];
for ( $i = 0; $i < $word_count; $i++ ) {
$result[] = $words[ $i % count( $words ) ];
}
return implode( ' ', $result );
}
/**
* Anonymize existing users.
*
* @param $args
* @param $assoc_args
*
* @return void
*/
public function __invoke( $args, $assoc_args ) {
global $wpdb;
$firstnames = [
'Maximilian','Chloe','Kimberly','Devon','Harold','Laurel','Jessie','Brody','Aryanna','Ciara','Kaylah','Logan','Rachel','Terry','Jada','Damion','Yair','Anabella','Aidyn','Tate','Shania','Alan','Carlo','Dax','Alia','Selah','Alex','Natalie','Kaleigh','Soren','Nathalie','Arielle','Campbell','Jonathon','Andy','Jeramiah','Eden','Barrett','Anderson','Julissa','Heather','Amare','Armando','Jayleen','Alisson','Cristal','Quentin','Regina','Cale','Krista'
];
$lastnames = [
'Oliver','Midnight','Zeus','Phoebe','Shadow','Bella','Lucky','Cupcake','Kitty','Sadie','Jasper','Salem','Emma','Sebastian','Minnie','Rusty','Milo','Hazel','Zoe','Millie','Leo','Maggie','Chloe','Puppy','Louie','Kahlua','Ginger','Oakley','Sugar','Bubba'
];
$users = $wpdb->get_results( "SELECT ID FROM {$wpdb->users}" );
$count = 0;
foreach ( $users as $user ) {
$firstname = $firstnames[ array_rand( $firstnames ) ];
$lastname = $lastnames[ array_rand( $lastnames ) ];
$login = strtolower( $firstname . '.' . $lastname );
$email = $login . '@performance.ddev.site';
// Ensure login is unique
$unique_login = $login;
$suffix = 1;
while ( username_exists( $unique_login ) && $unique_login !== get_userdata( $user->ID )->user_login ) {
$unique_login = $login . $suffix;
$suffix++;
}
// Generate a random password and encrypt it
$random_password = wp_generate_password( 12, true, true );
$password_hash = wp_hash_password( $random_password );
// Update wp_users table
$wpdb->update(
$wpdb->users,
[
'user_login' => $unique_login,
'user_nicename'=> $unique_login,
'user_email' => $email,
'user_url' => '',
'display_name' => $firstname . ' ' . $lastname,
'user_activation_key' => '',
'user_pass' => $password_hash
],
[ 'ID' => $user->ID ],
[ '%s', '%s', '%s', '%s', '%s', '%s', '%s' ],
[ '%d' ]
);
// Update usermeta for first and last name
update_user_meta( $user->ID, 'first_name', $firstname );
update_user_meta( $user->ID, 'last_name', $lastname );
update_user_meta( $user->ID, 'nickname', $firstname . ' ' . $lastname );
// Update description with Lorem Ipsum of same word count
$description = get_user_meta( $user->ID, 'description', true );
$word_count = str_word_count( $description );
if ( $word_count > 0 ) {
$new_description = $this->lorem_ipsum( $word_count );
update_user_meta( $user->ID, 'description', $new_description );
}
$count++;
WP_CLI::log( "Migrated user ID {$user->ID} to {$firstname} {$lastname} ({$unique_login}), password reset, nickname and description updated." );
}
WP_CLI::success( "Migrated {$count} users, reset passwords, updated nickname and description." );
}
}
WP_CLI::add_command( 'anonymize-users', 'Anonymize_Users_CLI_Command' );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment