WordPressin import/export-toiminnallisuus on usein riittävä kevyisiin käyttötapauksiin, mutta heti kun data on rakenteista, suurta tai liiketoimintakriittistä, sisäänrakennetut työkalut alkavat rajoittaa. Silloin kannattaa rakentaa oma järjestelmä, joka on hallittava, skaalautuva ja palautettava (resumable).
Kunnollinen toteutus sisältää yleensä:...
Hyvä malli:...
Älä yritä exportata kaikkea kerralla....
Huono:...
Tärkeä ominaisuus tuotantokäytössä....
Data ei koskaan ole 1:1....
Älä luota ulkoiseen dataan:...
if ($failed) { $retry_count++; } Lisää:...
Pakollinen isoille export/import-prosesseille:...
Älä tallenna exportteja WP-kansioon ilman hallintaa....
Tärkeää import/export-järjestelmissä:...
Paras malli:...
Frontendissä:...
Tärkeä enterprise-käytössä:...
Skaalautuva import/export-järjestelmä:...
Skaalautuva import/export-järjestelmä:...
Skaalautuva import/export-järjestelmä:...
Oma import/export-järjestelmä WordPressissä kannattaa rakentaa aina batch- ja queue-pohjaisesti, ei koskaan yksittäisen requestin varaan. Kun järjestelmä suunnitellaan streamattavaksi, resumableksi ja validoivaksi, siitä tulee luotettava osa...
Tavoitteena ei ole vain “viedä ja tuoda dataa”, vaan tehdä siitä luotettava osa sovelluksen arkkitehtuuria.
Mitä hyvä import/export-järjestelmä vaatii
Kunnollinen toteutus sisältää yleensä:
- batch-pohjaisen käsittelyn
- memory-safe execution
- resumable import/export
- validointi ja mapping layer
- error handling ja retry-logiikka
- versioitu formaatti
- progress tracking
- logging
1. Perusarkkitehtuuri
Hyvä malli:
Export Job → Queue → File Writer → Storage
Import File → Parser → Validator → Queue → Processor
Eli ei koskaan kaikkea kerralla.
2. Export-järjestelmän toteutus
2.1 Batch-pohjainen export
Älä yritä exportata kaikkea kerralla.
$posts = get_posts([
'numberposts' => 100,
'offset' => $offset
]);
Parempi vielä:
'posts_per_page' => 100,
'paged' => $page
2.2 Stream-based writing (suositeltu isoille datamäärille)
$handle = fopen('export.json', 'w');
foreach ($batch as $row) {
fwrite($handle, json_encode($row) . "\n");
}
fclose($handle);
👉 ei memory overflowia
2.3 Data normalization
Älä exporttaa suoraan WordPress-objekteja:
Huono:
get_post();
Parempi:
[
'id' => $post->ID,
'title' => $post->post_title,
'meta' => get_post_meta($post->ID)
]
2.4 Export formatit
Yleisimmät:
- JSONL (suositeltu suurille datamassoille)
- JSON (pienet datasetit)
- CSV (taulukkomuotoinen data)
- XML (legacy integraatiot)
3. Import-järjestelmän toteutus
3.1 Älä importoi yhdellä requestilla
Huono:
foreach ($file as $row) {
insert_post($row);
}
Parempi:
- queue + batch processing
3.2 Chunk processing
$chunk = array_slice($data, $offset, 100);
Tai file-based:
while (($line = fgets($handle)) !== false) {
process($line);
}
3.3 WP-Cron tai queue worker
add_action('myplugin_import_batch', function($batch_id) {
process_batch($batch_id);
});
Parempi vielä:
- custom queue table
- worker CLI (WP-CLI)
4. Resumable import/export
Tärkeä ominaisuus tuotantokäytössä.
Tallenna progress:
update_option('import_offset', $offset);
Tai parempi:
wp_myplugin_import_jobs
Kentät:
- job_id
- status
- offset
- error_count
5. Mapping layer (tärkeä integraatioissa)
Data ei koskaan ole 1:1.
Esimerkki:
$map = [
'name' => 'post_title',
'body' => 'post_content'
];
6. Validointi ennen importtia
Älä luota ulkoiseen dataan:
if (empty($row['email']) || !is_email($row['email'])) {
continue;
}
7. Error handling ja retry
if ($failed) {
$retry_count++;
}
Lisää:
- failed status
- retry queue
- dead-letter queue (isoissa järjestelmissä)
8. Memory-safe processing
Pakollinen isoille export/import-prosesseille:
wp_cache_flush();
gc_collect_cycles();
Ja:
- älä lataa koko tiedostoa muistiin
- käytä streamausta
9. File storage
Älä tallenna exportteja WP-kansioon ilman hallintaa.
Parempi:
/uploads/exports/- S3 / object storage
- signed URLs
10. Security
Tärkeää import/export-järjestelmissä:
- capability check
- nonce validation
- file type validation
- size limits
- virus scanning (tarvittaessa)
current_user_can('manage_options');
11. Background processing
Paras malli:
Upload → Queue → Worker → Process → Store result
Ei koskaan:
single request → full import
12. Progress tracking UI
Frontendissä:
- percentage
- batch status
- ETA
- error count
Data:
[
'processed' => 500,
'total' => 2000
]
13. Logging ja audit trail
Tärkeä enterprise-käytössä:
log('Import failed row 123');
Tai custom table:
wp_myplugin_import_logs
14. Performance optimointi
Käytä:
- batch inserts (
$wpdb->insert) wp_suspend_cache_invalidation(true)wp_defer_term_counting(true)- disable hooks tarvittaessa
15. Yleisimmät virheet
- koko datasetti muistiin
- ei batch processingia
- ei retry-logiikkaa
- ei progress trackingia
- suorat WP_Query loopit importissa
- ei validointia
- ei mapping layeria
16. Paras arkkitehtuuri
Skaalautuva import/export-järjestelmä:
- stream-based file handling
- queue + worker architecture
- batch processing
- mapping + validation layer
- resumable jobs
- logging + audit trail
- external storage (S3 tms.)
- UI progress tracking
- security layer
Yhteenveto
Oma import/export-järjestelmä WordPressissä kannattaa rakentaa aina batch- ja queue-pohjaisesti, ei koskaan yksittäisen requestin varaan. Kun järjestelmä suunnitellaan streamattavaksi, resumableksi ja validoivaksi, siitä tulee luotettava osa koko sovelluksen arkkitehtuuria eikä vain “admin-työkalu”.
Hyvin toteutettu import/export voi käsitellä miljoonia rivejä ilman muistiongelmia ja toimii vakaasti myös kuormitetuissa ympäristöissä.