I have a custom post type with over 100 posts. I want to create another custom post type and have the same posts with the same post titles. Is there a simple DB query that will allow me to do this, or am i stuck with having to re-create each post?

1 Answer 1


Backup your database

You can do this pretty easily. I created a proof-of-concept for you to try out. I would backup the database before running this.

Run the plugin

Configure the plugin by setting $post_type_1 and $post_type_2 variables to your source and destination post types.

To run this plugin, you need to be logged in as an administrator. Then, visit:


Plugin Name: Post Duplicator
Description: Duplicate posts to a new post type
Version: 0.1
Author: WPSE
Author URI: http://wordpress.stackexchange.com
License: GPL2

add_action('admin_init', 'foo_duplicate_posts', 99999);
function foo_duplicate_posts(){

    # Only allow admins to run the script

    # Check if keyword is set

    # Check if keyword matches
    if($_GET['duplicate-posts'] !== 'magic-password')

    global $wpdb;

    # Configure post types
    $post_type_1 = 'foo';
    $post_type_2 = 'bar';

    $query = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_type = '%s'", $post_type_1);
    $posts = $wpdb->get_results($query, ARRAY_A);
    foreach($posts as $post){

        # Post info is already stored in an array
        # Set the post_type to the new post type
        $post['post_type'] = $post_type_2;

        # Insert new post
        $new_post = wp_insert_post($post);

        # Proceed if new post was created
            # Print a success message to the screen
            show_message("{$post['post_title']} was duplicated from #$post['ID'] to #$new_post");

            # Get source post's post meta
            $post_meta = get_post_custom($post['ID']);

            # Convert all postmeta to new post
                foreach($post_meta as $k => $v)
                    update_post_meta($new_post, $k, $v[0]);
            # Print an error message to the screen
            show_message("{$post['post_title']} was not duplicated.");
    # Stop the admin area from loading to get a clean reading of our output messages

This plugin accounts for the basic post information and its postmeta. It does not account for revisions, auto-drafts, or attachments. You can run similar loops within the foreach loop to duplicate those sub post types.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.