I den siste opplæringen så vi på å eksportere data fra et tilpasset bord. Selvfølgelig er dette bare halvparten av historien - vi må åpenbart gi en måte å importere dataene på. Naturligvis håndterer WordPress ikke dette - så igjen må vi rulle våre egne.
I den forrige artikkelen i denne serien bemerket vi at hvis våre data inneholder referanser til en av de innfødte WordPress-tabellene (en post-ID for eksempel), så rammer vi ganske raskt problemer. Årsaken er at når du importerer slike data, kan post-ID som er referert, ikke eksistere, og hvis det gjør det, er det kanskje ikke riktig ID. Dette skyldes at når innlegg importeres, kan deres ID endres for å unngå kollisjoner i databasen (ID-er må vær unik).
Normalt er dette ok: Koblede data importeres sammen, og referansene oppdateres under importrutinen for å sikre at eventuelle endringer forplanter seg gjennom hele datasettet. Men som diskutert i forrige artikkel - er det faktisk veldig vanskelig (unntatt i spesielle tilfeller) å importere våre egendefinerte data ved siden av de opprinnelige dataene. Så advarslene nevnt i den artikkelen overføres til denne - og som før, selv om eksemplet nedenfor refererer til WordPress-tabeller, brukes det bare for konsistens med resten av serien.
Vi vil tillate at brukerne våre kan importere data fra eksportfilen som ble generert i den siste artikkelen i denne serien - så la oss starte med å legge til et skjema som lar brukeren laste opp den filen. Vi gjør dette ved å endre klassen vi definerte i siste opplæring.
klassen WPTuts_Log_Export_Admin_Page / ** * Sidekrok suffiks * / statisk $ hook_suffix = "; statisk funksjonslast () 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')); statisk funksjon add_submenu () / * Definert i forrige artikkel * / statisk funksjon maybe_download () / * Definert i forrige artikkel * / statisk funksjonsvisning () / * Definert i forrige artikkel - men vi vil gjøre noen endringer * / statisk funksjon maybe_upload () statisk funksjon admin_notices () statisk funksjon import () statisk funksjonsparse () WPTuts_Log_Export_Admin_Page :: load ();
Ovenfor har vi lagt til følgende metoder
maybe_upload ()
- som vil fungere som en lytter for en fil som sendes inn for import.admin_notices ()
- som vil vise en suksess eller feilmelding etter forsøk på å importere en fil.importere()
- som vil motta en opplastet fil og importere dataene.parse ()
- en hjelpefunksjon kalt av importere()
å analysere den opplastede filen, og trekk ut loggene den inneholder.Men først legger vi til et skjema hvor vi kan laste opp en fil. Vi legger til dette under eksportknappen vi opprettet i forrige artikkel. For å gjøre dette må vi gjøre noen endringer i vise()
metode, ansvarlig for å produsere oppslag på vår admin side. Siden denne andre skjemaet vil sende inn en fil, må vi sette kodingstypen til 'multipart / skjema-data
'.
'; screen_icon (); ekko ''. __ ('Eksporter aktivitetslogger', 'wptuts-log'). '
'; ?>
Deretter ønsker vi å lytte etter når skjemaet ovenfor er sendt inn og utløser importrutinen. Før du gjør det er det viktig å kjøre noen få sjekker:
manage_options
muligheten til å laste opp.Eventuelt kan du sette en grense på størrelsen på den opplastede filen som en slags "sunnhetskontroll". I dette eksemplet har jeg kuttet det på 2 MB. (En nyttig funksjon for formatering av filstørrelser på en "menneskelig lesbar måte" er funksjonen size_format
).
statisk funksjon maybe_upload () / * Lytt til skjema innsending * / hvis (tom ($ _POST ['action']) || 'import-logs'! == $ _POST ['action']) returnere; / * Kontroller tillatelser og nonces * / if (! Current_user_can ('manage_options')) wp_die ("); check_admin_referer ('wptuts-import-logs', '_wplnonce'); / * Utfør kontroller på filen: * / // Sanity sjekk om (tom ($ _FILES ["wptuts_import"])) wp_die ('Ingen fil funnet'); $ file = $ _FILES ["wptuts_import"]; // Er det av den forventede typen? "]! =" text / xml ") wp_die (sprintf (__ (" Det oppstod en feil ved å importere loggene. Filtype oppdaget: '% s'. 'text / xml' forventet ',' wptuts-log ') fil ['type']); // Angi en grense for størrelsen på den opplastede filen. Maks 2097152 bytes = 2MB hvis ($ file ["size"]> 2097152) $ size = size_format ', 2); wp_die (sprintf (__ (' Filstørrelse for stor (% s). Maksimum 2MB ',' importlogger '), $ size)); Hvis ($ file ["error"]> 0 ) wp_die (sprintf (__ ("Feil oppstått:% d", "wptuts-import"), $ fil ["feil"]); / * Hvis vi har gjort det så langt, kan vi importere dataene * / $ imported = self :: import ($ file ['tmp_name']); / * Alt er ferdig, nå re Direkte tilbake til siden * / wp_redirect (add_query_arg ('imported', $ imported)); exit();
Neste må vi importere filen. Først må vi trekke ut loggene fra den opplastede filen - og vi vil delegere den jobben til parse ()
metode (vi kommer til den metoden litt).
Når vi har disse loggene, vil vi først sjekke om de allerede eksisterer (for å unngå utilsiktet duplisering), før du setter dem inn. Når du sjekker loggene, kontrollerer vi bare bruker-IDen og aktivitetsdatoen. Vi kunne, hvis vi ønsket, være strengere (sjekke aktivitet, objekt ID og type etc.), men vi måtte gå tilbake og utvide vår API (spesifikt wptuts_get_logs ()
).
Når vi har importert loggene, omdirigerer vi brukeren tilbake til vår admin side. Vi legger til en spørringsvariabel i nettadressen (importert
) for å lagre hvor mange logger ble importert (hvis noen). På denne måten kan vi vise en passende adminmelding.
funksjon import ($ file) // Parse file $ logs = self :: parse ($ file); // Ingen logger funnet? - deretter avbrutt. hvis (! $ logger) returnerer 0; // Initialiserer en variabel som lagrer antall logger som er importert. $ importert = 0; // Gå gjennom hver logg foreach ($ logger som $ log_id => $ logg) / * * Sjekk om loggen allerede eksisterer: * Vi sjekker bare datoen og bruker-IDen, men vi kan sjekke andre detaljer * hvis Vi utvidet vår wptuts_get_logs () API * / $ exist = wptuts_get_logs (array ('user_id' => $ log ['user_id'], 'siden' => mysql2date ('G', $ log ['activity_date'], , 'til' => mysql2date ('G', $ log ['activity_date'], false),)); // Hvis det eksisterer, ikke importer det hvis ($ eksisterer) fortsett; // Sett inn loggen $ 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'], 'aktivitet' => $ log ['aktivitet'], 'activity_date' => $ log ['activity_date'] ); hvis ($ vellykket) $ importert ++; returnere $ importert;
Vi må fortsatt definere parse ()
metode som, gitt den opplastede filen, skal trekke ut dataene og returnere den som en rekke logger. Heldigvis, med PHPs innebygde XML-handler er dette en ganske enkel oppgave.
funksjonsparse ($ file) // Last xml filen $ xml = simplexml_load_file ($ file); // stopp hvis lasting gir en feil hvis (! $ xml) returnerer false; // Initial logger array $ logs = array (); foreach ($ xml-> xpath ('/ logs / item') som $ log_obj) $ log = $ log_obj-> barn (); $ log_id = (int) $ log-> log_id; $ logs [$ log_id] = array ('user_id' => (int) $ log-> user_id, 'object_id' => (int) $ log-> object_id, 'object_type' => (streng) $ log-> object_type , 'activty' => (streng) $ log-> aktivitet, 'activity_date' => (streng) $ log-> activity_date,); returner $ logger;
Til slutt vil vi definere vår admin_notices ()
Metode for å vise en passende melding etter at filen har blitt lastet opp. Husk at når importrutinen er ferdig, omdirigerer vi brukeren tilbake til vår admin side, med spørringsvariabelen importert
lagt til, lagrer antall importerte logger. Vi bruker dette til å avgjøre om vi skal vise en feilmelding eller suksessmelding.
Vi sjekker også skjerm-IDen slik at vi kun viser varselet på vår admin side. Hvis du ikke er sikker på hva skjerm-IDen til administrasjonssiden din er, kan du se denne artikkelen.
funksjon admin_notices () // Ble det importert forsøk, og er vi på riktig admin side? hvis (! isset ($ _GET ['imported']) || 'tools_page_wptuts-export'! == get_current_screen () -> id) returnere; $ imported = intval ($ _GET ['imported']); hvis (1 == $ importert) printf ('', __ (' 1 logg med suksess importert ',' wptuts-import ')); elseif (intval ($ _GET ['imported'])) printf ('% s
', sprintf (__ ('% d logger vellykket importert ',' wptuts-import '), $ importert)); else printf ('% s
', __ (' Ingen logger ble importert ',' wptuts-import '));% s