PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.2.4.1
Adminify – White Label, Admin Menu Editor, Login Customizer v3.2.4.1
4.3.2 4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 All 165 releases
adminify / Inc / Modules / PostDuplicator / PostDuplicator.php

PostDuplicator.php in Adminify – White Label, Admin Menu Editor, Login Customizer 3.2.4.1, at Inc/Modules/PostDuplicator/PostDuplicator.php

223 lines 6.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPAdminify\Inc\Modules\PostDuplicator;
4
5 use WPAdminify\Inc\Admin\AdminSettings;
6 // no direct access allowed
7 if (!defined('ABSPATH')) {
8 exit;
9 }
10
11 /**
12 * WP Adminify
13 *
14 * @package Duplicate Post/Page/Custom Posts
15 *
16 * @author Jewel Theme <support@jeweltheme.com>
17 */
18
19
20 if (!defined('ABSPATH')) {
21 exit; // If this file is called directly, abort.
22 }
23
24 class PostDuplicator
25 {
26
27 private $clone_title;
28 public $options = [];
29
30 public function __construct()
31 {
32 $this->clone_title = AdminSettings::get_instance()->get('jltwp_adminify_wl_plugin_menu_label');
33
34 $this->options = (array) AdminSettings::get_instance()->get();
35
36 // Check Access for User roles
37 $restrict_for = !empty($this->options['adminify_clone_post_user_roles']) ? $this->options['adminify_clone_post_user_roles'] : '';
38 if ($restrict_for) {
39 return;
40 }
41 add_action('admin_init', [$this, 'adminify_post_duplicator_init']);
42 }
43
44 public function adminify_post_duplicator_init()
45 {
46 $post_types = [];
47 if (!empty($this->options['adminify_clone_post_posts'])) {
48 $post_types = $this->options['adminify_clone_post_posts'];
49 }
50 $all_post_types = get_post_types();
51
52 if (empty($post_types) || empty(array_intersect($all_post_types, $post_types))) {
53 return;
54 }
55
56 add_action('admin_action_adminify_duplicate', [$this, 'adminify_duplicate_post_as_draft']);
57 foreach ($post_types as $key => $post_type) {
58 if (in_array($post_type, $all_post_types)) {
59 add_filter($post_type . '_row_actions', [$this, 'jltwp_adminify_duplicator_row_actions'], 10, 2);
60 }
61 }
62 }
63
64
65 /**
66 * Check if current user can clone
67 *
68 * @return bool
69 */
70 public function user_can_clone($post)
71 {
72 if (!current_user_can('edit_posts')) {
73 return false;
74 }
75
76 if (current_user_can('editor') || current_user_can('administrator')) {
77 return true;
78 }
79
80 if (current_user_can('contributor') || current_user_can('author')) {
81 $get_current_user_id = get_current_user_id();
82 $post = get_post($post);
83 $author_id = $post->post_author;
84 if ($get_current_user_id == $author_id) {
85 return true;
86 }
87 }
88 return false;
89 }
90
91
92 /*
93 * Add the duplicate link to action list for post_row_actions
94 */
95 public function jltwp_adminify_duplicator_row_actions($actions, $post)
96 {
97 if (!$this->user_can_clone($post)) {
98 return $actions;
99 }
100
101 $adminify_duplicate_link = admin_url('admin.php?action=adminify_duplicate&post=' . $post->ID);
102 $adminify_duplicate_link = wp_nonce_url($adminify_duplicate_link, 'jltwp_adminify_post_duplicator_nonce');
103
104 $clone_title = !empty($this->clone_title) ? $this->clone_title : 'Adminify';
105 $clone_title = preg_replace('/wp/i', '', $clone_title) . ' Clone';
106 $duplicate_title = 'Duplicate this item ' . $post->post_title;
107 $actions['adminify_duplicate'] = sprintf(__('<a href="%1$s" title="%2$s" rel="permalink">%3$s</a>', 'adminify'), $adminify_duplicate_link, $duplicate_title, $clone_title);
108 return $actions;
109 }
110
111
112 /*
113 * Function creates post duplicate as a draft and redirects then to the edit post screen
114 */
115 public function adminify_duplicate_post_as_draft()
116 {
117 global $wpdb;
118
119 if (!(isset($_GET['post']) || isset($_POST['post']) || (isset($_REQUEST['action']) && 'adminify_duplicate' == $_REQUEST['action']))) {
120 wp_die('No post to duplicate has been supplied!');
121 }
122
123 /*
124 * Nonce verification
125 * Return if nonce is not valid
126 */
127 if (!wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_wpnonce'])), 'jltwp_adminify_post_duplicator_nonce')) {
128 return;
129 }
130
131 /*
132 * get the original post id
133 */
134 $post_id = (isset($_GET['post']) ? absint($_GET['post']) : absint($_POST['post']));
135 /*
136 * and all the original post data then
137 */
138 $post = get_post($post_id);
139
140 if (!$this->user_can_clone($post)) {
141 return;
142 }
143
144 /*
145 * if post data exists, create the post duplicate
146 */
147 if (isset($post) && $post != null) {
148
149 /*
150 * new post data array
151 */
152 $args = [
153 'post_title' => $post->post_title,
154 'post_type' => $post->post_type,
155 'post_content' => $post->post_content,
156 'post_excerpt' => $post->post_excerpt,
157 'post_author' => get_current_user_id(),
158 'comment_status' => $post->comment_status,
159 'ping_status' => $post->ping_status,
160 'post_name' => $post->post_name,
161 'post_parent' => $post->post_parent,
162 'post_password' => $post->post_password,
163 'post_status' => 'draft',
164 'to_ping' => $post->to_ping,
165 'menu_order' => $post->menu_order,
166 ];
167
168 /*
169 * insert the post by wp_insert_post() function
170 */
171 $new_post_id = wp_insert_post($args);
172
173 /*
174 * get all current post terms ad set them to the new post draft
175 */
176 $taxonomies = get_object_taxonomies($post->post_type); // returns array of taxonomy names for post type, ex array("category", "post_tag");
177 foreach ($taxonomies as $taxonomy) {
178 $post_terms = wp_get_object_terms($post_id, $taxonomy, ['fields' => 'slugs']);
179 wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false);
180 }
181
182 /*
183 * duplicate all post meta just in two SQL queries
184 */
185 $post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
186 if (count($post_meta_infos) != 0) {
187 $sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
188 foreach ($post_meta_infos as $meta_info) {
189 $meta_key = $meta_info->meta_key;
190
191 // Do not copy these values
192 if ($meta_key == '_wp_old_slug') {
193 continue;
194 }
195 if ($meta_key == '_elementor_css') {
196 continue;
197 }
198
199 // Delete already added meta data triggered by wp_insert_post hook
200 if ($meta_key == '_elementor_template_type') {
201 delete_post_meta($new_post_id, '_elementor_template_type');
202 }
203
204 $meta_value = $meta_info->meta_value;
205 $sql_query_sel[] = $wpdb->prepare('SELECT %d, %s, %s', $new_post_id, $meta_key, $meta_value);
206 }
207 $sql_query .= implode(' UNION ALL ', $sql_query_sel);
208 $wpdb->query($sql_query);
209 }
210
211 /*
212 * finally, redirect to the edit post screen for the new draft
213 */
214 $redirect_url = admin_url('edit.php?post_type=' . $post->post_type);
215 wp_safe_redirect($redirect_url);
216
217 exit;
218 } else {
219 wp_die('Post creation failed, could not find original post: ' . absint($post_id));
220 }
221 }
222 }
223