! $options['copy_template'] ) { $meta_excludelist[] = '_wp_page_template'; } if ( ! $options['copy_thumbnail'] ) { $meta_excludelist[] = '_thumbnail_id'; } if ( $options['use_filters'] ) { /** * Filters the meta fields excludelist when copying a post. * * @param array $meta_excludelist The meta fields excludelist from the options. * * @return array */ $meta_excludelist = \apply_filters( 'duplicate_post_excludelist_filter', $meta_excludelist ); } $meta_excludelist_string = '(' . \implode( ')|(', $meta_excludelist ) . ')'; if ( \strpos( $meta_excludelist_string, '*' ) !== false ) { $meta_excludelist_string = \str_replace( [ '*' ], [ '[a-zA-Z0-9_]*' ], $meta_excludelist_string ); $meta_keys = []; foreach ( $post_meta_keys as $meta_key ) { if ( ! \preg_match( '#^' . $meta_excludelist_string . '$#', $meta_key ) ) { $meta_keys[] = $meta_key; } } } else { $meta_keys = \array_diff( $post_meta_keys, $meta_excludelist ); } if ( $options['use_filters'] ) { /** * Filters the list of meta fields names when copying a post. * * @param array $meta_keys The list of meta fields name, with the ones in the excludelist already removed. * * @return array */ $meta_keys = \apply_filters( 'duplicate_post_meta_keys_filter', $meta_keys ); } foreach ( $meta_keys as $meta_key ) { $meta_values = \get_post_custom_values( $meta_key, $post->ID ); // Clear existing meta data so that add_post_meta() works properly with non-unique keys. \delete_post_meta( $new_id, $meta_key ); foreach ( $meta_values as $meta_value ) { $meta_value = \maybe_unserialize( $meta_value ); \add_post_meta( $new_id, $meta_key, Utils::recursively_slash_strings( $meta_value ) ); } } } /** * Generates and returns the title for the copy. * * @param WP_Post $post The original post object. * @param array $options The options array. * * @return string The calculated title for the copy. */ public function generate_copy_title( WP_Post $post, array $options ) { $prefix = \sanitize_text_field( $options['title_prefix'] ); $suffix = \sanitize_text_field( $options['title_suffix'] ); if ( $options['copy_title'] ) { $title = $post->post_title; if ( ! empty( $prefix ) ) { $prefix .= ' '; } if ( ! empty( $suffix ) ) { $suffix = ' ' . $suffix; } } else { $title = ''; } return \trim( $prefix . $title . $suffix ); } /** * Generates and returns the status for the copy. * * @param WP_Post $post The original post object. * @param array $options The options array. * * @return string The calculated status for the copy. */ public function generate_copy_status( WP_Post $post, array $options ) { $new_post_status = 'draft'; if ( $options['copy_status'] ) { $new_post_status = $post->post_status; if ( $new_post_status === 'publish' || $new_post_status === 'future' ) { // Check if the user has the right capability. if ( \is_post_type_hierarchical( $post->post_type ) ) { if ( ! \current_user_can( 'publish_pages' ) ) { $new_post_status = 'pending'; } } elseif ( ! \current_user_can( 'publish_posts' ) ) { $new_post_status = 'pending'; } } } return $new_post_status; } /** * Generates and returns the author ID for the copy. * * @param WP_Post $post The original post object. * @param array $options The options array. * * @return int|string The calculated author ID for the copy. */ public function generate_copy_author( WP_Post $post, array $options ) { $new_post_author = \wp_get_current_user(); $new_post_author_id = $new_post_author->ID; if ( $options['copy_author'] ) { // Check if the user has the right capability. if ( \is_post_type_hierarchical( $post->post_type ) ) { if ( \current_user_can( 'edit_others_pages' ) ) { $new_post_author_id = $post->post_author; } } elseif ( \current_user_can( 'edit_others_posts' ) ) { $new_post_author_id = $post->post_author; } } return $new_post_author_id; } }