Iniziare ad usare la classe - GiorgioKM/ImporterCSVforWordpress GitHub Wiki

Sommario

➡️ Istanziare la classe

➡️ Eliminare gli spazi prima e dopo dentro una cella

➡️ Definire i dati da importare per ogni colonna del file CSV

➡️ Utilizzare il filtro icfw_filter_cell per far ritornare tutti i valori da una singola cella

➡️ Stampare il debug dei dati parsati

➡️ Salvare i dati importati in un post o custom post type di Wordpress

➡️ Utilizzare il filtro icfw_filter_save_title e icfw_filter_save_content


Istanziare la classe

Una volta inclusa la classe nel progetto, occorre come prima cosa istanziare la classe tramite il costruttore __construct($filename_csv = '', $column_delimiter = ''):

$icfw = new ImporterCSVforWP('import_data.csv');

Il costruttore accetta solo 2 parametri:

  • $filename_csv: String - Obbligatorio. Il nome del file utilizzato per l'importazione dei dati CSV.
  • $column_delimiter: String - Facoltativo. Carattere speciale che delimita i campi di dati. Come predefinito è utilizzato il carattere ';'

Il file viene ricercato all'interno della sotto-cartella "csv" della classe

Eliminare gli spazi prima e dopo dentro una cella

Se si vogliono eliminare eventuali spazi prima e dopo dal valore di una qualsiasi cella, è possibile richiamare il metodo:

$icfw->trimCell();

Si consiglia di richiamare questo metodo subito dopo l'instanza della classe stessa.

Definire i dati da importare per ogni colonna del file CSV

Ogni file CSV è costruito secondo una struttura dati più o meno stardard. Per mappare ogni colonna del file CSV si deve utilizzare il metodo mapColumns($args = array(), $start_row = 1).

mapColumns accetta 2 parametri:

  • $args: Array - Obbligatorio. Lista di parametri da definire per mappare ogni singola colonna.
  • $start_row: Integer - Facoltativo. Il numero di riga da dove iniziare l'importo dei dati dal file CSV.

Supponendo che il file in questione contenga le seguenti informazioni:

NOME;COGNOME;COGNOME 2;INDIRIZZO;CITTA;TEL1;TEL2
Giacomo; Rodari  ;Ernesto; Via tal dei tali, 133; Roma;06512345;
 Luigi;Girolamo;;Via tal dei tali, 19;Milano;33123456;02345678
Carlo;Rossi;De Bruni;Via tal dei tali, 1;Napoli;1234567;890123456

Il primo parametro $args del metodo mapColumns, deve essere strutturato in modo da importare solo le colonne che ci interessano:

