WordPress content type conversion

Change a post's type without losing what was attached to it

Set up a post type converter WordPress content can move between types safely with: a full impact report before anything changes, a real decision for every taxonomy involved, an automatic redirect for the old URL, and a genuine undo.

  • A full analysis of what would change, before you commit.
  • Four taxonomy modes: keep, match, map, or drop, per taxonomy.
  • Redirects the old URL automatically through Redirect Manager.
  • Genuinely reversible — slug, terms, meta and the redirect included.
Post Type ConverterConvert Type
Convert content type
What would you like to do?
Destination typePage
TaxonomiesMatch the terms by name
CancelConvert
Quick answer

Post type converter WordPress: what does the module actually do?

This is what a post type converter WordPress content gets with TheOneWP: a "Convert Type" row action on posts and pages runs TOWP_Post_Type_Converter::analyze() first, reporting exactly what would change — taxonomy terms that won't carry over, slug conflicts, hierarchy the destination can't express, sticky flags, page templates, post formats and comment support. Converting then applies a decision for every taxonomy involved (keep, match, map or drop), re-runs slug uniqueness for the new type, optionally creates a redirect from the old URL through Redirect Manager, and records a full undo record before anything risky happens — so a "Convert / Restore Type" action can put the post back exactly as it was.

The one-column-update problem

Changing a post's type is more than one database column

WordPress's own set_post_type() writes a single column and clears the cache — everything that was bound to the old type is simply left behind.

Categories and tags don't automatically follow

A taxonomy the destination type doesn't register still has terms assigned to the post, quietly disconnected rather than migrated anywhere useful.

A changed URL breaks every existing link to it

Slugs are unique per post type, so a converted post can collide with an existing one, and its permalink can change entirely — with nothing pointing visitors or search engines to the new address.

A unified WordPress solution

Analyze first, apply in full, keep a way back

The module treats a conversion as a described, reversible operation instead of a single quiet database write.

A real report before anything changes

Taxonomy conflicts, slug collisions, lost hierarchy and more are all surfaced up front, not discovered afterward.

A real decision for every taxonomy

Keep, match, map or drop — nothing about existing terms is left to chance or silently dropped.

Genuinely reversible

An exact undo record means a conversion is a decision you can revisit, not a one-way door.

Verified feature set

The complete post type converter WordPress feature set

Every capability below is present in the conversion engine or its admin AJAX handlers.

Taxonomies

Four handling modes

Keep (recoverable, not deleted), Match (rebuild per-post by slug then name), Map (a fixed set for every post), or Drop — chosen individually per taxonomy.

Keep/Match/Map/DropPer-taxonomy
URLs

Automatic Redirect Manager integration

A 301 or 302 redirect is created for the old address only when the URL genuinely changes — loop detection uses the same check Redirect Manager relies on itself.

save_redirect()Loop-checked
Recovery

Exact undo

Previous type, slug, parent, menu order, taxonomy terms and removed meta are all restorable with one action, including deleting the redirect that was created.

_towp_ptc_undoOne-click restore
Cleanup

Leftovers handled explicitly

Page templates and post formats the destination doesn't support are removed and recorded; a sticky post that becomes a non-post type is un-stuck automatically.

Template cleanupSticky cleanup
Compatibility

Real WordPress save hooks fire

save_post and save_post_{type} fire after a conversion, so caches, search indexes and other plugins hear about it the same way they would for a normal save.

save_postCore hooks
Recommended workflow

Run a post type converter WordPress conversion in four steps

Read the impact report before committing — it exists specifically so nothing is a surprise.

01

Click "Convert Type" on a post or page

Available as a row action for any post type enabled for conversion in settings.

02

Review the impact report

Check taxonomy conflicts, slug collisions and anything else flagged before choosing to proceed.

03

Decide each taxonomy and confirm the redirect

Pick keep, match, map or drop per taxonomy, and leave the redirect option on if the URL will change.

04

Convert, or restore if it wasn't right

"Convert / Restore Type" appears afterward — undo puts everything back exactly as it was.

Practical use cases

Where converting a type beats starting over

The module fits situations where content structure needs to change without losing the content itself.

Turning posts into pages, or back

Move content between the two most common types without manually copying titles, content and taxonomy assignments.

Migrating into a new custom post type

Move existing posts into a purpose-built post type as a site's content model matures, with a real decision for each taxonomy along the way.

Testing a structural change safely

Convert, review the result, and undo cleanly if it turns out to be the wrong call — with the redirect it created removed too.

Operational benefits

Conversions that don't leave a mess behind

Every design choice in the verified code favors a complete, checkable operation over a fast but incomplete one.

Nothing hidden until afterThe impact report surfaces every consequence before you commit to it.
Old links keep workingA redirect through Redirect Manager means search engines and bookmarks aren't left pointing at a 404.
A genuine way backUndo restores the exact previous state, not just the post type column.
Plays well with the rest of WordPressReal save_post hooks mean other plugins and caches stay in sync automatically.
Performance behaviour

A direct write, not the full save pipeline

The verified implementation avoids re-running work that a conversion doesn't need.

Direct database row update

Column changes go through $wpdb->update() directly instead of wp_update_post(), avoiding a second full save cycle mid-conversion.

Hooks fire once, deliberately

save_post is triggered once, explicitly, after the row is fully coherent — not repeatedly as intermediate steps run.

Assets load only on the list screen

The dialog's CSS and JS enqueue only on edit.php for post types where conversion is actually enabled.

Security implementation

Checked at both ends, every time

