NR Post Exporter v1.0.1

WordPress plugin

Move one post. Bring everything with it.

Export a single post or page to JSON — custom fields, taxonomy terms, and the full revision history — then import it on another site.

  • WordPress 5.8+
  • PHP 7.4+
  • MIT licensed
  • No settings screen
post-482-.2026-07-28--14-02-11.json the file you get
Core fields
{
  "post_title": "Spring release notes",
  "post_type": "post",
  "post_status": "publish",
  "post_name": "spring-release-notes",
  "post_content": "<!-- wp:paragraph -->…",
Custom fields
  "post_meta": {
    "_thumbnail_id": "1184",
    "reading_time": "6"
  },
Terms, by slug
  "terms": {
    "category": ["announcements"],
    "post_tag": ["release", "changelog"]
  },
Every revision
  "revisions": [
    { /* oldest draft, same shape */ },
    { /* … replayed in order on import */ }
  ]
}

The payload

What travels, and what stays behind

The export is a plain JSON file. Read it, diff it, keep it in a ticket — it is the whole record of the post at the moment you exported it.

Included

  • Post fields: title, content, excerpt, status, slug, dates, menu order, parent
  • All custom fields (post meta)
  • Terms for every taxonomy on the post type, referenced by slug
  • The complete revision history, in order
  • Content normalized as UTF-8 so accents survive the round trip

Not included

  • Media files. Attachment references stay in the content and meta, but the files do not move
  • The original author. The person running the import becomes the author
  • Comments
  • Anything larger than about 1 MB — that is the import limit

On the source site

Export a post

No settings to configure. The plugin adds one row action to every public post type. You need the export capability.

01

Open Posts or Pages

Custom post types work too, as long as they are public.

02

Hover a row, click Export

The link sits next to Edit and Trash. It opens in a new tab and starts the download.

WordPress posts list with the Export row action visible under a post title
The Export action in the post row.
03

Save the JSON file

The filename records the post type, ID, site, and export time, so a folder of exports stays readable.

Browser save dialog showing a downloaded JSON export file
The download, named by post type, ID, and timestamp.

On the destination site

Import it somewhere else

Install the plugin on the destination site too, then upload the file. You need the edit_posts capability.

01

Go to Tools → Post Import

One screen, one field.

The Post Import admin screen with a file field and Import Post button
Tools → Post Import.
02

Choose the exported JSON, then click Import Post

Files are capped at roughly 1 MB. Larger exports are rejected rather than truncated.

03

Review the new post

The title is prefixed with Imported: so it is easy to spot. Revisions are replayed oldest to newest, so the history reads the same as it did on the source site. Missing terms are created from their slugs.

Before you share a file

Treat exports as sensitive

An export is a full copy of the post record

  • Custom fields are exported verbatim. If a plugin stores an API key, a license key, or a private URL in post meta, it lands in the JSON file.
  • Password-protected posts export the post_password field.
  • Draft and private post content is exported the same way published content is.

Open the file before you attach it to a ticket, commit it, or send it on. Anyone who can read the file can read everything the post held.

Setup

Install

Install on both sites — the source site for exporting, the destination site for importing.

From the zip

Download the release zip, then go to Plugins → Add New → Upload Plugin, and activate.

Releases on GitHub

With Composer

composer require nikolareljin/nr-post-exporter

By hand

cd wp-content/plugins
git clone https://github.com/nikolareljin/nr-post-exporter.git
wp plugin activate nr-post-exporter

Requirements

WordPress5.8 or newer
PHP7.4 or newer
Export capabilityexport
Import capabilityedit_posts
Current version1.0.1

Details

Questions

Does this replace the built-in WordPress export?

No. The native WXR export moves a whole site or a whole post type. This moves one post at a time, and keeps meta and revisions intact while doing it.

Do custom post types work?

Yes, any post type registered as public gets the Export row action.

Why is the imported title prefixed with "Imported:"?

So a fresh import is obvious in the posts list, and so it never silently collides with a post that is already there. Rename it once you have checked it.

What happens to images?

Attachment references travel inside the content and meta, but the files themselves do not. Move the uploads separately, or re-point the references after import.

Who becomes the author?

The user running the import. Post authorship is not carried across, because user IDs rarely match between sites.

Can I import the same file twice?

Yes. Each import creates a new post — nothing is overwritten or matched by ID.

Is there a file size limit?

Imports are capped at about 1 MB. Posts with long revision histories are the usual reason to hit it.

History

Changelog

Generated from CHANGELOG.md by bin/update-docs.sh. Do not edit this section by hand.

1.0.1

Added

  • Project site under docs/, published with GitHub Pages: export and import walkthroughs, the JSON payload structure, install steps, requirements, and FAQ.
  • bin/update-docs.sh to sync the site's version and changelog from nr-post-exporter.php and CHANGELOG.md. Run with --check to fail on drift.
  • Copy buttons on the install commands on the project site.

Changed

  • Documentation only. No change to plugin runtime behaviour.
  • Excluded docs/ from the distributed plugin package.

1.0.0

Changed

  • Set explicit SVN slug/URL for WordPress.org deploys to ensure publishing to the correct repo.
  • Switched WP-CLI install in CI to the official builds phar for reliable POT generation.
  • Excluded the test directory from distributed plugin packages.

1.0.0-rc.1

Updated

  • Standardized plugin-specific constants and admin hooks to the nrpexp prefix to avoid collisions.
  • Unified export/import nonces and action slugs under the new prefix for consistency with WordPress guidelines.
  • Updated readme.txt metadata: added contributor nreljin, trimmed tags to five, and shortened the description to WordPress.org limits.
  • Swapped error_log() call for the nrpexp_export_terms_error action to surface term export failures without shipping debug logging.

0.1.2

Updated

  • Refined namespaces and linting to align with WordPress review feedback.

0.1.1

Fixed

  • Corrected the WordPress.org dist build workflow to deploy cleanly.

Full changelog on GitHub