Webstick.blog logo Wordpress, Design, SEO, Speed blog

How to Duplicate a Page or Post in WordPress 💥

Duplicate a Page 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!

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:

  1. Install the plugin and activate it.
  2. Go to Posts > All for cloning posts or pages > For cloning pages.
  3. To copy the page or post that you are looking for, navigate to it and click Clone.
  4. 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:

  1. Install the plugin and activate it.
  2. You can customize the settings to suit your needs.
  3. To find the content that you are looking for, go to pages > All and Posts > all.
  4. 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:

  1. Install the plugin and activate it.
  2. You can find the Posts All and Pages All depending on what you are trying to duplicate.
  3. Click on the page or post that you wish to clone.
  4. 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 funtions.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 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 );

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);

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.



This link gives you today 20% off on the Divi Theme!

Divi



Scroll up