Migrate to RunxBuild and earn up to $50 in hosting credit on your first deposit.

Calculate your savings
unxBuild

How to Duplicate a Page in WordPress, With and Without a Plugin

Sean

Platform Writer

Aug 10, 2026
7 min read

The quickest way to duplicate a page in WordPress with no plugin: open the page, select all blocks with Control+A, copy, create a new page, and paste. That copies the content. What it does not copy is the featured image, custom fields, template assignment, or SEO metadata — which is usually the half you actually cared about.

How to Duplicate a Page in WordPress, With and Without a Plugin

WordPress has no built-in duplicate button, which is odd given how often people want one. There are four ways to do it and they differ mainly in how much of the page’s non-content data comes along. Choosing by that criterion rather than by convenience saves the rebuild.

Table of contents

The no-plugin method, and what it misses

  1. Open the page you want to copy in the block editor.
  2. Click inside the content area and press Control+A (Command+A on macOS) to select all blocks. Press it twice if the first press only selects text within one block.
  3. Copy with Control+C.
  4. Create a new page and paste with Control+V.

The blocks arrive intact, including their settings and layout. For a straightforward content page this is all you need and it takes fifteen seconds.

There is a cleaner variant for reuse: select the blocks, open the block options menu, and choose Create pattern (called Reusable block in older versions). The saved pattern is then insertable into any page from the block inserter.

What copy-paste does not bring:

  • Featured image
  • Page template assignment
  • Custom fields and ACF data
  • SEO title, meta description, and social metadata
  • Page attributes — parent page, menu order
  • Categories and tags, on post types that use them
  • Page builder data stored outside post_content

That last one matters more than it sounds. Elementor, Divi, and similar builders store their layout in post meta, not in post_content — so copy-paste in the block editor produces an empty page. For a builder-made page you need one of the methods below.

Duplicate plugins, which is what most people should use

A duplication plugin adds a Duplicate link to the Pages list and copies everything, including post meta. This is the right answer for anyone doing it regularly.

What to look for when picking one:

  • Copies post meta, which is what makes custom fields and builder data survive.
  • Creates the copy as a draft, so you never publish a duplicate by accident.
  • Supports custom post types, not just pages and posts.
  • Lets you restrict who can duplicate, by role.
  • Is actively maintained. This category has a lot of abandoned plugins, and an unmaintained one that touches post creation is not something to leave installed.

A duplicated page shares its content with the original, which is a duplicate-content problem if both get published. Keep the copy as a draft while you edit it, and if you genuinely need both live, set a canonical URL on the copy pointing at the original.

The honest counterpoint: if you duplicate a page twice a year, installing a plugin to do it is not obviously worth the maintenance surface. Use copy-paste or WP-CLI instead.

WP-CLI, which copies everything and needs no plugin

If you have shell access, this is the most complete method and it leaves nothing installed behind.

# Find the page
wp post list --post_type=page --fields=ID,post_title,post_status

# Duplicate content and core fields into a new draft
wp post create \
  --post_type=page \
  --post_status=draft \
  --post_title="Copy of Services" \
  --post_content="$(wp post get 42 --field=post_content)"

# Copy every meta key across -- this is the part that matters
wp post meta list 42 --format=json \
  | jq -r '.[] | @base64' \
  | while read -r row; do
      key=$(echo "$row" | base64 -d | jq -r '.meta_key')
      val=$(echo "$row" | base64 -d | jq -r '.meta_value')
      wp post meta add 99 "$key" "$val"
    done

Replace 42 with the source ID and 99 with the newly created page’s ID. The meta loop is what carries featured image (_thumbnail_id), template (_wp_page_template), ACF fields, and builder data.

For a whole set of pages — building a staging copy, spinning up a similar site — the export/import pair is faster than duplicating one at a time:

