How to Duplicate a Page or Post in WordPress 💥
A page or post can be duplicated in WordPress. This is more than just copying and pasting content. To save time and effort when updating or redesigning your website, you can retain the page template, SEO data, images, and other information. It is easy to duplicate pages, posts, and all associated data in WordPress. You can do the job with or without a plugin. This article will show you how to safely clone pages or posts, and also introduce plugins that may help. Let's get started!
Advertisement
Duplicate Page in WordPress with Plugins
A plugin makes it easy to clone a page in WordPress. Everything is done in your dashboard. Because plugins don't modify your site's code, they are the best way to duplicate a page or post. These plugins are worth looking at if you are searching for the right tool.
1. Duplicate Post
Duplicate Post is a popular choice for WordPress page or post cloning. The plugin is simple to use and copies everything, from the post or page content to the comments. You can also choose to use a prefix or suffix to distinguish between the original post and the clone.
You can easily duplicate a post using this tool by simply:
- Install the plugin and activate it.
- Go to Posts > All for cloning posts or pages > For cloning pages.
- To copy the page or post that you are looking for, navigate to it and click Clone.
- You can select multiple pages or posts and you can clone all of them at once with Bulk actions.
2. Duplicate Page
Duplicate Page has a few extra features that other cloning software doesn't offer. This plugin can duplicate pages, posts, and custom post types. You can also save the resulting copies in drafts as pending, public, and private.
You can easily duplicate a post using this tool by simply:
- Install the plugin and activate it.
- You can customize the settings to suit your needs.
- To find the content that you are looking for, go to pages > All and Posts > all.
- Click on the Copy This option.
3. Duplicate Page and Post
Duplicate Page and Post doesn't have many features but it makes up for this in speed. This plugin is lightweight and fast. It won't slow down your site with too many options.
You can easily duplicate a post using this tool by simply:
- Install the plugin and activate it.
- You can find the Posts All and Pages All depending on what you are trying to duplicate.
- Click on the page or post that you wish to clone.
- Click on the Duplicate button.
Duplicate Page in WordPress without Plugins
To clone a WordPress page or post, you don’t need to use a plugin. You can also do this manually by editing the functions.php file, or copying and pasting relevant code. Let's take a look at both of these methods.
1. Enabling Cloning via functions.php
Editing the code in your function.php file is one way to clone WordPress pages or posts. Although this is a simple task, you should be careful and create a backup copy of your website before doing so. You will need to access the functions.php folder and open it for editing. You will then need to add this code snippet at the end of your file.
/*
* Function to post duplicate. Dups appear like drafts. The edit screen is displayed.
*/
function rd_duplicate_post_as_draft(){
global $wpdb;
if (! ( isset( $_GET['post']) || isset( $_POST['post']) || ( isset($_REQUEST['action']) && 'rd_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) {
wp_die('There has not been a post to duplicate.!');
}
/*
* verification of nonce
*/
if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) )
return;
/*
* obtain the original post ID
*/
$post_id = (isset($_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
/*
* and the rest of the original post data next
*/
$post = get_post( $post_id );
/*
* If you do not want the current user to become the,
* new author of your post, change lines to this: $new_post_author = $post->post_author;
*/
$current_user = wp_get_current_user();
$new_post_author = $current_user->ID;
/*
* if post data is there, create a 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 post with the wp_insert_post() function
*/
$new_post_id = wp_insert_post( $args );
/*
* get all the current post terms then point 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);
}
/*
* duplicating all the post meta just in 2 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);
}
/*
* at last, redirecting to the editing of post screen for its 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_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );
/*
* Add the duplicated link to the action list for the 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=rd_duplicate_post_as_draft&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate this item" rel="permalink">Duplicate</a>';
}
return $actions;
}
add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
That was only for posts so far. To be able to do the same for pages, use the same code once again in your functions.php but replace the last line (108) by:
add_filter('page_row_actions', 'rd_duplicate_post_link', 10, 2);
2. Copy a page just by hand
First of all this method is very simple and not so effective. I wanted to show it any way... Go to any page or post. Important is that it has not yet been edited with Elementor or any other pagebuilder, otherwise this method will not work any longer.
- Click on the Options button (three vertical dots in the upper-right corner).
- From the Options menu, press the "Copy All Content" button
You can now create a new post or page and copy the elements. After making some changes, you can save the draft as a draft. You can even save it in a document file (Microsoft Word or Google Docs) to make it easier for future reference.
You can only copy the elements on the page, such as images and text, using this method. You cannot copy elements below the hood, such as title, SEO Data, meta description, title tags andalt tags.
Be wise and install one of them plugins for it as it is the easiest way and also editing your functions.php does only survive theme-upgrades when you are using a child theme.
Advertisement