Aangepaste databasetabellen gegevens importeren

In de laatste zelfstudie hebben we gekeken naar het exporteren van gegevens uit een aangepaste tabel. Natuurlijk is dit slechts de helft van het verhaal - we moeten natuurlijk een manier bieden om die gegevens te importeren. Natuurlijk, WordPress gaat hier niet mee om - dus nogmaals moeten we onze eigen rollen.

In het vorige artikel in deze serie hebben we opgemerkt dat als onze gegevens verwijzingen bevatten naar een van de native WordPress-tabellen (een post-ID bijvoorbeeld), we eerder snel moeilijkheden ondervinden. De reden is dat bij het importeren van dergelijke gegevens de post-ID waarnaar wordt verwezen mogelijk niet bestaat en als dit wel het geval is, is dit mogelijk niet de juiste ID. Dit komt omdat wanneer berichten worden geïmporteerd, hun ID kan veranderen om botsingen in de database te voorkomen (ID's moet wees uniek).

Normaal gesproken is dit in orde: gekoppelde gegevens worden samen geïmporteerd en de referenties worden tijdens de importroutine bijgewerkt om ervoor te zorgen dat alle wijzigingen zich door de gehele gegevensreeks verspreiden. Zoals besproken in het vorige artikel, is het echter erg moeilijk (behalve in specifieke gevallen) om onze aangepaste gegevens naast de oorspronkelijke gegevens te importeren. Dus de restricties die in dat artikel worden genoemd, gaan over naar deze - en zoals eerder, hoewel het onderstaande voorbeeld refereert aan WordPress-tabellen, wordt het eenvoudigweg gebruikt voor consistentie met de rest van de serie.


De mark-up

We willen onze gebruikers toestaan ​​gegevens te importeren uit het exportbestand dat is gegenereerd in het laatste artikel in deze serie. Laten we beginnen met het toevoegen van een formulier waarmee de gebruiker dat bestand kan uploaden. We doen dit door de klasse aan te passen die we in de vorige tutorial hebben gedefinieerd.

 class WPTuts_Log_Export_Admin_Page / ** * Het suffix achtervoegsel * / static $ hook_suffix = "; statische functie laad () 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-functie add_submenu () / * Gedefinieerd in vorig artikel * / statische functie maybe_download () / * Gedefinieerd in vorig artikel * / weergave statische functie () / * Gedefinieerd in vorig artikel - maar we zullen enkele wijzigingen aanbrengen * / static function maybe_upload ()  static function admin_notices ()  statische functie import ()  static function parse ()  WPTuts_Log_Export_Admin_Page :: load ();

Hierboven hebben we de volgende methoden toegevoegd

  • maybe_upload () - die als luisteraar zal dienen voor een bestand dat wordt ingediend om te importeren.
  • admin_notices () - die een melding van succes of fout zal tonen na een poging om een ​​bestand te importeren.
  • importeren() - die een geüpload bestand ontvangt en de gegevens importeert.
  • ontleden () - een helperfunctie opgeroepen door importeren() om het geüploade bestand te ontleden en de logboeken die het bevat te extraheren.

Maar eerst voegen we een formulier toe waarmee we een bestand kunnen uploaden. We voegen dit toe onder de exportknop die we in het vorige artikel hebben gemaakt. Om dit te doen, moeten we een aantal wijzigingen aanbrengen in de display () methode, verantwoordelijk voor het maken van de mark-up van onze admin-pagina. Aangezien dit tweede formulier een bestand zal indienen, moeten we het coderingstype instellen op 'multipart / form-data'.

 '; screen_icon (); echo '

'. __ ('Exporteer activiteitenlogboeken', 'wptuts-log'). '

'; ?>


Omgaan met de Formulierverzending

Vervolgens willen we luisteren wanneer het bovenstaande formulier wordt ingediend en de importroutine activeren. Voordat u dat doet, is het belangrijk om een ​​paar controles uit te voeren:

  • Heeft de gebruiker toestemming om bestanden te uploaden? Hier hebben we alleen degenen die kunnen manage_options de mogelijkheid om te uploaden.
  • Heeft de gebruiker van plan zijn om de bestanden te uploaden (we controleren dit door de nonce te verifiëren)
  • Is een bestand daadwerkelijk geüpload? En was het van het juiste type
  • Er zijn fouten opgetreden tijdens het uploaden?

Optioneel kun je een limiet op de grootte van het geüploade bestand plaatsen als een soort 'sanity check'. In dit voorbeeld heb ik een maximum van 2 MB bereikt. (Een nuttige functie voor het formatteren van bestandsgrootten op een 'leesbare manier' voor mensen is de functie size_format).

 static function maybe_upload () / * Luister naar formulierinzending * / if (empty ($ _POST ['action']) || 'import-logs'! == $ _POST ['action']) terug; / * Controleer machtigingen en nonces * / if (! Current_user_can ('manage_options')) wp_die ("); check_admin_referer ('wptuts-import-logs', '_wplnonce'); / * Voer controles uit in bestand: * / // Sanity controleer of (empty ($ _FILES ["wptuts_import"])) wp_die ('Geen bestand gevonden'); $ file = $ _FILES ["wptuts_import"]; // Is dit van het verwachte type? if ($ file ["type "]! =" text / xml ") wp_die (sprintf (__ (" Er is een fout opgetreden bij het importeren van de logbestanden. Bestandstype gedetecteerd: '% s'. 'text / xml' expected ", 'wptuts-log'), $ bestand ['type'])); // Stel een limiet in voor de grootte van het geüploade bestand Max 2097152 bytes = 2MB if ($ bestand ["size"]> 2097152) $ size = size_format ($ file ['size '], 2); wp_die (sprintf (__ (' Bestandsgrootte te groot (% s). Maximum 2MB ',' import-logs '), $ size)); if ($ file ["error"]> 0 ) wp_die (sprintf (__ ("Fout aangetroffen:% d", 'wptuts-import'), $ file ["error"])); / * Als we het zover hebben gemaakt, dan kunnen we de gegevens importeren * / $ geïmporteerd = zelf :: import ($ bestand ['tmp_name']); / * Alles is voltooid, nu opnieuw direct terug naar de pagina * / wp_redirect (add_query_arg ('geïmporteerd', $ geïmporteerd)); Uitgang(); 

Het bestand importeren

Vervolgens moeten we het bestand importeren. Eerst moeten we de logboeken uit het geüploade bestand extraheren - en we delegeren die taak naar de ontleden () methode (we komen een beetje bij die methode).

Zodra we deze logboeken hebben, controleren we eerst of ze al bestaan ​​(om onbedoelde duplicatie te voorkomen) voordat ze worden ingevoegd. Bij het controleren van de logboeken controleren we alleen de gebruikers-ID en de activiteitendatum. We zouden, als we zouden willen, strenger kunnen zijn (controle van activiteit, object-ID en type etc.) maar we zouden terug moeten gaan en onze API moeten uitbreiden (specifiek wptuts_get_logs ()).

Zodra we de logs hebben geïmporteerd, leiden we de gebruiker terug naar onze beheerderspagina. We voegen een queryvariabele toe aan de URL (geïmporteerd) om op te slaan hoeveel logboeken er zijn geïmporteerd (indien aanwezig). Op deze manier kunnen we een passend beheerdersbericht weergeven.

 functie import ($ bestand) // Parse file $ logs = self: parse ($ file); // Geen logboeken gevonden? - daarna afgebroken. als (! $ logs) 0 retourneren; // Initialiseert een variabele die het aantal succesvol geïmporteerde logs opslaat. $ geïmporteerd = 0; // Doorloop elk logboek voor elke ($ logs als $ log_id => $ log) / * * Controleer of het logboek al bestaat: * We controleren alleen de datum en het gebruikers-ID, maar we kunnen andere details controleren * als we hebben onze wptuts_get_logs () API uitgebreid * / $ exists = wptuts_get_logs (array ('user_id' => $ log ['user_id'], 'since' => mysql2date ('G', $ log ['activity_date'], false) , 'until' => mysql2date ('G', $ log ['activity_date'], false),)); // Als het bestaat, importeer het dan niet als ($ exists) doorgaan; // Insert the 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'],) ); als ($ succesvol) $ geïmporteerd ++;  return $ geïmporteerd; 

Het bestand parseren

We moeten nog steeds het ontleden () methode die, gegeven het geüploade bestand, de gegevens moet extraheren en teruggeven als een reeks logboeken. Gelukkig is dit met de ingebouwde XML-handler van PHP een vrij eenvoudige taak.

 function parse ($ file) // Laad het XML-bestand $ xml = simplexml_load_file ($ file); // stop als het laden een fout oplevert als (! $ xml) false retourneert; // Initial logs array $ logs = array (); foreach ($ xml-> xpath ('/ logs / item') als $ 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' => (tekenreeks) $ log-> object_type , 'activty' => (string) $ log-> activiteit, 'activity_date' => (string) $ log-> activity_date,);  return $ logs; 

De beheerderskennisgeving weergeven

Ten slotte willen we onze definiëren admin_notices () methode om een ​​geschikt bericht weer te geven nadat het bestand is geüpload. Bedenk dat zodra de importroutine is voltooid, we de gebruiker omleiden naar onze beheerpagina, met de queryvariabele geïmporteerd toegevoegd, het aantal geïmporteerde logboeken opslaan. We gebruiken dit om te bepalen of we een foutmelding of een succesmelding moeten weergeven.

We controleren ook de scherm-ID, zodat we alleen de melding op onze beheerderspagina weergeven. Als u niet zeker weet wat de scherm-ID van uw beheerderspagina is, raadpleegt u dit artikel.

 function admin_notices () // Is er een importpoging gedaan en staan ​​we op de juiste admin-pagina? if (! isset ($ _GET ['geïmporteerd']) || 'tools_page_wptuts-export'! == get_current_screen () -> id) retour; $ geïmporteerd = intval ($ _GET ['geïmporteerd']); if (1 == $ geïmporteerd) printf ('

% s

', __ (' 1 log succesvol geïmporteerd ',' wptuts-import ')); elseif (intval ($ _GET ['geïmporteerd'])) printf ('

% s

', sprintf (__ ('% d logs succesvol geïmporteerd ',' wptuts-import '), $ geïmporteerd)); else printf ('

% s

', __ (' Geen logboeken geïmporteerd ',' wptuts-import '));