While content needs creativity, the look and feel of your site needs a consistent layout and color profile.
When to Clone Pages/Posts in WordPress?
These are popular use cases when you need to clone a page, post or custom post type in WordPress.
- You want to keep a page/post backup so that you can make changes on the primary ones. Even in some popular themes, the page and post revisions don’t work as expected. So creating a replica can help retrieve the previous content.
- You want to create a new page/post with the previously saved layout so that you only need to swap the content. Then you can publish the new page/post with fresh content and keeping your favored structure.
Duplicate Page Using a WordPress Plugin
Not all plugin is created equal. Some firstborn plugins got a large user base while new-born plugins have a more humble amount. If simplicity is your top priority, then WP Duplicate Page is the plugin you need to clone page, post, and even a custom post type.
So I’m going ahead to install and activate it.
Next, go to Settings > Duplicate Page > here I can adjust some additional settings:
- User roles: tick the user roles that you want them to see Duplicate button
- Post types: including post, pages, blocks, custom post types created by the 3rd party plugins you’re using
- Custom text: fill your own text for duplicate – can be clone, copy, new draft, dupliquer, or words in your languages
Then you need to click Save changes to make it happen.
When you access All posts, you’ll see a new button with the custom text. Clicking on that will make a new draft which is a replica of that post.
WP Duplicate Page is a stable and light-weight plugin. You just have to set up once and leave it that way.
In the next section, I’m showing you how to enable WordPress page/post copy without a plugin.
Duplicate Page Without a Plugin
Caution: Theme code modification required.
Here we provide you with a snippet of code that helps enable a Duplicate button at each page/post — just like the plugin above does!
/*
* Function creates post duplicate as a draft and redirects then to the edit post screen
*/
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('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,
* 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, 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_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );
/*
* 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=rd_duplicate_post_as_draft&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate this item" rel="permalink">Duplicate</a>';
}
return $actions;
}
add_filter('page_row_actions', 'rd_duplicate_post_link', 10, 2);
Here’s exactly what you need to do:
- Navigate to your WordPress file directory using FTP or a file manager plugin
- Find the theme’s functions PHP file
- Open wp-content > themes > choose your current active theme > functions.php
- (Alternative way: go to Appearance > Theme Editor > functions.php)
- Paste the code snippet and save changes
To make it work with child theme, you might need to adjust the filter at the last line:
add_filter( 'post_row_actions', 'rd_duplicate_post_link', 9999, 2 );
The snippet should work well in most cases. However, it might not cover all the aspects of your current WordPress site. If it doesn’t work, make sure to clear the code and maybe it’s time to reach out for a plugin.
Tried and tested plugins to copy a WordPress page:
- WP Duplicate Page – clean UI/UX plugin that allows you to set user roles and post types
- WP Post Page Clone – a simple plugin to add a clone option to page/post
- Duplicate Page and Post – allows you to set default status, post editor, and redirect options
Bottom Line
The content creation process doesn’t have to be repetitive tasks.
Depending on the theme you use, you’ll have various options to create reusable blocks, save page templates, or global design. Be sure to check out if your theme already comes with those options so that you don’t have to rely on another plugin.
If you have better solutions other than these, don’t hesitate to leave comments and let us know!