Last active
January 18, 2017 19:30
-
-
Save vincentorback/aa155d1bd8bb2e749c18ff50bc4ccae9 to your computer and use it in GitHub Desktop.
Adds and action in the WordPress admin to duplicate pages and posts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Function creates post duplicate as a draft and redirects then to the edit post screen | |
*/ | |
function duplicate_post_as_draft() { | |
global $wpdb; | |
if (!(isset($_GET['post']) || isset($_POST['post']) || (isset($_REQUEST['action']) && 'duplicate_post_as_draft' == $_REQUEST['action']))) { | |
wp_die('No post to duplicate has been supplied!'); | |
} | |
/* Get the original post id */ | |
$post_id = (isset($_GET['post']) ? absint($_GET['post']) : absint($_POST['post'])); | |
/* Get the original post data */ | |
$post = get_post($post_id); | |
/* Set post author to current user */ | |
$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) { | |
/* Array of data to copy */ | |
$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 data into new post */ | |
$new_post_id = wp_insert_post($args); | |
/* Get all current post terms and set them to the new post draft */ | |
$taxonomies = get_object_taxonomies($post->post_type); | |
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_info = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id"); | |
if (count($post_meta_info) != 0) { | |
$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) "; | |
foreach ($post_meta_info as $meta_info) { | |
$meta_key = $meta_info->meta_key; | |
$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); | |
} | |
/* 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 duplication failed, could not find original post: ' . $post_id); | |
} | |
} | |
add_action('admin_action_duplicate_post_as_draft', 'duplicate_post_as_draft'); | |
/** | |
* Add the duplicate link to action list for post_row_actions and page_row_actions | |
* @param [Array] $actions | |
* @param [Array] $post | |
* @return [Array] | |
*/ | |
function duplicate_post_link($actions, $post) { | |
if (current_user_can('edit_posts')) { | |
$actions['duplicate'] = '<a href="admin.php?action=duplicate_post_as_draft&post=' . $post->ID . '" title="Duplicate this item" rel="permalink">Duplicate</a>'; | |
} | |
return $actions; | |
} | |
add_filter('post_row_actions', 'duplicate_post_link', 10, 2); | |
add_filter('page_row_actions', 'duplicate_post_link', 10, 2); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment