WordPress.org

Plugin Directory

Changeset 507251


Ignore:
Timestamp:
02/19/12 09:24:29 (2 years ago)
Author:
sorich87
Message:

More modular code

Location:
import-users-from-csv/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • import-users-from-csv/trunk/import-users-from-csv.php

    r503665 r507251  
    22/** 
    33 * @package Import_Users_from_CSV 
    4  * @version 0.4 
    54 */ 
    65/* 
     
    87Plugin URI: http://pubpoet.com/plugins/ 
    98Description: Import Users data and metadata from a csv file. 
    10 Version: 0.4 
     9Version: 0.5 
    1110Author: PubPoet 
    1211Author URI: http://pubpoet.com/ 
     
    4140 **/ 
    4241class IS_IU_Import_Users { 
    43  
    44     /** 
    45      * Class contructor 
     42    private static $log_dir_path = ''; 
     43    private static $log_dir_url  = ''; 
     44 
     45    /** 
     46     * Initialization 
    4647     * 
    4748     * @since 0.1 
    4849     **/ 
    49     public function __construct() { 
    50         add_action( 'admin_menu', array( $this, 'add_admin_pages' ) ); 
    51         add_action( 'init', array( $this, 'process_csv' ) ); 
     50    public function init() { 
     51        add_action( 'admin_menu', array( __CLASS__, 'add_admin_pages' ) ); 
     52        add_action( 'init', array( __CLASS__, 'process_csv' ) ); 
    5253 
    5354        $upload_dir = wp_upload_dir(); 
    54         $this->log_dir_path = trailingslashit( $upload_dir['basedir'] ); 
    55         $this->log_dir_url  = trailingslashit( $upload_dir['baseurl'] ); 
     55        self::$log_dir_path = trailingslashit( $upload_dir['basedir'] ); 
     56        self::$log_dir_url  = trailingslashit( $upload_dir['baseurl'] ); 
    5657    } 
    5758 
     
    6263     **/ 
    6364    public function add_admin_pages() { 
    64         add_users_page( __( 'Import From CSV' , 'import-users-from-csv'), __( 'Import From CSV' , 'import-users-from-csv'), 'create_users', 'import-users-from-csv', array( $this, 'users_page' ) ); 
     65        add_users_page( __( 'Import From CSV' , 'import-users-from-csv'), __( 'Import From CSV' , 'import-users-from-csv'), 'create_users', 'import-users-from-csv', array( __CLASS__, 'users_page' ) ); 
    6566    } 
    6667 
     
    7677            if ( isset( $_FILES['users_csv']['tmp_name'] ) ) { 
    7778                // Setup settings variables 
     79                $filename              = $_FILES['users_csv']['tmp_name']; 
    7880                $password_nag          = isset( $_POST['password_nag'] ) ? $_POST['password_nag'] : false; 
    7981                $new_user_notification = isset( $_POST['new_user_notification'] ) ? $_POST['new_user_notification'] : false; 
    80                 $errors = $user_ids    = array(); 
    81  
    82                 // User data fields list used to differentiate with user meta 
    83                 $userdata_fields       = array( 
    84                     'ID', 'user_login', 'user_pass', 
    85                     'user_email', 'user_url', 'user_nicename', 
    86                     'display_name', 'user_registered', 'first_name', 
    87                     'last_name', 'nickname', 'description', 
    88                     'rich_editing', 'comment_shortcuts', 'admin_color', 
    89                     'use_ssl', 'show_admin_bar_front', 'show_admin_bar_admin', 
    90                     'role' 
    91                 ); 
    92  
    93                 include( plugin_dir_path( __FILE__ ) . 'class-readcsv.php' ); 
    94  
    95                 // Loop through the file lines 
    96                 $file_handle = fopen( $_FILES['users_csv']['tmp_name'], 'r' ); 
    97                 $csv_reader = new ReadCSV( $file_handle, IS_IU_CSV_DELIMITER, "\xEF\xBB\xBF" ); // Skip any UTF-8 byte order mark. 
    98  
    99                 $first = true; 
    100                 while ( ( $line = $csv_reader->get_row() ) !== NULL ) { 
    101  
    102                     // If the first line is empty, return and error 
    103                     // If another line is empty, just skip it 
    104                     if ( empty( $line ) ) { 
    105                         if ( $first ) { 
    106                             wp_redirect( add_query_arg( 'import', 'data', wp_get_referer() ) ); 
    107                             exit; 
    108                         } else { 
    109                             continue; 
    110                         } 
    111                     } 
    112  
    113                     // If we are on the first line, the columns are the headers 
    114                     if ( $first ) { 
    115                         $headers = $line; 
    116                         $first = false; 
    117                         continue; 
    118                     } 
    119  
    120                     // Separate user data from meta 
    121                     $userdata = $usermeta = array(); 
    122                     foreach ( $line as $ckey => $column ) { 
    123                         $column_name = $headers[$ckey]; 
    124                         $column = trim( $column ); 
    125  
    126                         if ( empty( $column ) ) 
    127                             continue; 
    128  
    129                         if ( in_array( $column_name, $userdata_fields ) ) { 
    130                             $userdata[$column_name] = $column; 
    131                         } else { 
    132                             $usermeta[$column_name] = $column; 
    133                         } 
    134                     } 
    135  
    136                     // A plugin may need to filter the data and meta 
    137                     $userdata = apply_filters( 'is_iu_import_userdata', $userdata, $usermeta ); 
    138                     $usermeta = apply_filters( 'is_iu_import_usermeta', $usermeta, $userdata ); 
    139  
    140                     // If no user data, bailout! 
    141                     if ( empty( $userdata ) ) 
    142                         continue; 
    143  
    144                     // Something to be done before importing one user? 
    145                     do_action( 'is_iu_pre_user_import', $userdata, $usermeta ); 
    146  
    147                     // Are we updating an old user or creating a new one? 
    148                     $update = false; 
    149                     $user_id = 0; 
    150                     if ( ! empty( $userdata['ID'] ) ) { 
    151                         $update = true; 
    152                         $user_id = $userdata['ID']; 
    153                     } 
    154  
    155                     // If creating a new user and no password was set, let auto-generate one! 
    156                     if ( ! $update && empty( $userdata['user_pass'] ) ) 
    157                         $userdata['user_pass'] = wp_generate_password( 12, false ); 
    158  
    159                     // Insert or update... at last! If only user ID was provided, we don't need to do anything at all. :) 
    160                     if ( array( 'ID' => $user_id ) == $userdata ) 
    161                         $user_id = get_userdata( $user_id )->ID; // To check if the user id exists 
    162                     else if ( $update ) 
    163                         $user_id = wp_update_user( $userdata ); 
    164                     else 
    165                         $user_id = wp_insert_user( $userdata ); 
    166  
    167                     // Is there an error o_O? 
    168                     if ( is_wp_error( $user_id ) ) { 
    169                         $errors[$rkey] = $user_id; 
    170                     } else { 
    171                         // If no error, let's update the user meta too! 
    172                         if ( $usermeta ) { 
    173                             foreach ( $usermeta as $metakey => $metavalue ) { 
    174                                 $metavalue = maybe_unserialize( $metavalue ); 
    175                                 update_user_meta( $user_id, $metakey, $metavalue ); 
    176                             } 
    177                         } 
    178  
    179                         // If we created a new user, maybe set password nag and send new user notification? 
    180                         if ( ! $update ) { 
    181                             if ( $password_nag ) 
    182                                 update_user_option( $user_id, 'default_password_nag', true, true ); 
    183  
    184                             if ( $new_user_notification ) 
    185                                 wp_new_user_notification( $user_id, $userdata['user_pass'] ); 
    186                         } 
    187  
    188                         // Some plugins may need to do things after one user has been imported. Who know? 
    189                         do_action( 'is_iu_post_user_import', $user_id ); 
    190  
    191                         $user_ids[] = $user_id; 
    192                     } 
    193  
    194                 } 
    195                 fclose( $file_handle ); 
    196  
    197                 // One more thing to do after all imports? 
    198                 do_action( 'is_iu_post_users_import', $user_ids, $errors ); 
    199  
    200                 // Let's log the errors 
    201                 $this->log_errors( $errors ); 
     82 
     83                $results = self::import_csv( $filename, $password_nag, $new_user_notification ); 
    20284 
    20385                // No users imported? 
    204                 if ( $errors && ! $user_ids ) { 
     86                if ( ! $results['user_ids'] ) 
    20587                    wp_redirect( add_query_arg( 'import', 'fail', wp_get_referer() ) ); 
     88 
    20689                // Some users imported? 
    207                 } elseif ( $errors ) { 
     90                elseif ( $results['errors'] ) 
    20891                    wp_redirect( add_query_arg( 'import', 'errors', wp_get_referer() ) ); 
     92 
    20993                // All users imported? :D 
    210                 } else { 
     94                else 
    21195                    wp_redirect( add_query_arg( 'import', 'success', wp_get_referer() ) ); 
    212                 } 
     96 
    21397                exit; 
    21498            } 
     
    232116    <h2><?php _e( 'Import users from a CSV file' , 'import-users-from-csv'); ?></h2> 
    233117    <?php 
    234     $error_log_file = $this->log_dir_path . 'is_iu_errors.log'; 
    235     $error_log_url  = $this->log_dir_url . 'is_iu_errors.log'; 
     118    $error_log_file = self::$log_dir_path . 'is_iu_errors.log'; 
     119    $error_log_url  = self::$log_dir_url . 'is_iu_errors.log'; 
    236120 
    237121    if ( ! file_exists( $error_log_file ) ) { 
    238122        if ( ! @fopen( $error_log_file, 'x' ) ) 
    239             echo '<div class="updated"><p><strong>' . sprintf( __( 'Notice: please make the directory %s writable so that you can see the error log.' , 'import-users-from-csv'), $this->log_dir_path ) . '</strong></p></div>'; 
     123            echo '<div class="updated"><p><strong>' . sprintf( __( 'Notice: please make the directory %s writable so that you can see the error log.' , 'import-users-from-csv'), self::$log_dir_path ) . '</strong></p></div>'; 
    240124    } 
    241125 
     
    302186 
    303187    /** 
     188     * Import a csv file 
     189     * 
     190     * @since 0.5 
     191     */ 
     192    public static function import_csv( $filename, $password_nag = false, $new_user_notification = false ) { 
     193        $errors = $user_ids = array(); 
     194 
     195        // User data fields list used to differentiate with user meta 
     196        $userdata_fields       = array( 
     197            'ID', 'user_login', 'user_pass', 
     198            'user_email', 'user_url', 'user_nicename', 
     199            'display_name', 'user_registered', 'first_name', 
     200            'last_name', 'nickname', 'description', 
     201            'rich_editing', 'comment_shortcuts', 'admin_color', 
     202            'use_ssl', 'show_admin_bar_front', 'show_admin_bar_admin', 
     203            'role' 
     204        ); 
     205 
     206        include( plugin_dir_path( __FILE__ ) . 'class-readcsv.php' ); 
     207 
     208        // Loop through the file lines 
     209        $file_handle = fopen( $filename, 'r' ); 
     210        $csv_reader = new ReadCSV( $file_handle, IS_IU_CSV_DELIMITER, "\xEF\xBB\xBF" ); // Skip any UTF-8 byte order mark. 
     211 
     212        $first = true; 
     213        $rkey = 0; 
     214        while ( ( $line = $csv_reader->get_row() ) !== NULL ) { 
     215 
     216            // If the first line is empty, abort 
     217            // If another line is empty, just skip it 
     218            if ( empty( $line ) ) { 
     219                if ( $first ) 
     220                    break; 
     221                else 
     222                    continue; 
     223            } 
     224 
     225            // If we are on the first line, the columns are the headers 
     226            if ( $first ) { 
     227                $headers = $line; 
     228                $first = false; 
     229                continue; 
     230            } 
     231 
     232            // Separate user data from meta 
     233            $userdata = $usermeta = array(); 
     234            foreach ( $line as $ckey => $column ) { 
     235                $column_name = $headers[$ckey]; 
     236                $column = trim( $column ); 
     237 
     238                if ( empty( $column ) ) 
     239                    continue; 
     240 
     241                if ( in_array( $column_name, $userdata_fields ) ) { 
     242                    $userdata[$column_name] = $column; 
     243                } else { 
     244                    $usermeta[$column_name] = $column; 
     245                } 
     246            } 
     247 
     248            // A plugin may need to filter the data and meta 
     249            $userdata = apply_filters( 'is_iu_import_userdata', $userdata, $usermeta ); 
     250            $usermeta = apply_filters( 'is_iu_import_usermeta', $usermeta, $userdata ); 
     251 
     252            // If no user data, bailout! 
     253            if ( empty( $userdata ) ) 
     254                continue; 
     255 
     256            // Something to be done before importing one user? 
     257            do_action( 'is_iu_pre_user_import', $userdata, $usermeta ); 
     258 
     259            // Are we updating an old user or creating a new one? 
     260            $update = false; 
     261            $user_id = 0; 
     262            if ( ! empty( $userdata['ID'] ) ) { 
     263                $update = true; 
     264                $user_id = $userdata['ID']; 
     265            } 
     266 
     267            // If creating a new user and no password was set, let auto-generate one! 
     268            if ( ! $update && empty( $userdata['user_pass'] ) ) 
     269                $userdata['user_pass'] = wp_generate_password( 12, false ); 
     270 
     271            // Insert or update... at last! If only user ID was provided, we don't need to do anything at all. :) 
     272            if ( array( 'ID' => $user_id ) == $userdata ) 
     273                $user_id = get_userdata( $user_id )->ID; // To check if the user id exists 
     274            else if ( $update ) 
     275                $user_id = wp_update_user( $userdata ); 
     276            else 
     277                $user_id = wp_insert_user( $userdata ); 
     278 
     279            // Is there an error o_O? 
     280            if ( is_wp_error( $user_id ) ) { 
     281                $errors[$rkey] = $user_id; 
     282            } else { 
     283                // If no error, let's update the user meta too! 
     284                if ( $usermeta ) { 
     285                    foreach ( $usermeta as $metakey => $metavalue ) { 
     286                        $metavalue = maybe_unserialize( $metavalue ); 
     287                        update_user_meta( $user_id, $metakey, $metavalue ); 
     288                    } 
     289                } 
     290 
     291                // If we created a new user, maybe set password nag and send new user notification? 
     292                if ( ! $update ) { 
     293                    if ( $password_nag ) 
     294                        update_user_option( $user_id, 'default_password_nag', true, true ); 
     295 
     296                    if ( $new_user_notification ) 
     297                        wp_new_user_notification( $user_id, $userdata['user_pass'] ); 
     298                } 
     299 
     300                // Some plugins may need to do things after one user has been imported. Who know? 
     301                do_action( 'is_iu_post_user_import', $user_id ); 
     302 
     303                $user_ids[] = $user_id; 
     304            } 
     305 
     306            $rkey++; 
     307        } 
     308        fclose( $file_handle ); 
     309 
     310        // One more thing to do after all imports? 
     311        do_action( 'is_iu_post_users_import', $user_ids, $errors ); 
     312 
     313        // Let's log the errors 
     314        self::log_errors( $errors ); 
     315 
     316        return array( 
     317            'user_ids' => $user_ids, 
     318            'errors'   => $errors 
     319        ); 
     320    } 
     321 
     322    /** 
    304323     * Log errors to a file 
    305324     * 
    306325     * @since 0.2 
    307326     **/ 
    308     public function log_errors( $errors ) { 
     327    private static function log_errors( $errors ) { 
    309328        if ( empty( $errors ) ) 
    310329            return; 
    311330 
    312         $log = @fopen( $this->log_dir_path . 'is_iu_errors.log', 'a' ); 
     331        $log = @fopen( self::$log_dir_path . 'is_iu_errors.log', 'a' ); 
    313332        @fwrite( $log, sprintf( __( 'BEGIN %s' , 'import-users-from-csv'), date( 'Y-m-d H:i:s', time() ) ) . "\n" ); 
    314333 
     
    323342} 
    324343 
    325 new IS_IU_Import_Users; 
     344IS_IU_Import_Users::init(); 
  • import-users-from-csv/trunk/readme.txt

    r503665 r507251  
    44Requires at least: 3.1 
    55Tested up to: 3.4 
    6 Stable tag: 0.4 
     6Stable tag: 0.5 
    77 
    88Import users from a CSV file into WordPress 
     
    8282== Changelog == 
    8383 
     84= 0.5 = 
     85* Changed code to allow running import from another plugin 
     86 
    8487= 0.4 = 
    8588* Switched to RFC 4180 compliant library for CSV parsing 
     
    124127== Upgrade Notice == 
    125128 
     129= 0.5 = 
     130* Code improvement for easier integration with another plugin. 
     131 
     132= 0.4 = 
     133* RFC 4180 compliance, performance improvement and bug fix. 
     134 
    126135= 0.3 = 
    127136Bug fix, performance improvement and internationalization. 
Note: See TracChangeset for help on using the changeset viewer.