How to Duplicate a Page or Post in WordPress

Do you want to duplicate a page in WordPress? Several reasons might lead you to duplicate a page in WordPress. Making copies of your pages during website creation makes it easier to go live. Duplicating pages and posts in WordPress isn’t just about copying and pasting. You can also save time when you revamp your website by having a copy of your page template, SEO info, and graphics. 

If you want to duplicate a WordPress page, there are several ways to do it. Therefore, this article will shed some light on how to duplicate a page in WordPress. Let’s dive in.

What is the Purpose of Duplicating a Page in WordPress?

Blogging for some time can sometimes lead to rapid duplication of posts and pages. One example would be to expand an older article or to reuse content from a sales page that already contains a lot of content.

You can copy and paste the post’s or page’s content into a new draft. You don’t get your featured image, SEO settings, post settings, or anything else copied. What if you could duplicate page in WordPress with all its settings and content automatically? Wouldn’t that be awesome?

When you use this method, you can edit a post right away and get started working.

How to Duplicate a WordPress Page

When duplicating a page in WordPress, there are two ways. You can do this with or without a WordPress plugin. As we move forward, we will look closely at both methods.

Duplicate a Page or Post in WordPress Using Plugin

The first step is to install and activate the Duplicate Post plugin. Activate the plugin and go to the Posts » All Posts page on your WordPress dashboard. You will see two new links in each post title to create a new draft or clone the one you already have.

duplicate post

If you select “Clone,” you’ll generate a duplicate post, but it won’t appear in your post editor. Selecting “New Draft” will duplicate and open the post in the post editor, so you can quickly edit it. When you duplicate a page in WordPress, the same options are available.

There’s no doubt that the duplicate post plugin works great. If you want to use it mainly for modifying previously published posts, there is a better way. Plugins like this shine when it comes to remaking websites, replicating landing pages, etc.

Duplicate Post Plugin Customization

Duplicate posts support posts and pages by default right out of the box. Furthermore, you can customize the plugin for specific post types, set user roles, and determine what is copied when creating duplicates. We’ll now examine each setting in detail.

Configure plugin settings under Settings » Duplicate Post.

Duplicate post settings
Duplicate post settings

On the settings page, there are three tabs. Using the first tab, you can select what you would like to duplicate.

Most websites will likely work with the default settings. However, you can select the objects you want to duplicate and deselect those you do not.

Next, you must click on the permissions tab. 

The plugin permits editors and administrators to make duplicate postings by default. The duplicate post feature is also available for page post types and posts.

If your website uses custom post types, these types will appear here. You can do so if you want to enable the duplicate post feature for those post types.

When you click Display, you can choose where your cloned posts will appear. It displays them by default on the edit screen, post list, and admin bar. Remember to click the Save Changes button to save your settings.

Page Duplication in WordPress without Plugins

If you wish to duplicate a WordPress page, you can do this also without using duplicate post plugins. You can duplicate WordPress pages or posts by editing your function.php file. 

Even though this is a straightforward task, you should take precautions and make a backup of your website first. It is necessary to access the functions.php folder so you can edit it. At the end of the file, you must add the following code snippet:

/**
 * @snippet  Duplicate posts and pages without plugins
 * @author   Misha Rudrastyh
 * @url      https://rudrastyh.com/wordpress/duplicate-post.html
 */

// Add the duplicate link to action list for post_row_actions
// for "post" and custom post types
add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
// for "page" post type
add_filter( 'page_row_actions', 'rd_duplicate_post_link', 10, 2 );


function rd_duplicate_post_link( $actions, $post ) {

	if( ! current_user_can( 'edit_posts' ) ) {
		return $actions;
	}

	$url = wp_nonce_url(
		add_query_arg(
			array(
				'action' => 'rd_duplicate_post_as_draft',
				'post' => $post->ID,
			),
			'admin.php'
		),
		basename(__FILE__),
		'duplicate_nonce'
	);

	$actions[ 'duplicate' ] = '<a href="' . $url . '" title="Duplicate this item" rel="permalink">Duplicate</a>';

	return $actions;
}

/*
 * Function creates post duplicate as a draft and redirects then to the edit post screen
 */
add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );

