Guenni007 icon

duplicate-posts-and-pages

Guenni007 | PRO | 10/26/23 12:25:38 PM UTC | 0 ⭐ | 1269 👁️ | Never ⏰ | []
PHP |

5.94 KB

|

None

|

0 👍

/

0 👎

<?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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