How to Duplicate WordPress Page/Post Easily

duplicate content in wordpress

Duplicating your existing content of pages or posts can be useful in many situations. You can use the main post/page as a template and quickly complete your task. Can you think how much time it would cost if you had to recreate the contents of the same page/post?

Well, I can’t imagine that. Thankfully, there are ways to duplicate content in WordPress page/post.

In this post, I am going to show you how to duplicate WordPress page/post instantly. 

Let’s start, then.

Why Duplicate WordPress Page/Post?

Duplicate Content in WordPress With The Help of a Plugin

There are a couple of plugins like-

  1. Duplicate Page,
  2. Post Duplicator,
  3. Duplicate page and Post,
  4. Page and Any Custom Post;  

that help you to duplicate WordPress page/post instantly. But the most popular one is the Yoast Duplicate Post.

At first, install and activate the Yoast Duplicate Post plugin from the WordPress plugins directory. 

From the dashboard, go to Post -> All Post. (For duplicating a page go to Pages -> All Pages)

Now Hover your cursor on any post, and you will see two new options – ‘Clone and New Draft.’

Now click on the clone button to duplicate the post. 

However, if you would like to create a clone and immediately open it in the post editor, click on the ‘New Draft’ button. 

Duplicate Content in WordPress Without a Plugin

If you don’t want an increase in the number of installed plugins, you can follow this method. It’s very simple; all you have to do is copy some codes to the function.php file, and then you will be able to duplicate WordPress pages/posts very easily.

Note: Before editing any of the WordPress files, it is recommended to back up your website first. 

At first, navigate to Appearance -> Theme Editor and click on ‘Theme Functions.’ Now copy the following code and paste it here. 

/*
 * Function for post duplication. Dups appear as drafts. User is redirected to the edit 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( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );

Don’t forget to Update the File. 

The above code will work for duplicating posts. If you want to duplicate pages, just replace the last line with the following code:

add_filter('page_row_actions', 'rd_duplicate_post_link', 10, 2);

Final Words

I hope now you have got an easy way to duplicate WordPress page/post. It doesn’t matter whether you use a plugin or not; you will get the same result both ways. If you have any questions or suggestions, let me know in the comment box below. 

Was this helpful?

Thanks for your feedback!

Leave a Reply

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

Introducing New Table Block Plugin - Tableberg

X
Need help?