wp export --post_type=page --dir=/tmp
wp import /tmp/*.xml --authors=create

WP-CLI is also the only one of these methods that works when the admin is broken, which makes it worth having access to for reasons well beyond duplication.

A small function, if you want it in the admin without a plugin

Adding a duplicate link yourself is about forty lines and avoids another plugin to maintain. Put it in a site-specific mu-plugin rather than in your theme, so it survives a theme change.

add_filter( 'page_row_actions', function ( $actions, $post ) {
    if ( ! current_user_can( 'edit_posts' ) ) {
        return $actions;
    }
    $url = wp_nonce_url(
        admin_url( 'admin.php?action=rb_duplicate&post=' . $post->ID ),
        'rb_duplicate_' . $post->ID
    );
    $actions['duplicate'] = '<a href="' . esc_url( $url ) . '">Duplicate</a>';
    return $actions;
}, 10, 2 );

add_action( 'admin_action_rb_duplicate', function () {
    $id = isset( $_GET['post'] ) ? absint( $_GET['post'] ) : 0;
    check_admin_referer( 'rb_duplicate_' . $id );

    if ( ! $id || ! current_user_can( 'edit_posts' ) ) {
        wp_die( 'Not allowed.' );
    }

    $post = get_post( $id );
    if ( ! $post ) {
        wp_die( 'Post not found.' );
    }

    $new_id = wp_insert_post( array(
        'post_title'   => $post->post_title . ' (copy)',
        'post_content' => $post->post_content,
        'post_excerpt' => $post->post_excerpt,
        'post_type'    => $post->post_type,
        'post_parent'  => $post->post_parent,
        'menu_order'   => $post->menu_order,
        'post_status'  => 'draft',
        'post_author'  => get_current_user_id(),
    ) );

    // The important part: carry the meta across
    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;
} );

Note check_admin_referer and the capability check. A duplicate action without a nonce is a cross-site request forgery hole — an attacker can make a logged-in editor create posts by loading an image URL. Every snippet you find online for this should have both, and many do not.

maybe_unserialize matters too: get_post_meta with no key returns raw serialised strings, and storing them without unserialising leaves builder data corrupted.

Which one to use

  • Simple content page, one-off → block editor copy-paste. Fastest, nothing installed.
  • Layout you will reuse repeatedly → save it as a block pattern rather than duplicating pages.
  • Page built with a page builder, or with custom fields → a duplicate plugin or WP-CLI. Copy-paste will lose the layout.
  • Many pages at once, or a staging copy → WP-CLI export and import.
  • You duplicate constantly and want it in the admin → a plugin, or the snippet above in an mu-plugin.

The recurring theme is post meta. Anything that lives outside post_content — featured images, templates, ACF, SEO fields, builder layouts — travels only with the methods that copy meta explicitly.

One practical habit regardless of method: duplicate into a draft and check it before publishing. A duplicated page with the original’s SEO title and meta description competes with the page it was copied from, and you will not notice until rankings for both slide.

If you are duplicating pages to build a staging version of a site, the database browser and file manager in RunxBuild’s managed WordPress make the export/import route straightforward without hunting for phpMyAdmin credentials — the WordPress database documentation covers what that reaches.

How this fits the rest of the stack

Copy-paste in the block editor handles simple pages in seconds. Anything with a featured image, a template, custom fields, or a page-builder layout needs a method that copies post meta — a duplicate plugin or WP-CLI. Duplicate into a draft, and fix the SEO fields before publishing so the copy does not compete with the original. If you are pricing WordPress hosting where the database and files are reachable from the dashboard, the RunxBuild hosting calculator shows the plan and database separately.

Useful related references:

FAQ

Does WordPress have a built-in duplicate page feature?

No. The closest built-in method is selecting all blocks in the editor, copying, and pasting into a new page. That copies content but not the featured image, template, custom fields, or SEO metadata.

Why is my duplicated page empty when I use copy-paste?

The page was probably built with a page builder such as Elementor or Divi, which store layout in post meta rather than in post_content. Use a duplicate plugin or WP-CLI, both of which copy meta.

How do I duplicate a page without installing a plugin?

Use WP-CLI: create the new post with wp post create, then loop over wp post meta list from the source and add each key to the new post. That carries featured image, template, and custom fields across.

Will a duplicated page hurt my SEO?

It can if both are published with the same content and metadata. Keep the copy as a draft while editing, and if both must be live, set a canonical URL on the copy pointing at the original.

Is it safe to use a duplicate post plugin?

Generally yes, but this category has many abandoned plugins. Choose one that is actively maintained, creates copies as drafts, and lets you restrict the capability by role.

#how to duplicate a page in wordpress#wordpress pages#wp-cli#custom fields#post meta