How to Duplicate a Page in WordPress (4 Simple Ways)
WordPress has no built-in button to duplicate a page or post. That is a long-standing gap, and it trips up almost everyone the first time they need to copy a layout, reuse a template, or draft a revision without touching the live version.
Below are four ways to duplicate a page in WordPress. Pick the one that matches how much you want to install and how technical you are willing to get.
1. Duplicate a Page With a Plugin (Easiest)
For most people, a plugin is the right answer. It adds a one-click "Clone" or "Duplicate" link right inside your admin, and it copies everything: content, blocks, custom fields, featured image, and page template.
The most trusted option is Yoast Duplicate Post (listed in the directory as "Yoast Duplicate Post & Page"). Here is how to use it:
- Go to Plugins > Add New in your WordPress dashboard.
- Search for Yoast Duplicate Post, then click Install Now and Activate.
- Open Pages > All Pages (or Posts > All Posts).
- Hover over any page in the list. You will see new links: Clone and New Draft.
- Click Clone to create an instant copy, or New Draft to create a copy and open it in the editor.
Clone drops a duplicate straight into your list as a draft. New Draft does the same but opens it so you can start editing right away. Both keep the original untouched.
Other solid choices include Duplicate Page by mndpsingh287 and Duplicate Page and Post. They all work the same way. If you only ever need to copy whole pages, any of them is fine.
2. Copy and Paste Blocks (No Plugin Needed)
If you would rather not install anything, the block editor lets you copy every block from one page and paste them into another. This copies the content, though not the page settings, featured image, or custom fields.
- Open the page you want to copy in the block editor.
- Click the Options menu (the three vertical dots, top right of the editor).
- Choose Copy all blocks. WordPress copies the entire layout to your clipboard.
- Create a new page under Pages > Add New.
- Click into the editor and paste with Ctrl + V (or Cmd + V on Mac).
Every block, including its styling, lands in the new page. This is handy for a single one-off copy when installing a plugin feels like overkill.
You can also duplicate a single block without leaving the page. Select a block, open its toolbar menu, and choose Duplicate. That covers the common case of reusing one section rather than a whole page.
3. Add a Duplicate Link With Code (For Developers)
If you maintain the site yourself and prefer not to add a plugin, you can register your own duplicate link. Add this snippet to your child theme's functions.php or, better, a small custom plugin or a code snippets plugin so it survives theme updates.
function wpprodevs_duplicate_post_as_draft() {
if ( empty( $_GET['post'] ) || ! current_user_can( 'edit_posts' ) ) {
wp_die( 'No post to duplicate or insufficient permissions.' );
}
check_admin_referer( 'wpprodevs_duplicate_' . absint( $_GET['post'] ) );
$post_id = absint( $_GET['post'] );
$post = get_post( $post_id );
if ( ! $post ) {
wp_die( 'Original post not found.' );
}
$new_post_id = wp_insert_post( array(
'post_title' => $post->post_title . ' (copy)',
'post_content' => $post->post_content,
'post_status' => 'draft',
'post_type' => $post->post_type,
'post_author' => get_current_user_id(),
) );
// Copy taxonomies.
foreach ( get_object_taxonomies( $post->post_type ) as $taxonomy ) {
$terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
wp_set_object_terms( $new_post_id, $terms, $taxonomy );
}
// Copy meta fields.
$meta = get_post_meta( $post_id );
foreach ( $meta as $key => $values ) {
foreach ( $values as $value ) {
add_post_meta( $new_post_id, $key, maybe_unserialize( $value ) );
}
}
wp_safe_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
exit;
}
add_action( 'admin_action_wpprodevs_duplicate', 'wpprodevs_duplicate_post_as_draft' );
function wpprodevs_duplicate_link( $actions, $post ) {
if ( current_user_can( 'edit_posts' ) ) {
$url = wp_nonce_url(
admin_url( 'admin.php?action=wpprodevs_duplicate&post=' . $post->ID ),
'wpprodevs_duplicate_' . $post->ID
);
$actions['duplicate'] = '<a href="' . esc_url( $url ) . '">Duplicate</a>';
}
return $actions;
}
add_filter( 'page_row_actions', 'wpprodevs_duplicate_link', 10, 2 );
add_filter( 'post_row_actions', 'wpprodevs_duplicate_link', 10, 2 );
This adds a Duplicate link to both the Pages and Posts list tables. Click it and WordPress creates a draft copy with the content, taxonomies, and meta fields, then opens it in the editor. The nonce check keeps the action from being triggered by a malicious link.
4. Duplicate a Custom Post Type (CPT)
The snippet above already handles custom post types, because it reads $post->post_type and inserts the copy under the same type. The row-action links, though, only attach to standard pages and posts.
To show the Duplicate link on a custom post type list, point the filter at that type's table. WordPress has no {post_type}_row_actions hook, so use the generic post_row_actions filter, which fires for every non-page post type including CPTs:
add_filter( 'post_row_actions', 'wpprodevs_duplicate_link', 10, 2 );
That single filter covers products, portfolio items, events, and any other registered post type. If you use Yoast Duplicate Post instead, open Settings > Duplicate Post, switch to the Permissions tab, and tick the post types you want enabled. Custom fields and taxonomies carry over the same way they do for pages.
Which Method Should You Use?
If you are not a developer and you want a button that copies everything, install Yoast Duplicate Post. It takes two minutes and handles pages, posts, and CPTs. If you need a quick one-off copy and do not want another plugin, use Copy all blocks in the editor. If you run the site, dislike extra plugins, and want full control over what gets copied, drop in the code snippet. For custom post types at scale, either the plugin or the snippet works, depending on whether you prefer settings or code.
Duplicating a page sounds trivial, and for content it is. Where teams get burned is forgetting that block copy and paste leaves the SEO meta, featured image, and page template behind. The plugin and the snippet copy those too, which is why they are worth the small setup. Keeping those plugins updated and tested is part of any healthy WordPress maintenance routine, and a duplicate page left in draft is also one more thing to prune when you speed up your WordPress site.
Building something more involved and want it done properly? Get in touch. This is exactly the kind of WordPress work we handle every day.
