HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //proc/self/cwd/wp-content/plugins/woolentor-addons/classes/class.post-duplicator.php
<?php
if( ! defined( 'ABSPATH' ) ) exit(); // Exit if accessed directly

class WooLentor_Post_Dupicator{

    /**
     * [$_instance]
     * @var null
     */
    private static $_instance = null;

    /**
     * [instance] Initializes a singleton instance
     * @return [WooLentor_Post_Dupicator]
     */
    public static function instance() {
        if ( is_null( self::$_instance ) ) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    /**
     * [__construct description]
     */
    public function __construct(){
        add_filter( 'admin_action_woolentor_duplicate_post_as_draft', [ $this, 'duplicate' ] );
        add_filter( 'post_row_actions', [ $this, 'row_actions' ], 10, 2 );
        add_filter( 'page_row_actions', [ $this, 'row_actions' ], 10, 2 );
    }

    /**
     * [row_actions]
     * @param  $actions 
     * @param  [string] $post Current Post
     * @return [array]   Row Action List
     */
    public function row_actions( $actions, $post ){
        
        $enable = woolentor_get_option( 'postduplicate_condition', 'woolentor_others_tabs', array('all') );

        if ( current_user_can('edit_posts') && ( in_array( $post->post_type, $enable ) || in_array('all', $enable) ) ) {
            $actionurl = admin_url('admin.php?action=woolentor_duplicate_post_as_draft&post=' . $post->ID );
            $url = wp_nonce_url( $actionurl, 'woolentor_duplicate_nonce' );
            $actions['woolentorduplicate'] = '<a href="'.$url.'" title="'.esc_attr__( 'HT Mega Duplicator', 'htmega-addons' ).'" rel="permalink">'.esc_html__( 'HT Duplicate', 'htmega-addons' ).'</a>';

        }
        return $actions;

    }

    /**
     * [duplicate]
     * @return [ERROR | Rediresct To Edit URL] 
     */
    public function duplicate(){
        global $wpdb;

        if (! ( isset( $_REQUEST['post']) || isset( $_REQUEST['post'] )  || ( isset( $_REQUEST['action'] ) && 'woolentor_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) {
            wp_die( 'No post to duplicate has been supplied!' );
        }

        /*
         * Nonce verification
         */
        if( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'woolentor_duplicate_nonce' ) ) {
            return; 
        }

        /*
         * get the original post id
         */
        $post_id = ( isset( $_REQUEST['post'] ) ? absint( $_REQUEST['post'] ) : Null );
        /*
         * and all the original post data then
         */
        $post = sanitize_post( get_post( $post_id ), 'db' );
     
        /*
         * 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 );

            if( ! is_wp_error( $new_post_id ) ) {
                /*
                 * 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");
                if( ! empty( $taxonomies ) && is_array( $taxonomies ) ) {
                    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_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
                if ( is_array( $post_meta_infos ) && 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;
                        if( $meta_key == '_wp_old_slug' ) continue;
                        $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 = admin_url( 'post.php?action=edit&post=' . $new_post_id );
            wp_safe_redirect( $redirect_to );

        }else {
            wp_die('Post creation failed, could not find original post: ' . $post_id);
        }


    }

}

WooLentor_Post_Dupicator::instance();