function rd_duplicate_post_as_draft(){

	// check if post ID has been provided and action
	if ( empty( $_GET[ 'post' ] ) ) {
		wp_die( 'No post to duplicate has been provided!' );
	}

	// Nonce verification
	if ( ! isset( $_GET[ 'duplicate_nonce' ] ) || ! wp_verify_nonce( $_GET[ 'duplicate_nonce' ], basename( __FILE__ ) ) ) {
		return;
	}

	// Get the original post id
	$post_id = absint( $_GET[ 'post' ] );

	// And all the original post data then
	$post = get_post( $post_id );

	/*
	 * if you don't want current user to be the new post author,
	 * then change next couple of lines to this: $new_post_author = $post->post_author;
	 */
	$current_user = wp_get_current_user();
	$new_post_author = $current_user->ID;

	// if post data exists (I am sure it is, but just in a case), create the post duplicate
	if ( $post ) {

		// new post data array
		$args = array(
			'comment_status' => $post->comment_status,
			'ping_status'    => $post->ping_status,
			'post_author'    => $new_post_author,
			'post_content'   => $post->post_content,
			'post_excerpt'   => $post->post_excerpt,
			'post_name'      => $post->post_name,
			'post_parent'    => $post->post_parent,
			'post_password'  => $post->post_password,
			'post_status'    => 'draft',
			'post_title'     => $post->post_title,
			'post_type'      => $post->post_type,
			'to_ping'        => $post->to_ping,
			'menu_order'     => $post->menu_order
		);

		// insert the post by wp_insert_post() function
		$new_post_id = wp_insert_post( $args );

		/*
		 * get all current post terms ad set them to the new post draft
		 */
		$taxonomies = get_object_taxonomies( get_post_type( $post ) ); // returns array of taxonomy names for post type, ex array("category", "post_tag");
		if( $taxonomies ) {
			foreach ( $taxonomies as $taxonomy ) {
				$post_terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
				wp_set_object_terms( $new_post_id, $post_terms, $taxonomy, false );
			}
		}

		// duplicate all post meta
		$post_meta = get_post_meta( $post_id );
		if( $post_meta ) {

			foreach ( $post_meta as $meta_key => $meta_values ) {

				if( '_wp_old_slug' == $meta_key ) { // do nothing for this meta key
					continue;
				}

				foreach ( $meta_values as $meta_value ) {
					add_post_meta( $new_post_id, $meta_key, $meta_value );
				}
			}
		}

		// finally, redirect to the edit post screen for the new draft
		// wp_safe_redirect(
		// 	add_query_arg(
		// 		array(
		// 			'action' => 'edit',
		// 			'post' => $new_post_id
		// 		),
		// 		admin_url( 'post.php' )
		// 	)
		// );
		// exit;
		// or we can redirect to all posts with a message
		wp_safe_redirect(
			add_query_arg(
				array(
					'post_type' => ( 'post' !== get_post_type( $post ) ? get_post_type( $post ) : false ),
					'saved' => 'post_duplication_created' // just a custom slug here
				),
				admin_url( 'edit.php' )
			)
		);
		exit;

	} else {
		wp_die( 'Post creation failed, could not find original post.' );
	}

}

/*
 * In case we decided to add admin notices
 */
add_action( 'admin_notices', 'rudr_duplication_admin_notice' );

function rudr_duplication_admin_notice() {

	// Get the current screen
	$screen = get_current_screen();

	if ( 'edit' !== $screen->base ) {
		return;
	}

    //Checks if settings updated
    if ( isset( $_GET[ 'saved' ] ) && 'post_duplication_created' == $_GET[ 'saved' ] ) {

		 echo '<div class="notice notice-success is-dismissible"><p>Post copy created.</p></div>';
		 
    }
}

After saving, you can upload the file again to your server. Go back to your WordPress dashboard. You should now see a Duplicate button when hovering over a page or post.

The Takeaway

That’s it for today’s discussion on duplicating a page in WordPress. It’s a great way to simplify your workflow if you run a busy blog or have conversion-optimized sales pages.

You can duplicate your current content with just one click with the Duplicate Post plugin. However, you can still do it without a duplicate plugin. We have discussed both methods in the article. We hope this article will be useful to you in learning how to duplicate a WordPress page.

Leave a Reply

Your email address will not be published. Required fields are marked *