Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
274 changes: 267 additions & 7 deletions import-users-from-csv.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,15 @@ public function process_csv() {

if ( !empty( $_FILES['users_csv']['tmp_name'] ) ) {
// Setup settings variables
$filename = $_FILES['users_csv']['tmp_name'];
$password_nag = isset( $_POST['password_nag'] ) ? $_POST['password_nag'] : false;
$users_update = isset( $_POST['users_update'] ) ? $_POST['users_update'] : false;
$new_user_notification = isset( $_POST['new_user_notification'] ) ? $_POST['new_user_notification'] : false;
$filename = $_FILES['users_csv']['tmp_name'];
$password_nag = isset( $_POST['password_nag'] ) ? $_POST['password_nag'] : false;
$password_hashing_disabled = isset( $_POST['password_hashing_disabled'] ) ? $_POST['password_hashing_disabled'] : false;
$users_update = isset( $_POST['users_update'] ) ? $_POST['users_update'] : false;
$new_user_notification = isset( $_POST['new_user_notification'] ) ? $_POST['new_user_notification'] : false;

$results = self::import_csv( $filename, array(
'password_nag' => $password_nag,
'password_hashing_disabled' => $password_hashing_disabled,
'new_user_notification' => $new_user_notification,
'users_update' => $users_update
) );
Expand Down Expand Up @@ -184,6 +186,16 @@ public function users_page() {
</label>
</fieldset></td>
</tr>
<tr valign="top">
<th scope="row"><?php _e( 'Password hashing' , 'import-users-from-csv'); ?></th>
<td><fieldset>
<legend class="screen-reader-text"><span><?php _e( 'Password hashing' , 'import-users-from-csv' ); ?></span></legend>
<label for="password_hashing_disabled">
<input id="password_hashing_disabled" name="password_hashing_disabled" type="checkbox" value="1" />
<?php _e( 'Disable password hashing', 'import-users-from-csv' ) ;?>
</label>
</fieldset></td>
</tr>
<tr valign="top">
<th scope="row"><?php _e( 'Users update' , 'import-users-from-csv'); ?></th>
<td><fieldset>
Expand Down Expand Up @@ -213,7 +225,8 @@ public static function import_csv( $filename, $args ) {
$defaults = array(
'password_nag' => false,
'new_user_notification' => false,
'users_update' => false
'users_update' => false,
'password_hashing_disabled' => false,
);
extract( wp_parse_args( $args, $defaults ) );

Expand Down Expand Up @@ -302,10 +315,13 @@ public static function import_csv( $filename, $args ) {
if ( ! $update && empty( $userdata['user_pass'] ) )
$userdata['user_pass'] = wp_generate_password( 12, false );

if ( $update )
if ( $update && !$password_hashing_disabled )
$user_id = wp_update_user( $userdata );
else
elseif ( !$update && !$password_hashing_disabled )
$user_id = wp_insert_user( $userdata );
else
// Updates or creates a new user, depending on whether ID is set in $userdata or not
$user_id = self::insert_user_disabled_hashing( $userdata );

// Is there an error o_O?
if ( is_wp_error( $user_id ) ) {
Expand Down Expand Up @@ -373,6 +389,250 @@ private static function log_errors( $errors ) {

@fclose( $log );
}

/**
* Insert an user into the database.
* Copied from wp-include/user.php and commented wp_hash_password part
* @since 1.1
*
**/
private function insert_user_disabled_hashing( $userdata ) {
global $wpdb;

if ( is_a( $userdata, 'stdClass' ) ) {
$userdata = get_object_vars( $userdata );
} elseif ( is_a( $userdata, 'WP_User' ) ) {
$userdata = $userdata->to_array();
}
// Are we updating or creating?
if ( ! empty( $userdata['ID'] ) ) {
$ID = (int) $userdata['ID'];
$update = true;
$old_user_data = WP_User::get_data_by( 'id', $ID );
// hashed in wp_update_user(), plaintext if called directly
// $user_pass = $userdata['user_pass'];
} else {
$update = false;
// Hash the password
// $user_pass = wp_hash_password( $userdata['user_pass'] );
}
$user_pass = $userdata['user_pass'];

$sanitized_user_login = sanitize_user( $userdata['user_login'], true );

/**
* Filter a username after it has been sanitized.
*
* This filter is called before the user is created or updated.
*
* @since 2.0.3
*
* @param string $sanitized_user_login Username after it has been sanitized.
*/
$pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login );

//Remove any non-printable chars from the login string to see if we have ended up with an empty username
$user_login = trim( $pre_user_login );

if ( empty( $user_login ) ) {
return new WP_Error('empty_user_login', __('Cannot create a user with an empty login name.') );
}
if ( ! $update && username_exists( $user_login ) ) {
return new WP_Error( 'existing_user_login', __( 'Sorry, that username already exists!' ) );
}
if ( empty( $userdata['user_nicename'] ) ) {
$user_nicename = sanitize_title( $user_login );
} else {
$user_nicename = $userdata['user_nicename'];
}

// Store values to save in user meta.
$meta = array();

/**
* Filter a user's nicename before the user is created or updated.
*
* @since 2.0.3
*
* @param string $user_nicename The user's nicename.
*/
$user_nicename = apply_filters( 'pre_user_nicename', $user_nicename );

$raw_user_url = empty( $userdata['user_url'] ) ? '' : $userdata['user_url'];

/**
* Filter a user's URL before the user is created or updated.
*
* @since 2.0.3
*
* @param string $raw_user_url The user's URL.
*/
$user_url = apply_filters( 'pre_user_url', $raw_user_url );

$raw_user_email = empty( $userdata['user_email'] ) ? '' : $userdata['user_email'];

/**
* Filter a user's email before the user is created or updated.
*
* @since 2.0.3
*
* @param string $raw_user_email The user's email.
*/
$user_email = apply_filters( 'pre_user_email', $raw_user_email );

if ( ! $update && ! defined( 'WP_IMPORTING' ) && email_exists( $user_email ) ) {
return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) );
}
$nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname'];

/**
* Filter a user's nickname before the user is created or updated.
*
* @since 2.0.3
*
* @param string $nickname The user's nickname.
*/
$meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname );

$first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name'];

/**
* Filter a user's first name before the user is created or updated.
*
* @since 2.0.3
*
* @param string $first_name The user's first name.
*/
$meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name );

$last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name'];

/**
* Filter a user's last name before the user is created or updated.
*
* @since 2.0.3
*
* @param string $last_name The user's last name.
*/
$meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name );

if ( empty( $userdata['display_name'] ) ) {
if ( $update ) {
$display_name = $user_login;
} elseif ( $meta['first_name'] && $meta['last_name'] ) {
/* translators: 1: first name, 2: last name */
$display_name = sprintf( _x( '%1$s %2$s', 'Display name based on first name and last name' ), $meta['first_name'], $meta['last_name'] );
} elseif ( $meta['first_name'] ) {
$display_name = $meta['first_name'];
} elseif ( $meta['last_name'] ) {
$display_name = $meta['last_name'];
} else {
$display_name = $user_login;
}
} else {
$display_name = $userdata['display_name'];
}

/**
* Filter a user's display name before the user is created or updated.
*
* @since 2.0.3
*
* @param string $display_name The user's display name.
*/
$display_name = apply_filters( 'pre_user_display_name', $display_name );

$description = empty( $userdata['description'] ) ? '' : $userdata['description'];

/**
* Filter a user's description before the user is created or updated.
*
* @since 2.0.3
*
* @param string $description The user's description.
*/
$meta['description'] = apply_filters( 'pre_user_description', $description );

$meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing'];

$meta['comment_shortcuts'] = empty( $userdata['comment_shortcuts'] ) ? 'false' : $userdata['comment_shortcuts'];

$admin_color = empty( $userdata['admin_color'] ) ? 'fresh' : $userdata['admin_color'];
$meta['admin_color'] = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $admin_color );

