Adding a Duplicate button to duplicate courses

Use plugin : Post duplicator : https://wordpress.org/plugins/post-duplicator/

In this tip we’re going to add a Duplicate switch for courses in the WP Admin panel. A course in WPLMS is a post with meta information, however there are few important rules you need to take care of while implementing a post duplicate function for courses :

a. Do not duplicate the post meta information related to students
b. Since the quizzes can be connected to a particular course you need to implement a quiz duplicate function as well.
c. Since the assignments can be connected to a particular course you need to implement a assignment duplicate function as well.
d. While duplicating Assignments and Quizzes make sure you do not copy the answers and queries.

This tip assumes that the Students attempting the duplicate course is different from the original one.

The below tip will cover all the points and add a duplicate link in the WP Admin panel :

a. Go to WP Admin -> Plugins -> Editor -> WPLMS Customizer -> customizer_class.php

b. Copy the following code in the function _constructor

PHP Code:

add_action( 'admin_action_rd_duplicate_post_as_draft', array($this,'rd_duplicate_post_as_draft') );  
             add_filter( 'post_row_actions', array($this,'rd_duplicate_post_link'), 10, 2 );
             add_filter( 'course_row_actions', array($this,'rd_duplicate_post_link'), 10, 2 );    
             add_filter( 'quiz_row_actions', array($this,'rd_duplicate_post_link'), 10, 2 );  
             add_filter( 'wplms-assignment_row_actions', array($this,'rd_duplicate_post_link'), 10, 2 );

c. Copy the following function in the class :

PHP Code: 

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!');    
                 }       /*      * get the original post id      */   
                 $post_id = (isset($_GET['post']) ? $_GET['post'] : $_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          */       
                    $post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id AND concat('',meta_key*1) = meta_key");          
                    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;                
                                $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 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="admin.php?action=rd_duplicate_post_as_draft&post=' . $post->ID . '" title="Duplicate this item" rel="permalink">Duplicate</a>';    
            }    
        return $actions;
        }

Credits to this tutorial : http://rudrastyh.com/wordpress/duplicate-post.html