$args = array(
	'NOME_MAPPA_COLONNA' => NUMERO_COLONNA (l'indice di partenza della colonna è 1),
	...
	/*
	 * Oppure come sotto array per definire eventuali opzioni per la colonna.
	 * È obbligatoria la chiave 'col' seguita dal valore numerico della colonna
	 * da ottenere.
	 * Si possono ottenere anche più colonne, inserendo diversi valori numerici come array.
	 * NB: definendo la chiave come sotto array, il valore finale restituito sarà un array.
	 */
	'NOME_MAPPA_COLONNA' => array(
		'col' => (integer|array),
		/*
		 * La chiave 'cell_separator' è facoltativa. Permette di suddividere
		 * ulteriormente la cella se viene trovato il carattere di separazione definito.
		 */
		'cell_separator' => 'CARATTERE_DI_SEPARAZIONE',
	),
	...
	...
);

Quindi facendo riferimento al CSV di sopra, si può scrivere:

$args = array(
	'nome' => 1,
	'cognome' => array(
		'col' => array(2,3),
	),
	'indirizzo' => 4,
	'citta' => 5,
	'telefono_1' => 6,
	'telefono_2' => 7,
);

$icfw->mapColumns($args, 2);

Il risultato sarà il seguente:

Array
(
    [0] => Array
        (
            [nome] => Giacomo
            [cognome] => Array
                (
                    [0] => Rodari
                    [1] => Ernesto
                )

            [indirizzo] => Via tal dei tali, 133
            [citta] => Roma
            [telefono_1] => 06512345
            [telefono_2] => 
        )

    [1] => Array
        (
            [nome] => Luigi
            [cognome] => Array
                (
                    [0] => Girolamo
                    [1] => 
                )

            [indirizzo] => Via tal dei tali, 19
            [citta] => Milano
            [telefono_1] => 33123456
            [telefono_2] => 02345678
        )

    [2] => Array
        (
            [nome] => Carlo
            [cognome] => Array
                (
                    [0] => Rossi
                    [1] => De Bruni
                )

            [indirizzo] => Via tal dei tali, 1
            [citta] => Napoli
            [telefono_1] => 1234567
            [telefono_2] => 890123456
        )

)

Invece in questo esempio, alcune celle verranno suddivise come array utilizzando la chiave 'cell_separator':

Titolo #1;2001;Attore #1, Attore #2, Attore #3;Thriller
Titolo #2;2012;Attore #4, Attore #5;Drammatico
$args = array(
	'titolo' => 1,
	'anno' => 2,
	'cast' => array(
		'col' => 3,
		'cell_separator' => ',',
	),
	'genere' => 4,
);

$icfw->mapColumns($args);

Il risultato sarà il seguente:

Array
(
    [0] => Array
        (
            [titolo] => Titolo #1
            [anno] => 2001
            [cast] => Array
                (
                    [0] => Attore #1
                    [1] => Attore #2
                    [2] => Attore #3
                )

            [genere] => Thriller
        )

    [1] => Array
        (
            [titolo] => Titolo #2
            [anno] => 2012
            [cast] => Array
                (
                    [0] => Attore #4
                    [1] => Attore #5
                )

            [genere] => Drammatico
        )

)

Utilizzare il filtro icfw_filter_cell per far ritornare tutti i valori da una singola cella

La classe prevede un filtro che permette di avere un controllo più completo sui valori ritornati da ogni singola cella e modificare i dati ulteriormente a proprio piacimento.

Per eseguire il filtro, richiamare il seguente metodo di Wordpress:

add_filter('icfw_filter_cell', function($cell_values, $column_name) {
	...
	codice aggiuntivo
	...
	
	return $cell_values;
}, 10, 2);

Questo filtro viene applicato solo alla fine, dopo che la classe ha già parsato i dati.

Il filtro accetta solo 2 parametri:

  • $cell_values: Array - Ritorna un array con i valori di ogni singola cella.
  • $column_name: String - Il nome della chiave della colonna mappata inizialmente con il metodo mapColumns.

Facendo riferimento all'ultimo esempio, se vogliamo per esempio unire tutti gli elementi dell'array in una singola stringa. Si può procedere così:

add_filter('icfw_filter_cell', function($cell_values, $column_name) {
	if ($column_name == 'cast')
		return implode(', ', $cell_values);
	
	return $cell_values;
}, 10, 2);

Il risultato sarà il seguente:

Array
(
    [0] => Array
        (
            [titolo] => Titolo #1
            [anno] => 2001
            [cast] => Attore #1, Attore #2, Attore #3
            [genere] => Thriller
        )

    [1] => Array
        (
            [titolo] => Titolo #2
            [anno] => 2012
            [cast] => Attore #4, Attore #5
            [genere] => Drammatico
        )

)

Stampare il debug dei dati parsati

Per un controllo dei dati appena parsati, si può utilizzare il metodo $icfw->debugData() per stampare i dati a video.

Salvare i dati importati in un post o custom post type di Wordpress

Una volta che i dati importati dal file CSV ci sembrano corretti, si può procedere ad un salvataggio degli stessi sottoforma di post o custom post type e eventuali post meta. Si può utilizzare il metodo saveDataToPost($args = array(), $save_to_db = false).

saveDataToPost accetta 2 parametri:

  • $args: Array - Facoltativo. Una serie di elementi per costruire il post da inserire all'interno di Wordpress.
  • $save_to_db: Bool - Facoltativo. Determina o meno se salvare i dati sul database. Se il valore è falso, stamperà a video un debug sull'operazione da effettuare.
$icfw->saveDataToPost(array(
	 /*
	 * La chiave 'wp_insert_post' è facoltativa. Se non specificata verrà utilizzato il
	 * seguente array predefinito:
	 * Array
	 * (
	 * 	[post_title] => MAPPATURA_CHIAVE_1_RIGA // vedasi metodo `mapColumns`
	 * 	[post_content] => 
	 * 	[post_status] => draft
	 * 	[post_type] => post
	 * )
	 * Altrimenti il formato è lo stesso che si utilizza quando si inserisce un post in Wordpress.
	 * NB: Vedere il metodo nativo di Wordpress `wp_insert_post` e in particolare il parametro `$postarr`.
	 */
	'wp_insert_post' => array(
		'post_title' => 'titolo', // 'titolo' è la chiave mappata che è stata definita nell'array
		                          //  `$args` del metodo `mapColumns`.
		'post_status' => 'publish',
		'post_type' => 'films' // 'films' è un custom post type, ma è possibile salvare i dati nel post
		                       // post nativo di Wordpress.
		...
	),
	/*
	 * La chiave 'custom_post_meta' è facoltativa. Se non specificata non verranno salvati ulteriori
	 * post meta.
	 * Si definisce con `chiave` => `valore`. La chiave è il campo su database chiamato 'meta_key', dove
	 * salvare il record e il valore è il campo 'meta_value' (tabella 'wp_postmeta').
	 * Il valore in questo caso sarà sempre la chiave che è stata mappata con il metodo [mapColumns](#definire-i-dati-da-importare-per-ogni-colonna-del-file-csv).
	 */
	'custom_post_meta' => array(
		'year_meta' => 'anno',
		/*
		 * Si può definire anche con un sotto array formato sempre da `chiave` => `valore`. Il valore
		 * funziona come visto sopra.
		 * In questo caso però il tutto verrà serializzato automaticamente da Wordpress.
		 * Se la chiave non viene specificata, verrà preso il nome mappato dal campo valore.
		 */
		'other_data_meta' => array(
			'cast',
			'genre' => 'genere',
		),
	),
));

Per chiarezza, ecco un esempio:

Titolo #1;2001;Attore #1, Attore #2, Attore #3;Thriller
Titolo #2;2012;Attore #4, Attore #5;Drammatico
$args = array(
	'titolo' => 1,
	'anno' => 2,
	'cast' => array(
		'col' => 3,
		'cell_separator' => ',',
	),
	'genere' => 4,
);

$icfw->mapColumns($args);

Risultato:

Array
(
    [0] => Array
        (
            [titolo] => Titolo #1
            [anno] => 2001
            [cast] => Attore #1, Attore #2, Attore #3
            [genere] => Thriller
        )

    [1] => Array
        (
            [titolo] => Titolo #2
            [anno] => 2012
            [cast] => Attore #4, Attore #5
            [genere] => Drammatico
        )

)

Salvo su Database:

$icfw->saveDataToPost(array(
	'wp_insert_post' => array(
		'post_title' => 'titolo',
		'post_status' => 'publish',
	),
	'custom_post_meta' => array(
		'year_meta' => 'anno',
		'other_data_meta' => array(
			'cast',
			'genre' => 'genere',
		),
	),
));

Utilizzare il filtro icfw_filter_save_title e icfw_filter_save_content

Prima di salvare i dati su database è possibile agire direttamente sul titolo e il contenuto del post. Si può comunque effettuare questa operazione anche tramite il filtro icfw_filter_cell. Il filtro comunque è necessario prima di poter salvare i dati su database.

Vediamo ora il primo filtro icfw_filter_save_title. Questo è quello predefinito dalla classe:

add_filter('icfw_filter_save_title', function($title) {
	if (is_array($title))
		$title = implode(' ', $title);
	
	return wp_strip_all_tags($title);
});

e icfw_filter_save_content:

add_filter('icfw_filter_save_content', function($content) {
	if (is_array($content))
		$content = implode(' ', $content);
	
	return apply_filters('the_content', $content);
});