A few months ago I had a problem I didn’t know I had. A client wanted to push their WooCommerce inventory to Google Merchant Center, refresh nightly, and have the price column reflect a complex rule (display price = base price + tax + shipping zone surcharge, depending on the product’s country tag). They asked for a quote. I built a custom plugin. It took me two days, plus another day of testing edge cases, plus a half-day fixing a bug where the cron didn’t fire on the staging host.
A week later, a different client wanted to export 8,000 product descriptions, run them through ChatGPT for tone consistency, and import the rewrites back. I started writing a WP_Query + fputcsv script, then stopped. There had to be a plugin for this.
There is. It’s called WP All Export Pro and it does both of those jobs out of the box, in about ten minutes of clicking. If I’d known earlier I would have saved myself a week of billable hours that the client probably didn’t realize I was burning. This review is partly a confession and partly a serious recommendation.
Together they form the "structured data layer" of a WordPress site, the thing every shop needs and almost no shop installs until they hit a wall.
Table of Contents
- What WP All Export Pro is actually for
- The field builder is the whole product
- Scheduled exports and the Google Merchant use case
- The roundtrip with WP All Import
- Function editor: when the UI runs out
- Installation and what to set up day one
- Five jobs it solves that you probably have
- Developer reference
- Performance, file handling, and gotchas
- Pricing and licensing
- FAQ
- Should you install it?
What WP All Export Pro is actually for
The plugin is sold as "export any post type to CSV or XML". That description is technically true and completely undersells it. What WP All Export Pro actually does is turn an arbitrary WordPress site into a structured data source you can read from, filter, transform, and ship anywhere you can put a CSV.
Concretely, you get:
- Any data type as a source: standard posts, custom post types, users, comments, taxonomy terms, WooCommerce orders, WooCommerce products, WooCommerce customers, raw
WP_Queryresults. - Any field as a column: built-in fields (title, content, dates, status), custom fields (post meta), taxonomies, ACF / Meta Box / JetEngine / Toolset / Pods / CMB2 fields, WooCommerce variations and stock data, computed PHP expressions, nested XML structures.
- Four output formats: CSV (with delimiter / enclosure / BOM control), XML (custom root and record tags), Excel (.xlsx), Google Merchant Feed (preset XML schema).
- Filtering by anything: post status, date range, taxonomy, meta key/value, custom SQL fragment.
- Scheduling: WP-Cron, an external cron hook URL Soflyy provides, or trigger on a WordPress action (e.g. when an order completes).
- A re-import path: export bundle includes a JSON template so WP All Import knows exactly how to read the file back, with field mappings preserved.
If you’re a developer, the first time you go through that list mentally you’ll think "I could write that in a weekend". You could. The catch is what you’re really paying for is the field mapping UI, the scheduling, the rebuilt-every-couple-years compatibility with ACF / WC variations / Meta Box, the streaming XML writer for large datasets, and the hundreds of edge cases (UTF-8 BOM in CSV, comma-in-cell escaping, CDATA wrapping in XML, taxonomy hierarchy serialization) that you didn’t think about when you said "I could write that in a weekend".
The field builder is the whole product
The drag-and-drop field builder is what makes this plugin worth the install. Once you pick a data source (let’s say "Posts") and click Customize Export File, you land on a screen with two panels: a list of available data on the right and an empty column list on the left. You drag fields from the right into the left, and that’s the export.
What’s in the available-data panel for a Post:
- Standard WordPress fields: ID, title, content, excerpt, slug, date, modified date, status, author, post type, parent ID, menu order, comment status, ping status, password, GUID
- Taxonomies: each registered taxonomy as its own column, with options for slug / name / hierarchy / comma-joined / single-row-per-term
- Custom fields: every post meta key as its own column, with serialize / unserialize / first-value / join options
- Featured image: URL, ID, path, alt, caption, multiple images
- Attachments: gallery, media library children, multiple-row expansion
- ACF: field group → field detection, including repeater rows, sub-fields, group fields, flexible content (handled correctly, which is non-trivial)
- WooCommerce: when you switch to "Products" as source, all WC fields appear, including variations (one variation per row, or multi-row, your choice), attributes, stock data, tax classes, price totals
- Function fields: insert a PHP callback that returns the value for this column per row
You can rename columns inline. You can nest columns under XML parent tags. You can reorder by drag. You can set per-column formatting (uppercase, lowercase, prefix, suffix, date format strings). For Excel output you can format numeric columns. For CSV you can wrap specific fields in quotes regardless of the global rule.
The visual model is the same as Power Query in Excel or DataPrep in Looker: lay out the shape of the output, let the engine fill in the rows. After spending a couple of hours with it you stop thinking "what fields can I export" and start thinking "what fields does my consuming system need" because the gap between those questions becomes trivial to close.
Scheduled exports and the Google Merchant use case
Once an export is configured, it’s saved. From All Export → Manage Exports you can run it manually, set a schedule, edit the field mapping, clone it for a similar use case, or download the last run’s file directly.
Scheduling has three modes:
-
WP-Cron schedule: pick hourly, daily, weekly, monthly, or a custom interval. WP-Cron runs on page visits, which is fine for high-traffic sites and unreliable for low-traffic ones. Don’t use this for anything critical without a real cron job.
-
External cron URL: Soflyy hosts a cron-trigger service. You give it your export’s trigger URL and it pings the URL on a schedule. Useful if WP-Cron is broken on your host.
-
Action hook trigger: tie the export to a WordPress action. When the action fires, the export runs. Common patterns: re-export the product feed after a WooCommerce price update, dump the orders CSV after an order completes, write a customer list after a user signs up.
The Google Merchant feed use case I mentioned in the intro maps to this directly:
- Create an export with source = "Products" (or WooCommerce Products specifically).
- In the field builder, switch the output format to Google Merchant Feed. The plugin auto-populates the required columns (id, title, description, link, image_link, availability, price, brand, gtin, mpn) from your product data.
- Add custom columns for the country-conditional surcharge using the function editor (more on that in a minute).
- Schedule it daily at 3am.
- Point Google Merchant Center at the resulting
.xmlURL.
That used to be two days of custom code. Now it’s a 15-minute config session. The XML is regenerated nightly, GMC fetches it, your shopping ads stay current. I’m slightly bitter about how easy this turned out to be.
The roundtrip with WP All Import
The thing I underused for the first six months is the export-to-import roundtrip. When you finish configuring an export, the "Save & Run" button has a sibling: Bundle Export For Import. That produces a ZIP file containing the exported XML + a JSON template describing the field mapping.
You open the import side (WP All Import Pro), upload the bundle, and every field mapping is auto-restored. No "drag SKU into the SKU column" dance. The import knows that column 4 is _price because the export told it.
You can also designate a unique field so the import matches updates rather than creating duplicates. For products that’s typically SKU. For posts it’s typically post ID. For users it’s typically email. Set it once, and re-importing the same file updates existing records instead of creating new ones.
The pattern that’s saved me the most time:
- Export 5,000 product descriptions as XML.
- Open the file in Excel or feed it to a script (or to ChatGPT, increasingly).
- Edit the description column. Save.
- Re-import the file as the bundle.
- Only the description column updates. Title, price, stock, categories all untouched.
That’s the workflow for: bulk SEO rewrites, content audits with corrections, mass language translation runs, AI-assisted content polish. None of those are exotic anymore; most of my clients ask for one a year. With this roundtrip they’re afternoon projects.
Function editor: when the UI runs out
Sometimes a column needs a value the UI can’t express. "Display the SKU prefixed by the warehouse code, but only if the product is in the wholesale category, otherwise just the SKU." Custom logic per row, called for every record being exported.
The Function Editor lives at All Export → Settings → Function Editor, a code editor pane where you write PHP that gets included by every export. You define a function, then reference it in any column’s value field as [your_function_name({field_to_pass})].
A real example I use:
function gpltimes_warehouse_sku( $sku, $post_id ) {
$categories = wp_get_post_terms( $post_id, 'product_cat', [ 'fields' => 'slugs' ] );
if ( in_array( 'wholesale', $categories, true ) ) {
$warehouse = get_post_meta( $post_id, '_warehouse_code', true );
return $warehouse ? $warehouse . '-' . $sku : $sku;
}
return $sku;
}
Then in the export’s SKU column I reference it as [gpltimes_warehouse_sku({sku},{ID})] and the function gets called for every row, returning the right value.
The functions run server-side with full PHP and full WordPress context, so you can query the database, call APIs, read files, do anything. The exports do, however, run as the user who triggered them (or as the cron user during scheduled runs), so be mindful of capability checks if you’re handling sensitive data.
Installation and what to set up day one
Five steps from zero to working.
- Install the free WP All Export plugin from wordpress.org if you want the basic CSV/XML feature only. Most readers won’t bother because Pro replaces it.
- Upload WP All Export Pro at Plugins → Add New → Upload Plugin. Install and activate.
- Activate the license at All Export → Settings → License Key.
- Configure file storage in All Export → Settings → Files. Two choices: store exports in the Media Library (visible in WP admin, indexed by WordPress) or in a randomized
wp-content/uploads/wpallexport/<random>/directory (recommended for sensitive data, hides from public listings). Pick one upfront because changing later breaks any external systems pointing at the file URLs. - (Optional but recommended) Replace WP-Cron with a real cron job if you’ll be scheduling exports. One line in your server crontab:
* * * * * wget -q -O - https://yoursite.com/wp-cron.php >/dev/null 2>&1
Then disable WordPress’s internal cron in wp-config.php: define('DISABLE_WP_CRON', true);. Scheduled exports become reliable.
That’s it. From here you create your first export at All Export → New Export, pick what to export, drag the columns you want, save and run.
Five jobs it solves that you probably have
Generic "use cases" sections are usually marketing puffery. These are specific things I’ve shipped this year using WP All Export Pro instead of writing code.
1. Google Merchant Center feed (the one from the intro). Daily XML feed of all in-stock products with country-conditional pricing. Replaces a 200-line custom plugin. Setup time: 15 minutes. Maintenance: zero in eight months.
2. Monthly accountant report. CSV of all completed WooCommerce orders for the previous month, with columns the accountant asked for (order ID, customer name, country, line items as a single field, total, tax, refund status). Scheduled monthly at midnight on the 1st, auto-emailed via a hook to the accountant’s address. Replaces a Google Sheet I was manually updating.
3. Newsletter list sync. Every Sunday night, export all users with a custom meta field newsletter_optin=1 to CSV, drop it into a watched folder, Klaviyo picks it up via its CSV import API. Two-way sync without a Zapier subscription.
4. AI content rewrite pass. Export 800 blog post excerpts, run through ChatGPT for tone consistency, re-import via bundle. Only the excerpt column updates. Old workflow: copy-paste each post into ChatGPT, paste result back in WP. Took a week. New workflow: an afternoon.
5. Site migration to a different stack. Export all posts, pages, products, users, and orders to CSV. The target system (a Shopify migration in one case, Headless WP + Astro in another) imports the CSV. Replaces "we’ll write a migration script" with "we’ll configure six exports". Faster, more reliable, easier to re-run when something is wrong on the target side.
If two of those five sound familiar, you’ve already justified installing the plugin.
Developer reference
I’ll spare you the full hooks list (Soflyy ships 219 apply_filters and 41 do_action hooks, all prefixed pmxe_ or wp_all_export_). Here are the ones I’ve actually used in production.
Transform a value before it hits the output
add_filter( 'pmxe_csv_value', function ( $value, $field_name, $post_id ) {
if ( $field_name === '_price' ) {
return number_format( (float) $value, 2, '.', '' );
}
return $value;
}, 10, 3 );
This catches every CSV cell before it’s written. Useful for normalizing currency, dates, or stripping HTML from content fields without touching the original data.
Modify post content per row
add_filter( 'pmxe_post_content', function ( $content, $post_id ) {
// Strip internal author notes wrapped in [[notes]]...[[/notes]] before exporting
return preg_replace( '/\[\[notes\]\][\s\S]*?\[\[\/notes\]\]/', '', $content );
}, 10, 2 );
Add a custom data source
If you want to export from a non-WP table or a custom data store, register it via:
add_filter( 'wp_all_export_available_data', function ( $sources ) {
$sources['my_app_users'] = [
'label' => 'My App Users (external DB)',
'callback' => 'my_app_users_iterator',
];
return $sources;
} );
function my_app_users_iterator( $args ) {
global $external_db;
return $external_db->get_results( 'SELECT * FROM users LIMIT %d OFFSET %d', $args['limit'], $args['offset'] );
}
Now your custom source shows up alongside Posts, Users, Comments, etc. in the New Export source picker.
Per-record export hook
add_action( 'pmxe_exported_post', function ( $post_id, $export ) {
update_post_meta( $post_id, '_last_exported', current_time( 'mysql' ) );
}, 10, 2 );
Useful for tracking which records have been exported, e.g. for incremental sync to an external system.
Override XML output
add_filter( 'wp_all_export_record_xml_tag', function ( $tag, $export_id ) {
if ( (int) $export_id === 5 ) {
return 'merchant_item';
}
return $tag;
}, 10, 2 );
Useful when the consuming system expects a specific XML schema (Shopify product feed, Yandex feed, etc.).
Before / after export hooks
add_action( 'pmxe_before_export', function ( $export_id ) {
do_action( 'my_app/sync_state', 'export_started' );
}, 10, 1 );
add_action( 'pmxe_after_export', function ( $export_id ) {
$file = pmxe_export_file( $export_id );
wp_remote_post( 'https://my-sftp-relay.example.com/upload', [
'body' => [ 'file' => base64_encode( file_get_contents( $file ) ) ],
'headers' => [ 'Authorization' => 'Bearer ' . MY_SFTP_TOKEN ],
] );
}, 10, 1 );
This pattern uploads the finished export to an external SFTP or cloud storage automatically. Combine with scheduling and you’ve got a reliable cross-system data pipe.
Performance, file handling, and gotchas
Performance. Exports of more than ~100 rows run through Action Scheduler (WooCommerce’s queue library) so they don’t hold a connection open or time out PHP. You’ll see the progress bar advance in chunks. For 10,000+ row exports, watch your hosting’s max_execution_time and PHP memory_limit settings. On modest shared hosts you may need to bump them; on dedicated hosts the defaults usually work.
The XML writer uses PHP’s XMLWriter (a streaming writer), so XML exports don’t hold the full document in memory. CSV exports use fputcsv per row. Excel exports use PhpSpreadsheet which is the heaviest of the three; for 50,000+ row Excel exports, expect a few minutes and watch memory.
File handling. Exported files go to wp-content/uploads/wpallexport/<randomized-folder>/ by default. Two things to know:
- The files persist indefinitely unless you configure history retention. All Export → Settings → History lets you set "keep last N runs". I usually set it to 10.
- If your sensitive data is in the export (customer emails, order totals), the randomized folder name is good but not security. Anyone with the URL can read the file. For real protection use the "Files → Secure Mode" setting and pair with an
.htaccessrule on the upload folder.
Compatibility.
- WP All Import Pro: fully bidirectional via bundle export.
- WooCommerce: deeply integrated. Variations, attributes, stock, custom product types all supported.
- ACF, Meta Box, Pods, Toolset, JetEngine, CMB2: dedicated add-ons (separate small plugins) extend field detection. Install whichever ones match your stack.
- WPML / Polylang: supported. You can filter exports by language and export translated versions per language as separate files.
Gotchas worth knowing.
- WP-Cron is unreliable on low-traffic sites. Scheduled exports may skip runs. The fix is the real-cron line above. This is the #1 support ticket reason on Soflyy’s forum.
- The Function Editor runs unsandboxed PHP in plugin scope. Only admins can edit it (which is correct), but if you’re handing the site off to a junior developer, that field is a footgun. Lock it down via capability if you’re worried.
- Large CSV files break Excel on Windows at around 1M rows due to Excel’s row limit. Switch to .xlsx (multi-sheet) or split into multiple files via filter.
- The Google Merchant feed preset uses an older schema. Google updated requirements in 2024-2025. Check the current
<g:identifier_exists>and<g:product_type>requirements; you may need to add custom columns via Function Editor for full compliance. - Re-imports via the bundle work only with WP All Import Pro, not the free WP All Import. The bundle format includes Pro-only metadata.
- Cloning an export doesn’t clone scheduling. If you clone an export to make a variation, remember to re-add the schedule manually.
- File URLs change if you rename the export. The randomized folder name persists, but the export’s file name updates. External systems pointing at the old URL break silently. Use the "Download" page URL (which is stable) rather than the direct file URL when feeding external consumers.
Pricing and licensing
Soflyy sells WP All Export Pro as an annual license with site-count tiers (single, 5-site, unlimited) and a one-time-purchase lifetime option. Updates and support come with the active license. Pricing changes from time to time; check wpallimport.com/export for current numbers.
The free WP All Export plugin on wordpress.org gives you basic CSV/XML export with the field builder but without scheduling, the Function Editor, the WPAI bundle export, or any add-on integrations. Useful for trying the workflow before paying.
That’s what I run on staging environments and side projects. For production sites where you want vendor support and priority bug fixes, buy a direct license from Soflyy.
FAQ
Do I need WP All Import Pro to use Export Pro?
Not for exporting. You only need Import Pro if you want to re-import the bundle. Many sites run Export Pro alone for feeds and accountant reports.
Can I export WooCommerce orders with line items?
Yes. Orders are a supported source. Each line item can be its own row (one row per item, multiple rows per order) or you can join all line items into a single field as JSON or pipe-delimited text. Both work, depending on what your consuming system needs.
Can it export user passwords?
The hashed password is a column you can include, but the plaintext password is not stored by WordPress and can’t be exported. You can use a function field to generate a temporary token or password reset link, if your workflow needs to invite users to set a new password on the destination system.
Does it handle ACF Repeater fields?
Yes. ACF Repeater rows can be exported as multiple rows per record (one repeater iteration per row) or as a single JSON-encoded column. Flexible Content is also supported. The ACF add-on plugin (free from Soflyy) is required for full field detection.
Can I FTP / SFTP the exported file to a remote server automatically?
Not via the UI, but the pmxe_after_export action gives you the file path; pair it with wp_remote_post or any PHP SFTP client to push it elsewhere. The code example earlier in this article does exactly that.
Does the export include drafts or only published posts?
Configurable. The filter step lets you choose post statuses, including custom statuses you’ve registered.
Will exports respect WPML language filters?
Yes if the WPML add-on is installed. You can filter exports by language and export each language as a separate file.
Is the field builder usable on mobile?
Technically yes, in landscape on a tablet. Realistically no, since the drag-and-drop interaction needs a desktop screen. Configure exports on a laptop; running them is fine from anywhere.
Can scheduled exports send via email?
Not built in. The "after export" action hook is the path: write a few lines of PHP that pick up the file and email it with wp_mail. About 10 lines of code.
What’s the difference between this and just running wp post list --format=csv in WP-CLI?
WP-CLI gives you basic CSV with built-in fields. WP All Export Pro gives you ACF / Meta Box / WooCommerce field discovery, scheduled runs, function-based transforms, XML output, the field builder UI, and the WPAI bundle roundtrip. If your needs are flat CSV of basic fields, WP-CLI is fine. For everything else, WP All Export Pro is what you want.
Should you install it?
If you’re nodding along to any of these statements, yes:
- You’ve written more than one CSV export script in the past year.
- A client has asked for a "feed" or "data dump" and you quoted them more than four hours.
- You maintain a WooCommerce store and have ever wanted to bulk-edit products in Excel.
- You sync customer or product data to an external system on a schedule.
- You’ve ever said the words "I’ll just write a quick
WP_Queryand dump to CSV".
If you’re not nodding, you probably don’t need this plugin yet. Most very small sites get by with manual exports through the WP admin’s CSV exporter or with WP-CLI. The break-even comes around the point where you find yourself rewriting the same export with slight tweaks for the third time.
Install WP All Export Pro from GPL Times on a staging site, build one real export against your data, and see whether it clicks. The first 30 minutes will tell you whether the UI fits your brain. For me it did, and I haven’t written a CSV export script since.