post_type)) return; if ($draft) $action_name = "duplicate_post_save_as_new_post_draft"; else $action_name = "duplicate_post_save_as_new_post"; if ( 'display' == $context ) $action = '?action='.$action_name.'&post='.$post->ID; else $action = '?action='.$action_name.'&post='.$post->ID; $post_type_object = get_post_type_object( $post->post_type ); if ( !$post_type_object ) return; return wp_nonce_url(apply_filters( 'duplicate_post_get_clone_post_link', admin_url( "admin.php". $action ), $post->ID, $context ), 'duplicate-post_' . $post->ID); } /** * Display duplicate post link for post. * * @param string $link Optional. Anchor text. * @param string $before Optional. Display before edit link. * @param string $after Optional. Display after edit link. * @param int $id Optional. Post ID. */ function duplicate_post_clone_post_link( $link = null, $before = '', $after = '', $id = 0 ) { if ( !$post = get_post( $id ) ) return; if ( !$url = duplicate_post_get_clone_post_link( $post->ID ) ) return; if ( null === $link ) $link = esc_html__('Copy to a new draft', 'duplicate-post'); $link = '' . $link . ''; echo $before . apply_filters( 'duplicate_post_clone_post_link', $link, $post->ID ) . $after; } /** * Get original post . * * @param int $post Optional. Post ID or Post object. * @param string $output Optional, default is Object. Either OBJECT, ARRAY_A, or ARRAY_N. * @return mixed Post data */ function duplicate_post_get_original($post = null , $output = OBJECT){ if ( !$post = get_post( $post ) ) return null; $original_ID = get_post_meta( $post->ID, '_dp_original'); if (empty($original_ID)) return null; $original_post = get_post($original_ID[0], $output); return $original_post; } function duplicate_post_get_edit_or_view_link( $post ){ $post = get_post( $post ); if ( ! $post ) return null; $can_edit_post = current_user_can( 'edit_post', $post->ID ); $title = _draft_or_post_title( $post ); $post_type_object = get_post_type_object( $post->post_type ); if ( $can_edit_post && 'trash' != $post->post_status ) { return sprintf( '%s', get_edit_post_link( $post->ID ), esc_attr( sprintf( __( 'Edit “%s”', 'default' ), $title ) ), $title ); } else if ( duplicate_post_is_post_type_viewable( $post_type_object ) ) { if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) { if ( $can_edit_post ) { $preview_link = get_preview_post_link( $post ); return sprintf( '%s', esc_url( $preview_link ), esc_attr( sprintf( __( 'Preview “%s”', 'default' ), $title ) ), $title ); } } elseif ( 'trash' != $post->post_status ) { return sprintf( '%s', get_permalink( $post->ID ), /* translators: %s: post title */ esc_attr( sprintf( __( 'View “%s”', 'default' ), $title ) ), $title ); } } return $title; } /* * Workaround for is_post_type_viewable (introduced in WP 4.4) */ function duplicate_post_is_post_type_viewable( $post_type ) { if ( function_exists( 'is_post_type_viewable' ) ){ return is_post_type_viewable( $post_type ); } else { if ( is_scalar( $post_type ) ) { $post_type = get_post_type_object( $post_type ); if ( ! $post_type ) { return false; } } return $post_type->publicly_queryable || ( $post_type->_builtin && $post_type->public ); } } // Admin bar function duplicate_post_admin_bar_render() { if(!is_admin_bar_showing()) return; global $wp_admin_bar; $current_object = get_queried_object(); if ( !empty($current_object) ){ if ( ! empty( $current_object->post_type ) && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) && duplicate_post_is_current_user_allowed_to_copy() && ( $post_type_object->show_ui || 'attachment' == $current_object->post_type ) && (duplicate_post_is_post_type_enabled($current_object->post_type) ) ) { $wp_admin_bar->add_menu( array( 'id' => 'new_draft', 'title' => esc_attr__("Copy to a new draft", 'duplicate-post'), 'href' => duplicate_post_get_clone_post_link( $current_object->ID ) ) ); } } else if ( is_admin() && isset( $_GET['post'] )){ $id = $_GET['post']; $post = get_post($id); if( !is_null($post) && duplicate_post_is_current_user_allowed_to_copy() && duplicate_post_is_post_type_enabled($post->post_type)) { $wp_admin_bar->add_menu( array( 'id' => 'new_draft', 'title' => esc_attr__("Copy to a new draft", 'duplicate-post'), 'href' => duplicate_post_get_clone_post_link( $id ) ) ); } } } function duplicate_post_add_css() { if(!is_admin_bar_showing()) return; $current_object = get_queried_object(); if ( !empty($current_object) ){ if ( ! empty( $current_object->post_type ) && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) && duplicate_post_is_current_user_allowed_to_copy() && ( $post_type_object->show_ui || 'attachment' == $current_object->post_type ) && (duplicate_post_is_post_type_enabled($current_object->post_type) ) ) { wp_enqueue_style ( 'duplicate-post', plugins_url('/duplicate-post.css', __FILE__), array(), DUPLICATE_POST_CURRENT_VERSION ); } } else if ( is_admin() && isset( $_GET['post'] )){ $id = $_GET['post']; $post = get_post($id); if( !is_null($post) && duplicate_post_is_current_user_allowed_to_copy() && duplicate_post_is_post_type_enabled($post->post_type)) { wp_enqueue_style ( 'duplicate-post', plugins_url('/duplicate-post.css', __FILE__), array(), DUPLICATE_POST_CURRENT_VERSION ); } } } add_action('init', 'duplicate_post_init'); function duplicate_post_init(){ if (get_option ( 'duplicate_post_show_adminbar' ) == 1) { add_action ( 'wp_before_admin_bar_render', 'duplicate_post_admin_bar_render' ); add_action ( 'wp_enqueue_scripts', 'duplicate_post_add_css' ); add_action ( 'admin_enqueue_scripts', 'duplicate_post_add_css' ); } } /** * Sort taxonomy objects: first public, then private */ function duplicate_post_tax_obj_cmp($a, $b) { return ($a->public < $b->public); }