Nell'ultimo tutorial abbiamo esaminato l'esportazione dei dati da una tabella personalizzata. Naturalmente questa è solo metà della storia - ovviamente dobbiamo fornire un modo per importare quei dati. Naturalmente WordPress non gestisce questo, quindi ancora una volta dobbiamo eseguire il rollover.
Nel precedente articolo di questa serie abbiamo notato che se i nostri dati contengono riferimenti a una delle tabelle nativi di WordPress (ad esempio un ID post), allora ci imbattiamo piuttosto rapidamente in difficoltà. Il motivo è che quando si importano tali dati, il post ID a cui si fa riferimento potrebbe non esistere e, in caso affermativo, potrebbe non essere l'ID corretto. Questo perché quando i messaggi vengono importati, il loro ID può cambiare per evitare collisioni nel database (ID dovere essere unico).
Normalmente questo è ok: i dati collegati vengono importati insieme e i riferimenti vengono aggiornati durante la routine di importazione per garantire che eventuali modifiche vengano propagate nell'intero set di dati. Tuttavia, come discusso nel precedente articolo, in realtà è molto difficile (tranne in casi particolari) importare i dati personalizzati insieme ai dati nativi. Quindi gli avvertimenti citati in questo articolo si riferiscono a questo - e come prima, anche se l'esempio sotto fa riferimento alle tabelle WordPress, è usato semplicemente per coerenza con il resto della serie.
Vogliamo consentire ai nostri utenti di importare dati dal file di esportazione generato nell'ultimo articolo di questa serie, quindi iniziamo con l'aggiunta di un modulo che consente all'utente di caricare quel file. Lo faremo modificando la classe che abbiamo definito nell'ultimo tutorial.
class WPTuts_Log_Export_Admin_Page / ** * Il suffisso hook della pagina * / static $ hook_suffix = "; static function load () add_action ('admin_menu', array (__CLASS__, 'add_submenu')); add_action ('admin_init', array (__CLASS__ , 'maybe_download')); add_action ('admin_init', array (__CLASS__, 'maybe_upload')); add_action ('admin_notices', array (__CLASS__, 'admin_notices')); static function add_submenu () / * Definito in articolo precedente * / static function maybe_download () / * Definito nell'articolo precedente * / static function display () / * Definito nel precedente articolo - ma apporteremo alcune modifiche * / static function forse_upload () funzione statica admin_notices () static function import () static function parse () WPTuts_Log_Export_Admin_Page :: load ();
Sopra abbiamo aggiunto i seguenti metodi
maybe_upload ()
- che fungerà da listener per un file inviato per l'importazione.admin_notices ()
- che visualizzerà un messaggio di errore o di successo dopo aver tentato di importare un file.importare()
- che riceverà un file caricato e importerà i dati.parse ()
- una funzione di supporto chiamata da importare()
analizzare il file caricato ed estrarre i log che contiene.Ma prima, aggiungeremo un modulo con il quale possiamo caricare un file. Lo aggiungeremo sotto il pulsante di esportazione che abbiamo creato nell'articolo precedente. Per fare ciò dovremo apportare alcune modifiche al display()
metodo, responsabile della produzione del mark-up della nostra pagina di amministrazione. Poiché questo secondo modulo invierà un file, dobbiamo impostare il tipo di codifica su '/ Form-data multipart
'.
'; screen_icon (); eco ''. __ ('Esporta log delle attività', 'wptuts-log'). '
'; ?>
Successivamente, vogliamo ascoltare quando viene inviato il modulo sopra e attivare la routine di importazione. Prima di farlo è importante eseguire alcuni controlli:
manage_options
la possibilità di caricare.Facoltativamente, puoi impostare un limite sulla dimensione del file caricato come una sorta di "controllo di integrità". In questo esempio l'ho limitato a 2 MB. (Una funzione utile per la formattazione delle dimensioni dei file in "modo leggibile" è la funzione size_format
).
funzione static forse_upload () / * Ascolta l'invio del modulo * / if (vuoto ($ _POST ['action']) || 'import-logs'! == $ _POST ['action']) return; / * Controlla permessi e nonces * / if (! Current_user_can ('manage_options')) wp_die ("); check_admin_referer ('wptuts-import-logs', '_wplnonce'); / * Esegue controlli su file: * / // Sanity controlla se (vuoto ($ _FILES ["wptuts_import"])) wp_die ('Nessun file trovato'); $ file = $ _FILES ["wptuts_import"]; // È del tipo previsto? if ($ file ["tipo "]! =" text / xml ") wp_die (sprintf (__ (" Errore durante l'importazione dei log. Tipo di file rilevato: '% s'. 'text / xml' expected ", 'wptuts-log'), $ file ['type'])); // Impone un limite alle dimensioni del file caricato. Max 2097152 byte = 2 MB se ($ file ["size"]> 2097152) $ size = size_format ($ file ['size '], 2); wp_die (sprintf (__ (' Dimensione del file troppo grande (% s). Massimo 2MB ',' import-logs '), $ dimensione)); if ($ file ["errore"]> 0 ) wp_die (sprintf (__ ("Errore riscontrato:% d", 'wptuts-import'), $ file ["errore"])); / * Se siamo arrivati così lontano, possiamo importare i dati * / $ imported = self :: import ($ file ['tmp_name']); / * Tutto è completo, ora ri torna direttamente alla pagina * / wp_redirect (add_query_arg ('importato', $ importato)); Uscita();
Quindi dobbiamo importare il file. Per prima cosa dovremo estrarre i log dal file caricato e delegheremo il lavoro a parse ()
metodo (arriveremo a quel metodo in un po ').
Una volta che abbiamo questi log, prima controlleremo se esistono già (per evitare qualsiasi duplicazione accidentale), prima di inserirli. Quando controlliamo i log, controlleremo solo l'ID utente e la data dell'attività. Potremmo, se volessimo, essere più severi (controllando attività, ID oggetto e tipo ecc.) Ma avremmo bisogno di tornare indietro ed estendere la nostra API (in particolare wptuts_get_logs ()
).
Una volta importati i registri, reindirizziamo l'utente alla nostra pagina di amministrazione. Aggiungeremo una variabile di query all'URL (importati
) per memorizzare il numero di registri importati (se presenti). In questo modo possiamo visualizzare un messaggio di amministrazione appropriato.
function import ($ file) // Parse file $ logs = self :: parse ($ file); // Nessun log trovato? - poi ha abortito. se (! $ logs) restituisce 0; // Inizializza una variabile che memorizza il numero di log importati correttamente. $ importato = 0; // Esamina ogni registro foreach ($ registri come $ log_id => $ log) / * * Verifica se il registro esiste già: * Verificheremo solo la data e l'ID utente, ma potremmo controllare altri dettagli * se abbiamo esteso la nostra API wptuts_get_logs () * / $ exists = wptuts_get_logs (array ('user_id' => $ log ['user_id'], 'since' => mysql2date ('G', $ log ['activity_date'], false) , 'until' => mysql2date ('G', $ log ['activity_date'], false),)); // Se esiste, non importarlo se ($ esiste) continua; // Inserisci il log $ successful = wptuts_insert_log (array ('user_id' => $ log ['user_id'], 'date' => mysql2date ('G', $ log ['activity_date'], false), 'object_id' => $ log ['object_id'], 'object_type' => $ log ['object_type'], 'activity' => $ log ['activity'], 'activity_date' => $ log ['activity_date'],) ); se ($ riuscito) $ importato ++; return $ importato;
Dobbiamo ancora definire il parse ()
metodo che, dato il file caricato, dovrebbe estrarre i dati e restituirli come una matrice di log. Fortunatamente, con il gestore XML integrato di PHP questo è un compito abbastanza semplice.
function parse ($ file) // Carica il file xml $ xml = simplexml_load_file ($ file); // interrompi se il caricamento genera un errore se (! $ xml) restituisce false; // Iniziale registra array $ logs = array (); foreach ($ xml-> xpath ('/ logs / item') come $ log_obj) $ log = $ log_obj-> children (); $ log_id = (int) $ log-> log_id; $ logs [$ log_id] = array ('user_id' => (int) $ log-> user_id, 'object_id' => (int) $ log-> object_id, 'object_type' => (string) $ log-> object_type , 'activty' => (stringa) $ log-> attività, 'activity_date' => (stringa) $ log-> activity_date,); return $ logs;
Infine, vogliamo definire il nostro admin_notices ()
metodo per visualizzare un messaggio appropriato dopo che il file è stato caricato. Ricordiamo che una volta terminata la routine di importazione, reindirizziamo l'utente alla nostra pagina di amministrazione, con la variabile di query importati
aggiunto, memorizzando il numero di log importati. Usiamo questo per determinare se dovremmo visualizzare un messaggio di errore o di successo.
Controlliamo anche l'ID della schermata in modo da visualizzare solo la notifica sulla nostra pagina di amministrazione. Se non sei sicuro di quale sia l'ID dello schermo della tua pagina di amministrazione, consulta questo articolo.
function admin_notices () // È stata tentata un'importazione e siamo sulla pagina di amministrazione corretta? if (! isset ($ _GET ['imported']) || 'tools_page_wptuts-export'! == get_current_screen () -> id) return; $ imported = intval ($ _GET ['imported']); se (1 == $ importato) printf ('', __ (' 1 registro correttamente importato ',' wptuts-import ')); elseif (intval ($ _GET ['imported'])) printf ('%S
', sprintf (__ ('% d registra importato con successo ',' wptuts-import '), $ importato)); else printf ('%S
', __ (' Nessun log è stato importato ',' wptuts-import '));%S