PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.9.7
Admin and Site Enhancements (ASE) v7.9.7
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 1 year ago class-admin-menu-organizer.php 1 year ago class-auto-publish-posts-with-missed-schedule.php 1 year ago class-avif-upload.php 1 year ago class-captcha-protection.php 1 year ago class-change-login-url.php 1 year ago class-cleanup-admin-bar.php 1 year ago class-common-methods.php 1 year ago class-content-duplication.php 1 year ago class-content-order.php 1 year ago class-custom-admin-footer-text.php 1 year ago class-custom-body-class.php 1 year ago class-custom-css.php 1 year ago class-custom-nav-menu-items-in-new-tab.php 1 year ago class-deactivation.php 1 year ago class-disable-author-archives.php 1 year ago class-disable-comments.php 1 year ago class-disable-dashboard-widgets.php 1 year ago class-disable-feeds.php 1 year ago class-disable-gutenberg.php 1 year ago class-disable-rest-api.php 1 year ago class-disable-smaller-components.php 1 year ago class-disable-updates.php 1 year ago class-disable-xml-rpc.php 1 year ago class-display-system-summary.php 1 year ago class-email-address-obfuscator.php 1 year ago class-email-delivery.php 1 year ago class-enhance-list-tables.php 1 year ago class-external-permalinks.php 1 year ago class-heartbeat-control.php 1 year ago class-hide-admin-bar.php 1 year ago class-hide-admin-notices.php 1 year ago class-image-sizes-panel.php 1 year ago class-image-upload-control.php 1 year ago class-insert-head-body-footer-code.php 1 year ago class-last-login-column.php 1 year ago class-limit-login-attempts.php 1 year ago class-login-id-type.php 1 year ago class-login-logout-menu.php 1 year ago class-maintenance-mode.php 1 year ago class-manage-ads-appads-txt.php 1 year ago class-manage-robots-txt.php 1 year ago class-media-replacement.php 1 year ago class-multiple-user-roles.php 1 year ago class-obfuscate-author-slugs.php 1 year ago class-open-external-links-in-new-tab.php 1 year ago class-password-protection.php 1 year ago class-redirect-after-login.php 1 year ago class-redirect-after-logout.php 1 year ago class-redirect-fourofour.php 1 year ago class-registration-date-column.php 1 year ago class-revisions-control.php 1 year ago class-search-engines-visibility.php 1 year ago class-settings-fields-render.php 1 year ago class-settings-sanitization.php 1 year ago class-settings-sections-fields.php 1 year ago class-show-custom-taxonomy-filters.php 1 year ago class-site-identity-on-login-page.php 1 year ago class-svg-upload.php 1 year ago class-various-admin-ui-enhancements.php 1 year ago class-view-admin-as-role.php 1 year ago class-wider-admin-menu.php 1 year ago class-wp-config-transformer.php 1 year ago
class-content-duplication.php
328 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',
67 // public, Elementor
68 'e-landing-page',
69 // public, Elementor
70 'elementor_snippet',
71 // non-public, Elementor
72 'elementor_font',
73 // non-public, Elementor
74 'elementor_icons',
75 // non-public, Elementor
76 'sfwd-assignment',
77 // public, LearnDash
78 'sfwd-certificates',
79 // public, LearnDash
80 'sfwd-courses',
81 // public, LearnDash
82 'sfwd-lessons',
83 // public, LearnDash
84 'sfwd-quiz',
85 // public, LearnDash
86 'sfwd-essays',
87 // public, LearnDash
88 'sfwd-topic',
89 // public, LearnDash
90 'sfwd-transactions',
91 // public, LearnDash
92 'sfwd-question',
93 // non-public, LearnDash
94 'ld-exam',
95 // non-public, LearnDash
96 'wfacp_checkout',
97 // public, FunnelKit Automation
98 'wffn_oty',
99 // public, FunnelKit Funnel Builder
100 'wffn_optin',
101 // public, FunnelKit Funnel Builder
102 'wffn_landing',
103 // public, FunnelKit Funnel Builder
104 'wffn_ty',
105 // public, FunnelKit Funnel Builder
106 'kadence_form',
107 // non-public, Kadence Blocks
108 'kadence_header',
109 // non-public, Kadence Blocks
110 'kadence_navigation',
111 // non-public, Kadence Blocks
112 'kadence_lottie',
113 // non-public, Kadence Blocks
114 'kadence_vector',
115 // non-public, Kadence Blocks
116 'kb_icon',
117 );
118
119 /**
120 * Enable duplication of pages, posts and custom posts
121 *
122 * @since 1.0.0
123 */
124 public function duplicate_content() {
125 $allow_duplication = false;
126 if ( current_user_can( 'edit_posts' ) ) {
127 $allow_duplication = true;
128 }
129 $original_post_id = intval( sanitize_text_field( $_REQUEST['post'] ) );
130 $nonce = sanitize_text_field( $_REQUEST['nonce'] );
131 if ( wp_verify_nonce( $nonce, 'asenha-duplicate-' . $original_post_id ) && $allow_duplication ) {
132 $original_post = get_post( $original_post_id );
133 $post_type = $original_post->post_type;
134 $common_methods = new Common_Methods();
135 $is_woocommerce_active = $common_methods->is_woocommerce_active();
136 if ( 'product' != $post_type || 'product' == $post_type && !$is_woocommerce_active ) {
137 // Set some attributes for the duplicate post
138 $new_post_title_suffix = __( 'DUPLICATE', 'admin-site-enhancements' );
139 $new_post_status = 'draft';
140 $current_user = wp_get_current_user();
141 $new_post_author_id = $current_user->ID;
142 // Create the duplicate post and store the ID
143 $args = array(
144 'comment_status' => $original_post->comment_status,
145 'ping_status' => $original_post->ping_status,
146 'post_author' => $new_post_author_id,
147 'post_content' => str_replace( '\\', "\\\\", $original_post->post_content ),
148 'post_excerpt' => $original_post->post_excerpt,
149 'post_parent' => $original_post->post_parent,
150 'post_password' => $original_post->post_password,
151 'post_status' => $new_post_status,
152 'post_title' => $original_post->post_title . ' (' . $new_post_title_suffix . ')',
153 'post_type' => $original_post->post_type,
154 'to_ping' => $original_post->to_ping,
155 'menu_order' => $original_post->menu_order,
156 );
157 $new_post_id = wp_insert_post( $args );
158 // Copy over the taxonomies
159 $original_taxonomies = get_object_taxonomies( $original_post->post_type );
160 if ( !empty( $original_taxonomies ) && is_array( $original_taxonomies ) ) {
161 foreach ( $original_taxonomies as $taxonomy ) {
162 $original_post_terms = wp_get_object_terms( $original_post_id, $taxonomy, array(
163 'fields' => 'slugs',
164 ) );
165 wp_set_object_terms(
166 $new_post_id,
167 $original_post_terms,
168 $taxonomy,
169 false
170 );
171 }
172 }
173 $excluded_post_meta_keys = array();
174 // Copy over the post meta
175 $original_post_metas = get_post_meta( $original_post_id );
176 // all meta keys and the corresponding values
177 if ( !empty( $original_post_metas ) ) {
178 foreach ( $original_post_metas as $meta_key => $meta_values ) {
179 if ( !in_array( $meta_key, $excluded_post_meta_keys ) ) {
180 // Only copy over post meta that are not ASE custom fields. We will handle that later.
181 foreach ( $meta_values as $meta_value ) {
182 update_post_meta( $new_post_id, $meta_key, wp_slash( maybe_unserialize( $meta_value ) ) );
183 }
184 }
185 }
186 }
187 }
188 $options = get_option( ASENHA_SLUG_U, array() );
189 $duplication_redirect_destination = ( isset( $options['duplication_redirect_destination'] ) ? $options['duplication_redirect_destination'] : 'edit' );
190 switch ( $duplication_redirect_destination ) {
191 case 'edit':
192 // Redirect to edit screen of the duplicate post
193 wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
194 break;
195 case 'list':
196 // Redirect to list table of the corresponding post type of original post
197 if ( 'post' == $post_type ) {
198 wp_redirect( admin_url( 'edit.php' ) );
199 } else {
200 wp_redirect( admin_url( 'edit.php?post_type=' . $post_type ) );
201 }
202 break;
203 }
204 } else {
205 wp_die( 'You do not have permission to perform this action.' );
206 }
207 }
208
209 /**
210 * Add row action link to perform duplication in page/post list tables
211 *
212 * @since 1.0.0
213 */
214 public function add_duplication_action_link( $actions, $post ) {
215 $duplication_link_locations = $this->get_duplication_link_locations();
216 $allow_duplication = $this->is_user_allowed_to_duplicate_content();
217 $post_type = $post->post_type;
218 $post_type_is_duplicable = $this->is_post_type_duplicable( $post_type );
219 if ( $allow_duplication && $post_type_is_duplicable ) {
220 // Not WooCommerce product
221 if ( in_array( 'post-action', $duplication_link_locations ) ) {
222 $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>';
223 }
224 }
225 return $actions;
226 }
227
228 /**
229 * Add admin bar duplicate link
230 *
231 * @since 6.3.0
232 */
233 public function add_admin_bar_duplication_link( WP_Admin_Bar $wp_admin_bar ) {
234 $duplication_link_locations = $this->get_duplication_link_locations();
235 $allow_duplication = $this->is_user_allowed_to_duplicate_content();
236 global $pagenow, $typenow, $post;
237 $inapplicable_post_types = array('attachment');
238 $post_type_is_duplicable = $this->is_post_type_duplicable( $typenow );
239 if ( $allow_duplication && $post_type_is_duplicable ) {
240 if ( 'post.php' == $pagenow && !in_array( $typenow, $inapplicable_post_types ) || is_singular() ) {
241 if ( in_array( 'admin-bar', $duplication_link_locations ) ) {
242 if ( is_object( $post ) ) {
243 $common_methods = new Common_Methods();
244 $post_type_singular_label = $common_methods->get_post_type_singular_label( $post );
245 if ( property_exists( $post, 'ID' ) ) {
246 $wp_admin_bar->add_menu( array(
247 'id' => 'duplicate-content',
248 'parent' => null,
249 'group' => null,
250 'title' => sprintf(
251 /* translators: %s is the singular label for the post type */
252 __( 'Duplicate %s', 'admin-site-enhancements' ),
253 $post_type_singular_label
254 ),
255 'href' => admin_url( 'admin.php?action=duplicate_content&amp;post=' . $post->ID . '&amp;nonce=' . wp_create_nonce( 'asenha-duplicate-' . $post->ID ) ),
256 ) );
257 }
258 }
259 }
260 }
261 }
262 }
263
264 /**
265 * Check at which locations duplication link should enabled
266 *
267 * @since 6.9.3
268 */
269 public function get_duplication_link_locations() {
270 $options = get_option( ASENHA_SLUG_U, array() );
271 $duplication_link_locations = array('post-action', 'admin-bar');
272 return $duplication_link_locations;
273 }
274
275 /**
276 * Check if a user role is allowed to duplicate content
277 *
278 * @since 6.9.3
279 */
280 public function is_user_allowed_to_duplicate_content() {
281 $allow_duplication = false;
282 if ( current_user_can( 'edit_posts' ) ) {
283 $allow_duplication = true;
284 }
285 return $allow_duplication;
286 }
287
288 /**
289 * Check if the post type can be duplicated
290 *
291 * @since 6.9.7
292 */
293 public function is_post_type_duplicable( $post_type ) {
294 global $asenha_public_post_types;
295 $common_methods = new Common_Methods();
296 $inapplicable_post_types = $this->inapplicable_post_types;
297 $is_woocommerce_active = $common_methods->is_woocommerce_active();
298 $options = get_option( ASENHA_SLUG_U, array() );
299 $enable_duplication_on_post_types_type = 'only-on';
300 $asenha_public_post_types_slugs = array();
301 if ( is_array( $asenha_public_post_types ) ) {
302 foreach ( $asenha_public_post_types as $post_type_slug => $post_type_label ) {
303 // e.g. $post_type_slug is post,
304 $asenha_public_post_types_slugs[] = $post_type_slug;
305 }
306 }
307 $enable_duplication_on_post_types = ( isset( $options['enable_duplication_on_post_types'] ) ? $options['enable_duplication_on_post_types'] : array() );
308 $post_types_for_enable_duplication = array();
309 if ( !empty( $enable_duplication_on_post_types ) && count( $enable_duplication_on_post_types ) > 0 ) {
310 foreach ( $enable_duplication_on_post_types as $post_type_slug => $is_duplication_enabled ) {
311 if ( $is_duplication_enabled ) {
312 $post_types_for_enable_duplication[] = $post_type_slug;
313 }
314 }
315 } else {
316 $post_types_for_enable_duplication = $asenha_public_post_types_slugs;
317 }
318 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 ) ) {
319 if ( 'product' != $post_type || 'product' == $post_type && !$is_woocommerce_active ) {
320 return true;
321 }
322 } else {
323 return false;
324 }
325 }
326
327 }
328