<?php
/**
* @snippet Duplicate posts and pages without plugins
* @author Misha Rudrastyh
* @url https://rudrastyh.com/wordpress/duplicate-post.html
*/
// Add the duplicate link to action list for post_row_actions
// for "post" and custom post types
add_filter("post_row_actions", "rd_duplicate_post_link", 10, 2);
// for "page" post type
add_filter("page_row_actions", "rd_duplicate_post_link", 10, 2);
// for "portfolio" post type ?
function rd_duplicate_post_link($actions, $post)
{
if (!current_user_can("edit_posts")) {
return $actions;
}
$url = wp_nonce_url(
add_query_arg(
[
"action" => "rd_duplicate_post_as_draft",
"post" => $post->ID,
],
"admin.php"
),
basename(__FILE__),
"duplicate_nonce"
);
/****
Modification at https://oxygenados.com to avoid link creation in snippets Advanced Scripts, Scripts Organizer.....
**/
$myCat = get_the_category($post->ID);
$Posttype = get_post_type($post->ID);
if ($Posttype == "page" || $myCat[0]->name != "") {
/** Changes by https://oxygenados.com **/
$actions["duplicate"] =
/** Changes by Guenni007 - to be translatable **/
'<a href="' . $url . '" aria-label="' . \esc_attr( \sprintf( \__( 'Duplicate this entry or page', 'avia_framework' ) , $title )) . '">' . \esc_html__( 'Duplicate', 'avia_framework' ) . '</a>';
}
return $actions;
}
/*
* Function creates post duplicate as a draft and redirects then to the edit post screen
*/
add_action(
"admin_action_rd_duplicate_post_as_draft",
"rd_duplicate_post_as_draft"
);
function rd_duplicate_post_as_draft()
{
// check if post ID has been provided and action
if (empty($_GET["post"])) {
wp_die("No post to duplicate has been provided!");
}
// Nonce verification
if (
!isset($_GET["duplicate_nonce"]) ||
!wp_verify_nonce($_GET["duplicate_nonce"], basename(__FILE__))
) {
return;
}
// Get the original post id
$post_id = absint($_GET["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 (I am sure it is, but just in a case), create the post duplicate
if ($post) {
// new post data array
$args = [
"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(get_post_type($post)); // returns array of taxonomy names for post type, ex array("category", "post_tag");
if ($taxonomies) {
foreach ($taxonomies as $taxonomy) {
$post_terms = wp_get_object_terms($post_id, $taxonomy, [
"fields" => "slugs",
]);
wp_set_object_terms(
$new_post_id,
$post_terms,
$taxonomy,
false
);
}
}
// duplicate all post meta
$post_meta = get_post_meta($post_id);
if ($post_meta) {
foreach ($post_meta as $meta_key => $meta_values) {
if ("_wp_old_slug" == $meta_key) {
// do nothing for this meta key
continue;
}
foreach ($meta_values as $meta_value) {
add_post_meta($new_post_id, $meta_key, $meta_value);
}
}
}
// finally, redirect to the edit post screen for the new draft
// wp_safe_redirect(
// add_query_arg(
// array(
// 'action' => 'edit',
// 'post' => $new_post_id
// ),
// admin_url( 'post.php' )
// )
// );
// exit;
// or we can redirect to all posts with a message
wp_safe_redirect(
add_query_arg(
[
"post_type" =>
"post" !== get_post_type($post)
? get_post_type($post)
: false,
"saved" => "post_duplication_created", // just a custom slug here
],
admin_url("edit.php")
)
);
exit();
} else {
wp_die("Copy creation has failed :(( ");
}
}
/*
* In case we decided to add admin notices
*/
add_action("admin_notices", "rudr_duplication_admin_notice");
function rudr_duplication_admin_notice()
{
// Get the current screen
$screen = get_current_screen();
if ("edit" !== $screen->base) {
return;
}
//Checks if settings updated
if (isset($_GET["saved"]) && "post_duplication_created" == $_GET["saved"]) {
echo '<div class="notice notice-success is-dismissible"><p>The copy has been created.</p></div>';
}
}
Comments
0 B
|👍
/👎