PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 8.2.2
Admin and Site Enhancements (ASE) v8.2.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / classes / class-content-duplication.php
admin-site-enhancements / classes Last commit date
class-activation.php 7 months ago class-admin-menu-organizer.php 7 months ago class-admin-menu-svg-icon-mask.php 7 months ago class-auto-publish-posts-with-missed-schedule.php 7 months ago class-avif-upload.php 7 months ago class-captcha-protection.php 7 months ago class-change-login-url.php 7 months ago class-cleanup-admin-bar.php 7 months ago class-common-methods.php 7 months ago class-content-duplication.php 7 months ago class-content-order.php 7 months ago class-custom-admin-footer-text.php 7 months ago class-custom-body-class.php 7 months ago class-custom-css.php 7 months ago class-custom-nav-menu-items-in-new-tab.php 7 months ago class-deactivation.php 7 months ago class-disable-author-archives.php 7 months ago class-disable-comments.php 7 months ago class-disable-dashboard-widgets.php 7 months ago class-disable-embeds.php 7 months ago class-disable-feeds.php 7 months ago class-disable-gutenberg.php 7 months ago class-disable-rest-api.php 7 months ago class-disable-smaller-components.php 7 months ago class-disable-updates.php 7 months ago class-disable-xml-rpc.php 7 months ago class-display-system-summary.php 7 months ago class-email-address-obfuscator.php 7 months ago class-email-delivery.php 7 months ago class-enhance-list-tables.php 7 months ago class-external-permalinks.php 7 months ago class-heartbeat-control.php 7 months ago class-hide-admin-bar.php 7 months ago class-hide-admin-notices.php 7 months ago class-image-sizes-panel.php 7 months ago class-image-upload-control.php 7 months ago class-insert-head-body-footer-code.php 7 months ago class-last-login-column.php 7 months ago class-limit-login-attempts.php 7 months ago class-login-id-type.php 7 months ago class-login-logout-menu.php 7 months ago class-maintenance-mode.php 7 months ago class-manage-ads-appads-txt.php 7 months ago class-manage-robots-txt.php 7 months ago class-media-replacement.php 7 months ago class-multiple-user-roles.php 7 months ago class-obfuscate-author-slugs.php 7 months ago class-open-external-links-in-new-tab.php 7 months ago class-password-protection.php 7 months ago class-redirect-after-login.php 7 months ago class-redirect-after-logout.php 7 months ago class-redirect-fourofour.php 7 months ago class-registration-date-column.php 7 months ago class-revisions-control.php 7 months ago class-search-engines-visibility.php 7 months ago class-settings-fields-render.php 7 months ago class-settings-sanitization.php 7 months ago class-settings-sections-fields.php 7 months ago class-show-custom-taxonomy-filters.php 7 months ago class-site-identity-on-login-page.php 7 months ago class-svg-upload.php 7 months ago class-various-admin-ui-enhancements.php 7 months ago class-view-admin-as-role.php 7 months ago class-wider-admin-menu.php 7 months ago class-wp-config-transformer.php 7 months ago
class-content-duplication.php
339 lines
1 <?php
2
3 namespace ASENHA\Classes;
4
5 use WP_Admin_Bar;
6 use WC_Admin_Duplicate_Product;
7 /**
8 * Class for Content Duplication module
9 *
10 * @since 6.9.5
11 */
12 class Content_Duplication {
13 public $inapplicable_post_types = array(
14 'attachment',
15 // public
16 'asenha_code_snippet',
17 // public, ASE
18 'asenha_cpt',
19 // non-public, ASE
20 'asenha_ctax',
21 // non-public, ASE
22 'asenha_cfgroup',
23 // non-public, ASE
24 'asenha_options_page',
25 // non-public, ASE
26 'options_page_config',
27 // non-public, ASE
28 'revision',
29 // non-public
30 'nav_menu_item',
31 // non-public
32 'custom_css',
33 // non-public
34 'customize_changeset',
35 // non-public
36 'oembed_cache',
37 // non-public
38 'user_request',
39 // non-public
40 'wp_block',
41 // non-public
42 'wp_template',
43 // non-public
44 'wp_template_part',
45 // non-public
46 'wp_global_styles',
47 // non-public
48 'wp_navigation',
49 // non-public
50 'wp_font_family',
51 // non-public
52 'wp_font_face',
53 // non-public
54 'patterns_ai_data',
55 // non-public
56 'product_variation',
57 // non-public, WooCommerce
58 'shop_order',
59 // non-public, WooCommerce
60 'shop_order_refund',
61 // non-public, WooCommerce
62 'shop_coupon',
63 // non-public, WooCommerce
64 'shop_order_placehold',
65 // non-public, WooCommerce
66 // 'elementor_library', // public, Elementor -- not excluded as data is stored only in wp_posts and wp_postmeta
67 // 'e-landing-page', // public, Elementor -- not excluded as data is stored only in wp_posts and wp_postmeta
68 'elementor_snippet',
69 // non-public, Elementor
70 'elementor_font',
71 // non-public, Elementor
72 'elementor_icons',
73 // non-public, Elementor
74 'sfwd-assignment',
75 // public, LearnDash
76 'sfwd-certificates',
77 // public, LearnDash
78 'sfwd-courses',
79 // public, LearnDash
80 'sfwd-lessons',
81 // public, LearnDash
82 'sfwd-quiz',
83 // public, LearnDash
84 'sfwd-essays',
85 // public, LearnDash
86 'sfwd-topic',
87 // public, LearnDash
88 'sfwd-transactions',
89 // public, LearnDash
90 'sfwd-question',
91 // non-public, LearnDash
92 'ld-exam',
93 // non-public, LearnDash
94 'wfacp_checkout',
95 // public, FunnelKit Automation
96 'wffn_oty',
97 // public, FunnelKit Funnel Builder
98 'wffn_optin',
99 // public, FunnelKit Funnel Builder
100 'wffn_landing',
101 // public, FunnelKit Funnel Builder
102 'wffn_ty',
103 // public, FunnelKit Funnel Builder
104 'kadence_form',
105 // non-public, Kadence Blocks
106 'kadence_header',
107 // non-public, Kadence Blocks
108 'kadence_navigation',
109 // non-public, Kadence Blocks
110 'kadence_lottie',
111 // non-public, Kadence Blocks
112 'kadence_vector',
113 // non-public, Kadence Blocks
114 'kb_icon',
115 );
116
117 /**
118 * Enable duplication of pages, posts and custom posts
119 *
120 * @since 1.0.0
121 */
122 public function duplicate_content() {
123 $allow_duplication = false;
124 if ( current_user_can( 'edit_posts' ) ) {
125 $allow_duplication = true;
126 }
127 $original_post_id = intval( sanitize_text_field( $_REQUEST['post'] ) );
128 $nonce = sanitize_text_field( $_REQUEST['nonce'] );
129 if ( wp_verify_nonce( $nonce, 'asenha-duplicate-' . $original_post_id ) && $allow_duplication ) {
130 $original_post = get_post( $original_post_id );
131 $post_type = $original_post->post_type;
132 $common_methods = new Common_Methods();
133 $is_woocommerce_active = $common_methods->is_woocommerce_active();
134 if ( 'product' != $post_type || 'product' == $post_type && !$is_woocommerce_active ) {
135 // Set some attributes for the duplicate post
136 $new_post_title_suffix = __( 'DUPLICATE', 'admin-site-enhancements' );
137 $new_post_status = 'draft';
138 $current_user = wp_get_current_user();
139 $new_post_author_id = $current_user->ID;
140 // Create the duplicate post and store the ID
141 $args = array(
142 'comment_status' => $original_post->comment_status,
143 'ping_status' => $original_post->ping_status,
144 'post_author' => $new_post_author_id,
145 'post_content' => str_replace( '\\', "\\\\", $original_post->post_content ),
146 'post_excerpt' => $original_post->post_excerpt,
147 'post_parent' => $original_post->post_parent,
148 'post_password' => $original_post->post_password,
149 'post_status' => $new_post_status,
150 'post_title' => $original_post->post_title . ' (' . $new_post_title_suffix . ')',
151 'post_type' => $original_post->post_type,
152 'to_ping' => $original_post->to_ping,
153 'menu_order' => $original_post->menu_order,
154 );
155 $new_post_id = wp_insert_post( $args );
156 // Copy over the taxonomies
157 $original_taxonomies = get_object_taxonomies( $original_post->post_type );
158 if ( !empty( $original_taxonomies ) && is_array( $original_taxonomies ) ) {
159 foreach ( $original_taxonomies as $taxonomy ) {
160 $original_post_terms = wp_get_object_terms( $original_post_id, $taxonomy, array(
161 'fields' => 'slugs',
162 ) );
163 wp_set_object_terms(
164 $new_post_id,
165 $original_post_terms,
166 $taxonomy,
167 false
168 );
169 }
170 }
171 $excluded_post_meta_keys = array();
172 // Copy over the post meta
173 $original_post_metas = get_post_meta( $original_post_id );
174 // all meta keys and the corresponding values
175 if ( !empty( $original_post_metas ) ) {
176 foreach ( $original_post_metas as $meta_key => $meta_values ) {
177 if ( !in_array( $meta_key, $excluded_post_meta_keys ) ) {
178 // Only copy over post meta that are not ASE custom fields. We will handle that later.
179 foreach ( $meta_values as $meta_value ) {
180 update_post_meta( $new_post_id, $meta_key, wp_slash( maybe_unserialize( $meta_value ) ) );
181 }
182 }
183 }
184 }
185 }
186 $options = get_option( ASENHA_SLUG_U, array() );
187 $duplication_redirect_destination = ( isset( $options['duplication_redirect_destination'] ) ? $options['duplication_redirect_destination'] : 'edit' );
188 switch ( $duplication_redirect_destination ) {
189 case 'edit':
190 // Redirect to edit screen of the duplicate post
191 wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
192 break;
193 case 'list':
194 // Redirect to list table of the corresponding post type of original post
195 if ( 'post' == $post_type ) {
196 wp_redirect( admin_url( 'edit.php' ) );
197 } else {
198 wp_redirect( admin_url( 'edit.php?post_type=' . $post_type ) );
199 }
200 break;
201 }
202 } else {
203 wp_die( 'You do not have permission to perform this action.' );
204 }
205 }
206
207 /**
208 * Add row action link to perform duplication in page/post list tables
209 *
210 * @since 1.0.0
211 */
212 public function add_duplication_action_link( $actions, $post ) {
213 $duplication_link_locations = $this->get_duplication_link_locations();
214 $allow_duplication = $this->is_user_allowed_to_duplicate_content();
215 $post_type = $post->post_type;
216 $post_type_is_duplicable = $this->is_post_type_duplicable( $post_type );
217 if ( $allow_duplication && $post_type_is_duplicable ) {
218 // Not WooCommerce product
219 if ( in_array( 'post-action', $duplication_link_locations ) ) {
220 $actions['asenha-duplicate'] = '<a href="admin.php?action=duplicate_content&amp;post=' . $post->ID . '&amp;nonce=' . wp_create_nonce( 'asenha-duplicate-' . $post->ID ) . '" title="' . __( 'Duplicate this as draft', 'admin-site-enhancements' ) . '">' . __( 'Duplicate', 'admin-site-enhancements' ) . '</a>';
221 }
222 }
223 return $actions;
224 }
225
226 /**
227 * Add admin bar duplicate link
228 *
229 * @since 6.3.0
230 */
231 public function add_admin_bar_duplication_link( WP_Admin_Bar $wp_admin_bar ) {
232 $duplication_link_locations = $this->get_duplication_link_locations();
233 $allow_duplication = $this->is_user_allowed_to_duplicate_content();
234 global $pagenow, $post;
235 if ( is_object( $post ) ) {
236 if ( property_exists( $post, 'post_type' ) ) {
237 $post_type = $post->post_type;
238 $inapplicable_post_types = array('attachment');
239 $post_type_is_duplicable = $this->is_post_type_duplicable( $post_type );
240 if ( $allow_duplication && $post_type_is_duplicable ) {
241 if ( 'post.php' == $pagenow && !in_array( $post_type, $inapplicable_post_types ) || is_singular() || is_front_page() && !is_home() ) {
242 if ( in_array( 'admin-bar', $duplication_link_locations ) ) {
243 $common_methods = new Common_Methods();
244 $post_type_singular_label = $common_methods->get_post_type_singular_label( $post );
245 $post_id = 0;
246 if ( is_front_page() && !is_home() ) {
247 $post_id = get_option( 'page_on_front' );
248 } else {
249 // if ( property_exists( $post, 'ID' ) ) {
250 $post_id = (int) $post->ID;
251 // } else {
252 // $post_id = 0;
253 // }
254 }
255 if ( $post_id > 0 ) {
256 $wp_admin_bar->add_menu( array(
257 'id' => 'duplicate-content',
258 'parent' => null,
259 'group' => null,
260 'title' => sprintf(
261 /* translators: %s is the singular label for the post type */
262 __( 'Duplicate %s', 'admin-site-enhancements' ),
263 $post_type_singular_label
264 ),
265 'href' => admin_url( 'admin.php?action=duplicate_content&amp;post=' . $post_id . '&amp;nonce=' . wp_create_nonce( 'asenha-duplicate-' . $post_id ) ),
266 ) );
267 }
268 }
269 }
270 }
271 }
272 }
273 }
274
275 /**
276 * Check at which locations duplication link should enabled
277 *
278 * @since 6.9.3
279 */
280 public function get_duplication_link_locations() {
281 $options = get_option( ASENHA_SLUG_U, array() );
282 $duplication_link_locations = array('post-action', 'admin-bar');
283 return $duplication_link_locations;
284 }
285
286 /**
287 * Check if a user role is allowed to duplicate content
288 *
289 * @since 6.9.3
290 */
291 public function is_user_allowed_to_duplicate_content() {
292 $allow_duplication = false;
293 if ( current_user_can( 'edit_posts' ) ) {
294 $allow_duplication = true;
295 }
296 return $allow_duplication;
297 }
298
299 /**
300 * Check if the post type can be duplicated
301 *
302 * @since 6.9.7
303 */
304 public function is_post_type_duplicable( $post_type ) {
305 $common_methods = new Common_Methods();
306 $asenha_public_post_types = $common_methods->get_public_post_type_slugs();
307 $inapplicable_post_types = $this->inapplicable_post_types;
308 $is_woocommerce_active = $common_methods->is_woocommerce_active();
309 $options = get_option( ASENHA_SLUG_U, array() );
310 $enable_duplication_on_post_types_type = 'only-on';
311 $asenha_public_post_types_slugs = array();
312 if ( is_array( $asenha_public_post_types ) ) {
313 foreach ( $asenha_public_post_types as $post_type_slug => $post_type_label ) {
314 // e.g. $post_type_slug is post,
315 $asenha_public_post_types_slugs[] = $post_type_slug;
316 }
317 }
318 $enable_duplication_on_post_types = ( isset( $options['enable_duplication_on_post_types'] ) ? $options['enable_duplication_on_post_types'] : array() );
319 $post_types_for_enable_duplication = array();
320 if ( !empty( $enable_duplication_on_post_types ) && count( $enable_duplication_on_post_types ) > 0 ) {
321 foreach ( $enable_duplication_on_post_types as $post_type_slug => $is_duplication_enabled ) {
322 if ( $is_duplication_enabled ) {
323 $post_types_for_enable_duplication[] = $post_type_slug;
324 }
325 }
326 } else {
327 $post_types_for_enable_duplication = $asenha_public_post_types_slugs;
328 }
329 if ( 'only-on' == $enable_duplication_on_post_types_type && in_array( $post_type, $post_types_for_enable_duplication ) && !in_array( $post_type, $inapplicable_post_types ) || 'except-on' == $enable_duplication_on_post_types_type && !in_array( $post_type, $post_types_for_enable_duplication ) && !in_array( $post_type, $inapplicable_post_types ) ) {
330 if ( 'product' != $post_type || 'product' == $post_type && !$is_woocommerce_active ) {
331 return true;
332 }
333 } else {
334 return false;
335 }
336 }
337
338 }
339