How to Duplicate a Page in WordPress — 4 Working Methods (2026)
WordPress still doesn't ship a Duplicate button on the Pages list. Here are the 4 working methods plus one that adds a proper Duplicate action in one click.
Key Takeaways
- WordPress has no native one-click Duplicate button — only Copy all blocks inside the block editor, which copies the body but not the title or meta.
- For a full clone (title, categories, custom fields, SEO meta, featured image) the de-facto plugin is Yoast Duplicate Post — 4M+ installs, free, actively maintained.
- No-plugin full clone: a 25-line
functions.phpsnippet that adds a Duplicate row action and callswp_insert_post(). - For bulk work or headless sites, WP-CLI does it with
wp post get | wp post create. - Opposite problem — accidental duplicates in a live template (two footers, two Add-to-cart buttons) — is a code fix:
remove_action(), or just delete the straydo_action()call.
Method 1: Block Editor — Copy All Blocks (No Plugin)
Built into WordPress since Gutenberg 5.4, works in every modern install. Copies the page body perfectly, but not the title, slug, featured image, or SEO meta.
- Open the source page in the block editor (Pages → All Pages → click the title).
- Click the three-dot Options menu in the top-right toolbar.
- Choose Copy all blocks. All blocks go to your clipboard as serialized block markup.
- Create a new page (Pages → Add New), click in the empty content area, and paste (
Ctrl/Cmd+V). Every block, including columns, images, and reusable blocks, appears. - Set the title, featured image, categories, and save as draft.
Method 2: Yoast Duplicate Post (Best Plugin)
Yoast Duplicate Post is the standard — 4M+ active installs, maintained by the Yoast SEO team, MIT-licensed, no paid tier. It adds Clone and New Draft links under every post and page row in the admin list, and supports any custom post type.
- Go to Plugins → Add New, search for Yoast Duplicate Post, click Install, then Activate.
- Go to Pages → All Pages. Hover over any page — you'll see two new row actions: Clone (makes the copy silently) and New Draft (makes the copy and opens it for editing).
- Fine-tune what gets copied under Settings → Duplicate Post: title, date, slug, excerpt, template, taxonomies, custom fields, featured image. Default is everything except the status (which is reset to draft).
- For bulk cloning, select multiple pages in the list, choose Clone from the Bulk Actions dropdown, and click Apply.
Alternatives if you don't want Yoast
- Duplicate Page by mndpsingh287 — 1M+ installs, simpler UI, adds only a Duplicate This link.
- Post Duplicator by Metaphor Creations — great for custom post types, lets you remap taxonomies during the copy.
Method 3: functions.php Snippet (No Plugin, Full Clone)
Drop this into your child theme's functions.php (or a site-specific plugin). It adds a Duplicate row action to pages and posts, copies all post fields, taxonomies, and post meta, and redirects you to the new draft.
/**
* Add a "Duplicate" row action to pages and posts.
*/
add_filter( 'post_row_actions', 'vb_duplicate_link', 10, 2 );
add_filter( 'page_row_actions', 'vb_duplicate_link', 10, 2 );
function vb_duplicate_link( $actions, $post ) {
if ( current_user_can( 'edit_posts' ) ) {
$url = wp_nonce_url(
admin_url( 'admin.php?action=vb_duplicate_post&post=' . $post->ID ),
'vb_duplicate_' . $post->ID
);
$actions['duplicate'] = '<a href="' . esc_url( $url ) . '">Duplicate</a>';
}
return $actions;
}
add_action( 'admin_action_vb_duplicate_post', 'vb_duplicate_post' );
function vb_duplicate_post() {
$id = isset( $_GET['post'] ) ? (int) $_GET['post'] : 0;
check_admin_referer( 'vb_duplicate_' . $id );
$post = get_post( $id );
if ( ! $post ) wp_die( 'Post not found' );
$new_id = wp_insert_post( [
'post_title' => $post->post_title . ' (Copy)',
'post_content' => $post->post_content,
'post_excerpt' => $post->post_excerpt,
'post_status' => 'draft',
'post_type' => $post->post_type,
'post_author' => get_current_user_id(),
] );
// Copy taxonomies
foreach ( get_object_taxonomies( $post->post_type ) as $tax ) {
$terms = wp_get_object_terms( $id, $tax, [ 'fields' => 'slugs' ] );
wp_set_object_terms( $new_id, $terms, $tax );
}
// Copy post meta
foreach ( get_post_meta( $id ) as $key => $values ) {
foreach ( $values as $value ) {
add_post_meta( $new_id, $key, maybe_unserialize( $value ) );
}
}
wp_safe_redirect( admin_url( 'post.php?action=edit&post=' . $new_id ) );
exit;
}
wp_insert_post() triggers every save_post hook your site has registered — SEO indexers, caches, webhooks. On a site with lots of integrations, a clone can fire a lot of downstream events.
Method 4: WP-CLI (Headless / Bulk)
Best for scripted workflows, bulk cloning, or sites where wp-admin is locked down. Assumes WP-CLI is installed on your host (most managed WP hosts ship it).
Quick content-only clone:
# Grab the body of post 42, create a new page with the same content
wp post get 42 --field=post_content \
| wp post create --post_type=page \
--post_title='Copy of Original' \
--post_status=draft \
--post_content=-
Full clone (title + content + excerpt + meta) with a one-liner:
SRC=42
NEW=$(wp post create \
--post_type=$(wp post get $SRC --field=post_type) \
--post_title="$(wp post get $SRC --field=post_title) (Copy)" \
--post_content="$(wp post get $SRC --field=post_content)" \
--post_excerpt="$(wp post get $SRC --field=post_excerpt)" \
--post_status=draft \
--porcelain)
# Copy every meta key from source to new
wp post meta list $SRC --format=json | \
jq -r '.[] | [.meta_key, .meta_value] | @tsv' | \
while IFS=$'\t' read -r k v; do wp post meta add "$NEW" "$k" "$v"; done
For bulk cloning (e.g. duplicate every page in a category), wrap it in a loop with wp post list --category=5 --format=ids.
Which Method Should You Use?
| Scenario | Best method | Why |
|---|---|---|
| One-off clone, simple page | Block editor "Copy all blocks" | Zero plugins, 4 clicks |
| Everyday editorial work | Yoast Duplicate Post | Clone + New Draft row actions, configurable, stable |
| Minimalist stack (no new plugin) | functions.php snippet | 25 lines, full feature set, ships in child theme |
| Bulk / scripted / headless | WP-CLI | Loops, shell pipes, no browser needed |
| Custom post type with ACF | Yoast Duplicate Post or Post Duplicator | Known-good ACF handling |
| WooCommerce product | Products → Duplicate (built-in) | WooCommerce adds its own Duplicate action |
The Flip Side: Removing Accidental Duplicates
Half the people searching for "duplicate page wordpress" actually have the opposite problem — they already have a duplicate they didn't want:
- Two Add to Cart buttons on a WooCommerce product page (child theme adds a hook the parent theme already fires).
- A second footer or menu rendering below the first (plugin injects a widget area that the theme also injects).
- Two H1 tags (page builder + theme both output one).
- Two copies of a checkout field, a CTA, or a cookie banner.
These aren't duplicates of a database row — they're duplicates of a rendered element, caused by a theme or plugin calling the same action twice. The fix is always in code, usually one line: either call remove_action( 'woocommerce_after_single_product_summary', ... ), or delete the stray do_action() / wp_nav_menu() / get_template_part() from the template.
The one-click way: SimpleReview
Instead of opening your IDE, grepping for the hook, and writing the right remove_action() priority by hand:
- Open the page with the duplicate element.
- Click the SimpleReview extension, then click the duplicate element itself (the second Add-to-cart, the extra footer).
- Type "Remove this duplicate" and click Fix it. SimpleReview walks the rendered DOM back to the PHP template or plugin that emitted it, finds the responsible hook or template include, and opens a PR that removes it — usually a one-line change in your child theme.
Got an Accidental Duplicate Element on Your Site?
Click on it — SimpleReview finds the theme file or plugin hook that emitted it, and opens a PR removing it.
Install SimpleReview Chrome Extension →Prefer a WordPress plugin? Download SimpleReview for WordPress → — installs in 30 seconds, no Chrome required.
Frequently Asked Questions
functions.php snippet, or WP-CLI.vb_duplicate_post snippet from the functions.php section above into your child theme — it adds a proper Duplicate row action and copies taxonomies and post meta.wp post get <ID> --field=post_content | wp post create --post_type=page --post_title='Copy' --post_status=draft --post_content=- clones the body. For a full clone including meta and taxonomies, loop wp post meta list into wp post meta add — there's a ready-to-paste script in the WP-CLI section above.remove_action() or remove the stray do_action() / template include. SimpleReview can do this from a single click on the element itself.