PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.1.3
Adminify – White Label, Admin Menu Editor, Login Customizer v4.1.3
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 4.1.17 All 164 releases
adminify / Inc / Modules / PostDuplicator / PostDuplicator.php

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

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