A conversion touches capability boundaries on two post types at once, and the code checks both.

01

edit_post on the source, create_posts on the destination

can_convert() requires the user to be able to edit the existing post and to create content of the destination type — either missing blocks the conversion.

02

Nonce-verified AJAX on every action

Context, convert and revert all check a dedicated nonce before doing anything.

03

Destination type validated against an explicit allowlist

Only post types WordPress actually registers with an admin UI, minus a filtered exclusion list, can be offered as a destination at all.

04

Trashed content excluded entirely

The row action doesn't appear on trashed posts — content on its way out isn't a candidate for conversion.

Verified compatibility

Built to work with Redirect Manager specifically

The supplied code checks for a real module dependency by name rather than assuming redirects are always possible. No compatibility claim beyond the verified implementation is assumed.

Optional dependency

Redirect Manager

Redirect creation only happens if that module is enabled — checked with class_exists( 'TOWP_Redirect_Manager' ) before ever calling it.

ConditionalNot required
Shared UI

Content Clone's dialog styling

The conversion dialog shares its stylesheet with the Content Clone module, so the two look and behave consistently.

content-clone.cssShared pattern
Core hooks

post_row_actions / page_row_actions

The only UI entry point in the shipped admin class — a button added to each row in the standard WordPress list table.

Row action onlyNo bulk/quick edit UI
Solution comparison

TheOneWP versus common alternatives

Compare a real post type converter WordPress implementation with WordPress core's own set_post_type() or a basic conversion plugin.

CapabilityTheOneWP Post Type ConverterOther common solutions
Pre-conversion visibility A full impact report before anything changesset_post_type() alone gives no warning at all
Taxonomy handling Four explicit modes, decided per taxonomyOften left disconnected with no decision offered
Old URLs Redirected automatically via Redirect ManagerUsually left broken unless handled manually
Undo Full restoration, including the redirect createdRarely offered at all once a conversion runs
Save pipeline Direct row update, hooks fired once deliberatelyVaries; some tools re-trigger the full save cycle
Administration A row action inside the list table already in useMay require a separate screen or bulk tool
Best practices

Convert with the report, not around it

A few habits keep type conversions predictable.

01

Read every line of the impact report

It exists specifically to surface consequences before they happen — don't skip past it.

02

Use Match for per-post taxonomy fidelity

When each post's own terms matter, Match preserves that instead of applying one fixed set to everything.

03

Keep the redirect option on for published content

It only creates a rule when the URL genuinely changes — there's little reason to turn it off for live content.

04

Use Undo instead of converting back manually

It restores taxonomy assignments and meta a second manual conversion wouldn't reliably reproduce.

Common mistakes

Avoid assumptions the code does not support

The module has a defined, verified scope — a few assumptions outside it cause confusion.

Expecting a bulk-conversion screen

The shipped admin UI converts one post at a time through a row action — there is no batch or Quick/Bulk Edit interface in this admin class.

Assuming Keep migrates terms to a new taxonomy

Keep only carries over an assignment the destination already shares — a taxonomy it doesn't register stays untouched, not moved anywhere.

Expecting a redirect without Redirect Manager enabled

Redirect creation is entirely conditional on that module being active — without it, no rule is created regardless of the toggle.

Frequently asked questions

Post Type Converter FAQ

These answers come directly from the verified conversion engine and its admin AJAX handlers.

Does this convert one post at a time, or in bulk?

One at a time, through a "Convert Type" button added to each row in the posts and pages list. The underlying engine is written so other interfaces could reuse the same methods, but the shipped admin UI only wires up this single-post row action.

What happens to categories or tags the destination type doesn't have?

You choose per taxonomy: Keep leaves the assignment in place even though it's inactive under the new type (and it becomes valid again if that taxonomy is later registered for it), Match rebuilds the same terms under a taxonomy the destination does have, Map applies a fixed set of terms to every converted post, and Drop clears the assignment.

Can a conversion be undone?

Yes. The exact previous type, slug, parent, menu order, taxonomy assignments and any removed meta are recorded before the conversion changes anything, and a "Convert / Restore Type" action reverses it, including deleting any redirect the conversion created.

Does converting a post create broken links to its old URL?

Not if Redirect Manager is active. When the address actually changes, a 301 or 302 redirect from the old permalink is created automatically through Redirect Manager's own save_redirect() — the same loop-detection check that module uses on its own confirms a redirect is genuinely needed first.

What happens to a slug that already exists under the destination type?

It gets resolved automatically. Slug uniqueness in WordPress is per post type, so the conversion re-runs wp_unique_post_slug() and records what changed, since a slug that was safe under the old type can collide under the new one.

Does this use wp_update_post() to change the type?

No, deliberately. wp_update_post() would re-sanitize the slug against the type being left and fire the full save pipeline mid-conversion. The engine writes the database row directly and fires WordPress's own save_post hooks itself once the row is in a coherent state.

Can any post type be converted to any other?

Only types with an admin UI, minus ones whose data wouldn't survive being reinterpreted as a post — attachments, revisions, nav menu items, and several WordPress and WooCommerce internals are excluded by default, and the exclusion list is filterable.

What does the pre-conversion analysis actually check?

Blocked posts, taxonomy terms that won't carry over automatically, slug conflicts, hierarchy the destination can't express, sticky posts, page templates, post formats, and comment counts the destination doesn't support — computed before anything is changed.

Stop losing terms when you change a type.See the impact first, then convert.

Use a post type converter WordPress content can move between types with confidence: a real report, a decision for every taxonomy, and an undo that actually works.