Plugin Directory

Changeset 3453997


Ignore:
Timestamp:
02/04/2026 05:39:04 PM (7 weeks ago)
Author:
kaushik1111
Message:

Add option for Export Data as JSON file
Update code for improve security
Update code for data export

Location:
export-users-data-csv
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • export-users-data-csv/trunk/export-users-data-csv.php

    r2869412 r3453997  
    11<?php
     2
    23/**
    34 * Plugin Name: Export Users Data CSV
    4  * Description: This Plugin allows you to export users data and metadata into CSV file.
     5 * Description: This Plugin allows you to export users data and some of the metadata into CSV, Excel, XML, JSON file.
    56 * Author: Kaushik Kalathiya
    67 * Author URI: https://kaushikkalathiya.github.io/kaushik/
    7  * License: Kaushik Kalathiya
    8  * License URI: https://kaushikkalathiya.github.io/kaushik/
    9  * Version: 2.2
    10  * Requires at least: 5.1
    11  * Requires PHP: 7.1
    12  * Text Domain: exportuser
     8 * 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
    1314 */
    1415
    1516// If this file is called directly, abort.
    16 if ( ! defined( 'WPINC' ) ) { die; }
     17if (! 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 */
     30function 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}
    1744
    1845// 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>';
     46add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'eudc_settings_page_link');
     47function eudc_settings_page_link($links)
     48{
     49    $links[] = '<a href="' . admin_url('users.php') . '">' . __('Export Users', 'export-users-data-csv') . '</a>';
    2250    return $links;
    2351}
     
    2654if (!function_exists('eudc_export_users')) {
    2755    add_action('admin_footer', 'eudc_export_users');
    28     function eudc_export_users() {
     56    function eudc_export_users()
     57    {
    2958        $screen = get_current_screen();
    3059        // Only add to users.php page
    31         if ( $screen->id != "users" )
     60        if ($screen->id != "users")
    3261            return;
    33     ?>
     62?>
    3463        <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>');
    4576            });
    4677        </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
     83if (!function_exists('eudc_get_user_data')) {
     84    function eudc_get_user_data($user)
     85    {
     86        if (!($user instanceof WP_User)) {
     87            return null;
    13988        }
    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
     107if (!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  
    33Donate link: https://kaushikkalathiya.github.io/kaushik/
    44Tags: Export Users, User Export, CSV, CSV Export
    5 Requires at least: 5.1
    6 Tested up to: 6.1
    7 Requires PHP: 7.1
    8 Stable tag: 2.2
    9 License: Kaushik
    10 License URI: https://kaushikkalathiya.github.io/kaushik/
     5Requires at least: 6.1
     6Tested up to: 6.9
     7Requires PHP: 7.4
     8Stable tag: 3.0
     9License: GPLv2 or later
     10License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1111
    1212Export Users Data Plugin allows you to export users information with important meta data in CSV file format.
     
    5454== Changelog ==
    5555
     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
    5661= 2.2 =
    5762* Update code for security purpose.
Note: See TracChangeset for help on using the changeset viewer.