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.

mysite.com/wp-admin/edit.php?post_type=page
SimpleReview extension
⚠ No "Duplicate" action on Pages list
Row actions on every page: Edit · Quick Edit · Trash · View
no duplicate_post_as_draft hook registered
WordPress 6.9 · Pages (4) · admin/edit.php?post_type=page
PostsPagesPlugins
✓ Duplicate action added · Pricing — Copy saved as Draft
Pages Add New Page
Pricing — Copy DRAFT Edit · Quick Edit · Duplicate · Trash · View
Home Edit · Quick Edit · Duplicate · Trash · View
About Us Edit · Quick Edit · Duplicate · Trash · View
Pricing Edit · Quick Edit · Duplicate · Trash · View
Contact Edit · Quick Edit · Duplicate · Trash · View
Comment×
Add Duplicate action|
Fix it ✓ Done
waiting for selection…
Detected
Missingduplicate_post_as_draft
Hookpage_row_actions
Fix plan
Add 28-line hook to child-theme functions.php (page_row_actions + admin_action_duplicate_post_as_draft)
Result
Duplicate action on all post types. No plugin. Child-theme safe.
✓ PR opened
feat: add Duplicate row action
functions.php · +28 lines
Click SimpleReview → add missing row action → Fix it → one-click page clone · no plugin
Need to clone a page for a landing-page test or a locked draft? Scroll down. Got two Add-to-cart buttons, two menus, or duplicate checkout fields you can't find in wp-admin? → SimpleReview lets you click the duplicate, describe what to remove, and opens a one-line PR against the responsible theme or plugin file.

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.php snippet that adds a Duplicate row action and calls wp_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 stray do_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.

  1. Open the source page in the block editor (Pages → All Pages → click the title).
  2. Click the three-dot Options menu in the top-right toolbar.
  3. Choose Copy all blocks. All blocks go to your clipboard as serialized block markup.
  4. 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.
  5. Set the title, featured image, categories, and save as draft.
Good for: one-off clones of a long-form page where you mostly care about the content layout. Not good for: pages with complex custom fields, ACF data, or Yoast SEO settings you want to preserve.

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.

  1. Go to Plugins → Add New, search for Yoast Duplicate Post, click Install, then Activate.
  2. 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).
  3. 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).
  4. 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

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;
}
Test on staging first. 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?

ScenarioBest methodWhy
One-off clone, simple pageBlock editor "Copy all blocks"Zero plugins, 4 clicks
Everyday editorial workYoast Duplicate PostClone + New Draft row actions, configurable, stable
Minimalist stack (no new plugin)functions.php snippet25 lines, full feature set, ships in child theme
Bulk / scripted / headlessWP-CLILoops, shell pipes, no browser needed
Custom post type with ACFYoast Duplicate Post or Post DuplicatorKnown-good ACF handling
WooCommerce productProducts → 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:

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:

  1. Open the page with the duplicate element.
  2. Click the SimpleReview extension, then click the duplicate element itself (the second Add-to-cart, the extra footer).
  3. 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

Does WordPress have a built-in Duplicate Page button?
No. As of WP 6.9 the closest native option is Copy all blocks inside the block editor's Options menu — that copies the body markup but not the title, featured image, categories, or SEO meta. For a true clone use Yoast Duplicate Post, a functions.php snippet, or WP-CLI.
What is the best free plugin to duplicate a page in WordPress?
Yoast Duplicate Post — 4M+ installs, maintained by Yoast, free with no paid tier. Adds Clone and New Draft links to every page, post, and custom post type row. Supports bulk cloning from the Bulk Actions dropdown.
How do I duplicate a page without a plugin?
Either open the page in the block editor and use Options → Copy all blocks, paste into a new page, then re-set the title and meta. Or drop the 25-line 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.
Can I duplicate a page with WP-CLI?
Yes. 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.
How do I remove a duplicate page from WordPress?
If it's an extra row in the database, Pages → All Pages → Trash. If it's a duplicate element rendered on the front-end (two footers, two Add-to-cart buttons), that's a code fix — either remove_action() or remove the stray do_action() / template include. SimpleReview can do this from a single click on the element itself.

Related WordPress Guides

Sources