$meta['use_ssl'] = empty( $userdata['use_ssl'] ) ? 0 : $userdata['use_ssl'];

$user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered'];

$meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front'];

$user_nicename_check = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1" , $user_nicename, $user_login));

if ( $user_nicename_check ) {
$suffix = 2;
while ($user_nicename_check) {
$alt_user_nicename = $user_nicename . "-$suffix";
$user_nicename_check = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1" , $alt_user_nicename, $user_login));
$suffix++;
}
$user_nicename = $alt_user_nicename;
}

$compacted = compact( 'user_pass', 'user_email', 'user_url', 'user_nicename', 'display_name', 'user_registered' );
$data = wp_unslash( $compacted );

if ( $update ) {
$wpdb->update( $wpdb->users, $data, compact( 'ID' ) );
$user_id = (int) $ID;
} else {
$wpdb->insert( $wpdb->users, $data + compact( 'user_login' ) );
$user_id = (int) $wpdb->insert_id;
}

$user = new WP_User( $user_id );

// Update user meta.
foreach ( $meta as $key => $value ) {
update_user_meta( $user_id, $key, $value );
}

foreach ( wp_get_user_contact_methods( $user ) as $key => $value ) {
if ( isset( $userdata[ $key ] ) ) {
update_user_meta( $user_id, $key, $userdata[ $key ] );
}
}

if ( isset( $userdata['role'] ) ) {
$user->set_role( $userdata['role'] );
} elseif ( ! $update ) {
$user->set_role(get_option('default_role'));
}
wp_cache_delete( $user_id, 'users' );
wp_cache_delete( $user_login, 'userlogins' );

if ( $update ) {
/**
* Fires immediately after an existing user is updated.
*
* @since 2.0.0
*
* @param int $user_id User ID.
* @param object $old_user_data Object containing user's data prior to update.
*/
do_action( 'profile_update', $user_id, $old_user_data );
} else {
/**
* Fires immediately after a new user is registered.
*
* @since 1.5.0
*
* @param int $user_id User ID.
*/
do_action( 'user_register', $user_id );
}

return $user_id;
}
}

IS_IU_Import_Users::init();
Binary file added languages/import-users-from-csv-de_DE.mo
Binary file not shown.
Loading