I 2013 kopierte du tabeller fra WordPress og limte dem inn i Excel. I dag er dataportabilitet et lovkrav (GDPR) og en forretningsnødvendighet.
Enten du migrerer WooCommerce-ordrer eller tar backup av brukerdata, trenger du ikke nødvendigvis en plugin for eksporten. Du må forstå PHP-strømmer og WP-CLI.
Bruk ren CSV til de fleste eksporter, strøm rader med fputcsv() for nedlasting i nettleseren, hent data i puljer med WP_Query og bytt til WP-CLI når en admin-forespørsel ville truffet grensene for minne eller tidsavbrudd. Velg REST API når et annet system trenger strukturerte data i stedet for en fil.
Hvordan eksportere WordPress-data til Excel
Tre tilnærminger dekker nesten alle eksportjobber i WordPress:
- PHP inne i WordPress for nedlastinger i admin med tilgangskontroll
- WP-CLI for store datasett og planlagte jobber på serveren
- REST API for dashbord, datavarehus, CRM-systemer og hodeløse klienter
Sjeldne, små eksporter passer godt som en PHP-nedlasting. Gjentakende eller svært store tabeller hører hjemme på kommandolinjen. Eksterne systemer bør hente JSON over REST og lage CSV-en utenfor WordPress hvis de fortsatt trenger et regneark.
Velg metode etter hvordan den feiler. Nedlastinger i nettleseren feiler på tidsavbrudd. Plugins feiler når de prøver å bygge et helt regnearkobjekt i én forespørsel. Ad hoc SQL-dumper feiler når kolonnenavn endres etter en plugin-oppdatering. Velg veien som holder eksporten reproduserbar neste måned også, ikke bare i dag.
Hva Verktøy > Eksporter i WordPress faktisk eksporterer
WordPress har en innebygd eksportør i kjernen, men den lager ikke et regneark. Ifølge dokumentasjonen for skjermen Verktøy > Eksporter er filen du laster ned en XML-fil i formatet WordPress eXtended RSS (WXR), med innlegg, sider, egendefinerte innholdstyper, kommentarer, egendefinerte felt, kategorier, stikkord, egne taksonomier og brukere. Når du velger innlegg eller sider, kan du filtrere på kategori, forfatter, datoperiode og status.
Filen er laget for Verktøy > Importer > WordPress på en annen installasjon. Excel kan åpne XML-en, men hver oppføring drar med seg hele HTML-innholdet, metadataene og kommentarene, så som regneark er den til liten hjelp. Bruk WXR til migrering og kopier av innhold. Bruk CSV når en person skal filtrere, summere eller sammenligne kolonner.
Den samme WXR-filen kommer ut på serveren med wp export. Kommandoen tar filtre som --post_type, --start_date og --end_date (format ÅÅÅÅ-MM-DD), --post_status og --author, deler filer ved 15 MB som standard (--max_file_size, -1 for ubegrenset) og skriver XML-en til standard utdata med --stdout:
wp export --dir=/tmp/exports/ --post_type=post --start_date=2026-01-01 --end_date=2026-06-30CSV eller XLSX for eksport av WordPress-data
Start med CSV, med mindre en interessent har et absolutt krav om .xlsx.
Styrker ved CSV
- Enkelt å generere med PHP eller WP-CLI
- Enkelt å inspisere og feilsøke i en teksteditor
- Åpnes i Excel, Numbers og Google Sheets
- Slipper XLSX-biblioteker og minnekostnaden deres
Ulemper ved XLSX
- Binært format med regneark, stiler og delte strenger
- Krever et bibliotek som
PhpSpreadsheeteller et konverteringssteg etter eksporten - Bygger opp mer tilstand i minnet før filen er ferdig
- Vanskeligere å strømme trygt under en lang HTTP-forespørsel
Du kan bli fristet til å bruke PhpSpreadsheet for å lage ekte .xlsx-filer. For store datasett er det feil sted: filen bygges i RAM før første byte sendes. Excel åpner CSV-filer direkte, og det er sjelden behov for en binær .xlsx-fil med mindre du trenger formler eller formatering. Praktisk mønster: eksporter CSV fra WordPress og konverter etterpå med Excel, LibreOffice eller et lite frakoblet skript hvis noen insisterer på XLSX. Da holder WordPress-forespørselen seg lett.
Excel-tips: CSV-filer i UTF-8 trenger noen ganger en BOM (\xEF\xBB\xBF) for at Excel på Windows skal vise æ, ø og å riktig. Microsoft-støtte bekrefter dette: en UTF-8-CSV lagret med BOM åpnes normalt med dobbeltklikk. Uten BOM er den dokumenterte veien Data > Hent data > Fra fil > Fra tekst/CSV, der du velger tegnkoding før innlasting. Skriv BOM-en før overskriftsraden når mottakerne jobber i Excel, og la den være når filen skal mates inn i et annet skript, fordi mange parsere leser de tre bytene som en del av det første kolonnenavnet.
Hvordan eksportere WordPress-brukere til CSV med PHP
Hvis du vil bygge en “Last ned rapport”-knapp for kundens dashbord, bruk PHPs innebygde fputcsv. Last aldri alle data inn i en array ($data[] = ...), da tømmer du minnegrensen. Strøm dataene direkte til nettleseren i stedet. Først kommer tilgangskontroll og nonce, deretter headere, php://output, overskriftsrad og datarader i puljer.
add_action( 'admin_post_wppoland_export_users', 'wppoland_export_users_csv' );
function wppoland_export_users_csv() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Ingen tilgang.' );
}
check_admin_referer( 'wppoland_export_users' );
header( 'Content-Type: text/csv; charset=utf-8' );
header( 'Content-Disposition: attachment; filename="brukereksport-' . gmdate( 'Y-m-d' ) . '.csv"' );
$fp = fopen( 'php://output', 'w' );
// Valgfri BOM for Excel på Windows:
// fwrite( $fp, "\xEF\xBB\xBF" );
fputcsv( $fp, array( 'ID', 'Brukernavn', 'E-post', 'Registrert' ), ',', '"', '' );
$args = array(
'number' => 100,
'offset' => 0,
'orderby' => 'ID',
'order' => 'ASC',
);
while ( $users = get_users( $args ) ) {
foreach ( $users as $user ) {
fputcsv(
$fp,
array( $user->ID, $user->user_login, $user->user_email, $user->user_registered ),
',',
'"',
''
);
}
$args['offset'] += 100;
if ( count( $users ) < 100 ) {
break;
}
}
fclose( $fp );
exit;
}Mønsteret passer for mindre eksporter og interne adminverktøy. Hver rad går til strømmen så snart den er hentet, og minnet holder seg på én pulje med 100 brukere.
Beskytt endepunktet med nonce og tilgangskontroll. Skjemaet som starter nedlastingen må inneholde wp_nonce_field( 'wppoland_export_users' ) slik at check_admin_referer() kan validere det. Eksport av brukere og ordrer inneholder ofte personopplysninger. Behandle dem som enhver annen privilegert admin-handling etter GDPR-prinsipper: logg hvem som kjørte eksporten, og hold filen borte fra offentlige URL-er.
fputcsv i PHP 8.4 og parameteren escape
Eksemplene i denne guiden sender fem argumenter til fputcsv(), og det er med vilje. PHP-manualen slår fast at fra og med PHP 8.4.0 er det foreldet å stole på standardverdien til escape: den må oppgis eksplisitt, enten etter posisjon eller som navngitt argument. En eksport som kjører på hver cron-runde, ville ellers fylt loggen med varsler om foreldet bruk.
Den samme manualen forklarer at enhver escape-verdi bortsett fra tom streng kan gi CSV som ikke følger RFC 4180, eller som ikke overlever en tur frem og tilbake gjennom PHPs CSV-funksjoner. Standardverdien er omvendt skråstrek, og anbefalingen er å sette den til "". Derfor bruker alle kallene her ',', '"', ''. Manualen varsler også at standardverdien vil endres i en fremtidig versjon, tidligst PHP 9.0. Setter du den i dag, endrer ikke utdataene seg av seg selv etter en serveroppdatering.
Eksportere store WordPress-datasett uten minnefeil
Den vanlige feilen er å laste for mye på én gang. PHPs minnegrense, max_execution_time og tidsavbrudd i reverse proxy dreper lange eksporter i admin. Hent data i puljer med WP_Query via posts_per_page og offset, eller enda bedre med en stabil markør når offset blir dyrt på store tabeller.
// $fp er strømmen, åpnet som i brukereksemplet.
$offset = 0;
$limit = 500;
do {
$query = new WP_Query(
array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => $limit,
'offset' => $offset,
'orderby' => 'ID',
'order' => 'ASC',
'fields' => 'ids',
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
)
);
foreach ( $query->posts as $post_id ) {
fputcsv( $fp, array( $post_id, get_the_title( $post_id ) ), ',', '"', '' );
}
$offset += $limit;
wp_cache_flush_runtime(); // WP 6.0+: tømmer bare minnecachen for denne forespørselen
} while ( count( $query->posts ) === $limit );Hvorfor dette hjelper:
fields => 'ids'holder objekthydreringen lett- Avslåtte meta- og term-cacher hindrer at objektcachen vokser uten grense
- Faste puljestørrelser holder toppforbruket nær én side med rader
- Strømming med
fputcsv()unngår å holde hele CSV-strengen i RAM - Sortering på stigende
IDhindrer at et innlegg publisert midt i eksporten forskyver sidene og gir doble eller manglende rader
Bruk wp_cache_flush_runtime(), ikke wp_cache_flush(), inne i løkken. Med en persistent objektcache (Redis eller Memcached) tømmer wp_cache_flush() cachen for hele nettstedet midt i eksporten. Runtime-funksjonen, tilgjengelig siden WordPress 6.0, tømmer bare minnet for gjeldende forespørsel, og hvis drop-in-en ikke støtter den, returnerer den false uten å røre den delte cachen.
På svært store tabeller blir offset i seg selv tregt, fordi MySQL fortsatt går gjennom radene som hoppes over. Velg keyset-paginering: WHERE ID > last_id ORDER BY ID ASC LIMIT N. For CLI-jobber er mønsteret verdt den ekstra koden.
Offisiell referanse for spørringsargumentene: klassen WP_Query på developer.wordpress.org.
Hvordan eksportere WordPress-innlegg til CSV med WP-CLI
Med hundretusenvis av innlegg får nettleseren tidsavbrudd. Bruk WP-CLI direkte på serveren. Da slipper du nettleseren og webserverens kjede av tidsavbrudd, og jobben kan automatiseres via cron.
wp post list --post_type=product --fields=ID,post_title,post_status --format=csv > produkter.csvNyttig for:
- store innleggs- eller produktkataloger
- WooCommerce-ordredumper som ville fått tidsavbrudd i wp-admin
- nattlige cron-eksporter til objektlagring eller en delt mappe
- overleveringer ved migrering og rapportering
Kommandodokumentasjon: wp post list. Kommandoen tar --format=csv, json, yaml, ids, count eller table, og ethvert WP_Query-argument som --<felt>=<verdi>. En detalj teller på store nettsteder: --posts_per_page er -1 som standard, altså alle innlegg i én spørring. Er tabellen enorm, paginerer du med --posts_per_page=1000 --paged=N i en shell-løkke.
For brukere finnes motstykket wp user list, med standardfeltene ID, user_login, display_name, user_email, user_registered og roles:
wp user list --role=customer --fields=ID,user_email,user_registered --format=csv > kunder.csvAlle kommandoer tar den globale parameteren --ssh=bruker@vert/sti, som kjører eksporten mot en ekstern server fra din egen maskin uten en egen økt.
Holder ikke standardflaggene, skriver du en egen WP-CLI-kommando som åpner en fil, paginerer med WC_Order_Query eller WP_Query og skriver CSV til disk. Det holder minnet forutsigbart og lar deg fortsette fra et sjekkpunkt hvis jobben blir avbrutt:
// Kommando: wp wppoland export-orders
WP_CLI::add_command( 'wppoland export-orders', function ( $args, $assoc_args ) {
$file = fopen( 'ordrer.csv', 'w' );
fputcsv( $file, array( 'Ordre-ID', 'Opprettet', 'Status', 'Sum', 'Kunde' ), ',', '"', '' );
$page = 1;
do {
$orders = wc_get_orders(
array(
'type' => 'shop_order',
'limit' => 200,
'paged' => $page,
'orderby' => 'ID',
'order' => 'ASC',
)
);
foreach ( $orders as $order ) {
$created = $order->get_date_created();
fputcsv(
$file,
array(
$order->get_id(),
$created ? $created->date( 'c' ) : '',
$order->get_status(),
$order->get_total(),
$order->get_billing_email(),
),
',',
'"',
''
);
}
$page++;
} while ( count( $orders ) === 200 );
fclose( $file );
WP_CLI::success( 'Eksport fullført til ordrer.csv' );
} );limit og paged er dokumenterte parametere i wc_get_orders(). Med limit => -1 ville kommandoen lastet alle ordrer inn i minnet før første rad ble skrevet, nøyaktig det puljene skal unngå.
Ta ut hele databasen med wp db export
Noen ganger er det ikke et regneark som etterspørres, men en kopi av alt. wp db export kjører mysqldump med tilgangsdataene fra wp-config.php og skriver en SQL-fil. Med --tables velger du bestemte tabeller, med --exclude_tables utelater du dem, og med - som filnavn går dumpen til standard utdata:
wp db export - --tables=wp_posts,wp_postmeta | gzip > innhold.sql.gzTilpass tabellprefikset til din installasjon. En SQL-dump er til gjenoppretting eller innlasting i en annen database, ikke til å åpne i Excel. Den inneholder også brukertabellen med passord-hasher og ofte API-nøkler som plugins lagrer i wp_options. Behandle den som en hemmelighet: aldri i en offentlig mappe, aldri som e-postvedlegg.
Hvordan eksportere WordPress-data via REST API
Bygger du et React-dashbord eller en hodeløs app, bruker du JSON, ikke CSV. Er mottakeren programvare og ikke en person med Excel, er REST API ofte ryddigere enn å generere CSV inne i WordPress.
Typiske tilfeller:
- synkronisere innhold til et datavarehus eller BI-verktøy
- mate et CRM med brukere eller leads
- hodeløse frontender som trenger strukturerte innleggsdata
Referanse for innleggssamlingen: Posts-endepunktet.
WordPress REST API (/wp-json/wp/v2/posts) paginerer data som standard. Ifølge pagineringsguiden har per_page et tak på 100 poster, og hvert svar har headerne X-WP-Total (antall poster totalt) og X-WP-TotalPages (antall sider totalt). For å hente alle data skriver du en løkke eller en rekursiv JS-funksjon som følger X-WP-TotalPages-headeren, i stedet for å gjette når den skal stoppe. Autentiser med Application Passwords eller OAuth-flytene verten din støtter, og respekter rate limits. Lag CSV-en hos mottakeren hvis det fortsatt trengs et regneark. Slik har WordPress ansvaret for autorisert tilgang, mens filformatet ligger hos mottakeren.
Ikke eksponer privilegerte eksportruter uten autentisering. Behandle eksportendepunkter som enhver annen skrivenær adminflate, også når de bare leser.
Eksportere WooCommerce-produkter til CSV uten plugin
Katalogen krever ingen kode. Ifølge dokumentasjonen for produktimport og -eksport med CSV har WooCommerce et eget verktøy for å importere, eksportere og masseoppdatere produkter:
- Gå til Produkter > Alle produkter og velg Eksporter øverst på siden.
- Velg kolonnene, eller behold valget om å eksportere alle.
- Filtrer på produkttyper og kategorier, eller la begge stå på alle.
- Kryss av for å eksportere alle egendefinerte metadata hvis du trenger data fra WooCommerce eller andre plugins. Disse kolonnene får prefikset
meta:. - Velg Generer CSV og vent til nettleseren laster ned filen.
Filen har samme format som importverktøyet leser, så den egner seg som grunnlag for masseendringer av priser eller lager: eksporter, rediger i regnearket, importer igjen. Verktøyet dekker produktkatalogen. Ordrer er ikke med, og dem tar neste avsnitt for seg.
Hvordan eksportere WooCommerce-ordrer til CSV
Ordreeksporter ser enkle ut helt til ordrelinjer, refusjoner og HPOS endrer bildet.
Ordrelinjer er ikke én rad. En ordre kan ha flere produkter, gebyrer, fraktlinjer og avgifter. Bestem på forhånd om én CSV-rad betyr én ordre eller én ordrelinje. Blander du begge uten et tydelig skjema, blir regnearket ubrukelig.
Meta og egendefinerte felt sprenger bredden. ID-er fra betalingsløsninger, sporingsnumre og plugin-meta gir brede, glisne kolonner. Eksporter bare feltene rapporten trenger. Lag en egen fil for ordrelinjer hvis du må beholde begge formene.
Lagringsløsningene er ulike. Klassiske shop_order-innlegg og tabellene i High-Performance Order Storage (HPOS) spørres ikke på samme måte. HPOS har vært standard lagring siden WooCommerce 8.2, ifølge dokumentasjonen for wc_get_orders(). Bruk WooCommerce sitt CRUD (wc_get_orders() / WC_Order_Query) i stedet for rå WP_Query mot shop_order, så overlever eksportøren et bytte av lagring. For datofiltre godtar date_created et intervall på formen 2026-01-01...2026-03-31, tolket i nettstedets tidssone.
Statusfiltre betyr noe. Utkast, mislykkede betalinger, refunderte ordrer og papirkurv blåser opp eller forskyver omsetningsrapporter. Dokumenter hvilke statuser du tar med.
Personopplysninger og tilgang. Ordrer inneholder navn, e-post og adresser. Tilgangskontroll (manage_woocommerce eller en egen capability), nonces og revisjonslogger hører hjemme i enhver admin-eksportør. Bruk WP-CLI for masseuttrekk, slik at filen aldri ligger i en offentlig tilgjengelig uploads-sti.
Ytelse. Å joine alle metanøkler for en ordre i én SQL-setning virker raskt helt til tabellen vokser. Paginer ordrene, hent hver med wc_get_order(), skriv raden og kast objektet. Det er tregere per ordre enn en gigantisk JOIN og langt mer stabilt under minnegrenser.
Valuta og formatering. Lagre summer som rene tall. La Excel formatere valutaen. Lokale tusenskilletegn inne i CSV-felt ødelegger import i andre verktøy.
Datofelt. Lagre ISO-8601 eller Unix-tidsstempler i CSV-en og formater i regnearket. Blandede lokale datoformater (03.04.2026 mot 04/03/2026) gir stille sorteringsfeil når filen krysser landegrenser.
Refusjoner og delrefusjoner. Bestem om refunderte beløp vises som negative rader, egne refusjons-ID-er eller nettosummer per ordre. Dokumenter valget i en README ved siden av eksport-cronen, slik at økonomi og utvikling jobber i samme regneark.
Hvordan hindre formelinjeksjon i en eksportert CSV
En CSV fra WordPress inneholder data brukerne dine har skrevet inn: visningsnavn, kommentarer, skjemafelt, fakturaadresser. OWASP beskriver risikoen som CSV injection eller formula injection: den oppstår når et nettsted legger upålitelig input inn i en CSV-fil. Starter en celle med =, +, - eller @, eller med tabulator, vognretur eller linjeskift, kan regnearket tolke den som en formel når filen åpnes.
Tiltaket fra OWASP er å sørge for at ingen celle starter med disse tegnene, for eksempel ved å sette en enkel apostrof foran slik at programmet leser cellen som tekst:
function wppoland_csv_safe( $value ) {
$value = (string) $value;
if ( '' !== $value && in_array( $value[0], array( '=', '+', '-', '@', "\t", "\r", "\n" ), true ) ) {
return "'" . $value;
}
return $value;
}Bruk funksjonen på fritekstkolonner, ikke på beløp WooCommerce regner ut: en negativ refusjonssum starter med - og ville blitt gjort om til tekst, noe som ødelegger summeringer i regnearket.
Eksportere en brukers personopplysninger med GDPR-verktøyet
Kommer forespørselen fra en person som bruker rettighetene sine, trenger du ingen egen eksportør. Dokumentasjonen for plugin-utviklere forklarer at WordPress 4.9.6 la til et verktøy for eksport av personopplysninger (Verktøy > Eksporter personopplysninger), laget for lover som GDPR.
Nøkkelen for hver eksport er e-postadressen, som dekker både registrerte brukere og personer som bare har lagt igjen en kommentar. Administratoren skriver inn brukernavn eller e-post, WordPress sender en bekreftelseslenke, og etter bekreftelse laster administratoren ned ZIP-filen eller sender den direkte til personen. Inne i filen ligger en HTML-indeksside med dataene gruppert, for eksempel kommentarene. Plugins som lagrer egne personopplysninger, kobler seg på via filteret wp_privacy_personal_data_exporters, slik at dataene havner i samme fil.
Hvilken eksportmetode passer til hvilken datamengde
- Små data (< 1 000 rader): PHP-strømming til nettleseren.
- Store data (> 10 000 rader): WP-CLI via
ssh. - App-data: JSON fra REST API.
- Flytte hele nettstedet: WXR via Verktøy > Eksporter eller
wp export. - Full sikkerhetskopi:
wp db export.
Sjekkliste for eksport av WordPress-data
- Velg CSV fremfor XLSX inne i WordPress, og WXR bare for å flytte innhold.
- Strøm med
fputcsv(), eksplisittescapeog tilgangskontroll for små nedlastinger i admin. - Hent i puljer med
WP_Queryeller WooCommerce-spørringer; slå av unødvendige cacher. - Flytt store eller planlagte jobber til WP-CLI.
- Bruk REST API når et annet system henter strukturerte data.
- I WooCommerce: bestem hva en rad betyr (ordre eller ordrelinje) og bruk CRUD-API-ene, så HPOS ikke knekker eksportøren.
- Nøytraliser celler i fritekstkolonner som starter med
=,+,-eller@.
Dine data tilhører deg. Sørg for at du alltid kan få dem ut.
Enten det blir WP-CLI, REST API eller en enkel CSV, er poenget at dataene dine skal kunne forlate installasjonen den dagen du vil. Trenger du eksporten automatisert i stedet for manuell, setter vi den opp gjennom WordPress-utvikling og automatisering.







