| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- <?php
- if (!defined('ABSPATH'))
- exit;
- require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
- $controls = new NewsletterControls();
- $module = NewsletterUsers::instance();
- $options_profile = get_option('newsletter_profile');
- if ($controls->is_action('import')) {
- $mode = $controls->data['mode'];
- // TODO: to be removed, it's not safe
- @set_time_limit(0);
- $results = '';
- if (is_uploaded_file($_FILES['csv_file']['tmp_name'])) {
- $lines = file($_FILES['csv_file']['tmp_name']);
- } else {
- $csv = stripslashes($controls->data['csv']);
- $lines = explode("\n", $csv);
- }
- // Set the selected preferences inside the
- if (!isset($controls->data['preferences']) || !is_array($controls->data['preferences']))
- $controls->data['preferences'] = array();
- // if ($options['followup'] == 'activate') {
- // $subscriber['followup'] = 1;
- // }
- $error_count = 0;
- $added_count = 0;
- $updated_count = 0;
- $skipped_count = 0;
- foreach ($lines as &$line) {
- // Parse the CSV line
- $line = trim($line);
- if ($line == '') {
- continue;
- }
- if ($line[0] == '#' || $line[0] == ';') {
- continue;
- }
- $separator = $controls->data['separator'];
- if ($separator == 'tab') {
- $separator = "\t";
- }
- $data = explode($separator, $line);
- // Builds a subscriber data structure
- $email = $newsletter->normalize_email($data[0]);
- if (empty($email)) {
- continue;
- }
- if (!$newsletter->is_email($email)) {
- $results .= '[INVALID EMAIL] ' . $line . "\n";
- $error_count++;
- continue;
- }
- $subscriber = $module->get_user($email, ARRAY_A);
- if ($subscriber == null) {
- $subscriber = array();
- $subscriber['email'] = $email;
- if (isset($data[1])) {
- $subscriber['name'] = $module->normalize_name($data[1]);
- }
- if (isset($data[2])) {
- $subscriber['surname'] = $module->normalize_name($data[2]);
- }
- if (isset($data[3])) {
- $subscriber['sex'] = $module->normalize_sex($data[3]);
- }
- $subscriber['status'] = $controls->data['import_as'];
- foreach ($controls->data['preferences'] as $i) {
- $subscriber['list_' . $i] = 1;
- }
- $module->save_user($subscriber);
- $results .= '[ADDED] ' . $line . "\n";
- $added_count++;
- } else {
- if ($mode == 'skip') {
- $results .= '[SKIPPED] ' . $line . "\n";
- $skipped_count++;
- continue;
- }
- if ($mode == 'overwrite') {
- if (isset($data[1])) {
- $subscriber['name'] = $module->normalize_name($data[1]);
- }
- if (isset($data[2])) {
- $subscriber['surname'] = $module->normalize_name($data[2]);
- }
- if (isset($data[3])) {
- $subscriber['sex'] = $module->normalize_sex($data[3]);
- }
- if (isset($controls->data['override_status'])) {
- $subscriber['status'] = $controls->data['import_as'];
- }
- // Prepare the preference to zero
- for ($i = 1; $i < NEWSLETTER_LIST_MAX; $i++) {
- $subscriber['list_' . $i] = 0;
- }
- foreach ($controls->data['preferences'] as $i) {
- $subscriber['list_' . $i] = 1;
- }
- }
- if ($mode == 'update') {
- $subscriber['name'] = $module->normalize_name($data[1]);
- $subscriber['surname'] = $module->normalize_name($data[2]);
- if (isset($data[3])) {
- $subscriber['sex'] = $module->normalize_sex($data[3]);
- }
- if (isset($controls->data['override_status'])) {
- $subscriber['status'] = $controls->data['import_as'];
- }
- foreach ($controls->data['preferences'] as $i) {
- $subscriber['list_' . $i] = 1;
- }
- }
- NewsletterUsers::instance()->save_user($subscriber);
- $results .= '[UPDATED] ' . $line . "\n";
- $updated_count++;
- }
- }
- if ($error_count) {
- $controls->errors = "Import completed but with errors.";
- }
- $controls->messages = "Import completed: $error_count errors, $added_count added, $updated_count updated, $skipped_count skipped.";
- }
- ?>
- <div class="wrap" id="tnp-wrap">
- <?php include NEWSLETTER_DIR . '/tnp-header.php'; ?>
- <div id="tnp-heading">
- <h2><?php _e('Import', 'newsletter') ?></h2>
- <p>
- The import and export functions <strong>ARE NOT for backup</strong>. If you want to backup you should consider to backup the
- wp_newsletter* tables. Please, read on bottom of this page the data format to use and other important notes.</p>
- </div>
- <div id="tnp-body" class="tnp-users tnp-users-import">
- <?php if (!empty($results)) { ?>
- <h3>Results</h3>
- <textarea wrap="off" style="width: 100%; height: 150px; font-size: 11px; font-family: monospace"><?php echo esc_html($results) ?></textarea>
- <?php } ?>
- <form method="post" enctype="multipart/form-data">
- <?php $controls->init(); ?>
- <table class="form-table">
- <tr>
- <th><?php _e('Import Subscribers As', 'newsletter') ?></th>
- <td>
- <?php $controls->select('import_as', array('C' => __('Confirmed', 'newsletter'), 'S' => __('Not confirmed', 'newsletter'))); ?>
- <br>
- <?php $controls->checkbox('override_status', __('Override status of existing users', 'newsletter')) ?>
- </td>
- </tr>
- <tr>
- <th><?php _e('Import mode', 'newsletter') ?></th>
- <td>
- <?php $controls->select('mode', array('update' => 'Update', 'overwrite' => 'Overwrite', 'skip' => 'Skip')); ?>
- if email is already present
- <p class="description">
- <strong>Update</strong>: <?php _e('user data will be updated, existing preferences will be left untouched and new ones will be added.', 'newsletter') ?><br />
- <strong>Overwrite</strong>: <?php _e('user data will be overwritten with new informations (like name and preferences).', 'newsletter') ?><br />
- <strong>Skip</strong>: <?php _e('user data will be left untouched if already present.', 'newsletter') ?>
- </p>
- </td>
- </tr>
- <tr>
- <th><?php _e('Lists', 'newsletter') ?></th>
- <td>
- <?php $controls->preferences_group('preferences', true); ?>
- <div class="hints">
- Every new imported or updated subscriber will be associate with selected preferences above.
- </div>
- </td>
- </tr>
- <tr>
- <th><?php _e('Field separator', 'newsletter') ?></th>
- <td>
- <?php $controls->select('separator', array(';' => 'Semicolon', ',' => 'Comma', 'tab' => 'Tabulation')); ?>
- </td>
- </tr>
- <tr>
- <th>
- <?php _e('CSV file', 'newsletter') ?>
- <div class="tnp-tip">
- <span class="tip-button">Tip</span>
- <span class="tip-content">
- Upload a CSV file, see format description <a href="#import_format">below</a>.
- </span>
- </div>
- </th>
- <td>
- <input type="file" name="csv_file" />
- </td>
- </tr>
- <tr>
- <th>CSV text
- <div class="tnp-tip">
- <span class="tip-button">Tip</span>
- <span class="tip-content">
- Simply paste CSV text here.
- </span>
- </div>
- </th>
- <td>
- <textarea name="options[csv]" wrap="off" style="width: 100%; height: 200px; font-size: 11px; font-family: monospace"><?php echo $controls->data['csv']; ?></textarea>
- </td>
- </tr>
- <tr>
- <th> </th><td><?php $controls->button('import', 'Import'); ?></td>
- </tr>
- <tr>
- <th>
- <a name="import_format"></a>
- Data format<br>and other notes
- <div class="tnp-tip">
- <span class="tip-button">Tip</span>
- <span class="tip-content">Consider to split up your input list if you get errors, blank pages or partially imported lists: it can be a time/resource limit
- of your provider. It's safe to import the same list a second time, no duplications will occur.</span>
- </th>
- <td>
- <p>
- Import list format is:
- <p><strong>email</strong><i>[separator]</i><strong>first name</strong><i>[separator]</i><strong>last name</strong><i>[separator]</i><strong>gender</strong><i>[new line]</i></p>
- Example:
- <p style="border: 1px solid #bfbfbf">
- email1@example.com;first name 1;last name 1;m<br />
- email2@example.com;first name 2;last name 2;f
- </p>
- <p>
- where [separator] must be selected from the available ones. Empty lines and lines starting with "#" will be skipped. There is
- no separator escaping mechanism, so be sure that field values do not contain the selected separator. The only required field is the email
- all other fields are options. Gender must be "m" or "f".
- </p>
- </td>
- </tr>
- </table>
- </form>
- </div>
- <?php include NEWSLETTER_DIR . '/tnp-footer.php'; ?>
- </div>
|