18

L’estensione dei file .csv sta per comma-separated values, ovvero valori separati da virgola. Si tratta di file di testo, usati per l’importazione ed esportazione di dati tabellari, accomunati dalla sintassi di delimitazione dei vari campi.

Uno degli ambiti comuni d’uso dei file csv è quello dell’importazione delle email nei servizi newsletter come Mailchimp. Nel nostro esempio andremo quindi a realizzare un semplice codice che esporti i dati degli utenti di WordPress per poter inviare loro una DEM.

Il concetto è davvero semplice per cui passiamo direttamente al codice.

Iniziamo estrapolando i dati che ci servono dal db di WordPress grazie a get_users():

// Prendo i dati degli utenti dal db di WordPress
$users_data = get_users( array( 'fields' => array( 'user_email', 'display_name' ) ) );

Il codice descritto ritorna un’array di oggetti che hanno come proprietà l’email ed il nome dei singoli user di WordPress.

Andremo quindi a realizzare una funzione, che potrà essere usata anche in altri contesti, per inserire questi dati nel nostro file csv. La base di questa funzione sarà la funzione php fputcsv() che, una volta passata un’array di dati, fa la maggior parte del lavoro per noi!

/**
 * Export di dati in formato csv
 *
 * @param	array	$data_array	Un'array di stringhe, array o oggetti
 * @param	string	$filename	Nome del file da esportare (opzionale)
 */
function export_to_csv( $data_array, $filename = 'default'  ) {

    // Gestione minima degli errori
    if ( !is_array( $data_array ) || empty( $data_array ) )
        return false;

    // Manda l'header corrispondente al formato csv
    header( 'Content-Type: text/csv' );
    header( 'Content-Disposition: attachment;filename=' . $filename  . '.csv');
	
    // Apre il file in modalità scrittura
    $fp = fopen( 'php://output', 'w' );
	
    // Inserisce i dati nel file
    foreach ( $data_array as $data ) {
		
       // Fa il casting dei dati
       if ( !is_array( $data ) )
           $data = (array) $data;
		
       // Inserisce i dati nel file, riga x riga, nel formato standard csv
       fputcsv( $fp, $data, ',', '"' );
			
    }

    // Chiude il file
    fclose( $fp );
		
    // Ferma l'esecuzione del php
    exit;

}

Ora non ci resta che mettere assieme le due cose per creare il file users.csv contente email e nome degli utenti da importare in mailchimp o similari.

export_to_csv( $users_data, 'users' );

