Changeset 3453997
- Timestamp:
- 02/04/2026 05:39:04 PM (7 weeks ago)
- Location:
- export-users-data-csv
- Files:
-
- 3 added
- 2 edited
-
tags/3.0 (added)
-
tags/3.0/export-users-data-csv.php (added)
-
tags/3.0/readme.txt (added)
-
trunk/export-users-data-csv.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
export-users-data-csv/trunk/export-users-data-csv.php
r2869412 r3453997 1 1 <?php 2 2 3 /** 3 4 * Plugin Name: Export Users Data CSV 4 * Description: This Plugin allows you to export users data and metadata into CSVfile.5 * Description: This Plugin allows you to export users data and some of the metadata into CSV, Excel, XML, JSON file. 5 6 * Author: Kaushik Kalathiya 6 7 * Author URI: https://kaushikkalathiya.github.io/kaushik/ 7 * License: Kaushik Kalathiya8 * License URI: https:// kaushikkalathiya.github.io/kaushik/9 * Version: 2.210 * Requires at least: 5.111 * Requires PHP: 7. 112 * Text Domain: export user8 * License: GPLv2 or later 9 * License URI: https://www.gnu.org/licenses/gpl-2.0.html 10 * Version: 3.0 11 * Requires at least: 6.1 12 * Requires PHP: 7.4 13 * Text Domain: export-users-data-csv 13 14 */ 14 15 15 16 // If this file is called directly, abort. 16 if ( ! defined( 'WPINC' ) ) { die; } 17 if (! defined('WPINC')) { 18 die; 19 } 20 21 /** 22 * Prevent CSV/Spreadsheet formula injection. 23 * 24 * Spreadsheet apps may interpret values starting with =, +, -, @ as formulas. 25 * Prefixing with a single quote forces literal text in common spreadsheet apps. 26 * 27 * @param mixed $value Value to sanitize for spreadsheet cell output. 28 * @return string 29 */ 30 function eudc_sanitize_spreadsheet_cell($value) 31 { 32 $value = (string) $value; 33 34 // Normalize line breaks to avoid breaking rows unexpectedly. 35 $value = str_replace(array("\r\n", "\r", "\n"), ' ', $value); 36 37 // If value begins with a formula sigil (optionally after whitespace), neutralize it. 38 if (preg_match('/^\s*[=+\-@]/', $value)) { 39 $value = "'" . $value; 40 } 41 42 return $value; 43 } 17 44 18 45 // Add setting link into plugin listing page 19 add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'eudc_settings_page_link'); 20 function eudc_settings_page_link($links){ 21 $links[] = '<a href="'.admin_url('users.php').'">'.__('Export Users').'</a>'; 46 add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'eudc_settings_page_link'); 47 function eudc_settings_page_link($links) 48 { 49 $links[] = '<a href="' . admin_url('users.php') . '">' . __('Export Users', 'export-users-data-csv') . '</a>'; 22 50 return $links; 23 51 } … … 26 54 if (!function_exists('eudc_export_users')) { 27 55 add_action('admin_footer', 'eudc_export_users'); 28 function eudc_export_users() { 56 function eudc_export_users() 57 { 29 58 $screen = get_current_screen(); 30 59 // Only add to users.php page 31 if ( $screen->id != "users")60 if ($screen->id != "users") 32 61 return; 33 ?>62 ?> 34 63 <script type="text/javascript"> 35 jQuery(document).ready( function($) { 36 37 jQuery('.tablenav.top .clear, .tablenav.bottom .clear').before('<form name="eud_form" action="#" method="POST">'+ 38 '<select name="edu_select">'+ 39 '<option value="eud_csv">Export as CSV</option>'+ 40 '<option value="eud_excel">Export as Excel</option>'+ 41 '<option value="eud_xml">Export as XML</option>'+ 42 '</select> '+ 43 '<input type="submit" class="button" name="eud_btn" value="Export">'+ 44 '</form>'); 64 jQuery(document).ready(function($) { 65 var nonce = '<?php echo esc_js(wp_create_nonce('eudc_export_users')); ?>'; 66 jQuery('.tablenav.top .clear, .tablenav.bottom .clear').before('<form name="eud_form" action="#" method="POST">' + 67 '<input type="hidden" name="eudc_nonce" value="' + nonce + '">' + 68 '<select name="edu_select">' + 69 '<option value="eud_csv">Export as CSV</option>' + 70 '<option value="eud_excel">Export as Excel</option>' + 71 '<option value="eud_xml">Export as XML</option>' + 72 '<option value="eud_json">Export as JSON</option>' + 73 '</select> ' + 74 '<input type="submit" class="button" name="eud_btn" value="Export">' + 75 '</form>'); 45 76 }); 46 77 </script> 47 <?php 48 } 49 } 50 51 //you can use admin_init as well 52 if (!function_exists('eudc_export_csv')) { 53 add_action('admin_init', 'eudc_export_csv'); 54 function eudc_export_csv() { 55 if (current_user_can('manage_options')) { 56 57 $args = array ( 58 'order' => 'ASC', 59 'orderby' => 'display_name', 60 'fields' => 'all', 61 ); 62 $wp_users = get_users( $args ); 63 64 if( !empty($_POST['eud_btn']) && isset($_POST['eud_btn']) ){ 65 66 // Code for CSV 67 if ( !empty($_POST['edu_select']) && $_POST['edu_select'] == 'eud_csv' ) { 68 header("Content-type: application/force-download"); 69 header('Content-Disposition: inline; filename="users_'.date('Y_m_d_H_i_s').'.csv"'); 70 71 echo '" User ID "," User Name "," First Name "," Last Name "," Email ID "," Nick Name "," User Role "," Registered Date "' . "\r\n"; 72 foreach ( $wp_users as $user ) { 73 $user_id = $user->ID; 74 $user_name = $user->user_login; 75 $reg_date = $user->user_registered; 76 $meta = get_user_meta($user_id); 77 $role = $user->roles; 78 $email = sanitize_email($user->user_email); 79 80 $first_name = ( isset($meta['first_name'][0]) && $meta['first_name'][0] != '' ) ? sanitize_text_field($meta['first_name'][0]) : ''; 81 $last_name = ( isset($meta['last_name'][0]) && $meta['last_name'][0] != '' ) ? sanitize_text_field($meta['last_name'][0]) : ''; 82 $nickname = ( isset($meta['nickname'][0]) && $meta['nickname'][0] != '' ) ? sanitize_text_field($meta['nickname'][0]) : ''; 83 84 echo '"'.$user_id.'","'.$user_name.'","'.$first_name.'","'.$last_name.'","'.$email.'","'.$nickname.'","'.ucfirst($role[0]).'","'.$reg_date.'"'."\r\n"; 85 } 86 exit(); 87 } 88 89 // Code for Excel 90 if ( !empty($_POST['edu_select']) && $_POST['edu_select'] == 'eud_excel' ) { 91 header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 92 header('Content-Disposition: attachment;filename="users_'.date('Y_m_d_H_i_s').'.xlsx'); 93 94 _e('" User_ID " " User_Name " " First_Name " " Last_Name " " Email_ID " " Nick_Name " " User_Role " " Registered_Date "' . "\r\n"); 95 foreach ( $wp_users as $user ) { 96 $user_id = $user->ID; 97 $user_name = $user->user_login; 98 $reg_date = $user->user_registered; 99 $meta = get_user_meta($user_id); 100 $role = $user->roles; 101 $email = sanitize_email($user->user_email); 102 103 $first_name = ( isset($meta['first_name'][0]) && $meta['first_name'][0] != '' ) ? sanitize_text_field($meta['first_name'][0]) : ''; 104 $last_name = ( isset($meta['last_name'][0]) && $meta['last_name'][0] != '' ) ? sanitize_text_field($meta['last_name'][0]) : ''; 105 $nickname = ( isset($meta['nickname'][0]) && $meta['nickname'][0] != '' ) ? sanitize_text_field($meta['nickname'][0]) : ''; 106 107 _e('" '.$user_id.' " " '.$user_name.' " " '.$first_name.' " " '.$last_name.' " " '.$email.'" "'.$nickname.'" "'.ucfirst($role[0]).'" " '.$reg_date.' " '."\r\n"); 108 } 109 exit(); 110 } 111 112 // Code for XML 113 if ( !empty($_POST['edu_select']) && $_POST['edu_select'] == 'eud_xml' ) { 114 header("Content-type: text/xml"); 115 header('Content-Disposition: attachment; filename="users_'.date('Y_m_d_H_i_s').'.xml'); 116 117 _e('<users>'); 118 foreach ( $wp_users as $user ) { 119 $user_id = $user->ID; 120 $user_name = $user->user_login; 121 $reg_date = $user->user_registered; 122 $meta = get_user_meta($user_id); 123 $role = $user->roles; 124 $email = sanitize_email($user->user_email); 125 126 $first_name = ( isset($meta['first_name'][0]) && $meta['first_name'][0] != '' ) ? sanitize_text_field($meta['first_name'][0]) : ''; 127 $last_name = ( isset($meta['last_name'][0]) && $meta['last_name'][0] != '' ) ? sanitize_text_field($meta['last_name'][0]) : ''; 128 $nickname = ( isset($meta['nickname'][0]) && $meta['nickname'][0] != '' ) ? sanitize_text_field($meta['nickname'][0]) : ''; 129 130 _e("\n\t".'<user>'."\n\t\t"); 131 _e('<user_id>'.$user_id.'</user_id>'."\n\t\t".'<user_name>'.$user_name.'</user_name>'."\n\t\t".'<first_name>'.$first_name.'</first_name>'."\n\t\t".'<last_name>'.$last_name.'</last_name>'."\n\t\t".'<email>'.$email.'</email>'."\n\t\t".'<nickname>'.$nickname.'</nickname>'."\n\t\t".'<user_role>'.ucfirst($role[0]).'</user_role>'."\n\t\t".'<user_reg_date>'.$reg_date.'</user_reg_date>'); 132 _e("\n\t".'</user>'); 133 } 134 _e("\n".'</users>'); 135 exit(); 136 } 137 138 } 78 <?php 79 } 80 } 81 82 // Helper function to extract user data from WP_User object 83 if (!function_exists('eudc_get_user_data')) { 84 function eudc_get_user_data($user) 85 { 86 if (!($user instanceof WP_User)) { 87 return null; 139 88 } 140 } 141 } 142 143 ?> 89 90 $roles = $user->roles; 91 $role = !empty($roles) ? $roles[0] : ''; 92 93 return array( 94 'user_id' => $user->ID, 95 'user_name' => $user->user_login, 96 'first_name' => $user->first_name, 97 'last_name' => $user->last_name, 98 'email' => $user->user_email, 99 'nickname' => $user->nickname, 100 'user_role' => $role, 101 'user_reg_date' => $user->user_registered, 102 ); 103 } 104 } 105 106 // Function to export users data 107 if (!function_exists('eudc_export_users_data')) { 108 add_action('admin_init', 'eudc_export_users_data'); 109 function eudc_export_users_data() 110 { 111 if (current_user_can('manage_options') && isset($_POST['eud_btn']) && $_POST['eud_btn'] == 'Export') { 112 // Verify nonce 113 if (!isset($_POST['eudc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['eudc_nonce'])), 'eudc_export_users')) { 114 wp_die(esc_html__('Security check failed. Please try again.', 'export-users-data-csv')); 115 } 116 117 $edu_select = isset($_POST['edu_select']) ? sanitize_text_field(wp_unslash($_POST['edu_select'])) : ''; 118 if (empty($edu_select)) { 119 wp_send_json_error(__('Please select a export format', 'export-users-data-csv')); 120 } 121 $users = get_users(); 122 if (empty($users)) { 123 wp_send_json_error(__('No users found', 'export-users-data-csv')); 124 } 125 126 // Code for CSV 127 if ($edu_select == 'eud_csv') { 128 header("Content-type: application/force-download"); 129 header('Content-Disposition: inline; filename="users_' . gmdate('Y_m_d_H_i_s') . '.csv"'); 130 131 echo '" User ID "," User Name "," First Name "," Last Name "," Email ID "," Nick Name "," User Role "," Registered Date "' . "\r\n"; 132 foreach ($users as $user) { 133 $user_data = eudc_get_user_data($user); 134 if (!$user_data) { 135 continue; 136 } 137 138 echo '"' . esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_id'])) . '","' . 139 esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_name'])) . '","' . 140 esc_html(eudc_sanitize_spreadsheet_cell($user_data['first_name'])) . '","' . 141 esc_html(eudc_sanitize_spreadsheet_cell($user_data['last_name'])) . '","' . 142 esc_html(eudc_sanitize_spreadsheet_cell($user_data['email'])) . '","' . 143 esc_html(eudc_sanitize_spreadsheet_cell($user_data['nickname'])) . '","' . 144 esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_role'])) . '","' . 145 esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_reg_date'])) . '"' . "\r\n"; 146 } 147 exit(); 148 } 149 150 // Code for Excel 151 if ($edu_select == 'eud_excel') { 152 header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 153 header('Content-Disposition: attachment;filename="users_' . gmdate('Y_m_d_H_i_s') . '.xlsx'); 154 155 echo '" User_ID " " User_Name " " First_Name " " Last_Name " " Email_ID " " Nick_Name " " User_Role " " Registered_Date "' . "\r\n"; 156 foreach ($users as $user) { 157 $user_data = eudc_get_user_data($user); 158 if (!$user_data) { 159 continue; 160 } 161 162 echo '" ' . esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_id'])) . ' " " ' . 163 esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_name'])) . ' " " ' . 164 esc_html(eudc_sanitize_spreadsheet_cell($user_data['first_name'])) . ' " " ' . 165 esc_html(eudc_sanitize_spreadsheet_cell($user_data['last_name'])) . ' " " ' . 166 esc_html(eudc_sanitize_spreadsheet_cell($user_data['email'])) . '" "' . 167 esc_html(eudc_sanitize_spreadsheet_cell($user_data['nickname'])) . '" "' . 168 esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_role'])) . '" " ' . 169 esc_html(eudc_sanitize_spreadsheet_cell($user_data['user_reg_date'])) . ' " ' . "\r\n"; 170 } 171 exit(); 172 } 173 174 // Code for XML 175 if ($edu_select == 'eud_xml') { 176 header("Content-type: text/xml"); 177 header('Content-Disposition: attachment; filename="users_' . gmdate('Y_m_d_H_i_s') . '.xml'); 178 echo '<users>'; 179 foreach ($users as $user) { 180 $user_data = eudc_get_user_data($user); 181 if (!$user_data) { 182 continue; 183 } 184 185 echo "\n\t" . '<user>' . "\n\t\t"; 186 echo '<user_id>' . esc_xml($user_data['user_id']) . '</user_id>' . "\n\t\t" . '<user_name>' . esc_xml($user_data['user_name']) . '</user_name>' . "\n\t\t" . '<first_name>' . esc_xml($user_data['first_name']) . '</first_name>' . "\n\t\t" . '<last_name>' . esc_xml($user_data['last_name']) . '</last_name>' . "\n\t\t" . '<email>' . esc_xml($user_data['email']) . '</email>' . "\n\t\t" . '<nickname>' . esc_xml($user_data['nickname']) . '</nickname>' . "\n\t\t" . '<user_role>' . esc_xml($user_data['user_role']) . '</user_role>' . "\n\t\t" . '<user_reg_date>' . esc_xml($user_data['user_reg_date']) . '</user_reg_date>'; 187 echo "\n\t" . '</user>'; 188 } 189 echo "\n" . '</users>'; 190 exit(); 191 } 192 193 // Code for JSON 194 if ($edu_select == 'eud_json') { 195 header("Content-type: application/json"); 196 header('Content-Disposition: attachment; filename="users_' . gmdate('Y_m_d_H_i_s') . '.json'); 197 198 $users_data = array(); 199 foreach ($users as $user) { 200 $user_data = eudc_get_user_data($user); 201 if ($user_data) { 202 $users_data[] = $user_data; 203 } 204 } 205 echo wp_json_encode($users_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); 206 exit(); 207 } 208 } 209 } 210 } -
export-users-data-csv/trunk/readme.txt
r2869412 r3453997 3 3 Donate link: https://kaushikkalathiya.github.io/kaushik/ 4 4 Tags: Export Users, User Export, CSV, CSV Export 5 Requires at least: 5.16 Tested up to: 6. 17 Requires PHP: 7. 18 Stable tag: 2.29 License: Kaushik10 License URI: https:// kaushikkalathiya.github.io/kaushik/5 Requires at least: 6.1 6 Tested up to: 6.9 7 Requires PHP: 7.4 8 Stable tag: 3.0 9 License: GPLv2 or later 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html 11 11 12 12 Export Users Data Plugin allows you to export users information with important meta data in CSV file format. … … 54 54 == Changelog == 55 55 56 = 3.0 = 57 * Update code for better security. 58 * Improve code execution and safe data export. 59 * Add option for Export as JSON file. 60 56 61 = 2.2 = 57 62 * Update code for security purpose.
Note: See TracChangeset
for help on using the changeset viewer.