How to Duplicate a Page or Post in WordPress

How to Duplicate a Page or Post in WordPress

How to Duplicate a Page or Post in WordPress

In WordPress, there are several ways to replicate a post or page. This goes beyond simply copying and pasting text. When changing or rebuilding your website, you may save the page template, SEO data, photos, and other information to save time and effort. In WordPress, it is simple to clone pages, articles, and all associated data. You can do the task with or without a plugin. This article will demonstrate how to properly clone pages or posts, as well as present plugins that may be useful. Let’s get this party started!

Duplicate a Page or Post in WordPress With a Plugin

When you utilize a WordPress plugin, cloning a page in WordPress is really straightforward because everything is done directly in your dashboard. Because you won’t be affecting your site’s code directly, plugins are also the safest approach to replicate a post or page.

If you’re seeking for the ideal tool, here are three¬†plugins to consider.

1. Duplicate Page

2+ million Active Installations

With a simple click, you can simply duplicate posts, pages, and custom posts. You may clone your pages, articles, and custom posts with a single click and they will be saved as your chosen alternatives (draft, private, public, pending).

2. Yoast Duplicate Post

4+ million Active Installations

Yoast’s Duplicate Post plugin is a popular choice for this reason. You may clone comments, slugs, menu order, and much more in addition to duplicating articles or pages.

3. Duplicate Page and Post

100,000+ million Active Installations

The Duplicate page and post plugin allows you to generate clones of pages or posts. You may replicate pages, articles, and custom posts with a single click and save them as drafts.
Duplicate page and post lacks many of the capabilities found in other plugins, however it is extremely quick in comparison.

Duplicate a Page or Post in WordPress Without a Plugin

Aside from utilizing plugins, you may duplicate posts and pages by adding code to your functions.php file. You may use an FTP client, an HTML editor, or the built-in WordPress file editor to activate a duplicate link.

I highly recommend you to try this method on a staging website (Testing website) before you add the following code to your functions.php file on your live website

To replicate a post on a WordPress website, add the following code into your functions.php file:

/*
 * Function to enable you to clone WordPress posts and pages.
 */
function duplicate_post_page(){
	global $wpdb;
	if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'duplicate_post_page' == $_REQUEST['action'] ) ) ) {
		wp_die('No post to duplicate has been supplied!');
	}
 
	/*
	 * Nonce verification
	 */
	if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) )
		return;
 
	/*
	 * get the original post id
	 */
	$post_id = (isset($_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['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
	 */
	 
	 $new_post_author = $post->post_author;
 
	/*
	 * if post data exists, create the post duplicate
	 */
	if (isset( $post ) && $post != null) {
 
		/*
		 * 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($post->post_type); // returns array of taxonomy names for post type, ex array("category", "post_tag");
		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 just in two SQL queries
		 */
		$post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
		if (count($post_meta_infos)!=0) {
			$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
			foreach ($post_meta_infos as $meta_info) {
				$meta_key = $meta_info->meta_key;
				if( $meta_key == '_wp_old_slug' ) continue;
				$meta_value = addslashes($meta_info->meta_value);
				$sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'";
			}
			$sql_query.= implode(" UNION ALL ", $sql_query_sel);
			$wpdb->query($sql_query);
		}
 
 
		/*
		 * finally, redirect to the edit post screen for the new draft
		 */
		wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
		exit;
	} else {
		wp_die('Post creation failed, could not find original post: ' . $post_id);
	}
}
add_action( 'admin_action_duplicate_post_page', 'duplicate_post_page' );
 
/*
 * Add the duplicate link to action list for post_row_actions
 */
function rd_duplicate_post_link( $actions, $post ) {
	if (current_user_can('edit_posts')) {
		$actions['duplicate'] = '<a href="' . wp_nonce_url('admin.php?action=duplicate_post_page&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate this item" rel="permalink">Clone</a>';
	}
	return $actions;
}
 
add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'rd_duplicate_post_link', 10, 2 );