Se qualcosa non dovesse essere chiaro o fosse necessaria qualche precisazione non esitate a lasciare un commento.

  1. Ciao, premetto che utilizzo wordpress da molto ma non ho mai “smanettato” con il codice nel database. Solo per quanto riguarda le modifiche del template.
    Mi interessa molto poter esportare le mail degli utenti di wordpress ma non saprei dove aggiungere il codice da te indicato. Saresti così gentile da indicarmi, passo passo cosa fare per poter ottenere il file? Non è la prima volta che mi capita di seguirti 🙂

    1. Ciao Matteo,

      crea un file export-template.php nella cartella principale del tuo tema e inserisci il seguente codice:

      <?php
      /*
      Template Name: Pagina export csv
      */
      
      /**
       * Export di dati in formato csv
       *
       * @param  array  $data_array  Un'array di stringhe, array o oggetti
       * @param  string  $filename  Nome del file da esportare (opzionale)
       */
      function export_to_csv( $data_array, $filename = 'default'  ) {
      
          // Gestione minima degli errori
          if ( !is_array( $data_array ) || empty( $data_array ) )
              return false;
      
          // Manda l'header corrispondente al formato csv
          header( 'Content-Type: text/csv' );
          header( 'Content-Disposition: attachment;filename=' . $filename  . '.csv');
        
          // Apre il file in modalità scrittura
          $fp = fopen( 'php://output', 'w' );
        
          // Inserisce i dati nel file
          foreach ( $data_array as $data ) {
          
             // Fa il casting dei dati
             if ( !is_array( $data ) )
                 $data = (array) $data;
          
             // Inserisce i dati nel file, riga x riga, nel formato standard csv
             fputcsv( $fp, $data, ',', '"' );
            
          }
      
          // Chiude il file
          fclose( $fp );
          
          // Ferma l'esecuzione del php
          exit;
      
      }
      
      // Prendo i dati degli utenti dal db di WordPress
      $users_data = get_users( array( 'fields' => array( 'user_email', 'display_name' ) ) );
      
      if ( is_super_admin() )
          export_to_csv( $users_data, 'users' );
      

      A questo punto salva il file e crea una nuova pagina chiamata export csv nel pannello di amministrazione di WordPress assegnando come modello “Pagina export csv”. Salva la pagina e visualizzala. Quando hai finito puoi eliminare tutto o mettere la pagina nelle bozze per un uso futuro. Considera che chiunque con permessi da amministratore potrà scaricare il csv con le email degli utenti registrati.
      Ho copia/incollato il codice al volo, se ci fosse qualche problema fammi sapere.

      1. Gentilissimo Alessandro, ho seguito passo dopo passo il tuo post facendo come dici tu, ovvero creando la pagina in php denominata “export-template.php” e successivamente ho creato la pagina “Pagina export csv” ma non succede nulla.
        Ho inserito il php sulla directory principale di wordpress, è giusto o va copiato sulla cartella themes?

        Grazie
        Andrea Zamboni

        1. Ciao Andrea,
          Va inserito nella cartella wp-content/themes/tuotema/
          In questo modo quando andrai a creare la pagina “Pagina export csv” potrai selezionare “Pagina export csv” nel menu a tendina “modello”.

  2. Ciao, funziona perfettamente! volevo sapere se c’è un modo per esportare oltre l’email anche i dati di registrazione (nome, cognome ecc..). Ad esempio utilizzo il plugin “Register Plus Redux” con il quale ho generato altri campi e che vorrei esportare.
    Grazie

    1. Certo, una cosa del genere dovrebbe fare al tuo caso:

      $users_data = get_users( array( 'fields' => array( 'ID', 'user_email', 'display_name' ) ) );
      foreach ($users_data as $key => $user) {
      	$user_meta = get_user_meta($user->ID);
      	foreach ($user_meta as $meta_name => $meta) {
      		$users_data[$key]->$meta_name = $meta[0];
      	}
      }
      export_to_csv( $users_data, 'users_with_meta' );

      Ps. Oltre ai tuoi custom field questo esporterà gli altri metadata di wp come l’admin color ecc…

      1. ciao
        ho creato il file e caricato nel tema, creato la pagina e salvata come detto, ma dove sono gli indirizzi e-mail?
        da export di wordpress posso scaricare soltanto un file xml dei contrenuti, dove sta il file delle e-mail?
        grazie
        Massimo

    1. Ciao, effettivamente mi ha scaricato tutti i metadata. Se volessi invece scaricare solo i custom field che ho creato? ad esempio ho il nome, cognome e numero di telefono? Grazie ancora!

      1. Non l’ho testato ma puoi prendere spunto dal codice che segue:

        $users_data = get_users( array( 'fields' => array( 'ID', 'user_email', 'display_name' ) ) );
        foreach ($users_data as $key => $user) {
          $user_meta = get_user_meta($user->ID);
          $users_data[$key]['Nome del custom field 1'] = $user_meta['nome_del_custom_field_1'][0];
          $users_data[$key]['Nome del custom field 2'] = $user_meta['nome_del_custom_field_2'][0];
          // ecc ...
        }
        export_to_csv( $users_data, 'users_with_meta' );
  3. Ciao ancora non ho fatto la prova… volevo fare anche un’altra cosa.. cioè di fare apparire su una pagina del sito la lista degli utenti.

    Allora ho trovato questo codice:
    Utenti registrati

    <?php
    $q_users = mysql_query('SELECT user_login FROM wp_users');
    while($username = mysql_fetch_array($q_users)){
        echo $username['user_login'];
    }
    ?>

    Questo funziona e crea una lista di tutti gli username.

    E se a questa lista volessi aggiungere altri valori dell’utente (Nome, cognome, tel)?

    Pensi sia una cosa fattibile?
    Grazie

    1. Ciao Valerio,
      Il codice sopra non è specifico ma va adattato alle tue esigenze. Per quanto riguarda la necessità di implementare una pagina con la lista degli utente va oltre lo scopo dell’articolo. Puoi dare un’occhiata a questo articolo per maggiori informazioni in proposito.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *