Version Description
Bulk clone + custom field wildcards + other features + bugfixes
Download this release
Release Info
| Developer | lopo |
| Plugin | |
| Version | 3.1 |
| Comparing to | |
| See all releases | |
Code changes from version 3.0.3 to 3.1
- duplicate-post-admin.php +257 -125
- duplicate-post-common.php +6 -3
- duplicate-post-options.php +92 -54
- duplicate-post.php +3 -3
- readme.txt +22 -12
duplicate-post-admin.php
CHANGED
|
@@ -26,110 +26,101 @@ add_action('admin_init','duplicate_post_plugin_upgrade');
|
|
| 26 |
|
| 27 |
function duplicate_post_plugin_upgrade() {
|
| 28 |
$installed_version = duplicate_post_get_installed_version();
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
// Add capability to admin and editors
|
| 33 |
-
|
| 34 |
// Get default roles
|
| 35 |
-
|
| 36 |
3 => 'editor',
|
| 37 |
8 => 'administrator',
|
| 38 |
);
|
| 39 |
-
|
| 40 |
// Cycle all roles and assign capability if its level >= duplicate_post_copy_user_level
|
| 41 |
foreach ($default_roles as $level => $name){
|
| 42 |
$role = get_role($name);
|
| 43 |
if(!empty($role)) $role->add_cap( 'copy_posts' );
|
| 44 |
}
|
|
|
|
|
|
|
| 45 |
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
add_option('duplicate_post_show_adminbar','1');
|
| 61 |
-
add_option('duplicate_post_show_submitbox','1');
|
| 62 |
-
} else if ( $installed_version==duplicate_post_get_current_version() ) { //re-install
|
| 63 |
-
// do nothing
|
| 64 |
-
} else { //upgrade form previous version
|
| 65 |
-
// delete old, obsolete options
|
| 66 |
-
delete_option('duplicate_post_admin_user_level');
|
| 67 |
-
delete_option('duplicate_post_create_user_level');
|
| 68 |
-
delete_option('duplicate_post_view_user_level');
|
| 69 |
-
delete_option('dp_notice');
|
| 70 |
-
|
| 71 |
-
$installed_version_numbers = explode('.', $installed_version);
|
| 72 |
-
|
| 73 |
-
if($installed_version_numbers[0] == 2){ // upgrading from 2.*
|
| 74 |
-
/*
|
| 75 |
-
* Convert old userlevel option to new capability scheme
|
| 76 |
-
*/
|
| 77 |
-
|
| 78 |
-
// Get old duplicate_post_copy_user_level option
|
| 79 |
-
$min_user_level = get_option('duplicate_post_copy_user_level');
|
| 80 |
-
|
| 81 |
-
if (!empty($min_user_level)){
|
| 82 |
-
// Get default roles
|
| 83 |
-
$default_roles = array(
|
| 84 |
-
1 => 'contributor',
|
| 85 |
-
2 => 'author',
|
| 86 |
-
3 => 'editor',
|
| 87 |
-
8 => 'administrator',
|
| 88 |
-
);
|
| 89 |
-
|
| 90 |
-
// Cycle all roles and assign capability if its level >= duplicate_post_copy_user_level
|
| 91 |
-
foreach ($default_roles as $level => $name){
|
| 92 |
-
$role = get_role($name);
|
| 93 |
-
if ($role && $min_user_level <= $level)
|
| 94 |
-
$role->add_cap( 'copy_posts' );
|
| 95 |
-
}
|
| 96 |
-
|
| 97 |
-
// delete old option
|
| 98 |
-
delete_option('duplicate_post_copy_user_level');
|
| 99 |
}
|
| 100 |
-
|
| 101 |
-
add_option('duplicate_post_copytitle','1');
|
| 102 |
-
add_option('duplicate_post_copydate','0');
|
| 103 |
-
add_option('duplicate_post_copystatus','0');
|
| 104 |
-
add_option('duplicate_post_copyslug','1');
|
| 105 |
-
add_option('duplicate_post_copyexcerpt','1');
|
| 106 |
-
add_option('duplicate_post_copycontent','1');
|
| 107 |
-
add_option('duplicate_post_copypassword','0');
|
| 108 |
-
add_option('duplicate_post_copyattachments','0');
|
| 109 |
-
add_option('duplicate_post_copychildren','0');
|
| 110 |
-
add_option('duplicate_post_copycomments','0');
|
| 111 |
-
add_option('duplicate_post_taxonomies_blacklist',array());
|
| 112 |
-
add_option('duplicate_post_blacklist','');
|
| 113 |
-
add_option('duplicate_post_types_enabled',array('post', 'page'));
|
| 114 |
-
add_option('duplicate_post_show_row','1');
|
| 115 |
-
add_option('duplicate_post_show_adminbar','1');
|
| 116 |
-
add_option('duplicate_post_show_submitbox','1');
|
| 117 |
-
|
| 118 |
-
// show notice about new features
|
| 119 |
-
add_site_option('duplicate_post_show_notice','1');
|
| 120 |
-
|
| 121 |
-
} else if($installed_version_numbers[0] == 3){ // upgrading from 3.*
|
| 122 |
-
// hide notice, we assume people already know of new features
|
| 123 |
-
delete_option('duplicate_post_show_notice', 0);
|
| 124 |
-
update_site_option('duplicate_post_show_notice', 0);
|
| 125 |
}
|
|
|
|
| 126 |
|
| 127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
}
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
delete_option('duplicate_post_version');
|
| 131 |
update_site_option( 'duplicate_post_version', duplicate_post_get_current_version() );
|
| 132 |
-
|
|
|
|
|
|
|
|
|
|
| 133 |
}
|
| 134 |
|
| 135 |
if (get_option('duplicate_post_show_row') == 1){
|
|
@@ -145,9 +136,14 @@ if (get_site_option('duplicate_post_show_notice') == 1){
|
|
| 145 |
function duplicate_post_show_update_notice() {
|
| 146 |
if(!current_user_can( 'manage_options')) return;
|
| 147 |
$class = 'notice is-dismissible';
|
| 148 |
-
$message =
|
| 149 |
-
$message .= '<br/>';
|
| 150 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
echo '<div id="duplicate-post-notice" class="'.$class.'"><p>'.$message.'</p></div>';
|
| 152 |
echo "<script>
|
| 153 |
function duplicate_post_dismiss_notice(){
|
|
@@ -168,7 +164,11 @@ if (get_site_option('duplicate_post_show_notice') == 1){
|
|
| 168 |
</script>";
|
| 169 |
}
|
| 170 |
|
| 171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
add_action( 'wp_ajax_duplicate_post_dismiss_notice', 'duplicate_post_dismiss_notice' );
|
| 173 |
|
| 174 |
function duplicate_post_dismiss_notice() {
|
|
@@ -184,11 +184,11 @@ if (get_site_option('duplicate_post_show_notice') == 1){
|
|
| 184 |
function duplicate_post_make_duplicate_link_row($actions, $post) {
|
| 185 |
if (duplicate_post_is_current_user_allowed_to_copy() && duplicate_post_is_post_type_enabled($post->post_type)) {
|
| 186 |
$actions['clone'] = '<a href="'.duplicate_post_get_clone_post_link( $post->ID , 'display', false).'" title="'
|
| 187 |
-
.
|
| 188 |
-
. '">' .
|
| 189 |
$actions['edit_as_new_draft'] = '<a href="'. duplicate_post_get_clone_post_link( $post->ID ) .'" title="'
|
| 190 |
-
.
|
| 191 |
-
. '">' .
|
| 192 |
}
|
| 193 |
return $actions;
|
| 194 |
}
|
|
@@ -208,7 +208,7 @@ function duplicate_post_add_duplicate_post_button() {
|
|
| 208 |
?>
|
| 209 |
<div id="duplicate-action">
|
| 210 |
<a class="submitduplicate duplication"
|
| 211 |
-
href="<?php echo duplicate_post_get_clone_post_link( $_GET['post'] ) ?>"><?php
|
| 212 |
</a>
|
| 213 |
</div>
|
| 214 |
<?php
|
|
@@ -243,7 +243,7 @@ function duplicate_post_add_removable_query_arg( $removable_query_args ){
|
|
| 243 |
*/
|
| 244 |
function duplicate_post_save_as_new_post($status = ''){
|
| 245 |
if (! ( isset( $_GET['post']) || isset( $_POST['post']) || ( isset($_REQUEST['action']) && 'duplicate_post_save_as_new_post' == $_REQUEST['action'] ) ) ) {
|
| 246 |
-
wp_die(
|
| 247 |
}
|
| 248 |
|
| 249 |
// Get the original post
|
|
@@ -253,9 +253,9 @@ function duplicate_post_save_as_new_post($status = ''){
|
|
| 253 |
// Copy the post and insert it
|
| 254 |
if (isset($post) && $post!=null) {
|
| 255 |
$new_id = duplicate_post_create_duplicate($post, $status);
|
| 256 |
-
|
| 257 |
if ($status == ''){
|
| 258 |
-
$sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'cloned', 'ids'),
|
| 259 |
// Redirect to the post list screen
|
| 260 |
wp_redirect( add_query_arg( array( 'cloned' => 1, 'ids' => $post->ID), $sendback ) );
|
| 261 |
} else {
|
|
@@ -265,7 +265,7 @@ function duplicate_post_save_as_new_post($status = ''){
|
|
| 265 |
exit;
|
| 266 |
|
| 267 |
} else {
|
| 268 |
-
wp_die(
|
| 269 |
}
|
| 270 |
}
|
| 271 |
|
|
@@ -279,8 +279,16 @@ function duplicate_post_copy_post_taxonomies($new_id, $post) {
|
|
| 279 |
wp_set_object_terms( $new_id, NULL, 'category' );
|
| 280 |
|
| 281 |
$post_taxonomies = get_object_taxonomies($post->post_type);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 282 |
$taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist');
|
| 283 |
if ($taxonomies_blacklist == "") $taxonomies_blacklist = array();
|
|
|
|
|
|
|
|
|
|
| 284 |
$taxonomies = array_diff($post_taxonomies, $taxonomies_blacklist);
|
| 285 |
foreach ($taxonomies as $taxonomy) {
|
| 286 |
$post_terms = wp_get_object_terms($post->ID, $taxonomy, array( 'orderby' => 'term_order' ));
|
|
@@ -307,17 +315,54 @@ function duplicate_post_copy_post_meta_info($new_id, $post) {
|
|
| 307 |
$meta_blacklist[] = '_wpas_mess'; //Jetpack Publicize
|
| 308 |
$meta_blacklist[] = '_edit_lock'; // edit lock
|
| 309 |
$meta_blacklist[] = '_edit_last'; // edit lock
|
| 310 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 311 |
|
|
|
|
| 312 |
foreach ($meta_keys as $meta_key) {
|
| 313 |
$meta_values = get_post_custom_values($meta_key, $post->ID);
|
| 314 |
foreach ($meta_values as $meta_value) {
|
| 315 |
$meta_value = maybe_unserialize($meta_value);
|
| 316 |
-
add_post_meta($new_id, $meta_key, $meta_value);
|
| 317 |
}
|
| 318 |
}
|
| 319 |
}
|
| 320 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 321 |
/**
|
| 322 |
* Copy the attachments
|
| 323 |
*/
|
|
@@ -337,7 +382,7 @@ function duplicate_post_copy_attachments($new_id, $post){
|
|
| 337 |
continue;
|
| 338 |
}
|
| 339 |
|
| 340 |
-
$desc =
|
| 341 |
|
| 342 |
$file_array = array();
|
| 343 |
$file_array['name'] = basename($url);
|
|
@@ -352,17 +397,17 @@ function duplicate_post_copy_attachments($new_id, $post){
|
|
| 352 |
$new_post_author = wp_get_current_user();
|
| 353 |
$cloned_child = array(
|
| 354 |
'ID' => $new_attachment_id,
|
| 355 |
-
'post_title' =>
|
| 356 |
-
'post_exceprt' =>
|
| 357 |
'post_author' => $new_post_author->ID
|
| 358 |
);
|
| 359 |
-
wp_update_post( $cloned_child );
|
| 360 |
|
| 361 |
$alt_title = get_post_meta($child->ID, '_wp_attachment_image_alt', true);
|
| 362 |
-
if($alt_title) update_post_meta($new_attachment_id, '_wp_attachment_image_alt', $alt_title);
|
| 363 |
|
| 364 |
// if we have cloned the post thumbnail, set the copy as the thumbnail for the new post
|
| 365 |
-
if($old_thumbnail_id == $child->ID){
|
| 366 |
set_post_thumbnail($new_id, $new_attachment_id);
|
| 367 |
}
|
| 368 |
|
|
@@ -447,10 +492,14 @@ add_action('dp_duplicate_page', 'duplicate_post_copy_post_taxonomies', 50, 2);
|
|
| 447 |
* Create a duplicate from a post
|
| 448 |
*/
|
| 449 |
function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
|
|
|
|
|
|
| 450 |
|
| 451 |
if (!duplicate_post_is_post_type_enabled($post->post_type) && $post->post_type != 'attachment')
|
| 452 |
-
wp_die(
|
| 453 |
|
|
|
|
|
|
|
| 454 |
if ($post->post_type != 'attachment'){
|
| 455 |
$prefix = sanitize_text_field(get_option('duplicate_post_title_prefix'));
|
| 456 |
$suffix = sanitize_text_field(get_option('duplicate_post_title_suffix'));
|
|
@@ -468,13 +517,40 @@ function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
|
| 468 |
// empty title
|
| 469 |
$title = __('Untitled');
|
| 470 |
}
|
| 471 |
-
|
| 472 |
-
|
| 473 |
-
|
| 474 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 475 |
$new_post_author = wp_get_current_user();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 476 |
|
| 477 |
-
$menu_order = $post->menu_order;
|
| 478 |
$increase_menu_order_by = get_option('duplicate_post_increase_menu_order_by');
|
| 479 |
if(!empty($increase_menu_order_by) && is_numeric($increase_menu_order_by)){
|
| 480 |
$menu_order += intval($increase_menu_order_by);
|
|
@@ -484,15 +560,15 @@ function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
|
| 484 |
'menu_order' => $menu_order,
|
| 485 |
'comment_status' => $post->comment_status,
|
| 486 |
'ping_status' => $post->ping_status,
|
| 487 |
-
'post_author' => $
|
| 488 |
-
'post_content' => (get_option('duplicate_post_copycontent') == '1') ?
|
| 489 |
-
'post_content_filtered' => (get_option('duplicate_post_copycontent') == '1') ?
|
| 490 |
-
'post_excerpt' => (get_option('duplicate_post_copyexcerpt') == '1') ?
|
| 491 |
'post_mime_type' => $post->post_mime_type,
|
| 492 |
'post_parent' => $new_post_parent = empty($parent_id)? $post->post_parent : $parent_id,
|
| 493 |
'post_password' => (get_option('duplicate_post_copypassword') == '1') ? $post->post_password: "",
|
| 494 |
-
'post_status' => $new_post_status
|
| 495 |
-
'post_title' =>
|
| 496 |
'post_type' => $post->post_type,
|
| 497 |
);
|
| 498 |
|
|
@@ -501,7 +577,7 @@ function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
|
| 501 |
$new_post['post_date_gmt'] = get_gmt_from_date($new_post_date);
|
| 502 |
}
|
| 503 |
|
| 504 |
-
$new_post_id = wp_insert_post($new_post);
|
| 505 |
|
| 506 |
// If the copy is published or scheduled, we have to set a proper slug.
|
| 507 |
if ($new_post_status == 'publish' || $new_post_status == 'future'){
|
|
@@ -516,12 +592,12 @@ function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
|
| 516 |
$new_post['post_name'] = $post_name;
|
| 517 |
|
| 518 |
// Update the post into the database
|
| 519 |
-
wp_update_post( $new_post );
|
| 520 |
}
|
| 521 |
|
| 522 |
// If you have written a plugin which uses non-WP database tables to save
|
| 523 |
// information about a post you can hook this action to dupe that data.
|
| 524 |
-
if ($post->post_type == 'page' ||
|
| 525 |
do_action( 'dp_duplicate_page', $new_post_id, $post );
|
| 526 |
else
|
| 527 |
do_action( 'dp_duplicate_post', $new_post_id, $post );
|
|
@@ -529,6 +605,8 @@ function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
|
| 529 |
delete_post_meta($new_post_id, '_dp_original');
|
| 530 |
add_post_meta($new_post_id, '_dp_original', $post->ID);
|
| 531 |
|
|
|
|
|
|
|
| 532 |
return $new_post_id;
|
| 533 |
}
|
| 534 |
|
|
@@ -537,12 +615,14 @@ add_filter('plugin_row_meta', 'duplicate_post_add_plugin_links', 10, 2);
|
|
| 537 |
|
| 538 |
function duplicate_post_add_plugin_links($links, $file) {
|
| 539 |
if ( $file == plugin_basename(dirname(__FILE__).'/duplicate-post.php') ) {
|
| 540 |
-
$links[] = '<a href="http://lopo.it/duplicate-post-plugin">' .
|
| 541 |
-
$links[] = '<a href="https://translate.wordpress.org/projects/wp-plugins/duplicate-post">' .
|
| 542 |
}
|
| 543 |
return $links;
|
| 544 |
}
|
| 545 |
|
|
|
|
|
|
|
| 546 |
add_action( 'admin_notices', 'duplicate_post_action_admin_notice' );
|
| 547 |
|
| 548 |
function duplicate_post_action_admin_notice() {
|
|
@@ -557,3 +637,55 @@ function duplicate_post_action_admin_notice() {
|
|
| 557 |
remove_query_arg( 'cloned' );
|
| 558 |
}
|
| 559 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
function duplicate_post_plugin_upgrade() {
|
| 28 |
$installed_version = duplicate_post_get_installed_version();
|
| 29 |
+
|
| 30 |
+
if ( $installed_version==duplicate_post_get_current_version() )
|
| 31 |
+
return;
|
| 32 |
|
| 33 |
+
|
| 34 |
+
if (empty($installed_version)) {
|
|
|
|
|
|
|
| 35 |
// Get default roles
|
| 36 |
+
$default_roles = array(
|
| 37 |
3 => 'editor',
|
| 38 |
8 => 'administrator',
|
| 39 |
);
|
| 40 |
+
|
| 41 |
// Cycle all roles and assign capability if its level >= duplicate_post_copy_user_level
|
| 42 |
foreach ($default_roles as $level => $name){
|
| 43 |
$role = get_role($name);
|
| 44 |
if(!empty($role)) $role->add_cap( 'copy_posts' );
|
| 45 |
}
|
| 46 |
+
} else {
|
| 47 |
+
$min_user_level = get_option('duplicate_post_copy_user_level');
|
| 48 |
|
| 49 |
+
if (!empty($min_user_level)){
|
| 50 |
+
// Get default roles
|
| 51 |
+
$default_roles = array(
|
| 52 |
+
1 => 'contributor',
|
| 53 |
+
2 => 'author',
|
| 54 |
+
3 => 'editor',
|
| 55 |
+
8 => 'administrator',
|
| 56 |
+
);
|
| 57 |
+
|
| 58 |
+
// Cycle all roles and assign capability if its level >= duplicate_post_copy_user_level
|
| 59 |
+
foreach ($default_roles as $level => $name){
|
| 60 |
+
$role = get_role($name);
|
| 61 |
+
if ($role && $min_user_level <= $level)
|
| 62 |
+
$role->add_cap( 'copy_posts' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
}
|
| 64 |
+
delete_option('duplicate_post_copy_user_level');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
}
|
| 66 |
+
}
|
| 67 |
|
| 68 |
+
|
| 69 |
+
add_option('duplicate_post_copytitle','1');
|
| 70 |
+
add_option('duplicate_post_copydate','0');
|
| 71 |
+
add_option('duplicate_post_copystatus','0');
|
| 72 |
+
add_option('duplicate_post_copyslug','1');
|
| 73 |
+
add_option('duplicate_post_copyexcerpt','1');
|
| 74 |
+
add_option('duplicate_post_copycontent','1');
|
| 75 |
+
add_option('duplicate_post_copythumbnail','1');
|
| 76 |
+
add_option('duplicate_post_copytemplate','1');
|
| 77 |
+
add_option('duplicate_post_copyformat','1');
|
| 78 |
+
add_option('duplicate_post_copyauthor','0');
|
| 79 |
+
add_option('duplicate_post_copypassword','0');
|
| 80 |
+
add_option('duplicate_post_copyattachments','0');
|
| 81 |
+
add_option('duplicate_post_copychildren','0');
|
| 82 |
+
add_option('duplicate_post_copycomments','0');
|
| 83 |
+
add_option('duplicate_post_copymenuorder','1');
|
| 84 |
+
add_option('duplicate_post_taxonomies_blacklist',array());
|
| 85 |
+
add_option('duplicate_post_blacklist','');
|
| 86 |
+
add_option('duplicate_post_types_enabled',array('post', 'page'));
|
| 87 |
+
add_option('duplicate_post_show_row','1');
|
| 88 |
+
add_option('duplicate_post_show_adminbar','1');
|
| 89 |
+
add_option('duplicate_post_show_submitbox','1');
|
| 90 |
+
add_option('duplicate_post_show_bulkactions','1');
|
| 91 |
+
|
| 92 |
+
$taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist');
|
| 93 |
+
if ($taxonomies_blacklist == "") $taxonomies_blacklist = array();
|
| 94 |
+
if(in_array('post_format',$taxonomies_blacklist)){
|
| 95 |
+
update_option('duplicate_post_copyformat', 0);
|
| 96 |
+
$taxonomies_blacklist = array_diff($taxonomies_blacklist, array('post_format'));
|
| 97 |
+
update_option('duplicate_post_taxonomies_blacklist', $taxonomies_blacklist);
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
$meta_blacklist = explode(",",get_option('duplicate_post_blacklist'));
|
| 101 |
+
if ($meta_blacklist == "") $meta_blacklist = array();
|
| 102 |
+
$meta_blacklist = array_map('trim', $meta_blacklist);
|
| 103 |
+
if(in_array('_wp_page_template', $meta_blacklist)){
|
| 104 |
+
update_option('duplicate_post_copytemplate', 0);
|
| 105 |
+
$meta_blacklist = array_diff($meta_blacklist, array('_wp_page_template'));
|
| 106 |
+
}
|
| 107 |
+
if(in_array('_thumbnail_id', $meta_blacklist)){
|
| 108 |
+
update_option('duplicate_post_copythumbnail', 0);
|
| 109 |
+
$meta_blacklist = array_diff($meta_blacklist, array('_thumbnail_id'));
|
| 110 |
}
|
| 111 |
+
update_option('duplicate_post_blacklist', implode(',',$meta_blacklist));
|
| 112 |
+
|
| 113 |
+
delete_option('duplicate_post_admin_user_level');
|
| 114 |
+
delete_option('duplicate_post_create_user_level');
|
| 115 |
+
delete_option('duplicate_post_view_user_level');
|
| 116 |
+
delete_option('dp_notice');
|
| 117 |
+
|
| 118 |
delete_option('duplicate_post_version');
|
| 119 |
update_site_option( 'duplicate_post_version', duplicate_post_get_current_version() );
|
| 120 |
+
|
| 121 |
+
delete_option('duplicate_post_show_notice', 0);
|
| 122 |
+
update_site_option('duplicate_post_show_notice', 1);
|
| 123 |
+
|
| 124 |
}
|
| 125 |
|
| 126 |
if (get_option('duplicate_post_show_row') == 1){
|
| 136 |
function duplicate_post_show_update_notice() {
|
| 137 |
if(!current_user_can( 'manage_options')) return;
|
| 138 |
$class = 'notice is-dismissible';
|
| 139 |
+
$message = '<strong>'.esc_html__('Duplicate Post has new features!', 'duplicate-post').'</strong><br/>';
|
| 140 |
+
$message .= '<em>'.esc_html__('Clone posts in bulk (WP 4.7+)', 'duplicate-post').' — '.esc_html__('Wildcards in custom field names', 'duplicate-post').' — '.esc_html__('Options for thumbnail, post format, post template, author, menu order', 'duplicate-post').'</em><br/>';
|
| 141 |
+
$message .= sprintf(__('Please <a href="%s">review the settings</a> to make sure it works as you expect.', 'duplicate-post'), admin_url('options-general.php?page=duplicatepost')).'<br/>';
|
| 142 |
+
$message .= '<strong>'.__('Help me develop the plugin and provide support by <a href="http://lopo.it/duplicate-post-plugin">donating even a small sum</a>.', 'duplicate-post').'</strong>';
|
| 143 |
+
global $wp_version;
|
| 144 |
+
if( version_compare($wp_version, '4.2') < 0 ){
|
| 145 |
+
$message .= ' | <a id="duplicate-post-dismiss-notice" href="javascript:duplicate_post_dismiss_notice();">'.__('Dismiss this notice.').'</a>';
|
| 146 |
+
}
|
| 147 |
echo '<div id="duplicate-post-notice" class="'.$class.'"><p>'.$message.'</p></div>';
|
| 148 |
echo "<script>
|
| 149 |
function duplicate_post_dismiss_notice(){
|
| 164 |
</script>";
|
| 165 |
}
|
| 166 |
|
| 167 |
+
if(is_multisite()){
|
| 168 |
+
add_action( 'network_admin_notices', 'duplicate_post_show_update_notice' );
|
| 169 |
+
} else {
|
| 170 |
+
add_action( 'admin_notices', 'duplicate_post_show_update_notice' );
|
| 171 |
+
}
|
| 172 |
add_action( 'wp_ajax_duplicate_post_dismiss_notice', 'duplicate_post_dismiss_notice' );
|
| 173 |
|
| 174 |
function duplicate_post_dismiss_notice() {
|
| 184 |
function duplicate_post_make_duplicate_link_row($actions, $post) {
|
| 185 |
if (duplicate_post_is_current_user_allowed_to_copy() && duplicate_post_is_post_type_enabled($post->post_type)) {
|
| 186 |
$actions['clone'] = '<a href="'.duplicate_post_get_clone_post_link( $post->ID , 'display', false).'" title="'
|
| 187 |
+
. esc_attr__("Clone this item", 'duplicate-post')
|
| 188 |
+
. '">' . esc_html__('Clone', 'duplicate-post') . '</a>';
|
| 189 |
$actions['edit_as_new_draft'] = '<a href="'. duplicate_post_get_clone_post_link( $post->ID ) .'" title="'
|
| 190 |
+
. esc_attr__('Copy to a new draft', 'duplicate-post')
|
| 191 |
+
. '">' . esc_html__('New Draft', 'duplicate-post') . '</a>';
|
| 192 |
}
|
| 193 |
return $actions;
|
| 194 |
}
|
| 208 |
?>
|
| 209 |
<div id="duplicate-action">
|
| 210 |
<a class="submitduplicate duplication"
|
| 211 |
+
href="<?php echo duplicate_post_get_clone_post_link( $_GET['post'] ) ?>"><?php esc_html_e('Copy to a new draft', 'duplicate-post'); ?>
|
| 212 |
</a>
|
| 213 |
</div>
|
| 214 |
<?php
|
| 243 |
*/
|
| 244 |
function duplicate_post_save_as_new_post($status = ''){
|
| 245 |
if (! ( isset( $_GET['post']) || isset( $_POST['post']) || ( isset($_REQUEST['action']) && 'duplicate_post_save_as_new_post' == $_REQUEST['action'] ) ) ) {
|
| 246 |
+
wp_die(esc_html__('No post to duplicate has been supplied!', 'duplicate-post'));
|
| 247 |
}
|
| 248 |
|
| 249 |
// Get the original post
|
| 253 |
// Copy the post and insert it
|
| 254 |
if (isset($post) && $post!=null) {
|
| 255 |
$new_id = duplicate_post_create_duplicate($post, $status);
|
| 256 |
+
|
| 257 |
if ($status == ''){
|
| 258 |
+
$sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'cloned', 'ids'), admin_url( 'edit.php?post_type='.$post->post_type) );
|
| 259 |
// Redirect to the post list screen
|
| 260 |
wp_redirect( add_query_arg( array( 'cloned' => 1, 'ids' => $post->ID), $sendback ) );
|
| 261 |
} else {
|
| 265 |
exit;
|
| 266 |
|
| 267 |
} else {
|
| 268 |
+
wp_die(esc_html__('Copy creation failed, could not find original:', 'duplicate-post') . ' ' . htmlspecialchars($id));
|
| 269 |
}
|
| 270 |
}
|
| 271 |
|
| 279 |
wp_set_object_terms( $new_id, NULL, 'category' );
|
| 280 |
|
| 281 |
$post_taxonomies = get_object_taxonomies($post->post_type);
|
| 282 |
+
// severl plugins just add support to post-formats but don't register post_format taxonomy
|
| 283 |
+
if(post_type_supports($post->post_type, 'post-formats') && !in_array('post_format', $post_taxonomies)){
|
| 284 |
+
$post_taxonomies[] = 'post_format';
|
| 285 |
+
}
|
| 286 |
+
|
| 287 |
$taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist');
|
| 288 |
if ($taxonomies_blacklist == "") $taxonomies_blacklist = array();
|
| 289 |
+
if(get_option('duplicate_post_copyformat') == 0){
|
| 290 |
+
$taxonomies_blacklist[] = 'post_format';
|
| 291 |
+
}
|
| 292 |
$taxonomies = array_diff($post_taxonomies, $taxonomies_blacklist);
|
| 293 |
foreach ($taxonomies as $taxonomy) {
|
| 294 |
$post_terms = wp_get_object_terms($post->ID, $taxonomy, array( 'orderby' => 'term_order' ));
|
| 315 |
$meta_blacklist[] = '_wpas_mess'; //Jetpack Publicize
|
| 316 |
$meta_blacklist[] = '_edit_lock'; // edit lock
|
| 317 |
$meta_blacklist[] = '_edit_last'; // edit lock
|
| 318 |
+
if(get_option('duplicate_post_copytemplate') == 0){
|
| 319 |
+
$meta_blacklist[] = '_wp_page_template';
|
| 320 |
+
}
|
| 321 |
+
if(get_option('duplicate_post_copythumbnail') == 0){
|
| 322 |
+
$meta_blacklist[] = '_thumbnail_id';
|
| 323 |
+
}
|
| 324 |
+
//$meta_keys = array_diff($post_meta_keys, $meta_blacklist);
|
| 325 |
+
$meta_blacklist_string = '('.implode(')|(',$meta_blacklist).')';
|
| 326 |
+
$meta_blacklist_string = str_replace(array('*'), array('[a-zA-Z0-9_]*'), $meta_blacklist_string);
|
| 327 |
+
|
| 328 |
+
$meta_keys = array();
|
| 329 |
+
foreach($post_meta_keys as $meta_key){
|
| 330 |
+
if(!preg_match('#^'.$meta_blacklist_string.'$#', $meta_key))
|
| 331 |
+
$meta_keys[] = $meta_key;
|
| 332 |
+
}
|
| 333 |
|
| 334 |
+
$meta_keys = apply_filters( 'dp_meta_keys', $meta_keys );
|
| 335 |
foreach ($meta_keys as $meta_key) {
|
| 336 |
$meta_values = get_post_custom_values($meta_key, $post->ID);
|
| 337 |
foreach ($meta_values as $meta_value) {
|
| 338 |
$meta_value = maybe_unserialize($meta_value);
|
| 339 |
+
add_post_meta($new_id, $meta_key, duplicate_post_wp_slash($meta_value));
|
| 340 |
}
|
| 341 |
}
|
| 342 |
}
|
| 343 |
|
| 344 |
+
/*
|
| 345 |
+
* Workaround for inconsistent wp_slash.
|
| 346 |
+
* Works only with WP 4.4+ (map_deep)
|
| 347 |
+
*/
|
| 348 |
+
function duplicate_post_addslashes_deep( $value ) {
|
| 349 |
+
if (function_exists('map_deep')){
|
| 350 |
+
return map_deep( $value, 'duplicate_post_addslashes_to_strings_only' );
|
| 351 |
+
} else {
|
| 352 |
+
return wp_slash( $value );
|
| 353 |
+
}
|
| 354 |
+
}
|
| 355 |
+
|
| 356 |
+
function duplicate_post_addslashes_to_strings_only( $value ) {
|
| 357 |
+
return is_string( $value ) ? addslashes( $value ) : $value;
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
function duplicate_post_wp_slash( $value ) {
|
| 361 |
+
return duplicate_post_addslashes_deep( $value );
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
|
| 365 |
+
|
| 366 |
/**
|
| 367 |
* Copy the attachments
|
| 368 |
*/
|
| 382 |
continue;
|
| 383 |
}
|
| 384 |
|
| 385 |
+
$desc = wp_slash($child->post_content);
|
| 386 |
|
| 387 |
$file_array = array();
|
| 388 |
$file_array['name'] = basename($url);
|
| 397 |
$new_post_author = wp_get_current_user();
|
| 398 |
$cloned_child = array(
|
| 399 |
'ID' => $new_attachment_id,
|
| 400 |
+
'post_title' => $child->post_title,
|
| 401 |
+
'post_exceprt' => $child->post_title,
|
| 402 |
'post_author' => $new_post_author->ID
|
| 403 |
);
|
| 404 |
+
wp_update_post( wp_slash($cloned_child) );
|
| 405 |
|
| 406 |
$alt_title = get_post_meta($child->ID, '_wp_attachment_image_alt', true);
|
| 407 |
+
if($alt_title) update_post_meta($new_attachment_id, '_wp_attachment_image_alt', wp_slash($alt_title));
|
| 408 |
|
| 409 |
// if we have cloned the post thumbnail, set the copy as the thumbnail for the new post
|
| 410 |
+
if(get_option('duplicate_post_copythumbnail') == 1 && $old_thumbnail_id == $child->ID){
|
| 411 |
set_post_thumbnail($new_id, $new_attachment_id);
|
| 412 |
}
|
| 413 |
|
| 492 |
* Create a duplicate from a post
|
| 493 |
*/
|
| 494 |
function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') {
|
| 495 |
+
|
| 496 |
+
do_action('duplicate_post_pre_copy');
|
| 497 |
|
| 498 |
if (!duplicate_post_is_post_type_enabled($post->post_type) && $post->post_type != 'attachment')
|
| 499 |
+
wp_die(esc_html__('Copy features for this post type are not enabled in options page', 'duplicate-post'));
|
| 500 |
|
| 501 |
+
$new_post_status = (empty($status))? $post->post_status: $status;
|
| 502 |
+
|
| 503 |
if ($post->post_type != 'attachment'){
|
| 504 |
$prefix = sanitize_text_field(get_option('duplicate_post_title_prefix'));
|
| 505 |
$suffix = sanitize_text_field(get_option('duplicate_post_title_suffix'));
|
| 517 |
// empty title
|
| 518 |
$title = __('Untitled');
|
| 519 |
}
|
| 520 |
+
if (get_option('duplicate_post_copystatus') == 0){
|
| 521 |
+
$new_post_status = 'draft';
|
| 522 |
+
} else {
|
| 523 |
+
if ( 'publish' == $new_post_status || 'future' == $new_post_status ){
|
| 524 |
+
// check if the user has the right capability
|
| 525 |
+
if(is_post_type_hierarchical( $post->post_type )){
|
| 526 |
+
if(!current_user_can('publish_pages')){
|
| 527 |
+
$new_post_status = 'pending';
|
| 528 |
+
}
|
| 529 |
+
} else {
|
| 530 |
+
if(!current_user_can('publish_posts')){
|
| 531 |
+
$new_post_status = 'pending';
|
| 532 |
+
}
|
| 533 |
+
}
|
| 534 |
+
}
|
| 535 |
+
}
|
| 536 |
+
}
|
| 537 |
+
|
| 538 |
$new_post_author = wp_get_current_user();
|
| 539 |
+
$new_post_author_id = $new_post_author->ID;
|
| 540 |
+
if ( get_option('duplicate_post_copyauthor') == '1' ){
|
| 541 |
+
// check if the user has the right capability
|
| 542 |
+
if(is_post_type_hierarchical( $post->post_type )){
|
| 543 |
+
if(current_user_can('edit_others_pages')){
|
| 544 |
+
$new_post_author_id = $post->post_author;
|
| 545 |
+
}
|
| 546 |
+
} else {
|
| 547 |
+
if(current_user_can('edit_others_posts')){
|
| 548 |
+
$new_post_author_id = $post->post_author;
|
| 549 |
+
}
|
| 550 |
+
}
|
| 551 |
+
}
|
| 552 |
|
| 553 |
+
$menu_order = (get_option('duplicate_post_copymenuorder') == '1') ? $post->menu_order : 0;
|
| 554 |
$increase_menu_order_by = get_option('duplicate_post_increase_menu_order_by');
|
| 555 |
if(!empty($increase_menu_order_by) && is_numeric($increase_menu_order_by)){
|
| 556 |
$menu_order += intval($increase_menu_order_by);
|
| 560 |
'menu_order' => $menu_order,
|
| 561 |
'comment_status' => $post->comment_status,
|
| 562 |
'ping_status' => $post->ping_status,
|
| 563 |
+
'post_author' => $new_post_author_id,
|
| 564 |
+
'post_content' => (get_option('duplicate_post_copycontent') == '1') ? $post->post_content : "" ,
|
| 565 |
+
'post_content_filtered' => (get_option('duplicate_post_copycontent') == '1') ? $post->post_content_filtered : "" ,
|
| 566 |
+
'post_excerpt' => (get_option('duplicate_post_copyexcerpt') == '1') ? $post->post_excerpt : "",
|
| 567 |
'post_mime_type' => $post->post_mime_type,
|
| 568 |
'post_parent' => $new_post_parent = empty($parent_id)? $post->post_parent : $parent_id,
|
| 569 |
'post_password' => (get_option('duplicate_post_copypassword') == '1') ? $post->post_password: "",
|
| 570 |
+
'post_status' => $new_post_status,
|
| 571 |
+
'post_title' => $title,
|
| 572 |
'post_type' => $post->post_type,
|
| 573 |
);
|
| 574 |
|
| 577 |
$new_post['post_date_gmt'] = get_gmt_from_date($new_post_date);
|
| 578 |
}
|
| 579 |
|
| 580 |
+
$new_post_id = wp_insert_post(wp_slash($new_post));
|
| 581 |
|
| 582 |
// If the copy is published or scheduled, we have to set a proper slug.
|
| 583 |
if ($new_post_status == 'publish' || $new_post_status == 'future'){
|
| 592 |
$new_post['post_name'] = $post_name;
|
| 593 |
|
| 594 |
// Update the post into the database
|
| 595 |
+
wp_update_post( wp_slash($new_post) );
|
| 596 |
}
|
| 597 |
|
| 598 |
// If you have written a plugin which uses non-WP database tables to save
|
| 599 |
// information about a post you can hook this action to dupe that data.
|
| 600 |
+
if ($post->post_type == 'page' || is_post_type_hierarchical( $post->post_type ))
|
| 601 |
do_action( 'dp_duplicate_page', $new_post_id, $post );
|
| 602 |
else
|
| 603 |
do_action( 'dp_duplicate_post', $new_post_id, $post );
|
| 605 |
delete_post_meta($new_post_id, '_dp_original');
|
| 606 |
add_post_meta($new_post_id, '_dp_original', $post->ID);
|
| 607 |
|
| 608 |
+
do_action('duplicate_post_post_copy');
|
| 609 |
+
|
| 610 |
return $new_post_id;
|
| 611 |
}
|
| 612 |
|
| 615 |
|
| 616 |
function duplicate_post_add_plugin_links($links, $file) {
|
| 617 |
if ( $file == plugin_basename(dirname(__FILE__).'/duplicate-post.php') ) {
|
| 618 |
+
$links[] = '<a href="http://lopo.it/duplicate-post-plugin">' . esc_html__('Donate', 'duplicate-post') . '</a>';
|
| 619 |
+
$links[] = '<a href="https://translate.wordpress.org/projects/wp-plugins/duplicate-post">' . esc_html__('Translate', 'duplicate-post') . '</a>';
|
| 620 |
}
|
| 621 |
return $links;
|
| 622 |
}
|
| 623 |
|
| 624 |
+
/*** NOTICES ***/
|
| 625 |
+
|
| 626 |
add_action( 'admin_notices', 'duplicate_post_action_admin_notice' );
|
| 627 |
|
| 628 |
function duplicate_post_action_admin_notice() {
|
| 637 |
remove_query_arg( 'cloned' );
|
| 638 |
}
|
| 639 |
}
|
| 640 |
+
|
| 641 |
+
|
| 642 |
+
/*** BULK ACTIONS ***/
|
| 643 |
+
|
| 644 |
+
add_action('admin_init', 'duplicate_post_add_bulk_filters_for_enabled_post_types');
|
| 645 |
+
|
| 646 |
+
function duplicate_post_add_bulk_filters_for_enabled_post_types(){
|
| 647 |
+
if(get_option('duplicate_post_show_bulkactions') != 1) return;
|
| 648 |
+
$duplicate_post_types_enabled = get_option('duplicate_post_types_enabled', array ('post', 'page'));
|
| 649 |
+
if(!is_array($duplicate_post_types_enabled)) $duplicate_post_types_enabled = array($duplicate_post_types_enabled);
|
| 650 |
+
foreach($duplicate_post_types_enabled as $duplicate_post_type_enabled){
|
| 651 |
+
add_filter( "bulk_actions-edit-{$duplicate_post_type_enabled}", 'duplicate_post_register_bulk_action' );
|
| 652 |
+
add_filter( "handle_bulk_actions-edit-{$duplicate_post_type_enabled}", 'duplicate_post_action_handler', 10, 3 );
|
| 653 |
+
}
|
| 654 |
+
}
|
| 655 |
+
|
| 656 |
+
function duplicate_post_register_bulk_action($bulk_actions) {
|
| 657 |
+
$bulk_actions['duplicate_post_clone'] = esc_html__( 'Clone', 'duplicate-post');
|
| 658 |
+
return $bulk_actions;
|
| 659 |
+
}
|
| 660 |
+
|
| 661 |
+
function duplicate_post_action_handler( $redirect_to, $doaction, $post_ids ) {
|
| 662 |
+
if ( $doaction !== 'duplicate_post_clone' ) {
|
| 663 |
+
return $redirect_to;
|
| 664 |
+
}
|
| 665 |
+
$counter = 0;
|
| 666 |
+
foreach ( $post_ids as $post_id ) {
|
| 667 |
+
$post = get_post($post_id);
|
| 668 |
+
if(!empty($post)){
|
| 669 |
+
if( get_option('duplicate_post_copychildren') != 1
|
| 670 |
+
|| !is_post_type_hierarchical( $post->post_type )
|
| 671 |
+
|| (is_post_type_hierarchical( $post->post_type ) && !duplicate_post_has_ancestors_marked($post, $post_ids))){
|
| 672 |
+
if(duplicate_post_create_duplicate($post)){
|
| 673 |
+
$counter++;
|
| 674 |
+
}
|
| 675 |
+
}
|
| 676 |
+
}
|
| 677 |
+
}
|
| 678 |
+
$redirect_to = add_query_arg( 'cloned', $counter, $redirect_to );
|
| 679 |
+
return $redirect_to;
|
| 680 |
+
}
|
| 681 |
+
|
| 682 |
+
function duplicate_post_has_ancestors_marked($post, $post_ids){
|
| 683 |
+
$ancestors_in_array = 0;
|
| 684 |
+
$parent = $post->ID;
|
| 685 |
+
while ($parent = wp_get_post_parent_id($parent)){
|
| 686 |
+
if(in_array($parent, $post_ids)){
|
| 687 |
+
$ancestors_in_array++;
|
| 688 |
+
}
|
| 689 |
+
}
|
| 690 |
+
return ($ancestors_in_array !== 0);
|
| 691 |
+
}
|
duplicate-post-common.php
CHANGED
|
@@ -12,6 +12,7 @@ function duplicate_post_is_current_user_allowed_to_copy() {
|
|
| 12 |
*/
|
| 13 |
function duplicate_post_is_post_type_enabled($post_type){
|
| 14 |
$duplicate_post_types_enabled = get_option('duplicate_post_types_enabled', array ('post', 'page'));
|
|
|
|
| 15 |
return in_array($post_type, $duplicate_post_types_enabled);
|
| 16 |
}
|
| 17 |
|
|
@@ -74,10 +75,10 @@ function duplicate_post_clone_post_link( $link = null, $before = '', $after = ''
|
|
| 74 |
return;
|
| 75 |
|
| 76 |
if ( null === $link )
|
| 77 |
-
$link =
|
| 78 |
|
| 79 |
$link = '<a class="post-clone-link" href="' . $url . '" title="'
|
| 80 |
-
.
|
| 81 |
.'">' . $link . '</a>';
|
| 82 |
echo $before . apply_filters( 'duplicate_post_clone_post_link', $link, $post->ID ) . $after;
|
| 83 |
}
|
|
@@ -99,6 +100,7 @@ function duplicate_post_get_original($id = 0 , $output = OBJECT){
|
|
| 99 |
|
| 100 |
// Admin bar
|
| 101 |
function duplicate_post_admin_bar_render() {
|
|
|
|
| 102 |
global $wp_admin_bar;
|
| 103 |
$current_object = get_queried_object();
|
| 104 |
if ( empty($current_object) )
|
|
@@ -111,13 +113,14 @@ function duplicate_post_admin_bar_render() {
|
|
| 111 |
{
|
| 112 |
$wp_admin_bar->add_menu( array(
|
| 113 |
'id' => 'new_draft',
|
| 114 |
-
'title' =>
|
| 115 |
'href' => duplicate_post_get_clone_post_link( $current_object->ID )
|
| 116 |
) );
|
| 117 |
}
|
| 118 |
}
|
| 119 |
|
| 120 |
function duplicate_post_add_css() {
|
|
|
|
| 121 |
$current_object = get_queried_object();
|
| 122 |
if ( empty($current_object) )
|
| 123 |
return;
|
| 12 |
*/
|
| 13 |
function duplicate_post_is_post_type_enabled($post_type){
|
| 14 |
$duplicate_post_types_enabled = get_option('duplicate_post_types_enabled', array ('post', 'page'));
|
| 15 |
+
if(!is_array($duplicate_post_types_enabled)) $duplicate_post_types_enabled = array($duplicate_post_types_enabled);
|
| 16 |
return in_array($post_type, $duplicate_post_types_enabled);
|
| 17 |
}
|
| 18 |
|
| 75 |
return;
|
| 76 |
|
| 77 |
if ( null === $link )
|
| 78 |
+
$link = esc_html__('Copy to a new draft', 'duplicate-post');
|
| 79 |
|
| 80 |
$link = '<a class="post-clone-link" href="' . $url . '" title="'
|
| 81 |
+
. esc_attr__("Copy to a new draft", 'duplicate-post')
|
| 82 |
.'">' . $link . '</a>';
|
| 83 |
echo $before . apply_filters( 'duplicate_post_clone_post_link', $link, $post->ID ) . $after;
|
| 84 |
}
|
| 100 |
|
| 101 |
// Admin bar
|
| 102 |
function duplicate_post_admin_bar_render() {
|
| 103 |
+
if(!is_admin_bar_showing()) return;
|
| 104 |
global $wp_admin_bar;
|
| 105 |
$current_object = get_queried_object();
|
| 106 |
if ( empty($current_object) )
|
| 113 |
{
|
| 114 |
$wp_admin_bar->add_menu( array(
|
| 115 |
'id' => 'new_draft',
|
| 116 |
+
'title' => esc_attr__("Copy to a new draft", 'duplicate-post'),
|
| 117 |
'href' => duplicate_post_get_clone_post_link( $current_object->ID )
|
| 118 |
) );
|
| 119 |
}
|
| 120 |
}
|
| 121 |
|
| 122 |
function duplicate_post_add_css() {
|
| 123 |
+
if(!is_admin_bar_showing()) return;
|
| 124 |
$current_object = get_queried_object();
|
| 125 |
if ( empty($current_object) )
|
| 126 |
return;
|
duplicate-post-options.php
CHANGED
|
@@ -18,10 +18,15 @@ function duplicate_post_register_settings() { // whitelist options
|
|
| 18 |
register_setting( 'duplicate_post_group', 'duplicate_post_copyslug');
|
| 19 |
register_setting( 'duplicate_post_group', 'duplicate_post_copyexcerpt');
|
| 20 |
register_setting( 'duplicate_post_group', 'duplicate_post_copycontent');
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
register_setting( 'duplicate_post_group', 'duplicate_post_copypassword');
|
| 22 |
register_setting( 'duplicate_post_group', 'duplicate_post_copyattachments');
|
| 23 |
register_setting( 'duplicate_post_group', 'duplicate_post_copychildren');
|
| 24 |
register_setting( 'duplicate_post_group', 'duplicate_post_copycomments');
|
|
|
|
| 25 |
register_setting( 'duplicate_post_group', 'duplicate_post_blacklist');
|
| 26 |
register_setting( 'duplicate_post_group', 'duplicate_post_taxonomies_blacklist');
|
| 27 |
register_setting( 'duplicate_post_group', 'duplicate_post_title_prefix');
|
|
@@ -32,6 +37,7 @@ function duplicate_post_register_settings() { // whitelist options
|
|
| 32 |
register_setting( 'duplicate_post_group', 'duplicate_post_show_row');
|
| 33 |
register_setting( 'duplicate_post_group', 'duplicate_post_show_adminbar');
|
| 34 |
register_setting( 'duplicate_post_group', 'duplicate_post_show_submitbox');
|
|
|
|
| 35 |
}
|
| 36 |
|
| 37 |
|
|
@@ -69,19 +75,25 @@ function duplicate_post_options() {
|
|
| 69 |
<br>
|
| 70 |
</div>
|
| 71 |
<h1>
|
| 72 |
-
<?php
|
| 73 |
</h1>
|
| 74 |
-
|
| 75 |
<div
|
| 76 |
-
style="margin: 9px 15px 4px 0; padding: 5px; text-align: center;
|
| 77 |
-
<
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
</div>
|
|
|
|
| 85 |
|
| 86 |
<script>
|
| 87 |
jQuery(document).on( 'click', '.nav-tab-wrapper a', function() {
|
|
@@ -91,12 +103,14 @@ function duplicate_post_options() {
|
|
| 91 |
jQuery('section').eq(jQuery(this).index()).show();
|
| 92 |
return false;
|
| 93 |
});
|
| 94 |
-
|
| 95 |
function toggle_private_taxonomies(){
|
| 96 |
-
jQuery('.taxonomy_private').toggle();
|
| 97 |
}
|
|
|
|
|
|
|
| 98 |
jQuery(function(){
|
| 99 |
-
jQuery('.taxonomy_private').hide();
|
| 100 |
});
|
| 101 |
|
| 102 |
</script>
|
|
@@ -169,11 +183,11 @@ img#donate-button{
|
|
| 169 |
|
| 170 |
<h2 class="nav-tab-wrapper">
|
| 171 |
<a class="nav-tab nav-tab-active"
|
| 172 |
-
href="<?php echo admin_url() ?>/index.php?page=duplicate-post-what"><?php
|
| 173 |
</a> <a class="nav-tab"
|
| 174 |
-
href="<?php echo admin_url() ?>/index.php?page=duplicate-post-who"><?php
|
| 175 |
</a> <a class="nav-tab"
|
| 176 |
-
href="<?php echo admin_url() ?>/index.php?page=duplicate-post-where"><?php
|
| 177 |
</a>
|
| 178 |
</h2>
|
| 179 |
|
|
@@ -181,99 +195,118 @@ img#donate-button{
|
|
| 181 |
|
| 182 |
<table class="form-table">
|
| 183 |
<tr valign="top">
|
| 184 |
-
<th scope="row"><?php
|
| 185 |
</th>
|
| 186 |
<td colspan="2"><label> <input type="checkbox"
|
| 187 |
name="duplicate_post_copytitle" value="1" <?php if(get_option('duplicate_post_copytitle') == 1) echo 'checked="checked"'; ?>"/>
|
| 188 |
-
<?php
|
| 189 |
</label> <label> <input type="checkbox"
|
| 190 |
name="duplicate_post_copydate" value="1" <?php if(get_option('duplicate_post_copydate') == 1) echo 'checked="checked"'; ?>"/>
|
| 191 |
-
<?php
|
| 192 |
</label> <label> <input type="checkbox"
|
| 193 |
name="duplicate_post_copystatus" value="1" <?php if(get_option('duplicate_post_copystatus') == 1) echo 'checked="checked"'; ?>"/>
|
| 194 |
-
<?php
|
| 195 |
</label> <label> <input type="checkbox"
|
| 196 |
name="duplicate_post_copyslug" value="1" <?php if(get_option('duplicate_post_copyslug') == 1) echo 'checked="checked"'; ?>"/>
|
| 197 |
-
<?php
|
| 198 |
</label> <label> <input type="checkbox"
|
| 199 |
name="duplicate_post_copyexcerpt" value="1" <?php if(get_option('duplicate_post_copyexcerpt') == 1) echo 'checked="checked"'; ?>"/>
|
| 200 |
-
<?php
|
| 201 |
</label> <label> <input type="checkbox"
|
| 202 |
name="duplicate_post_copycontent" value="1" <?php if(get_option('duplicate_post_copycontent') == 1) echo 'checked="checked"'; ?>"/>
|
| 203 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
</label> <label> <input type="checkbox"
|
| 205 |
name="duplicate_post_copypassword" value="1" <?php if(get_option('duplicate_post_copypassword') == 1) echo 'checked="checked"'; ?>"/>
|
| 206 |
-
<?php
|
| 207 |
</label> <label> <input type="checkbox"
|
| 208 |
name="duplicate_post_copyattachments" value="1" <?php if(get_option('duplicate_post_copyattachments') == 1) echo 'checked="checked"'; ?>"/>
|
| 209 |
-
<?php
|
| 210 |
</label> <label> <input type="checkbox"
|
| 211 |
name="duplicate_post_copychildren" value="1" <?php if(get_option('duplicate_post_copychildren') == 1) echo 'checked="checked"'; ?>"/>
|
| 212 |
-
<?php
|
| 213 |
</label> <label> <input type="checkbox"
|
| 214 |
name="duplicate_post_copycomments" value="1" <?php if(get_option('duplicate_post_copycomments') == 1) echo 'checked="checked"'; ?>"/>
|
| 215 |
-
<?php
|
|
|
|
|
|
|
|
|
|
| 216 |
</label>
|
| 217 |
</td>
|
| 218 |
</tr>
|
| 219 |
<tr valign="top">
|
| 220 |
-
<th scope="row"><?php
|
| 221 |
</th>
|
| 222 |
<td><input type="text" name="duplicate_post_title_prefix"
|
| 223 |
value="<?php echo get_option('duplicate_post_title_prefix'); ?>" />
|
| 224 |
</td>
|
| 225 |
-
<td><span class="description"><?php
|
| 226 |
</span>
|
| 227 |
</td>
|
| 228 |
</tr>
|
| 229 |
<tr valign="top">
|
| 230 |
-
<th scope="row"><?php
|
| 231 |
</th>
|
| 232 |
<td><input type="text" name="duplicate_post_title_suffix"
|
| 233 |
value="<?php echo get_option('duplicate_post_title_suffix'); ?>" />
|
| 234 |
</td>
|
| 235 |
-
<td><span class="description"><?php
|
| 236 |
</span>
|
| 237 |
</td>
|
| 238 |
</tr>
|
| 239 |
<tr valign="top">
|
| 240 |
-
<th scope="row"><?php
|
| 241 |
</th>
|
| 242 |
<td><input type="text" name="duplicate_post_increase_menu_order_by"
|
| 243 |
value="<?php echo get_option('duplicate_post_increase_menu_order_by'); ?>" />
|
| 244 |
</td>
|
| 245 |
-
<td><span class="description"><?php
|
| 246 |
</span>
|
| 247 |
</td>
|
| 248 |
</tr>
|
| 249 |
<tr valign="top">
|
| 250 |
-
<th scope="row"><?php
|
| 251 |
</th>
|
| 252 |
<td id="textfield"><input type="text"
|
| 253 |
name="duplicate_post_blacklist"
|
| 254 |
value="<?php echo get_option('duplicate_post_blacklist'); ?>" /></td>
|
| 255 |
-
<td><span class="description"><?php
|
| 256 |
-
<small><?php
|
| 257 |
</small> </span>
|
| 258 |
</td>
|
| 259 |
</tr>
|
| 260 |
<tr valign="top">
|
| 261 |
-
<th scope="row"><?php
|
| 262 |
<a class="toggle_link" href="#"
|
| 263 |
-
onclick="toggle_private_taxonomies();return false;"><?php
|
| 264 |
</a>
|
| 265 |
</th>
|
| 266 |
<td colspan="2"><?php $taxonomies=get_taxonomies(array(),'objects'); usort($taxonomies, 'duplicate_post_tax_obj_cmp');
|
| 267 |
$taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist');
|
| 268 |
if ($taxonomies_blacklist == "") $taxonomies_blacklist = array();
|
| 269 |
-
foreach ($taxonomies as $taxonomy ) :
|
|
|
|
|
|
|
|
|
|
|
|
|
| 270 |
class="taxonomy_<?php echo ($taxonomy->public)?'public':'private';?>">
|
| 271 |
<input type="checkbox"
|
| 272 |
name="duplicate_post_taxonomies_blacklist[]"
|
| 273 |
value="<?php echo $taxonomy->name?>"
|
| 274 |
<?php if(in_array($taxonomy->name, $taxonomies_blacklist)) echo 'checked="checked"'?> />
|
| 275 |
<?php echo $taxonomy->labels->name.' ['.$taxonomy->name.']'; ?>
|
| 276 |
-
</label> <?php endforeach; ?> <span class="description"><?php
|
| 277 |
</span>
|
| 278 |
</td>
|
| 279 |
</tr>
|
|
@@ -283,7 +316,7 @@ img#donate-button{
|
|
| 283 |
<table class="form-table">
|
| 284 |
<?php if ( current_user_can( 'promote_users' ) ){ ?>
|
| 285 |
<tr valign="top">
|
| 286 |
-
<th scope="row"><?php
|
| 287 |
</th>
|
| 288 |
<td><?php global $wp_roles;
|
| 289 |
$roles = $wp_roles->get_names();
|
|
@@ -293,14 +326,14 @@ img#donate-button{
|
|
| 293 |
value="<?php echo $name ?>"
|
| 294 |
<?php if($role->has_cap('copy_posts')) echo 'checked="checked"'?> />
|
| 295 |
<?php echo translate_user_role($display_name); ?>
|
| 296 |
-
</label> <?php endforeach; ?> <span class="description"><?php
|
| 297 |
-
<?php
|
| 298 |
</span>
|
| 299 |
</td>
|
| 300 |
</tr>
|
| 301 |
<?php } ?>
|
| 302 |
<tr valign="top">
|
| 303 |
-
<th scope="row"><?php
|
| 304 |
</th>
|
| 305 |
<td><?php $post_types = get_post_types(array('show_ui' => true),'objects');
|
| 306 |
foreach ($post_types as $post_type_object ) :
|
|
@@ -309,8 +342,8 @@ img#donate-button{
|
|
| 309 |
value="<?php echo $post_type_object->name?>"
|
| 310 |
<?php if(duplicate_post_is_post_type_enabled($post_type_object->name)) echo 'checked="checked"'?> />
|
| 311 |
<?php echo $post_type_object->labels->name?>
|
| 312 |
-
</label> <?php endforeach; ?> <span class="description"><?php
|
| 313 |
-
<br /> <?php
|
| 314 |
</span>
|
| 315 |
</td>
|
| 316 |
</tr>
|
|
@@ -319,19 +352,24 @@ img#donate-button{
|
|
| 319 |
<section>
|
| 320 |
<table class="form-table">
|
| 321 |
<tr valign="top">
|
| 322 |
-
<th scope="row"><?php
|
| 323 |
</th>
|
| 324 |
<td><label><input type="checkbox" name="duplicate_post_show_row"
|
| 325 |
value="1" <?php if(get_option('duplicate_post_show_row') == 1) echo 'checked="checked"'; ?>"/>
|
| 326 |
-
<?php
|
| 327 |
-
type="checkbox" name="duplicate_post_show_submitbox" value="1" <?php if(get_option('duplicate_post_show_submitbox') == 1) echo 'checked="checked"'; ?>"/>
|
| 328 |
-
<?php
|
| 329 |
-
type="checkbox" name="duplicate_post_show_adminbar" value="1" <?php if(get_option('duplicate_post_show_adminbar') == 1) echo 'checked="checked"'; ?>"/>
|
| 330 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 331 |
</td>
|
| 332 |
</tr>
|
| 333 |
<tr valign="top">
|
| 334 |
-
<td colspan="2"><span class="description"><?php
|
| 335 |
<br /> <?php printf(__('You can also use the template tag duplicate_post_clone_post_link( $link, $before, $after, $id ). More info <a href="%s">here</a>', 'duplicate-post'), 'https://wordpress.org/plugins/duplicate-post/other_notes/'); ?>
|
| 336 |
</span>
|
| 337 |
</td>
|
|
@@ -340,7 +378,7 @@ img#donate-button{
|
|
| 340 |
</section>
|
| 341 |
<p class="submit">
|
| 342 |
<input type="submit" class="button-primary"
|
| 343 |
-
value="<?php
|
| 344 |
</p>
|
| 345 |
|
| 346 |
</form>
|
| 18 |
register_setting( 'duplicate_post_group', 'duplicate_post_copyslug');
|
| 19 |
register_setting( 'duplicate_post_group', 'duplicate_post_copyexcerpt');
|
| 20 |
register_setting( 'duplicate_post_group', 'duplicate_post_copycontent');
|
| 21 |
+
register_setting( 'duplicate_post_group', 'duplicate_post_copythumbnail');
|
| 22 |
+
register_setting( 'duplicate_post_group', 'duplicate_post_copytemplate');
|
| 23 |
+
register_setting( 'duplicate_post_group', 'duplicate_post_copyformat');
|
| 24 |
+
register_setting( 'duplicate_post_group', 'duplicate_post_copyauthor');
|
| 25 |
register_setting( 'duplicate_post_group', 'duplicate_post_copypassword');
|
| 26 |
register_setting( 'duplicate_post_group', 'duplicate_post_copyattachments');
|
| 27 |
register_setting( 'duplicate_post_group', 'duplicate_post_copychildren');
|
| 28 |
register_setting( 'duplicate_post_group', 'duplicate_post_copycomments');
|
| 29 |
+
register_setting( 'duplicate_post_group', 'duplicate_post_copymenuorder');
|
| 30 |
register_setting( 'duplicate_post_group', 'duplicate_post_blacklist');
|
| 31 |
register_setting( 'duplicate_post_group', 'duplicate_post_taxonomies_blacklist');
|
| 32 |
register_setting( 'duplicate_post_group', 'duplicate_post_title_prefix');
|
| 37 |
register_setting( 'duplicate_post_group', 'duplicate_post_show_row');
|
| 38 |
register_setting( 'duplicate_post_group', 'duplicate_post_show_adminbar');
|
| 39 |
register_setting( 'duplicate_post_group', 'duplicate_post_show_submitbox');
|
| 40 |
+
register_setting( 'duplicate_post_group', 'duplicate_post_show_bulkactions');
|
| 41 |
}
|
| 42 |
|
| 43 |
|
| 75 |
<br>
|
| 76 |
</div>
|
| 77 |
<h1>
|
| 78 |
+
<?php esc_html_e("Duplicate Post Options", 'duplicate-post'); ?>
|
| 79 |
</h1>
|
| 80 |
+
|
| 81 |
<div
|
| 82 |
+
style="margin: 9px 15px 4px 0; padding: 5px 30px; text-align: center; float: left; clear:left; border: solid 3px #cccccc; width: 600px;">
|
| 83 |
+
<p>
|
| 84 |
+
<?php esc_html_e('Help me develop the plugin, add new features and improve support!', 'duplicate-post'); ?>
|
| 85 |
+
<br/>
|
| 86 |
+
<?php esc_html_e('Donate whatever sum you choose, even just 10¢.', 'duplicate-post'); ?>
|
| 87 |
+
<br/>
|
| 88 |
+
<a href="http://lopo.it/duplicate-post-plugin"><img id="donate-button" style="margin: 0px auto;" src="<?php echo plugins_url( 'donate.png', __FILE__ ); ?>" alt="Donate"/></a>
|
| 89 |
+
<br/>
|
| 90 |
+
<a href="http://lopo.it/duplicate-post-plugin"><?php esc_html_e('Visit plugin site'); ?></a>
|
| 91 |
+
- <a href="https://translate.wordpress.org/projects/wp-plugins/duplicate-post"><?php esc_html_e('Translate', 'duplicate-post'); ?></a>
|
| 92 |
+
- <a href="https://wordpress.org/plugins/duplicate-post/faq/"><?php esc_html_e('FAQ', 'duplicate-post'); ?></a>
|
| 93 |
+
- <a href="https://wordpress.org/support/plugin/duplicate-post"><?php esc_html_e('Support Forum', 'duplicate-post'); ?></a>
|
| 94 |
+
</p>
|
| 95 |
</div>
|
| 96 |
+
|
| 97 |
|
| 98 |
<script>
|
| 99 |
jQuery(document).on( 'click', '.nav-tab-wrapper a', function() {
|
| 103 |
jQuery('section').eq(jQuery(this).index()).show();
|
| 104 |
return false;
|
| 105 |
});
|
| 106 |
+
|
| 107 |
function toggle_private_taxonomies(){
|
| 108 |
+
jQuery('.taxonomy_private').toggle(300);
|
| 109 |
}
|
| 110 |
+
|
| 111 |
+
|
| 112 |
jQuery(function(){
|
| 113 |
+
jQuery('.taxonomy_private').hide(300);
|
| 114 |
});
|
| 115 |
|
| 116 |
</script>
|
| 183 |
|
| 184 |
<h2 class="nav-tab-wrapper">
|
| 185 |
<a class="nav-tab nav-tab-active"
|
| 186 |
+
href="<?php echo admin_url() ?>/index.php?page=duplicate-post-what"><?php esc_html_e('What to copy', 'duplicate-post'); ?>
|
| 187 |
</a> <a class="nav-tab"
|
| 188 |
+
href="<?php echo admin_url() ?>/index.php?page=duplicate-post-who"><?php esc_html_e('Permissions', 'duplicate-post'); ?>
|
| 189 |
</a> <a class="nav-tab"
|
| 190 |
+
href="<?php echo admin_url() ?>/index.php?page=duplicate-post-where"><?php esc_html_e('Display', 'duplicate-post'); ?>
|
| 191 |
</a>
|
| 192 |
</h2>
|
| 193 |
|
| 195 |
|
| 196 |
<table class="form-table">
|
| 197 |
<tr valign="top">
|
| 198 |
+
<th scope="row"><?php esc_html_e('Post/page elements to copy', 'duplicate-post'); ?>
|
| 199 |
</th>
|
| 200 |
<td colspan="2"><label> <input type="checkbox"
|
| 201 |
name="duplicate_post_copytitle" value="1" <?php if(get_option('duplicate_post_copytitle') == 1) echo 'checked="checked"'; ?>"/>
|
| 202 |
+
<?php esc_html_e("Title", 'default'); ?>
|
| 203 |
</label> <label> <input type="checkbox"
|
| 204 |
name="duplicate_post_copydate" value="1" <?php if(get_option('duplicate_post_copydate') == 1) echo 'checked="checked"'; ?>"/>
|
| 205 |
+
<?php esc_html_e("Date", 'default'); ?>
|
| 206 |
</label> <label> <input type="checkbox"
|
| 207 |
name="duplicate_post_copystatus" value="1" <?php if(get_option('duplicate_post_copystatus') == 1) echo 'checked="checked"'; ?>"/>
|
| 208 |
+
<?php esc_html_e("Status", 'default'); ?>
|
| 209 |
</label> <label> <input type="checkbox"
|
| 210 |
name="duplicate_post_copyslug" value="1" <?php if(get_option('duplicate_post_copyslug') == 1) echo 'checked="checked"'; ?>"/>
|
| 211 |
+
<?php esc_html_e("Slug", 'default'); ?>
|
| 212 |
</label> <label> <input type="checkbox"
|
| 213 |
name="duplicate_post_copyexcerpt" value="1" <?php if(get_option('duplicate_post_copyexcerpt') == 1) echo 'checked="checked"'; ?>"/>
|
| 214 |
+
<?php esc_html_e("Excerpt", 'default'); ?>
|
| 215 |
</label> <label> <input type="checkbox"
|
| 216 |
name="duplicate_post_copycontent" value="1" <?php if(get_option('duplicate_post_copycontent') == 1) echo 'checked="checked"'; ?>"/>
|
| 217 |
+
<?php esc_html_e("Content", 'default'); ?>
|
| 218 |
+
</label> <label> <input type="checkbox"
|
| 219 |
+
name="duplicate_post_copythumbnail" value="1" <?php if(get_option('duplicate_post_copythumbnail') == 1) echo 'checked="checked"'; ?>"/>
|
| 220 |
+
<?php esc_html_e("Featured Image", 'default'); ?>
|
| 221 |
+
</label> <label> <input type="checkbox"
|
| 222 |
+
name="duplicate_post_copytemplate" value="1" <?php if(get_option('duplicate_post_copytemplate') == 1) echo 'checked="checked"'; ?>"/>
|
| 223 |
+
<?php esc_html_e("Template", 'default'); ?>
|
| 224 |
+
</label> <label> <input type="checkbox"
|
| 225 |
+
name="duplicate_post_copyformat" value="1" <?php if(get_option('duplicate_post_copyformat') == 1) echo 'checked="checked"'; ?>"/>
|
| 226 |
+
<?php echo esc_html_x("Format", 'post format', 'default'); ?>
|
| 227 |
+
</label> <label> <input type="checkbox"
|
| 228 |
+
name="duplicate_post_copyauthor" value="1" <?php if(get_option('duplicate_post_copyauthor') == 1) echo 'checked="checked"'; ?>"/>
|
| 229 |
+
<?php esc_html_e("Author", 'default'); ?>
|
| 230 |
</label> <label> <input type="checkbox"
|
| 231 |
name="duplicate_post_copypassword" value="1" <?php if(get_option('duplicate_post_copypassword') == 1) echo 'checked="checked"'; ?>"/>
|
| 232 |
+
<?php esc_html_e("Password", 'default'); ?>
|
| 233 |
</label> <label> <input type="checkbox"
|
| 234 |
name="duplicate_post_copyattachments" value="1" <?php if(get_option('duplicate_post_copyattachments') == 1) echo 'checked="checked"'; ?>"/>
|
| 235 |
+
<?php esc_html_e("Attachments", 'duplicate-post'); ?>
|
| 236 |
</label> <label> <input type="checkbox"
|
| 237 |
name="duplicate_post_copychildren" value="1" <?php if(get_option('duplicate_post_copychildren') == 1) echo 'checked="checked"'; ?>"/>
|
| 238 |
+
<?php esc_html_e("Children", 'duplicate-post'); ?>
|
| 239 |
</label> <label> <input type="checkbox"
|
| 240 |
name="duplicate_post_copycomments" value="1" <?php if(get_option('duplicate_post_copycomments') == 1) echo 'checked="checked"'; ?>"/>
|
| 241 |
+
<?php esc_html_e("Comments", 'default'); ?> (<?php esc_html_e("except pingbacks and trackbacks", 'duplicate-post'); ?>)
|
| 242 |
+
</label> <label> <input type="checkbox"
|
| 243 |
+
name="duplicate_post_copymenuorder" value="1" <?php if(get_option('duplicate_post_copymenuorder') == 1) echo 'checked="checked"'; ?>"/>
|
| 244 |
+
<?php esc_html_e("Menu order", 'default'); ?>
|
| 245 |
</label>
|
| 246 |
</td>
|
| 247 |
</tr>
|
| 248 |
<tr valign="top">
|
| 249 |
+
<th scope="row"><?php esc_html_e("Title prefix", 'duplicate-post'); ?>
|
| 250 |
</th>
|
| 251 |
<td><input type="text" name="duplicate_post_title_prefix"
|
| 252 |
value="<?php echo get_option('duplicate_post_title_prefix'); ?>" />
|
| 253 |
</td>
|
| 254 |
+
<td><span class="description"><?php esc_html_e("Prefix to be added before the title, e.g. \"Copy of\" (blank for no prefix)", 'duplicate-post'); ?>
|
| 255 |
</span>
|
| 256 |
</td>
|
| 257 |
</tr>
|
| 258 |
<tr valign="top">
|
| 259 |
+
<th scope="row"><?php esc_html_e("Title suffix", 'duplicate-post'); ?>
|
| 260 |
</th>
|
| 261 |
<td><input type="text" name="duplicate_post_title_suffix"
|
| 262 |
value="<?php echo get_option('duplicate_post_title_suffix'); ?>" />
|
| 263 |
</td>
|
| 264 |
+
<td><span class="description"><?php esc_html_e("Suffix to be added after the title, e.g. \"(dup)\" (blank for no suffix)", 'duplicate-post'); ?>
|
| 265 |
</span>
|
| 266 |
</td>
|
| 267 |
</tr>
|
| 268 |
<tr valign="top">
|
| 269 |
+
<th scope="row"><?php esc_html_e("Increase menu order by", 'duplicate-post'); ?>
|
| 270 |
</th>
|
| 271 |
<td><input type="text" name="duplicate_post_increase_menu_order_by"
|
| 272 |
value="<?php echo get_option('duplicate_post_increase_menu_order_by'); ?>" />
|
| 273 |
</td>
|
| 274 |
+
<td><span class="description"><?php esc_html_e("Add this number to the original menu order (blank or zero to retain the value)", 'duplicate-post'); ?>
|
| 275 |
</span>
|
| 276 |
</td>
|
| 277 |
</tr>
|
| 278 |
<tr valign="top">
|
| 279 |
+
<th scope="row"><?php esc_html_e("Do not copy these fields", 'duplicate-post'); ?>
|
| 280 |
</th>
|
| 281 |
<td id="textfield"><input type="text"
|
| 282 |
name="duplicate_post_blacklist"
|
| 283 |
value="<?php echo get_option('duplicate_post_blacklist'); ?>" /></td>
|
| 284 |
+
<td><span class="description"><?php esc_html_e("Comma-separated list of meta fields that must not be copied", 'duplicate-post'); ?><br />
|
| 285 |
+
<small><?php esc_html_e("You can use * to match zero or more alphanumeric characters or underscores: e.g. field*", 'duplicate-post'); ?>
|
| 286 |
</small> </span>
|
| 287 |
</td>
|
| 288 |
</tr>
|
| 289 |
<tr valign="top">
|
| 290 |
+
<th scope="row"><?php esc_html_e("Do not copy these taxonomies", 'duplicate-post'); ?><br />
|
| 291 |
<a class="toggle_link" href="#"
|
| 292 |
+
onclick="toggle_private_taxonomies();return false;"><?php esc_html_e('Show/hide private taxonomies', 'duplicate-post');?>
|
| 293 |
</a>
|
| 294 |
</th>
|
| 295 |
<td colspan="2"><?php $taxonomies=get_taxonomies(array(),'objects'); usort($taxonomies, 'duplicate_post_tax_obj_cmp');
|
| 296 |
$taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist');
|
| 297 |
if ($taxonomies_blacklist == "") $taxonomies_blacklist = array();
|
| 298 |
+
foreach ($taxonomies as $taxonomy ) :
|
| 299 |
+
if($taxonomy->name == 'post_format'){
|
| 300 |
+
continue;
|
| 301 |
+
}
|
| 302 |
+
?> <label
|
| 303 |
class="taxonomy_<?php echo ($taxonomy->public)?'public':'private';?>">
|
| 304 |
<input type="checkbox"
|
| 305 |
name="duplicate_post_taxonomies_blacklist[]"
|
| 306 |
value="<?php echo $taxonomy->name?>"
|
| 307 |
<?php if(in_array($taxonomy->name, $taxonomies_blacklist)) echo 'checked="checked"'?> />
|
| 308 |
<?php echo $taxonomy->labels->name.' ['.$taxonomy->name.']'; ?>
|
| 309 |
+
</label> <?php endforeach; ?> <span class="description"><?php esc_html_e("Select the taxonomies you don't want to be copied", 'duplicate-post'); ?>
|
| 310 |
</span>
|
| 311 |
</td>
|
| 312 |
</tr>
|
| 316 |
<table class="form-table">
|
| 317 |
<?php if ( current_user_can( 'promote_users' ) ){ ?>
|
| 318 |
<tr valign="top">
|
| 319 |
+
<th scope="row"><?php esc_html_e("Roles allowed to copy", 'duplicate-post'); ?>
|
| 320 |
</th>
|
| 321 |
<td><?php global $wp_roles;
|
| 322 |
$roles = $wp_roles->get_names();
|
| 326 |
value="<?php echo $name ?>"
|
| 327 |
<?php if($role->has_cap('copy_posts')) echo 'checked="checked"'?> />
|
| 328 |
<?php echo translate_user_role($display_name); ?>
|
| 329 |
+
</label> <?php endforeach; ?> <span class="description"><?php esc_html_e("Warning: users will be able to copy all posts, even those of other users", 'duplicate-post'); ?><br />
|
| 330 |
+
<?php esc_html_e("Passwords and contents of password-protected posts may become visible to undesired users and visitors", 'duplicate-post'); ?>
|
| 331 |
</span>
|
| 332 |
</td>
|
| 333 |
</tr>
|
| 334 |
<?php } ?>
|
| 335 |
<tr valign="top">
|
| 336 |
+
<th scope="row"><?php esc_html_e("Enable for these post types", 'duplicate-post'); ?>
|
| 337 |
</th>
|
| 338 |
<td><?php $post_types = get_post_types(array('show_ui' => true),'objects');
|
| 339 |
foreach ($post_types as $post_type_object ) :
|
| 342 |
value="<?php echo $post_type_object->name?>"
|
| 343 |
<?php if(duplicate_post_is_post_type_enabled($post_type_object->name)) echo 'checked="checked"'?> />
|
| 344 |
<?php echo $post_type_object->labels->name?>
|
| 345 |
+
</label> <?php endforeach; ?> <span class="description"><?php esc_html_e("Select the post types you want the plugin to be enabled", 'duplicate-post'); ?>
|
| 346 |
+
<br /> <?php esc_html_e("Whether the links are displayed for custom post types registered by themes or plugins depends on their use of standard WordPress UI elements", 'duplicate-post'); ?>
|
| 347 |
</span>
|
| 348 |
</td>
|
| 349 |
</tr>
|
| 352 |
<section>
|
| 353 |
<table class="form-table">
|
| 354 |
<tr valign="top">
|
| 355 |
+
<th scope="row"><?php esc_html_e("Show links in", 'duplicate-post'); ?>
|
| 356 |
</th>
|
| 357 |
<td><label><input type="checkbox" name="duplicate_post_show_row"
|
| 358 |
value="1" <?php if(get_option('duplicate_post_show_row') == 1) echo 'checked="checked"'; ?>"/>
|
| 359 |
+
<?php esc_html_e("Post list", 'duplicate-post'); ?> </label>
|
| 360 |
+
<label><input type="checkbox" name="duplicate_post_show_submitbox" value="1" <?php if(get_option('duplicate_post_show_submitbox') == 1) echo 'checked="checked"'; ?>"/>
|
| 361 |
+
<?php esc_html_e("Edit screen", 'duplicate-post'); ?> </label>
|
| 362 |
+
<label><input type="checkbox" name="duplicate_post_show_adminbar" value="1" <?php if(get_option('duplicate_post_show_adminbar') == 1) echo 'checked="checked"'; ?>"/>
|
| 363 |
+
<?php esc_html_e("Admin bar", 'duplicate-post'); ?> </label>
|
| 364 |
+
<?php global $wp_version;
|
| 365 |
+
if( version_compare($wp_version, '4.7') >= 0 ){ ?>
|
| 366 |
+
<label><input type="checkbox" name="duplicate_post_show_bulkactions" value="1" <?php if(get_option('duplicate_post_show_bulkactions') == 1) echo 'checked="checked"'; ?>"/>
|
| 367 |
+
<?php esc_html_e("Bulk Actions", 'default'); ?> </label>
|
| 368 |
+
<?php } ?>
|
| 369 |
</td>
|
| 370 |
</tr>
|
| 371 |
<tr valign="top">
|
| 372 |
+
<td colspan="2"><span class="description"><?php esc_html_e("Whether the links are displayed for custom post types registered by themes or plugins depends on their use of standard WordPress UI elements", 'duplicate-post'); ?>
|
| 373 |
<br /> <?php printf(__('You can also use the template tag duplicate_post_clone_post_link( $link, $before, $after, $id ). More info <a href="%s">here</a>', 'duplicate-post'), 'https://wordpress.org/plugins/duplicate-post/other_notes/'); ?>
|
| 374 |
</span>
|
| 375 |
</td>
|
| 378 |
</section>
|
| 379 |
<p class="submit">
|
| 380 |
<input type="submit" class="button-primary"
|
| 381 |
+
value="<?php esc_html_e('Save Changes', 'duplicate-post') ?>" />
|
| 382 |
</p>
|
| 383 |
|
| 384 |
</form>
|
duplicate-post.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
Plugin Name: Duplicate Post
|
| 4 |
Plugin URI: http://lopo.it/duplicate-post-plugin/
|
| 5 |
Description: Clone posts and pages.
|
| 6 |
-
Version: 3.
|
| 7 |
Author: Enrico Battocchi
|
| 8 |
Author URI: http://lopo.it
|
| 9 |
Text Domain: duplicate-post
|
|
@@ -31,7 +31,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
| 31 |
}
|
| 32 |
|
| 33 |
// Version of the plugin
|
| 34 |
-
define('DUPLICATE_POST_CURRENT_VERSION', '3.
|
| 35 |
|
| 36 |
|
| 37 |
/**
|
|
@@ -46,7 +46,7 @@ add_action( 'plugins_loaded', 'duplicate_post_load_plugin_textdomain' );
|
|
| 46 |
add_filter("plugin_action_links_".plugin_basename(__FILE__), "duplicate_post_plugin_actions", 10, 4);
|
| 47 |
|
| 48 |
function duplicate_post_plugin_actions( $actions, $plugin_file, $plugin_data, $context ) {
|
| 49 |
-
array_unshift($actions, "<a href=\"".menu_page_url('duplicatepost', false)."\">".
|
| 50 |
return $actions;
|
| 51 |
}
|
| 52 |
|
| 3 |
Plugin Name: Duplicate Post
|
| 4 |
Plugin URI: http://lopo.it/duplicate-post-plugin/
|
| 5 |
Description: Clone posts and pages.
|
| 6 |
+
Version: 3.1
|
| 7 |
Author: Enrico Battocchi
|
| 8 |
Author URI: http://lopo.it
|
| 9 |
Text Domain: duplicate-post
|
| 31 |
}
|
| 32 |
|
| 33 |
// Version of the plugin
|
| 34 |
+
define('DUPLICATE_POST_CURRENT_VERSION', '3.1' );
|
| 35 |
|
| 36 |
|
| 37 |
/**
|
| 46 |
add_filter("plugin_action_links_".plugin_basename(__FILE__), "duplicate_post_plugin_actions", 10, 4);
|
| 47 |
|
| 48 |
function duplicate_post_plugin_actions( $actions, $plugin_file, $plugin_data, $context ) {
|
| 49 |
+
array_unshift($actions, "<a href=\"".menu_page_url('duplicatepost', false)."\">".esc_html__("Settings")."</a>");
|
| 50 |
return $actions;
|
| 51 |
}
|
| 52 |
|
readme.txt
CHANGED
|
@@ -2,9 +2,9 @@
|
|
| 2 |
Contributors: lopo
|
| 3 |
Donate link: http://lopo.it/duplicate-post-plugin/
|
| 4 |
Tags: duplicate post, copy, clone
|
| 5 |
-
Requires at least: 3.
|
| 6 |
Tested up to: 4.7
|
| 7 |
-
Stable tag: 3.
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
|
@@ -20,13 +20,15 @@ How it works:
|
|
| 20 |
|
| 21 |
1. In 'Edit Posts'/'Edit Pages', you can click on 'Clone' link below the post/page title: this will immediately create a copy and return to the list.
|
| 22 |
|
| 23 |
-
2. In 'Edit Posts'/'Edit Pages', you can
|
| 24 |
|
| 25 |
-
3.
|
| 26 |
|
| 27 |
-
4.
|
| 28 |
|
| 29 |
-
|
|
|
|
|
|
|
| 30 |
|
| 31 |
There is also a **template tag**, so you can put it in your templates and clone your posts/pages from the front-end. Clicking on the link will lead you to the edit page for the new draft, just like the admin bar link.
|
| 32 |
|
|
@@ -74,12 +76,6 @@ From version 3.0 the plugin's translations are managed by the WordPress.org plat
|
|
| 74 |
If Duplicate Post is still in English, or if there are some untraslated strings, you can help traslating to your language [here](https://translate.wordpress.org/projects/wp-plugins/duplicate-post): you only need a WordPress.org account.
|
| 75 |
[Contact me](http://lopo.it/contatti/) if you wish to become an editor for your language.
|
| 76 |
|
| 77 |
-
= Can you add it to the bulk actions in the post/page list? =
|
| 78 |
-
|
| 79 |
-
I can't. There is no way to do it without hacking the core code of WordPress.
|
| 80 |
-
There is an open ticket in WordPress Trac, as other plugin developers too are interested to this feature: we can only hope that eventually our wish will be fulfilled.
|
| 81 |
-
|
| 82 |
-
|
| 83 |
== Screenshots ==
|
| 84 |
|
| 85 |
1. Here you can copy the post you're editing to a new draft.
|
|
@@ -87,9 +83,13 @@ There is an open ticket in WordPress Trac, as other plugin developers too are in
|
|
| 87 |
3. The options page.
|
| 88 |
4. The template tag manually added to Twenty Ten theme. Click on the "Copy to a new draft" link and you're redirected to the edit screen for a new draft copy of your post.
|
| 89 |
5. The admin bar link.
|
|
|
|
| 90 |
|
| 91 |
== Upgrade Notice ==
|
| 92 |
|
|
|
|
|
|
|
|
|
|
| 93 |
= 3.0.3 =
|
| 94 |
Notices + small fixes and improvements
|
| 95 |
|
|
@@ -140,6 +140,16 @@ New features and customization, WP 3.0 compatibility: you should upgrade if you
|
|
| 140 |
|
| 141 |
== Changelog ==
|
| 142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
= 3.0.3 =
|
| 144 |
* Notices in admin after copying
|
| 145 |
* Fixes warning in custom post type archives
|
| 2 |
Contributors: lopo
|
| 3 |
Donate link: http://lopo.it/duplicate-post-plugin/
|
| 4 |
Tags: duplicate post, copy, clone
|
| 5 |
+
Requires at least: 3.6
|
| 6 |
Tested up to: 4.7
|
| 7 |
+
Stable tag: 3.1
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
| 20 |
|
| 21 |
1. In 'Edit Posts'/'Edit Pages', you can click on 'Clone' link below the post/page title: this will immediately create a copy and return to the list.
|
| 22 |
|
| 23 |
+
2. NEW! In 'Edit Posts'/'Edit Pages', you can select one or more items, then choose 'Clone' in the 'Bulk Actions' dropdown to copy them all at once.
|
| 24 |
|
| 25 |
+
3. In 'Edit Posts'/'Edit Pages', you can click on 'New Draft' link below the post/page title.
|
| 26 |
|
| 27 |
+
4. On the post edit screen, you can click on 'Copy to a new draft' above "Cancel"/"Move to trash".
|
| 28 |
|
| 29 |
+
5. While viewing a post as a logged in user, you can click on 'Copy to a new draft' as a dropdown link under "Edit Post" in the admin bar.
|
| 30 |
+
|
| 31 |
+
3, 4 and 5 will lead to the edit page for the new draft: change what you want, click on 'Publish' and you're done.
|
| 32 |
|
| 33 |
There is also a **template tag**, so you can put it in your templates and clone your posts/pages from the front-end. Clicking on the link will lead you to the edit page for the new draft, just like the admin bar link.
|
| 34 |
|
| 76 |
If Duplicate Post is still in English, or if there are some untraslated strings, you can help traslating to your language [here](https://translate.wordpress.org/projects/wp-plugins/duplicate-post): you only need a WordPress.org account.
|
| 77 |
[Contact me](http://lopo.it/contatti/) if you wish to become an editor for your language.
|
| 78 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
== Screenshots ==
|
| 80 |
|
| 81 |
1. Here you can copy the post you're editing to a new draft.
|
| 83 |
3. The options page.
|
| 84 |
4. The template tag manually added to Twenty Ten theme. Click on the "Copy to a new draft" link and you're redirected to the edit screen for a new draft copy of your post.
|
| 85 |
5. The admin bar link.
|
| 86 |
+
6. Bulk clone action.
|
| 87 |
|
| 88 |
== Upgrade Notice ==
|
| 89 |
|
| 90 |
+
= 3.1 =
|
| 91 |
+
Bulk clone + custom field wildcards + other features + bugfixes
|
| 92 |
+
|
| 93 |
= 3.0.3 =
|
| 94 |
Notices + small fixes and improvements
|
| 95 |
|
| 140 |
|
| 141 |
== Changelog ==
|
| 142 |
|
| 143 |
+
= 3.1 =
|
| 144 |
+
* Bulk clone action added (WP 4.7+)
|
| 145 |
+
* Wildcards enabled for custom fields to skip
|
| 146 |
+
* Options to copy post author, post format (moved from taxonomies), menu order, post template
|
| 147 |
+
* Check publish_posts/publish_pages capability to prevent Contributors from publishing by cloning
|
| 148 |
+
* Using wp_slash (WP 3.6+) or a better workaround (WP 4.4+) on the post and its meta, should also fix some compatibility issues
|
| 149 |
+
* Check if admin bar is showing before enqueueing CSS
|
| 150 |
+
* Probable fix for repeated clone bug
|
| 151 |
+
* Other minor bugs fixed
|
| 152 |
+
|
| 153 |
= 3.0.3 =
|
| 154 |
* Notices in admin after copying
|
| 155 |
* Fixes warning in custom post type archives
|
