Delete Duplicate Posts - Version 4.8

Version Description

  • Code improvements so the plugin runs faster overall.
  • Updated language files.
  • NEW: (Pro only) - Feature: 301 redirects deleted duplicates.
Download this release

Release Info

Developer lkoudal
Plugin Icon 128x128 Delete Duplicate Posts
Version 4.8
Comparing to
See all releases

Code changes from version 4.7.9 to 4.8

delete-duplicate-posts.php CHANGED
@@ -5,7 +5,7 @@ Plugin Name: Delete Duplicate Posts
5
  Plugin Script: delete-duplicate-posts.php
6
  Plugin URI: https://cleverplugins.com
7
  Description: Remove duplicate blogposts on your blog! Searches and removes duplicate posts and their post meta tags. You can delete posts, pages and other Custom Post Types enabled on your website.
8
- Version: 4.7.9
9
  Author: cleverplugins.com
10
  Author URI: https://cleverplugins.com
11
  Min WP Version: 4.7
@@ -90,6 +90,7 @@ if ( function_exists( 'ddp_fs' ) ) {
90
  {
91
  global $wpdb ;
92
  $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %s', $wpdb->prefix . 'ddp_log' ) );
 
93
  delete_option( 'ddp_deleted_duplicates' );
94
  delete_option( 'delete_duplicate_posts_options_v4' );
95
  delete_option( 'cp_ddp_freemius_state' );
@@ -112,6 +113,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
112
  if ( function_exists( 'ddp_fs' ) ) {
113
  ddp_fs()->add_filter( 'permission_list', array( __CLASS__, 'add_freemius_extra_permission' ) );
114
  }
 
115
  $locale = get_locale();
116
  $mo = plugin_dir_path( __FILE__ ) . '/languages/delete-duplicate-posts-' . $locale . '.mo';
117
  load_plugin_textdomain( 'delete-duplicate-posts', false, dirname( __FILE__ ) . '/languages/' );
@@ -293,7 +295,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
293
  </form>
294
  <p><small>Signup form is shown every 14 days until dismissed</small></p>
295
  </div>
296
- <?php
297
  }
298
 
299
  if ( 'tools_page_delete-duplicate-posts' !== $screen->id ) {
@@ -313,13 +315,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
313
  ?></h3>
314
 
315
  <p>
316
- <?php
317
  echo esc_html__( 'Gathering non-sensitive diagnostic data about the plugin install helps us improve the plugin.', 'delete-duplicate-posts' ) . ' <a href="' . esc_url( 'https://cleverplugins.com/docs/install/non-sensitive-diagnostic-data/' ) . '" target="_blank" rel="noopener">' . esc_html__( 'Read more about what we collect.', 'delete-duplicate-posts' ) . '</a>' ;
318
  ?>
319
  </p>
320
 
321
  <p>
322
- <?php
323
  // translators:
324
  printf( esc_html__( 'If you opt-in, some data about your usage of %1$s will be sent to Freemius.com. If you skip this, that\'s okay! %1$s will still work just fine.', 'delete-duplicate-posts' ), '<b>Delete Duplicate Posts</b>' );
325
  ?>
@@ -341,7 +343,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
341
  ?>" />
342
 
343
  </div>
344
- <?php
345
  }
346
 
347
  }
@@ -358,13 +360,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
358
  ?>
359
  <div id="cp-ddp-reviewlink" data-dismissible="ddp-leavereview-14" class="updated notice notice-success is-dismissible">
360
  <h3>
361
- <?php
362
  // translators: Total number of deleted duplicates
363
  printf( esc_html__( '%s duplicates deleted!', 'delete-duplicate-posts' ), esc_html( $totaldeleted ) );
364
  ?>
365
  </h3>
366
  <p>
367
- <?php
368
  // translators: Asking for a review text
369
  printf( esc_html__( "Hey, I noticed this plugin has deleted %s duplicate posts for you - that's awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress? Just to help us spread the word and boost our motivation.", 'delete-duplicate-posts' ), esc_html( $totaldeleted ) );
370
  ?>
@@ -380,7 +382,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
380
  target="_blank" rel="noopener">I already did</a>
381
  </p>
382
  </div>
383
- <?php
384
  }
385
 
386
  }
@@ -405,16 +407,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
405
  $checked_posts = array();
406
  if ( isset( $_POST['checked_posts'] ) && is_array( $_POST['checked_posts'] ) ) {
407
  foreach ( $_POST['checked_posts'] as $cp ) {
408
- $checked_posts[] = intval( $cp );
 
 
 
409
  }
410
  }
411
  $options = self::get_options();
412
-
413
- if ( $options['ddp_debug'] ) {
414
- $outputlist = array_values( array_slice( $checked_posts, 0, 10 ) );
415
- self::log( 'DEBUG: Cleaning post IDs ' . print_r( $outputlist, true ) . ' (first 10 shown)' );
416
- }
417
-
418
  self::cleandupes( true, $checked_posts );
419
  wp_send_json_success();
420
  }
@@ -741,8 +740,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
741
  */
742
  public static function create_redirect( $inurl, $targeturl, $code = 301 )
743
  {
744
- global $wpdb ;
745
- // @todo - future
746
  }
747
 
748
  /**
@@ -767,6 +765,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
767
  'ddp_enabled' => 0,
768
  'ddp_pstati' => array( 'publish' ),
769
  'ddp_debug' => 0,
 
770
  );
771
  return $defaults;
772
  }
@@ -774,11 +773,11 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
774
  /**
775
  * get plugin's options
776
  *
777
- * @author Lars Koudal
778
- * @since v0.0.1
779
- * @version v1.0.0 Thursday, June 9th, 2022.
780
- * @access public static
781
- * @return mixed
782
  */
783
  public static function get_options()
784
  {
@@ -793,12 +792,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
793
  /**
794
  * add_freemius_extra_permission.
795
  *
796
- * @author Lars Koudal
797
- * @since v0.0.1
798
- * @version v1.0.0 Thursday, June 9th, 2022.
799
- * @access public static
800
- * @param mixed $permissions
801
- * @return mixed
802
  */
803
  public static function add_freemius_extra_permission( $permissions )
804
  {
@@ -820,11 +819,11 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
820
  /**
821
  * Fetch plugin version from plugin PHP header
822
  *
823
- * @author Lars Koudal
824
- * @since v0.0.1
825
- * @version v1.0.0 Thursday, June 9th, 2022.
826
- * @access public static
827
- * @return mixed
828
  */
829
  public static function get_plugin_version()
830
  {
@@ -837,12 +836,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
837
  /**
838
  * timerstart.
839
  *
840
- * @author Lars Koudal
841
- * @since v0.0.1
842
- * @version v1.0.0 Thursday, June 9th, 2022.
843
- * @access public static
844
- * @param mixed $watchname
845
- * @return void
846
  */
847
  public static function timerstart( $watchname )
848
  {
@@ -852,13 +851,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
852
  /**
853
  * timerstop.
854
  *
855
- * @author Lars Koudal
856
- * @since v0.0.1
857
- * @version v1.0.0 Thursday, June 9th, 2022.
858
- * @access public static
859
- * @param mixed $watchname
860
- * @param integer $digits Default: 3
861
- * @return mixed
862
  */
863
  public static function timerstop( $watchname, $digits = 3 )
864
  {
@@ -870,16 +869,17 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
870
  /**
871
  * Clean duplicates - not AJAX version
872
  *
873
- * @author Lars Koudal
874
- * @since v0.0.1
875
- * @version v1.0.0 Thursday, June 9th, 2022.
876
- * @access public static
877
- * @param boolean $manualrun Default: false
878
- * @param mixed $to_delete Default: array()
879
- * @return void
880
  */
881
  public static function cleandupes( $manualrun = false, $to_delete = array() )
882
  {
 
883
  self::timerstart( 'ddp_totaltime' );
884
  // start total timer
885
  $options = self::get_options();
@@ -898,9 +898,10 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
898
  $lookup_arr = array();
899
  foreach ( $to_delete as $td ) {
900
  $new_item = array();
901
- $new_item['ID'] = $td;
902
- $new_item['type'] = get_post_type( $td );
903
- $new_item['title'] = get_the_title( $td );
 
904
  $lookup_arr['dupes'][] = $new_item;
905
  }
906
  $dupes = $lookup_arr;
@@ -918,7 +919,9 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
918
 
919
  if ( $postid ) {
920
  self::timerstart( 'deletepost_' . $postid );
921
- $result = wp_delete_post( $postid, true );
 
 
922
  $timespent = self::timerstop( 'deletepost_' . $postid );
923
  $dispcount++;
924
  $totaldeleted = get_option( 'ddp_deleted_duplicates' );
@@ -953,13 +956,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
953
  ?>
954
  <div class="notice notice-success">
955
  <p>
956
- <?php
957
  // translators:
958
  printf( esc_html__( 'A total of %s duplicate posts were deleted.', 'delete-duplicate-posts' ), intval( $dispcount ) );
959
  ?>
960
  </p>
961
  </div>
962
- <?php
963
  } else {
964
  $json_response = array(
965
  'msg' => sprintf( esc_html__( 'A total of %s duplicate posts were deleted.', 'delete-duplicate-posts' ), intval( $dispcount ) ),
@@ -1000,12 +1003,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1000
  /**
1001
  * add_cron_intervals.
1002
  *
1003
- * @author Lars Koudal
1004
- * @since v0.0.1
1005
- * @version v1.0.0 Thursday, June 9th, 2022.
1006
- * @access public static
1007
- * @param mixed $schedules
1008
- * @return mixed
1009
  */
1010
  public static function add_cron_intervals( $schedules )
1011
  {
@@ -1102,15 +1105,17 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1102
  /**
1103
  * Create plugin tables
1104
  *
1105
- * @author Lars Koudal
1106
- * @since v0.0.1
1107
- * @version v1.0.0 Monday, January 11th, 2021.
1108
- * @access public static
1109
- * @return void
 
 
1110
  */
1111
  public static function create_table()
1112
  {
1113
- global $wpdb ;
1114
  $table_name = $wpdb->prefix . 'ddp_log';
1115
 
1116
  if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) !== $table_name ) {
@@ -1128,12 +1133,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1128
  /**
1129
  * Install routines - create database and default options
1130
  *
1131
- * @author Lars Koudal
1132
- * @since v0.0.1
1133
- * @version v1.0.0 Thursday, June 9th, 2022.
1134
- * @access public static
1135
- * @param mixed $network_wide
1136
- * @return void
1137
  */
1138
  public static function install( $network_wide )
1139
  {
@@ -1158,17 +1163,17 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1158
  * Creating table when a new blog is created
1159
  * https://sudarmuthu.com/blog/how-to-properly-create-tables-in-wordpress-multisite-plugins/
1160
  *
1161
- * @author Lars Koudal
1162
- * @since v0.0.1
1163
- * @version v1.0.0 Thursday, June 9th, 2022.
1164
- * @access public static
1165
- * @param mixed $blog_id
1166
- * @param mixed $user_id
1167
- * @param mixed $domain
1168
- * @param mixed $path
1169
- * @param mixed $site_id
1170
- * @param mixed $meta
1171
- * @return void
1172
  */
1173
  public static function on_create_blog(
1174
  $blog_id,
@@ -1191,16 +1196,16 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1191
  /**
1192
  * Deleting the table whenever a blog is deleted
1193
  *
1194
- * @author Lars Koudal
1195
- * @since v0.0.1
1196
- * @version v1.0.0 Thursday, June 9th, 2022.
1197
- * @access public static
1198
- * @param mixed $tables
1199
- * @return mixed
1200
  */
1201
  public static function on_delete_blog( $tables )
1202
  {
1203
- global $wpdb ;
1204
  $tables[] = $wpdb->prefix . 'ddp_log';
1205
  return $tables;
1206
  }
@@ -1208,12 +1213,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1208
  /**
1209
  * Saves options
1210
  *
1211
- * @author Lars Koudal
1212
- * @since v0.0.1
1213
- * @version v1.0.0 Thursday, June 9th, 2022.
1214
- * @access public static
1215
- * @param mixed $newoptions
1216
- * @return mixed
1217
  */
1218
  public static function save_options( $newoptions )
1219
  {
@@ -1223,11 +1228,11 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1223
  /**
1224
  * Adds link to menu under Tools
1225
  *
1226
- * @author Lars Koudal
1227
- * @since v0.0.1
1228
- * @version v1.0.0 Thursday, June 9th, 2022.
1229
- * @access public static
1230
- * @return void
1231
  */
1232
  public static function admin_menu_link()
1233
  {
@@ -1249,13 +1254,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1249
  /**
1250
  * filter_plugin_actions.
1251
  *
1252
- * @author Lars Koudal
1253
- * @since v0.0.1
1254
- * @version v1.0.0 Thursday, June 9th, 2022.
1255
- * @access public static
1256
- * @param mixed $links
1257
- * @param mixed $file
1258
- * @return mixed
1259
  */
1260
  public static function filter_plugin_actions( $links, $file )
1261
  {
@@ -1268,11 +1273,11 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1268
  /**
1269
  * Adds help content to plugin page
1270
  *
1271
- * @author Lars Koudal
1272
- * @since v0.0.1
1273
- * @version v1.0.0 Thursday, June 9th, 2022.
1274
- * @access public static
1275
- * @return void
1276
  */
1277
  public static function set_custom_help_content()
1278
  {
@@ -1281,7 +1286,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1281
  $screen->add_help_tab( array(
1282
  'id' => 'ddp_help',
1283
  'title' => __( 'Usage and FAQ', 'delete-duplicate-posts' ),
1284
- 'content' => '<h4>' . __( 'What does this plugin do?', 'delete-duplicate-posts' ) . '</h4><p>' . __( 'Helps you clean duplicate posts from your blog. The plugin checks for blogposts on your blog with the same title.', 'delete-duplicate-posts' ) . '</p><p>' . __( "It can run automatically via WordPress's own internal CRON-system, or you can run it automatically.", 'delete-duplicate-posts' ) . '</p><p>' . __( 'It also has a nice feature that can send you an e-mail when Delete Duplicate Posts finds and deletes something (if you have turned on the CRON feature).', 'delete-duplicate-posts' ) . '</p><h4>' . __( 'Help! Something was deleted that was not supposed to be deleted!', 'delete-duplicate-posts' ) . '</h4><p>' . __( 'I am sorry for that, I can only recommend you restore the database you took just before you ran this plugin.', 'delete-duplicate-posts' ) . '</p><p>' . __( 'If you run this plugin, manually or automatically, it is at your OWN risk!', 'delete-duplicate-posts' ) . '</p><p>' . __( 'I have done my best to avoid deleting something that should not be deleted, but if it happens, there is nothing I can do to help you.', 'delete-duplicate-posts' ) . "</p><p><a href='https://cleverplugins.com' target='_blank'>cleverplugins.com</a>.</p>",
1285
  ) );
1286
  }
1287
  }
@@ -1289,12 +1294,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1289
  /**
1290
  * admin_options_page.
1291
  *
1292
- * @author Lars Koudal
1293
- * @since v0.0.1
1294
- * @version v1.0.0 Thursday, June 9th, 2022.
1295
- * @version v1.0.1 Thursday, June 9th, 2022.
1296
- * @access public static
1297
- * @return void
1298
  */
1299
  public static function admin_options_page()
1300
  {
@@ -1354,6 +1359,14 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1354
  if ( isset( $_POST['ddp_resultslimit'] ) ) {
1355
  $options['ddp_resultslimit'] = sanitize_text_field( $_POST['ddp_resultslimit'] );
1356
  }
 
 
 
 
 
 
 
 
1357
  $options['ddp_pts'] = $posttypes;
1358
  // Previously sanitized
1359
  if ( isset( $_POST['ddp_limit'] ) ) {
@@ -1508,7 +1521,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1508
  ?>
1509
  <div class="notice notice-info is-dismissible">
1510
  <h3><span class="dashicons dashicons-saved"></span> Automatically Deleting Duplicates</h3>
1511
- <?php
1512
  echo '<p class="cronstatus center">' . esc_html__( 'You have enabled automatic deletion, so I am running on automatic. I will take care of everything...', 'delete-duplicate-posts' ) . '</p>' ;
1513
  echo '<p class="center">' ;
1514
  echo sprintf(
@@ -1520,7 +1533,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1520
  echo '</p>' ;
1521
  ?>
1522
  </div>
1523
- <?php
1524
  }
1525
 
1526
  ?>
@@ -1534,7 +1547,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1534
 
1535
  <tr valign="top">
1536
  <th><label
1537
- for="ddp_enabled"><?php
1538
  esc_html_e( 'Which post types?:', 'delete-duplicate-posts' );
1539
  ?></label>
1540
  </th>
@@ -1554,7 +1567,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1554
  if ( $post_types ) {
1555
  ?>
1556
  <ul class="radio">
1557
- <?php
1558
  $step = 0;
1559
  if ( !is_array( $checked_post_types ) ) {
1560
  $checked_post_types = array();
@@ -1567,17 +1580,19 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1567
  ?>"
1568
  value="<?php
1569
  echo esc_html( $pt ) ;
1570
- ?>" <?php
 
1571
  if ( false !== $checked ) {
1572
  echo ' checked' ;
1573
  }
1574
- ?> />
 
1575
  <label for="ddp_pt-<?php
1576
  echo esc_attr( $step ) ;
1577
  ?>"><?php
1578
  echo esc_html( $pt ) ;
1579
  ?></label>
1580
- <?php
1581
  // Count for each post type
1582
  $postinfo = wp_count_posts( $pt );
1583
  $othercount = 0;
@@ -1588,12 +1603,12 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1588
  echo '<small>' . sprintf( esc_html__( '(%s total found)', 'delete-duplicate-posts' ), esc_html( number_format_i18n( $othercount ) ) ) . '</small>' ;
1589
  ?>
1590
  </li>
1591
- <?php
1592
  $step++;
1593
  }
1594
  ?>
1595
  </ul>
1596
- <?php
1597
  }
1598
 
1599
  ?>
@@ -1623,7 +1638,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1623
  if ( $stati ) {
1624
  ?>
1625
  <ul class="radio">
1626
- <?php
1627
  $staticount = count( $stati );
1628
  foreach ( $stati as $key => $st ) {
1629
 
@@ -1636,29 +1651,30 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1636
  ?>"
1637
  value="<?php
1638
  echo esc_attr( $key ) ;
1639
- ?>"<?php
 
1640
  if ( false !== $checked ) {
1641
  echo ' checked' ;
1642
  }
1643
  if ( 1 === $staticount ) {
1644
  echo ' disabled' ;
1645
  }
1646
- ?> />
1647
- <label
1648
  for="ddp_pstatus-<?php
1649
  echo esc_attr( $key ) ;
1650
  ?>"><?php
1651
  echo esc_html( $key . ' (' . $st->label . ')' ) ;
1652
  ?></label>
1653
  </li>
1654
- <?php
1655
  $step++;
1656
  }
1657
 
1658
  }
1659
  ?>
1660
  </ul>
1661
- <?php
1662
  }
1663
 
1664
  ?>
@@ -1708,18 +1724,22 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1708
  <td>
1709
 
1710
  <select name="ddp_keep" id="ddp_keep">
1711
- <option value="oldest" <?php
 
1712
  if ( 'oldest' === $options['ddp_keep'] ) {
1713
  echo 'selected="selected"' ;
1714
  }
1715
- ?>><?php
 
1716
  esc_html_e( 'Keep oldest', 'delete-duplicate-posts' );
1717
  ?></option>
1718
- <option value="latest" <?php
 
1719
  if ( 'latest' === $options['ddp_keep'] ) {
1720
  echo 'selected="selected"' ;
1721
  }
1722
- ?>><?php
 
1723
  esc_html_e( 'Keep latest', 'delete-duplicate-posts' );
1724
  ?></option>
1725
  </select>
@@ -1769,7 +1789,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1769
  <?php
1770
  echo esc_attr( $label ) ;
1771
  ?></option>
1772
- <?php
1773
  }
1774
  ?>
1775
  </select>
@@ -1782,34 +1802,10 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1782
  </td>
1783
  </tr>
1784
 
1785
- <?php
1786
- /*
1787
-
1788
- <tr valign="top">
1789
- <th><label for="ddp_limit"><?php esc_html_e( 'Delete at maximum :', 'delete-duplicate-posts' ); ?></label>
1790
- </th>
1791
- <td><select name="ddp_limit">
1792
- <?php
1793
- for ( $x = 1; $x <= 10; $x++ ) {
1794
- $val = ( $x * 50 );
1795
- echo "<option value='" . esc_attr( $val ) . "' ";
1796
- if ( $options['ddp_limit'] === $val ) {
1797
- echo 'selected';
1798
- }
1799
- echo '>' . esc_attr( $val ) . '</option>';
1800
- }
1801
- ?>
1802
- </select>
1803
- <?php esc_html_e( 'duplicates.', 'delete-duplicate-posts' ); ?>
1804
- <p class="description">
1805
- <?php esc_html_e( 'Setting a limit is a good idea, especially if your site is on a busy server.', 'delete-duplicate-posts' ); ?>
1806
- </p>
1807
- </td>
1808
- </tr>
1809
- */
1810
- ?>
1811
 
1812
 
 
 
1813
 
1814
  <tr>
1815
  <td colspan="2">
@@ -1824,11 +1820,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1824
 
1825
  </th>
1826
  <td><label for="ddp_enabled">
1827
- <input type="checkbox" id="ddp_enabled" name="ddp_enabled" <?php
 
1828
  if ( true === $options['ddp_enabled'] ) {
1829
  echo 'checked="checked"' ;
1830
  }
1831
- ?>>
 
1832
  <p class="description">
1833
  <?php
1834
  esc_html_e( 'Clean duplicates automatically.', 'delete-duplicate-posts' );
@@ -1853,14 +1851,16 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1853
  ?>
1854
  <option value="<?php
1855
  echo esc_attr( $key ) ;
1856
- ?>" <?php
 
1857
  if ( isset( $options['ddp_schedule'] ) && esc_attr( $key ) === $options['ddp_schedule'] ) {
1858
  echo esc_html( 'selected="selected"' ) ;
1859
  }
1860
- ?>><?php
 
1861
  echo esc_html( $sch['display'] ) ;
1862
  ?></option>
1863
- <?php
1864
  }
1865
  }
1866
  ?>
@@ -1871,9 +1871,6 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1871
  ?></p>
1872
  </td>
1873
  </tr>
1874
-
1875
-
1876
-
1877
  <tr>
1878
  <td colspan="2">
1879
  <hr>
@@ -1886,11 +1883,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1886
  ?></th>
1887
  <td>
1888
  <label for="ddp_statusmail">
1889
- <input type="checkbox" id="ddp_statusmail" name="ddp_statusmail" <?php
 
1890
  if ( isset( $options['ddp_statusmail'] ) && true === $options['ddp_statusmail'] ) {
1891
  echo 'checked="checked"' ;
1892
  }
1893
- ?>>
 
1894
  <p class="description">
1895
  <?php
1896
  esc_html_e( 'Sends a status email if duplicates have been found.', 'delete-duplicate-posts' );
@@ -1934,11 +1933,13 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1934
  ?></th>
1935
  <td>
1936
  <label for="ddp_debug">
1937
- <input type="checkbox" id="ddp_debug" name="ddp_debug" <?php
 
1938
  if ( isset( $options['ddp_debug'] ) && true === $options['ddp_debug'] ) {
1939
  echo 'checked="checked"' ;
1940
  }
1941
- ?>>
 
1942
  <p class="description">
1943
  <?php
1944
  esc_html_e( 'Should only be enabled if debugging a problem.', 'delete-duplicate-posts' );
@@ -1975,7 +1976,7 @@ if ( !class_exists( 'Delete_Duplicate_Posts' ) ) {
1975
  </form>
1976
  </p>
1977
  </div><!-- #ddp_container -->
1978
- <?php
1979
  include_once 'sidebar.php';
1980
  if ( function_exists( 'ddp_fs' ) ) {
1981
  global $ddp_fs ;
5
  Plugin Script: delete-duplicate-posts.php
6
  Plugin URI: https://cleverplugins.com
7
  Description: Remove duplicate blogposts on your blog! Searches and removes duplicate posts and their post meta tags. You can delete posts, pages and other Custom Post Types enabled on your website.
8
+ Version: 4.8
9
  Author: cleverplugins.com
10
  Author URI: https://cleverplugins.com
11
  Min WP Version: 4.7
90
  {
91
  global $wpdb ;
92
  $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %s', $wpdb->prefix . 'ddp_log' ) );
93
+ $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %s', $wpdb->prefix . 'ddp_redirects' ) );
94
  delete_option( 'ddp_deleted_duplicates' );
95
  delete_option( 'delete_duplicate_posts_options_v4' );
96
  delete_option( 'cp_ddp_freemius_state' );
113
  if ( function_exists( 'ddp_fs' ) ) {
114
  ddp_fs()->add_filter( 'permission_list', array( __CLASS__, 'add_freemius_extra_permission' ) );
115
  }
116
+ global $ddp_fs ;
117
  $locale = get_locale();
118
  $mo = plugin_dir_path( __FILE__ ) . '/languages/delete-duplicate-posts-' . $locale . '.mo';
119
  load_plugin_textdomain( 'delete-duplicate-posts', false, dirname( __FILE__ ) . '/languages/' );
295
  </form>
296
  <p><small>Signup form is shown every 14 days until dismissed</small></p>
297
  </div>
298
+ <?php
299
  }
300
 
301
  if ( 'tools_page_delete-duplicate-posts' !== $screen->id ) {
315
  ?></h3>
316
 
317
  <p>
318
+ <?php
319
  echo esc_html__( 'Gathering non-sensitive diagnostic data about the plugin install helps us improve the plugin.', 'delete-duplicate-posts' ) . ' <a href="' . esc_url( 'https://cleverplugins.com/docs/install/non-sensitive-diagnostic-data/' ) . '" target="_blank" rel="noopener">' . esc_html__( 'Read more about what we collect.', 'delete-duplicate-posts' ) . '</a>' ;
320
  ?>
321
  </p>
322
 
323
  <p>
324
+ <?php
325
  // translators:
326
  printf( esc_html__( 'If you opt-in, some data about your usage of %1$s will be sent to Freemius.com. If you skip this, that\'s okay! %1$s will still work just fine.', 'delete-duplicate-posts' ), '<b>Delete Duplicate Posts</b>' );
327
  ?>
343
  ?>" />
344
 
345
  </div>
346
+ <?php
347
  }
348
 
349
  }
360
  ?>
361
  <div id="cp-ddp-reviewlink" data-dismissible="ddp-leavereview-14" class="updated notice notice-success is-dismissible">
362
  <h3>
363
+ <?php
364
  // translators: Total number of deleted duplicates
365
  printf( esc_html__( '%s duplicates deleted!', 'delete-duplicate-posts' ), esc_html( $totaldeleted ) );
366
  ?>
367
  </h3>
368
  <p>
369
+ <?php
370
  // translators: Asking for a review text
371
  printf( esc_html__( "Hey, I noticed this plugin has deleted %s duplicate posts for you - that's awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress? Just to help us spread the word and boost our motivation.", 'delete-duplicate-posts' ), esc_html( $totaldeleted ) );
372
  ?>
382
  target="_blank" rel="noopener">I already did</a>
383
  </p>
384
  </div>
385
+ <?php
386
  }
387
 
388
  }
407
  $checked_posts = array();
408
  if ( isset( $_POST['checked_posts'] ) && is_array( $_POST['checked_posts'] ) ) {
409
  foreach ( $_POST['checked_posts'] as $cp ) {
410
+ $checked_posts[] = array(
411
+ 'ID' => intval( $cp['ID'] ),
412
+ 'orgID' => intval( $cp['orgID'] ),
413
+ );
414
  }
415
  }
416
  $options = self::get_options();
 
 
 
 
 
 
417
  self::cleandupes( true, $checked_posts );
418
  wp_send_json_success();
419
  }
740
  */
741
  public static function create_redirect( $inurl, $targeturl, $code = 301 )
742
  {
743
+ global $wpdb, $ddp_fs ;
 
744
  }
745
 
746
  /**
765
  'ddp_enabled' => 0,
766
  'ddp_pstati' => array( 'publish' ),
767
  'ddp_debug' => 0,
768
+ 'ddp_redirects' => 0,
769
  );
770
  return $defaults;
771
  }
773
  /**
774
  * get plugin's options
775
  *
776
+ * @author Lars Koudal
777
+ * @since v0.0.1
778
+ * @version v1.0.0 Thursday, June 9th, 2022.
779
+ * @access public static
780
+ * @return mixed
781
  */
782
  public static function get_options()
783
  {
792
  /**
793
  * add_freemius_extra_permission.
794
  *
795
+ * @author Lars Koudal
796
+ * @since v0.0.1
797
+ * @version v1.0.0 Thursday, June 9th, 2022.
798
+ * @access public static
799
+ * @param mixed $permissions
800
+ * @return mixed
801
  */
802
  public static function add_freemius_extra_permission( $permissions )
803
  {
819
  /**
820
  * Fetch plugin version from plugin PHP header
821
  *
822
+ * @author Lars Koudal
823
+ * @since v0.0.1
824
+ * @version v1.0.0 Thursday, June 9th, 2022.
825
+ * @access public static
826
+ * @return mixed
827
  */
828
  public static function get_plugin_version()
829
  {
836
  /**
837
  * timerstart.
838
  *
839
+ * @author Lars Koudal
840
+ * @since v0.0.1
841
+ * @version v1.0.0 Thursday, June 9th, 2022.
842
+ * @access public static
843
+ * @param mixed $watchname
844
+ * @return void
845
  */
846
  public static function timerstart( $watchname )
847
  {
851
  /**
852
  * timerstop.
853
  *
854
+ * @author Lars Koudal
855
+ * @since v0.0.1
856
+ * @version v1.0.0 Thursday, June 9th, 2022.
857
+ * @access public static
858
+ * @param mixed $watchname
859
+ * @param integer $digits Default: 3
860
+ * @return mixed
861
  */
862
  public static function timerstop( $watchname, $digits = 3 )
863
  {
869
  /**
870
  * Clean duplicates - not AJAX version
871
  *
872
+ * @author Lars Koudal
873
+ * @since v0.0.1
874
+ * @version v1.0.0 Thursday, June 9th, 2022.
875
+ * @access public static
876
+ * @param boolean $manualrun Default: false
877
+ * @param mixed $to_delete Default: array()
878
+ * @return void
879
  */
880
  public static function cleandupes( $manualrun = false, $to_delete = array() )
881
  {
882
+ global $wpdb, $ddp_fs ;
883
  self::timerstart( 'ddp_totaltime' );
884
  // start total timer
885
  $options = self::get_options();
898
  $lookup_arr = array();
899
  foreach ( $to_delete as $td ) {
900
  $new_item = array();
901
+ $new_item['ID'] = $td['ID'];
902
+ $new_item['orgID'] = $td['orgID'];
903
+ $new_item['type'] = get_post_type( $td['ID'] );
904
+ $new_item['title'] = get_the_title( $td['ID'] );
905
  $lookup_arr['dupes'][] = $new_item;
906
  }
907
  $dupes = $lookup_arr;
919
 
920
  if ( $postid ) {
921
  self::timerstart( 'deletepost_' . $postid );
922
+ $perma = get_permalink( $dupe['ID'] );
923
+ $ORGperma = get_permalink( $dupe['orgID'] );
924
+ $deleteresult = wp_delete_post( $postid, true );
925
  $timespent = self::timerstop( 'deletepost_' . $postid );
926
  $dispcount++;
927
  $totaldeleted = get_option( 'ddp_deleted_duplicates' );
956
  ?>
957
  <div class="notice notice-success">
958
  <p>
959
+ <?php
960
  // translators:
961
  printf( esc_html__( 'A total of %s duplicate posts were deleted.', 'delete-duplicate-posts' ), intval( $dispcount ) );
962
  ?>
963
  </p>
964
  </div>
965
+ <?php
966
  } else {
967
  $json_response = array(
968
  'msg' => sprintf( esc_html__( 'A total of %s duplicate posts were deleted.', 'delete-duplicate-posts' ), intval( $dispcount ) ),
1003
  /**
1004
  * add_cron_intervals.
1005
  *
1006
+ * @author Lars Koudal
1007
+ * @since v0.0.1
1008
+ * @version v1.0.0 Thursday, June 9th, 2022.
1009
+ * @access public static
1010
+ * @param mixed $schedules
1011
+ * @return mixed
1012
  */
1013
  public static function add_cron_intervals( $schedules )
1014
  {
1105
  /**
1106
  * Create plugin tables
1107
  *
1108
+ * @author Lars Koudal
1109
+ * @author Unknown
1110
+ * @since v0.0.1
1111
+ * @version v1.0.0 Monday, January 11th, 2021.
1112
+ * @version v1.0.1 Sunday, July 17th, 2022.
1113
+ * @access public static
1114
+ * @return void
1115
  */
1116
  public static function create_table()
1117
  {
1118
+ global $wpdb, $ddp_fs ;
1119
  $table_name = $wpdb->prefix . 'ddp_log';
1120
 
1121
  if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) !== $table_name ) {
1133
  /**
1134
  * Install routines - create database and default options
1135
  *
1136
+ * @author Lars Koudal
1137
+ * @since v0.0.1
1138
+ * @version v1.0.0 Thursday, June 9th, 2022.
1139
+ * @access public static
1140
+ * @param mixed $network_wide
1141
+ * @return void
1142
  */
1143
  public static function install( $network_wide )
1144
  {
1163
  * Creating table when a new blog is created
1164
  * https://sudarmuthu.com/blog/how-to-properly-create-tables-in-wordpress-multisite-plugins/
1165
  *
1166
+ * @author Lars Koudal
1167
+ * @since v0.0.1
1168
+ * @version v1.0.0 Thursday, June 9th, 2022.
1169
+ * @access public static
1170
+ * @param mixed $blog_id
1171
+ * @param mixed $user_id
1172
+ * @param mixed $domain
1173
+ * @param mixed $path
1174
+ * @param mixed $site_id
1175
+ * @param mixed $meta
1176
+ * @return void
1177
  */
1178
  public static function on_create_blog(
1179
  $blog_id,
1196
  /**
1197
  * Deleting the table whenever a blog is deleted
1198
  *
1199
+ * @author Lars Koudal
1200
+ * @since v0.0.1
1201
+ * @version v1.0.0 Thursday, June 9th, 2022.
1202
+ * @access public static
1203
+ * @param mixed $tables
1204
+ * @return mixed
1205
  */
1206
  public static function on_delete_blog( $tables )
1207
  {
1208
+ global $wpdb, $ddp_fs ;
1209
  $tables[] = $wpdb->prefix . 'ddp_log';
1210
  return $tables;
1211
  }
1213
  /**
1214
  * Saves options
1215
  *
1216
+ * @author Lars Koudal
1217
+ * @since v0.0.1
1218
+ * @version v1.0.0 Thursday, June 9th, 2022.
1219
+ * @access public static
1220
+ * @param mixed $newoptions
1221
+ * @return mixed
1222
  */
1223
  public static function save_options( $newoptions )
1224
  {
1228
  /**
1229
  * Adds link to menu under Tools
1230
  *
1231
+ * @author Lars Koudal
1232
+ * @since v0.0.1
1233
+ * @version v1.0.0 Thursday, June 9th, 2022.
1234
+ * @access public static
1235
+ * @return void
1236
  */
1237
  public static function admin_menu_link()
1238
  {
1254
  /**
1255
  * filter_plugin_actions.
1256
  *
1257
+ * @author Lars Koudal
1258
+ * @since v0.0.1
1259
+ * @version v1.0.0 Thursday, June 9th, 2022.
1260
+ * @access public static
1261
+ * @param mixed $links
1262
+ * @param mixed $file
1263
+ * @return mixed
1264
  */
1265
  public static function filter_plugin_actions( $links, $file )
1266
  {
1273
  /**
1274
  * Adds help content to plugin page
1275
  *
1276
+ * @author Lars Koudal
1277
+ * @since v0.0.1
1278
+ * @version v1.0.0 Thursday, June 9th, 2022.
1279
+ * @access public static
1280
+ * @return void
1281
  */
1282
  public static function set_custom_help_content()
1283
  {
1286
  $screen->add_help_tab( array(
1287
  'id' => 'ddp_help',
1288
  'title' => __( 'Usage and FAQ', 'delete-duplicate-posts' ),
1289
+ 'content' => '<h4>' . __( 'What does this plugin do?', 'delete-duplicate-posts' ) . '</h4><p>' . __( 'Helps you clean duplicate posts from your blog. The plugin checks for blogposts on your blog with the same title.', 'delete-duplicate-posts' ) . '</p><p>' . __( "It can run automatically via WordPress's own internal CRON-system, or you can run it automatically.", 'delete-duplicate-posts' ) . '</p><p>' . __( 'It also has a nice feature that can send you an e-mail when Delete Duplicate Posts finds and deletes something (if you have turned on the CRON feature).', 'delete-duplicate-posts' ) . '</p><h4>' . __( 'Help! Something was deleted that was not supposed to be deleted!', 'delete-duplicate-posts' ) . '</h4><p>' . __( 'I am sorry for that, I can only recommend you restore the database you took just before you ran this plugin.', 'delete-duplicate-posts' ) . '</p><p>' . __( 'If you run this plugin, manually or automatically, it is at your OWN risk!', 'delete-duplicate-posts' ) . '</p><p>' . __( 'We have done our best to avoid deleting something that should not be deleted, but if it happens, there is nothing we can do to help you.', 'delete-duplicate-posts' ) . "</p><p><a href='https://cleverplugins.com' target='_blank'>cleverplugins.com</a>.</p>",
1290
  ) );
1291
  }
1292
  }
1294
  /**
1295
  * admin_options_page.
1296
  *
1297
+ * @author Lars Koudal
1298
+ * @since v0.0.1
1299
+ * @version v1.0.0 Thursday, June 9th, 2022.
1300
+ * @version v1.0.1 Thursday, June 9th, 2022.
1301
+ * @access public static
1302
+ * @return void
1303
  */
1304
  public static function admin_options_page()
1305
  {
1359
  if ( isset( $_POST['ddp_resultslimit'] ) ) {
1360
  $options['ddp_resultslimit'] = sanitize_text_field( $_POST['ddp_resultslimit'] );
1361
  }
1362
+ // 301 redirects
1363
+
1364
+ if ( isset( $_POST['ddp_redirects'] ) ) {
1365
+ $options['ddp_redirects'] = ( 'on' === $_POST['ddp_redirects'] ? true : false );
1366
+ } else {
1367
+ $options['ddp_redirects'] = false;
1368
+ }
1369
+
1370
  $options['ddp_pts'] = $posttypes;
1371
  // Previously sanitized
1372
  if ( isset( $_POST['ddp_limit'] ) ) {
1521
  ?>
1522
  <div class="notice notice-info is-dismissible">
1523
  <h3><span class="dashicons dashicons-saved"></span> Automatically Deleting Duplicates</h3>
1524
+ <?php
1525
  echo '<p class="cronstatus center">' . esc_html__( 'You have enabled automatic deletion, so I am running on automatic. I will take care of everything...', 'delete-duplicate-posts' ) . '</p>' ;
1526
  echo '<p class="center">' ;
1527
  echo sprintf(
1533
  echo '</p>' ;
1534
  ?>
1535
  </div>
1536
+ <?php
1537
  }
1538
 
1539
  ?>
1547
 
1548
  <tr valign="top">
1549
  <th><label
1550
+ for="ddp_pts"><?php
1551
  esc_html_e( 'Which post types?:', 'delete-duplicate-posts' );
1552
  ?></label>
1553
  </th>
1567
  if ( $post_types ) {
1568
  ?>
1569
  <ul class="radio">
1570
+ <?php
1571
  $step = 0;
1572
  if ( !is_array( $checked_post_types ) ) {
1573
  $checked_post_types = array();
1580
  ?>"
1581
  value="<?php
1582
  echo esc_html( $pt ) ;
1583
+ ?>"
1584
+ <?php
1585
  if ( false !== $checked ) {
1586
  echo ' checked' ;
1587
  }
1588
+ ?>
1589
+ />
1590
  <label for="ddp_pt-<?php
1591
  echo esc_attr( $step ) ;
1592
  ?>"><?php
1593
  echo esc_html( $pt ) ;
1594
  ?></label>
1595
+ <?php
1596
  // Count for each post type
1597
  $postinfo = wp_count_posts( $pt );
1598
  $othercount = 0;
1603
  echo '<small>' . sprintf( esc_html__( '(%s total found)', 'delete-duplicate-posts' ), esc_html( number_format_i18n( $othercount ) ) ) . '</small>' ;
1604
  ?>
1605
  </li>
1606
+ <?php
1607
  $step++;
1608
  }
1609
  ?>
1610
  </ul>
1611
+ <?php
1612
  }
1613
 
1614
  ?>
1638
  if ( $stati ) {
1639
  ?>
1640
  <ul class="radio">
1641
+ <?php
1642
  $staticount = count( $stati );
1643
  foreach ( $stati as $key => $st ) {
1644
 
1651
  ?>"
1652
  value="<?php
1653
  echo esc_attr( $key ) ;
1654
+ ?>"
1655
+ <?php
1656
  if ( false !== $checked ) {
1657
  echo ' checked' ;
1658
  }
1659
  if ( 1 === $staticount ) {
1660
  echo ' disabled' ;
1661
  }
1662
+ ?>
1663
+ /><label
1664
  for="ddp_pstatus-<?php
1665
  echo esc_attr( $key ) ;
1666
  ?>"><?php
1667
  echo esc_html( $key . ' (' . $st->label . ')' ) ;
1668
  ?></label>
1669
  </li>
1670
+ <?php
1671
  $step++;
1672
  }
1673
 
1674
  }
1675
  ?>
1676
  </ul>
1677
+ <?php
1678
  }
1679
 
1680
  ?>
1724
  <td>
1725
 
1726
  <select name="ddp_keep" id="ddp_keep">
1727
+ <option value="oldest"
1728
+ <?php
1729
  if ( 'oldest' === $options['ddp_keep'] ) {
1730
  echo 'selected="selected"' ;
1731
  }
1732
+ ?>
1733
+ ><?php
1734
  esc_html_e( 'Keep oldest', 'delete-duplicate-posts' );
1735
  ?></option>
1736
+ <option value="latest"
1737
+ <?php
1738
  if ( 'latest' === $options['ddp_keep'] ) {
1739
  echo 'selected="selected"' ;
1740
  }
1741
+ ?>
1742
+ ><?php
1743
  esc_html_e( 'Keep latest', 'delete-duplicate-posts' );
1744
  ?></option>
1745
  </select>
1789
  <?php
1790
  echo esc_attr( $label ) ;
1791
  ?></option>
1792
+ <?php
1793
  }
1794
  ?>
1795
  </select>
1802
  </td>
1803
  </tr>
1804
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1805
 
1806
 
1807
+ <?php
1808
+ ?>
1809
 
1810
  <tr>
1811
  <td colspan="2">
1820
 
1821
  </th>
1822
  <td><label for="ddp_enabled">
1823
+ <input type="checkbox" id="ddp_enabled" name="ddp_enabled"
1824
+ <?php
1825
  if ( true === $options['ddp_enabled'] ) {
1826
  echo 'checked="checked"' ;
1827
  }
1828
+ ?>
1829
+ >
1830
  <p class="description">
1831
  <?php
1832
  esc_html_e( 'Clean duplicates automatically.', 'delete-duplicate-posts' );
1851
  ?>
1852
  <option value="<?php
1853
  echo esc_attr( $key ) ;
1854
+ ?>"
1855
+ <?php
1856
  if ( isset( $options['ddp_schedule'] ) && esc_attr( $key ) === $options['ddp_schedule'] ) {
1857
  echo esc_html( 'selected="selected"' ) ;
1858
  }
1859
+ ?>
1860
+ ><?php
1861
  echo esc_html( $sch['display'] ) ;
1862
  ?></option>
1863
+ <?php
1864
  }
1865
  }
1866
  ?>
1871
  ?></p>
1872
  </td>
1873
  </tr>
 
 
 
1874
  <tr>
1875
  <td colspan="2">
1876
  <hr>
1883
  ?></th>
1884
  <td>
1885
  <label for="ddp_statusmail">
1886
+ <input type="checkbox" id="ddp_statusmail" name="ddp_statusmail"
1887
+ <?php
1888
  if ( isset( $options['ddp_statusmail'] ) && true === $options['ddp_statusmail'] ) {
1889
  echo 'checked="checked"' ;
1890
  }
1891
+ ?>
1892
+ >
1893
  <p class="description">
1894
  <?php
1895
  esc_html_e( 'Sends a status email if duplicates have been found.', 'delete-duplicate-posts' );
1933
  ?></th>
1934
  <td>
1935
  <label for="ddp_debug">
1936
+ <input type="checkbox" id="ddp_debug" name="ddp_debug"
1937
+ <?php
1938
  if ( isset( $options['ddp_debug'] ) && true === $options['ddp_debug'] ) {
1939
  echo 'checked="checked"' ;
1940
  }
1941
+ ?>
1942
+ >
1943
  <p class="description">
1944
  <?php
1945
  esc_html_e( 'Should only be enabled if debugging a problem.', 'delete-duplicate-posts' );
1976
  </form>
1977
  </p>
1978
  </div><!-- #ddp_container -->
1979
+ <?php
1980
  include_once 'sidebar.php';
1981
  if ( function_exists( 'ddp_fs' ) ) {
1982
  global $ddp_fs ;
freemius/assets/img/delete-duplicate-posts.png ADDED
Binary file
freemius/includes/class-freemius.php CHANGED
@@ -4058,7 +4058,7 @@
4058
  if ( empty( $unique_id ) || ! is_string( $unique_id ) ) {
4059
  $key = fs_strip_url_protocol( get_site_url( $blog_id ) );
4060
 
4061
- $secure_auth = SECURE_AUTH_KEY;
4062
  if ( empty( $secure_auth ) ||
4063
  false !== strpos( $secure_auth, ' ' ) ||
4064
  'put your unique phrase here' === $secure_auth
4058
  if ( empty( $unique_id ) || ! is_string( $unique_id ) ) {
4059
  $key = fs_strip_url_protocol( get_site_url( $blog_id ) );
4060
 
4061
+ $secure_auth = defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : '';
4062
  if ( empty( $secure_auth ) ||
4063
  false !== strpos( $secure_auth, ' ' ) ||
4064
  'put your unique phrase here' === $secure_auth
freemius/includes/managers/class-fs-key-value-storage.php CHANGED
@@ -298,6 +298,7 @@
298
  return $this->get( $k, null );
299
  }
300
 
 
301
  function offsetSet( $k, $v ) {
302
  if ( is_null( $k ) ) {
303
  throw new Exception( 'Can\'t append value to request params.' );
@@ -306,14 +307,17 @@
306
  }
307
  }
308
 
 
309
  function offsetExists( $k ) {
310
  return array_key_exists( $k, $this->_data );
311
  }
312
 
 
313
  function offsetUnset( $k ) {
314
  unset( $this->$k );
315
  }
316
 
 
317
  function offsetGet( $k ) {
318
  return $this->get( $k, null );
319
  }
@@ -325,6 +329,7 @@
325
  * @link http://php.net/manual/en/iterator.current.php
326
  * @return mixed Can return any type.
327
  */
 
328
  public function current() {
329
  return current( $this->_data );
330
  }
@@ -336,6 +341,7 @@
336
  * @link http://php.net/manual/en/iterator.next.php
337
  * @return void Any returned value is ignored.
338
  */
 
339
  public function next() {
340
  next( $this->_data );
341
  }
@@ -347,6 +353,7 @@
347
  * @link http://php.net/manual/en/iterator.key.php
348
  * @return mixed scalar on success, or null on failure.
349
  */
 
350
  public function key() {
351
  return key( $this->_data );
352
  }
@@ -359,6 +366,7 @@
359
  * @return boolean The return value will be casted to boolean and then evaluated.
360
  * Returns true on success or false on failure.
361
  */
 
362
  public function valid() {
363
  $key = key( $this->_data );
364
 
@@ -372,6 +380,7 @@
372
  * @link http://php.net/manual/en/iterator.rewind.php
373
  * @return void Any returned value is ignored.
374
  */
 
375
  public function rewind() {
376
  reset( $this->_data );
377
  }
@@ -386,6 +395,7 @@
386
  * <p>
387
  * The return value is cast to an integer.
388
  */
 
389
  public function count() {
390
  return count( $this->_data );
391
  }
298
  return $this->get( $k, null );
299
  }
300
 
301
+ #[ReturnTypeWillChange]
302
  function offsetSet( $k, $v ) {
303
  if ( is_null( $k ) ) {
304
  throw new Exception( 'Can\'t append value to request params.' );
307
  }
308
  }
309
 
310
+ #[ReturnTypeWillChange]
311
  function offsetExists( $k ) {
312
  return array_key_exists( $k, $this->_data );
313
  }
314
 
315
+ #[ReturnTypeWillChange]
316
  function offsetUnset( $k ) {
317
  unset( $this->$k );
318
  }
319
 
320
+ #[ReturnTypeWillChange]
321
  function offsetGet( $k ) {
322
  return $this->get( $k, null );
323
  }
329
  * @link http://php.net/manual/en/iterator.current.php
330
  * @return mixed Can return any type.
331
  */
332
+ #[ReturnTypeWillChange]
333
  public function current() {
334
  return current( $this->_data );
335
  }
341
  * @link http://php.net/manual/en/iterator.next.php
342
  * @return void Any returned value is ignored.
343
  */
344
+ #[ReturnTypeWillChange]
345
  public function next() {
346
  next( $this->_data );
347
  }
353
  * @link http://php.net/manual/en/iterator.key.php
354
  * @return mixed scalar on success, or null on failure.
355
  */
356
+ #[ReturnTypeWillChange]
357
  public function key() {
358
  return key( $this->_data );
359
  }
366
  * @return boolean The return value will be casted to boolean and then evaluated.
367
  * Returns true on success or false on failure.
368
  */
369
+ #[ReturnTypeWillChange]
370
  public function valid() {
371
  $key = key( $this->_data );
372
 
380
  * @link http://php.net/manual/en/iterator.rewind.php
381
  * @return void Any returned value is ignored.
382
  */
383
+ #[ReturnTypeWillChange]
384
  public function rewind() {
385
  reset( $this->_data );
386
  }
395
  * <p>
396
  * The return value is cast to an integer.
397
  */
398
+ #[ReturnTypeWillChange]
399
  public function count() {
400
  return count( $this->_data );
401
  }
freemius/start.php CHANGED
@@ -15,7 +15,7 @@
15
  *
16
  * @var string
17
  */
18
- $this_sdk_version = '2.4.3';
19
 
20
  #region SDK Selection Logic --------------------------------------------------------------------
21
 
15
  *
16
  * @var string
17
  */
18
+ $this_sdk_version = '2.4.4';
19
 
20
  #region SDK Selection Logic --------------------------------------------------------------------
21
 
js/delete-duplicate-posts-min.js CHANGED
@@ -1 +1 @@
1
- "use strict";function cp_ddp_freemius_opt_in(e){var t=jQuery("#cp-ddp-freemius-opt-nonce").val(),a=jQuery(e).data("opt");jQuery("#cp-ddp-opt-spin").addClass("is-active"),jQuery.ajax({type:"POST",url:ajaxurl,async:!0,data:{action:"cp_ddp_freemius_opt_in",opt_nonce:t,choice:a},success:function(){jQuery("#cp-ddp-opt-spin").removeClass("is-active"),location.reload()},error:function(e,t,a){console.log(e.statusText),console.log(t),console.log(a)}})}jQuery(document).ready((function(){var e=[];function t(){jQuery("#ddp_log").empty(),jQuery.ajax({type:"POST",url:ajaxurl,data:{_ajax_nonce:cp_ddp.loglines_nonce,action:"ddp_get_loglines"},dataType:"json",success:function(e){var t=e.data.results;t&&jQuery.each(t,(function(e,t){jQuery("#ddp_log").append("<li><code>"+t.datime+"</code> "+t.note+"</li>")})),jQuery("#log .spinner").removeClass("is-active")}}).fail((function(e){jQuery("#log .spinner").removeClass("is-active"),window.console&&window.console.log&&window.console.log(e.statusCode+" "+e.statusText)}))}function a(e,t,d){jQuery("#ddp_container #ddp_buttons input").each((function(){jQuery(this).prop("disabled",!0)})),jQuery("#ddp_container #dashboard .spinner").addClass("is-active"),jQuery.ajax({type:"POST",url:ajaxurl,data:{_ajax_nonce:cp_ddp.nonce,action:"ddp_get_duplicates",stepid:e},dataType:"json",success:function(e){var o=e.data.dupes;o?(jQuery("#ddp_container #dashboard .statusdiv .statusmessage").html(e.data.msg).show(),jQuery("#ddp_container #dashboard .statusdiv .dupelist .duplicatetable").show(),jQuery.each(o,(function(e,t){jQuery("#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody").append('<tr><th scope="row" class="check-column"><label class="screen-reader-text" for="cb-select-'+t.ID+'">Select Post</label><input id="cb-select-'+t.ID+'" type="checkbox" name="delpost[]" value="'+t.ID+'"><div class="locked-indicator"></div></th><td><a href="'+t.permalink+'" target="_blank">'+t.title+"</a> (ID #"+t.ID+" type:"+t.type+" status:"+t.status+')</td><td><a href="'+t.orgpermalink+'" target="_blank">'+t.orgtitle+"</a> (ID #"+t.orgID+") "+t.why+"</td></tr>")})),jQuery("#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody").slideDown(),jQuery("#ddp_container #ddp_buttons input").each((function(){jQuery(this).prop("disabled",!1)}))):jQuery("#ddp_container #dashboard .statusdiv .statusmessage").html(e.data.msg).show(),jQuery("#ddp_container #dashboard .spinner").removeClass("is-active"),"-1"==e.data.nextstep||parseInt(e.data.nextstep)>0&&a(parseInt(e.data.nextstep),t,d)}}).fail((function(e){jQuery("#ddp_container #dashboard .spinner").removeClass("is-active"),window.console&&window.console.log&&window.console.log(e.statusCode+" "+e.statusText)}))}e.stepid=0,a(1,e),t(),jQuery(document).on("click","#deleteduplicateposts_deleteall",(function(d){d.preventDefault(),jQuery("#log .spinner").addClass("is-active");var o=[];if(jQuery(".duplicatetable input[name='delpost[]']:checked").each((function(){o.push(parseInt(jQuery(this).val()))})),void 0===o||0===o.length)return alert(cp_ddp.text_selectsomething),!1;confirm(cp_ddp.text_areyousure)&&(jQuery("#ddp_container .dupelist .duplicatetable tbody").empty(),jQuery.ajax({type:"POST",url:ajaxurl,data:{_ajax_nonce:cp_ddp.deletedupes_nonce,action:"ddp_delete_duplicates",checked_posts:o},dataType:"json",success:function(){a(1,e),t()}}).fail((function(d){jQuery("#log .spinner").removeClass("is-active"),window.console&&window.console.log&&window.console.log(d.statusCode+" "+d.statusText),a(1,e),t()})))})),jQuery(document).on("click","#deleteduplicateposts_resetview",(function(d){d.preventDefault(),jQuery("#ddp_container .dupelist .duplicatetable tbody").empty(),a(1,e),t()})),jQuery(document).on("click",".ddpcomparemethod li",(function(){jQuery(".ddpcomparemethod input:radio").each((function(){this.checked?jQuery(this).closest("li").find(".ddp-compare-details").show():jQuery(this).closest("li").find(".ddp-compare-details").hide()}))})),jQuery(".ddpcomparemethod li").trigger("click")}));
1
+ "use strict";function cp_ddp_freemius_opt_in(e){var t=jQuery("#cp-ddp-freemius-opt-nonce").val(),a=jQuery(e).data("opt");jQuery("#cp-ddp-opt-spin").addClass("is-active"),jQuery.ajax({type:"POST",url:ajaxurl,async:!0,data:{action:"cp_ddp_freemius_opt_in",opt_nonce:t,choice:a},success:function(){jQuery("#cp-ddp-opt-spin").removeClass("is-active"),location.reload()},error:function(e,t,a){console.log(e.statusText),console.log(t),console.log(a)}})}jQuery(document).ready((function(){var e=[];function t(){jQuery("#ddp_log").empty(),jQuery.ajax({type:"POST",url:ajaxurl,data:{_ajax_nonce:cp_ddp.loglines_nonce,action:"ddp_get_loglines"},dataType:"json",success:function(e){var t=e.data.results;t&&jQuery.each(t,(function(e,t){jQuery("#ddp_log").append("<li><code>"+t.datime+"</code> "+t.note+"</li>")})),jQuery("#log .spinner").removeClass("is-active")}}).fail((function(e){jQuery("#log .spinner").removeClass("is-active"),window.console&&window.console.log&&window.console.log(e.statusCode+" "+e.statusText)}))}function a(e,t,d){jQuery("#ddp_container #ddp_buttons input").each((function(){jQuery(this).prop("disabled",!0)})),jQuery("#ddp_container #dashboard .spinner").addClass("is-active"),jQuery.ajax({type:"POST",url:ajaxurl,data:{_ajax_nonce:cp_ddp.nonce,action:"ddp_get_duplicates",stepid:e},dataType:"json",success:function(e){var o=e.data.dupes;o?(jQuery("#ddp_container #dashboard .statusdiv .statusmessage").html(e.data.msg).show(),jQuery("#ddp_container #dashboard .statusdiv .dupelist .duplicatetable").show(),jQuery.each(o,(function(e,t){jQuery("#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody").append('<tr><th scope="row" class="check-column"><label class="screen-reader-text" for="cb-select-'+t.ID+'">Select Post</label><input id="cb-select-'+t.ID+'" type="checkbox" name="delpost[]" value="'+t.ID+'" data-orgid="'+t.orgID+'"><div class="locked-indicator"></div></th><td><a href="'+t.permalink+'" target="_blank">'+t.title+"</a> (ID #"+t.ID+" type:"+t.type+" status:"+t.status+')</td><td><a href="'+t.orgpermalink+'" target="_blank">'+t.orgtitle+"</a> (ID #"+t.orgID+") "+t.why+"</td></tr>")})),jQuery("#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody").slideDown(),jQuery("#ddp_container #ddp_buttons input").each((function(){jQuery(this).prop("disabled",!1)}))):jQuery("#ddp_container #dashboard .statusdiv .statusmessage").html(e.data.msg).show(),jQuery("#ddp_container #dashboard .spinner").removeClass("is-active"),"-1"==e.data.nextstep||parseInt(e.data.nextstep)>0&&a(parseInt(e.data.nextstep),t,d)}}).fail((function(e){jQuery("#ddp_container #dashboard .spinner").removeClass("is-active"),window.console&&window.console.log&&window.console.log(e.statusCode+" "+e.statusText)}))}e.stepid=0,a(1,e),t(),jQuery(document).on("click","#deleteduplicateposts_deleteall",(function(d){d.preventDefault(),jQuery("#log .spinner").addClass("is-active");var o=[];if(jQuery(".duplicatetable input[name='delpost[]']:checked").each((function(){o.push({ID:jQuery(this).val(),orgID:jQuery(this).data("orgid")})})),void 0===o||0===o.length)return alert(cp_ddp.text_selectsomething),!1;confirm(cp_ddp.text_areyousure)&&(jQuery("#ddp_container .dupelist .duplicatetable tbody").empty(),jQuery.ajax({type:"POST",url:ajaxurl,data:{_ajax_nonce:cp_ddp.deletedupes_nonce,action:"ddp_delete_duplicates",checked_posts:o},dataType:"json",success:function(){a(1,e),t()}}).fail((function(d){jQuery("#log .spinner").removeClass("is-active"),window.console&&window.console.log&&window.console.log(d.statusCode+" "+d.statusText),a(1,e),t()})))})),jQuery(document).on("click","#deleteduplicateposts_resetview",(function(d){d.preventDefault(),jQuery("#ddp_container .dupelist .duplicatetable tbody").empty(),a(1,e),t()})),jQuery(document).on("click",".ddpcomparemethod li",(function(){jQuery(".ddpcomparemethod input:radio").each((function(){this.checked?jQuery(this).closest("li").find(".ddp-compare-details").show():jQuery(this).closest("li").find(".ddp-compare-details").hide()}))})),jQuery(".ddpcomparemethod li").trigger("click")}));
js/delete-duplicate-posts.js CHANGED
@@ -38,10 +38,15 @@ jQuery(document).ready(function () {
38
  e.preventDefault();
39
  jQuery('#log .spinner').addClass('is-active');
40
  var checked_posts_to_delete = [];
41
- jQuery(".duplicatetable input[name='delpost[]']:checked").each(function () {
42
- checked_posts_to_delete.push(parseInt(jQuery(this).val()));
 
 
 
 
43
  });
44
 
 
45
  if (checked_posts_to_delete === undefined || checked_posts_to_delete.length === 0) {
46
  alert(cp_ddp.text_selectsomething);
47
  return false;
@@ -167,7 +172,7 @@ jQuery(document).ready(function () {
167
  jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable').show();
168
 
169
  jQuery.each(dupes, function (key, value) {
170
- jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody').append('<tr><th scope="row" class="check-column"><label class="screen-reader-text" for="cb-select-' + value.ID + '">Select Post</label><input id="cb-select-' + value.ID + '" type="checkbox" name="delpost[]" value="' + value.ID + '"><div class="locked-indicator"></div></th><td><a href="' + value.permalink + '" target="_blank">' + value.title + '</a> (ID #' + value.ID + ' type:' + value.type + ' status:' + value.status + ')</td><td><a href="' + value.orgpermalink + '" target="_blank">' + value.orgtitle + '</a> (ID #' + value.orgID + ') ' + value.why + '</td></tr>');
171
 
172
  });
173
 
38
  e.preventDefault();
39
  jQuery('#log .spinner').addClass('is-active');
40
  var checked_posts_to_delete = [];
41
+
42
+ jQuery( ".duplicatetable input[name='delpost[]']:checked" ).each( function() {
43
+ checked_posts_to_delete.push( {
44
+ ID: jQuery( this ).val(),
45
+ orgID: jQuery( this ).data( 'orgid' )
46
+ });
47
  });
48
 
49
+
50
  if (checked_posts_to_delete === undefined || checked_posts_to_delete.length === 0) {
51
  alert(cp_ddp.text_selectsomething);
52
  return false;
172
  jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable').show();
173
 
174
  jQuery.each(dupes, function (key, value) {
175
+ jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody').append('<tr><th scope="row" class="check-column"><label class="screen-reader-text" for="cb-select-' + value.ID + '">Select Post</label><input id="cb-select-' + value.ID + '" type="checkbox" name="delpost[]" value="' + value.ID + '" data-orgid="' + value.orgID + '"><div class="locked-indicator"></div></th><td><a href="' + value.permalink + '" target="_blank">' + value.title + '</a> (ID #' + value.ID + ' type:' + value.type + ' status:' + value.status + ')</td><td><a href="' + value.orgpermalink + '" target="_blank">' + value.orgtitle + '</a> (ID #' + value.orgID + ') ' + value.why + '</td></tr>');
176
 
177
  });
178
 
languages/delete_duplicate_posts.pot CHANGED
@@ -2,7 +2,7 @@
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: Delete Duplicate Posts\n"
5
- "POT-Creation-Date: 2022-06-09 20:46-0400\n"
6
  "PO-Revision-Date: 2017-03-30 09:17-0400\n"
7
  "Last-Translator: Lars Koudal\n"
8
  "Language-Team: Lars Koudal\n"
@@ -10,7 +10,7 @@ msgstr ""
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
13
- "X-Generator: Poedit 3.1\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
  "X-Poedit-WPHeader: delete-duplicate-posts.php\n"
@@ -21,57 +21,62 @@ msgstr ""
21
  "X-Poedit-SearchPath-0: .\n"
22
  "X-Poedit-SearchPathExcluded-0: *.js\n"
23
 
24
- #: delete-duplicate-posts.php:175
 
 
 
 
 
25
  msgid "Nonce verification failed."
26
  msgstr ""
27
 
28
- #: delete-duplicate-posts.php:215
29
  msgid "Freemius opt choice selected."
30
  msgstr ""
31
 
32
- #: delete-duplicate-posts.php:222
33
  msgid "Freemius opt choice not found."
34
  msgstr ""
35
 
36
- #: delete-duplicate-posts.php:314
37
  msgid "Help Delete Duplicate Posts improve!"
38
  msgstr ""
39
 
40
- #: delete-duplicate-posts.php:317
41
  msgid ""
42
  "Gathering non-sensitive diagnostic data about the plugin install helps us "
43
  "improve the plugin."
44
  msgstr ""
45
 
46
- #: delete-duplicate-posts.php:317
47
  msgid "Read more about what we collect."
48
  msgstr ""
49
 
50
  #. translators:
51
- #: delete-duplicate-posts.php:323
52
  #, php-format
53
  msgid ""
54
  "If you opt-in, some data about your usage of %1$s will be sent to Freemius."
55
  "com. If you skip this, that's okay! %1$s will still work just fine."
56
  msgstr ""
57
 
58
- #: delete-duplicate-posts.php:328
59
  msgid "Sure, opt-in"
60
  msgstr ""
61
 
62
- #: delete-duplicate-posts.php:331
63
  msgid "No, thank you"
64
  msgstr ""
65
 
66
  #. translators: Total number of deleted duplicates
67
  #. translators: %s: Number of deleted posts
68
- #: delete-duplicate-posts.php:357 sidebar.php:39
69
  #, php-format
70
  msgid "%s duplicates deleted!"
71
  msgstr ""
72
 
73
  #. translators: Asking for a review text
74
- #: delete-duplicate-posts.php:363
75
  #, php-format
76
  msgid ""
77
  "Hey, I noticed this plugin has deleted %s duplicate posts for you - that's "
@@ -79,332 +84,351 @@ msgid ""
79
  "WordPress? Just to help us spread the word and boost our motivation."
80
  msgstr ""
81
 
82
- #: delete-duplicate-posts.php:397
83
  msgid "Cleaning duplicates"
84
  msgstr ""
85
 
86
- #: delete-duplicate-posts.php:463
87
  msgid "Error: Log is empty.. do something :-)"
88
  msgstr ""
89
 
90
- #: delete-duplicate-posts.php:696
91
  msgid "Error, choose which meta_key to look for duplicate values in."
92
  msgstr ""
93
 
94
- #: delete-duplicate-posts.php:809
95
  msgid "Error: Choose post types to check."
96
  msgstr ""
97
 
98
- #: delete-duplicate-posts.php:920
 
 
 
 
 
99
  msgid "Rendering Help Scouts beacon for easy help and support"
100
  msgstr ""
101
 
102
- #: delete-duplicate-posts.php:927
103
  msgid ""
104
  "Your email is added to cleverplugins.com newsletter. Unsubscribe any time."
105
  msgstr ""
106
 
107
- #: delete-duplicate-posts.php:1005
108
  msgid "Cron job running."
109
  msgstr ""
110
 
111
- #: delete-duplicate-posts.php:1007
112
  msgid "Manually cleaning."
113
  msgstr ""
114
 
115
- #: delete-duplicate-posts.php:1053
116
  #, php-format
117
  msgid "DEBUG: Deleted %1$s '%2$s' (id: %3$s) in %4$s sec."
118
  msgstr ""
119
 
120
  #. translators: How many posts were deleted and how long it took in seconds
121
- #: delete-duplicate-posts.php:1064
122
  #, php-format
123
  msgid "A total of %1$s duplicate posts were deleted in %2$s sec."
124
  msgstr ""
125
 
126
  #. translators:
127
- #: delete-duplicate-posts.php:1072 delete-duplicate-posts.php:1081
128
  #, php-format
129
  msgid "A total of %s duplicate posts were deleted."
130
  msgstr ""
131
 
132
  #. translators:
133
- #: delete-duplicate-posts.php:1099
134
  #, php-format
135
  msgid ""
136
  "Hi Admin, I have deleted <strong>%1$d</strong> posts on your blog, %2$s."
137
  msgstr ""
138
 
139
- #: delete-duplicate-posts.php:1101
140
  msgid ""
141
  "You are receiving this e-mail because you have turned on e-mail "
142
  "notifications by the plugin, Delete Duplicate Posts."
143
  msgstr ""
144
 
145
- #: delete-duplicate-posts.php:1108
146
  msgid "Deleted Duplicate Posts Status"
147
  msgstr ""
148
 
149
  #. translators:
150
- #: delete-duplicate-posts.php:1111
151
  #, php-format
152
  msgid "Status email sent to %s."
153
  msgstr ""
154
 
155
  #. translators:
156
- #: delete-duplicate-posts.php:1115
157
  #, php-format
158
  msgid "Not a vaild email %s."
159
  msgstr ""
160
 
161
- #: delete-duplicate-posts.php:1137
162
  msgid "Every 5 minutes"
163
  msgstr ""
164
 
165
- #: delete-duplicate-posts.php:1141
166
  msgid "Every 10 minutes"
167
  msgstr ""
168
 
169
- #: delete-duplicate-posts.php:1145
170
  msgid "Every 15 minutes"
171
  msgstr ""
172
 
173
- #: delete-duplicate-posts.php:1149
174
  msgid "Every 30 minutes"
175
  msgstr ""
176
 
177
- #: delete-duplicate-posts.php:1211
178
  msgid "Are you sure you want to delete duplicates? There is no undo feature."
179
  msgstr ""
180
 
181
- #: delete-duplicate-posts.php:1212
182
  msgid ""
183
  "You have to select which duplicates to delete. Tip: You can click the top or "
184
  "bottom checkbox to select all."
185
  msgstr ""
186
 
187
- #: delete-duplicate-posts.php:1239
188
  msgid "Plugin activated."
189
  msgstr ""
190
 
191
- #: delete-duplicate-posts.php:1355 delete-duplicate-posts.php:1612
192
  msgid "Settings"
193
  msgstr ""
194
 
195
- #: delete-duplicate-posts.php:1378
196
  msgid "Usage and FAQ"
197
  msgstr ""
198
 
199
- #: delete-duplicate-posts.php:1380
200
  msgid "What does this plugin do?"
201
  msgstr ""
202
 
203
- #: delete-duplicate-posts.php:1381
204
  msgid ""
205
  "Helps you clean duplicate posts from your blog. The plugin checks for "
206
  "blogposts on your blog with the same title."
207
  msgstr ""
208
 
209
- #: delete-duplicate-posts.php:1382
210
  msgid ""
211
  "It can run automatically via WordPress's own internal CRON-system, or you "
212
  "can run it automatically."
213
  msgstr ""
214
 
215
- #: delete-duplicate-posts.php:1383
216
  msgid ""
217
  "It also has a nice feature that can send you an e-mail when Delete Duplicate "
218
  "Posts finds and deletes something (if you have turned on the CRON feature)."
219
  msgstr ""
220
 
221
- #: delete-duplicate-posts.php:1384
222
  msgid "Help! Something was deleted that was not supposed to be deleted!"
223
  msgstr ""
224
 
225
- #: delete-duplicate-posts.php:1385
226
  msgid ""
227
  "I am sorry for that, I can only recommend you restore the database you took "
228
  "just before you ran this plugin."
229
  msgstr ""
230
 
231
- #: delete-duplicate-posts.php:1386
232
  msgid ""
233
  "If you run this plugin, manually or automatically, it is at your OWN risk!"
234
  msgstr ""
235
 
236
- #: delete-duplicate-posts.php:1387
237
  msgid ""
238
- "I have done my best to avoid deleting something that should not be deleted, "
239
- "but if it happens, there is nothing I can do to help you."
240
  msgstr ""
241
 
242
- #: delete-duplicate-posts.php:1417 delete-duplicate-posts.php:1507
243
- #: delete-duplicate-posts.php:1518
244
  msgid "Whoops! Some error occured, try again, please!"
245
  msgstr ""
246
 
247
- #: delete-duplicate-posts.php:1424
248
  msgid ""
249
  "Whoops! There was a problem with the data you posted. Please go back and try "
250
  "again."
251
  msgstr ""
252
 
253
- #: delete-duplicate-posts.php:1501
254
  msgid "Settings saved."
255
  msgstr ""
256
 
257
- #: delete-duplicate-posts.php:1511
258
  msgid "The log was cleared."
259
  msgstr ""
260
 
261
- #: delete-duplicate-posts.php:1577 delete-duplicate-posts.php:1588
262
  msgid "Duplicate"
263
  msgstr ""
264
 
265
- #: delete-duplicate-posts.php:1578 delete-duplicate-posts.php:1589
266
  msgid "Original"
267
  msgstr ""
268
 
269
- #: delete-duplicate-posts.php:1600
270
  msgid "Refresh list"
271
  msgstr ""
272
 
273
- #: delete-duplicate-posts.php:1603
274
  msgid "Delete duplicates"
275
  msgstr ""
276
 
277
- #: delete-duplicate-posts.php:1622
278
  msgid ""
279
  "You have enabled automatic deletion, so I am running on automatic. I will "
280
  "take care of everything..."
281
  msgstr ""
282
 
283
  #. translators: Showing when the next check happens and what the current time is
284
- #: delete-duplicate-posts.php:1628
285
  #, php-format
286
  msgid "Next automated check %1$s. Current time %2$s"
287
  msgstr ""
288
 
289
- #: delete-duplicate-posts.php:1647
290
  msgid "Which post types?:"
291
  msgstr ""
292
 
293
  #. translators: Total number of deleted duplicates
294
- #: delete-duplicate-posts.php:1692
295
  #, php-format
296
  msgid "(%s total found)"
297
  msgstr ""
298
 
299
- #: delete-duplicate-posts.php:1704
300
  msgid "Choose which post types to scan for duplicates."
301
  msgstr ""
302
 
303
- #: delete-duplicate-posts.php:1710
304
  msgid "Post status"
305
  msgstr ""
306
 
307
- #: delete-duplicate-posts.php:1786
308
  msgid "Comparison Method"
309
  msgstr ""
310
 
311
- #: delete-duplicate-posts.php:1794
312
  msgid "Compare by title (default)"
313
  msgstr ""
314
 
315
- #: delete-duplicate-posts.php:1796
316
  msgid "Looks at the title of the post itself."
317
  msgstr ""
318
 
319
- #: delete-duplicate-posts.php:1810
320
  msgid "Compare by meta tag"
321
  msgstr ""
322
 
323
- #: delete-duplicate-posts.php:1812
324
  msgid "Compare by any meta tag."
325
  msgstr ""
326
 
327
- #: delete-duplicate-posts.php:1857
328
  msgid "Delete which posts?:"
329
  msgstr ""
330
 
331
- #: delete-duplicate-posts.php:1865
332
  msgid "Keep oldest"
333
  msgstr ""
334
 
335
- #: delete-duplicate-posts.php:1870
336
  msgid "Keep latest"
337
  msgstr ""
338
 
339
- #: delete-duplicate-posts.php:1873
340
  msgid ""
341
  "Keep the oldest or the latest version of duplicates? Default is keeping the "
342
  "oldest, and deleting any subsequent duplicate posts"
343
  msgstr ""
344
 
345
- #: delete-duplicate-posts.php:1883
346
  msgid "Find how many duplicates:"
347
  msgstr ""
348
 
349
- #: delete-duplicate-posts.php:1890
350
  msgid "No limit"
351
  msgstr ""
352
 
353
- #: delete-duplicate-posts.php:1915
354
  msgid ""
355
  "If you have many duplicates, the plugin might time out before finding them "
356
  "all. Try limiting the amount of duplicates here. Default: Unlimited."
357
  msgstr ""
358
 
359
- #: delete-duplicate-posts.php:1956
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
  msgid "Enable automatic deletion?:"
361
  msgstr ""
362
 
363
- #: delete-duplicate-posts.php:1966
364
  msgid "Clean duplicates automatically."
365
  msgstr ""
366
 
367
- #: delete-duplicate-posts.php:1973
368
  msgid "How often?:"
369
  msgstr ""
370
 
371
- #: delete-duplicate-posts.php:1994
372
  msgid "How often should the cron job run?"
373
  msgstr ""
374
 
375
- #: delete-duplicate-posts.php:2007
376
  msgid "Send status mail?:"
377
  msgstr ""
378
 
379
- #: delete-duplicate-posts.php:2016
380
  msgid "Sends a status email if duplicates have been found."
381
  msgstr ""
382
 
383
- #: delete-duplicate-posts.php:2023
384
  msgid "Email recipient:"
385
  msgstr ""
386
 
387
- #: delete-duplicate-posts.php:2031
388
  msgid "Who should get the notification email."
389
  msgstr ""
390
 
391
- #: delete-duplicate-posts.php:2045
392
  msgid "Enable debug logging?:"
393
  msgstr ""
394
 
395
- #: delete-duplicate-posts.php:2054
396
  msgid "Should only be enabled if debugging a problem."
397
  msgstr ""
398
 
399
- #: delete-duplicate-posts.php:2060
400
  msgid "Save Settings"
401
  msgstr ""
402
 
403
- #: delete-duplicate-posts.php:2066
404
  msgid "The Log"
405
  msgstr ""
406
 
407
- #: delete-duplicate-posts.php:2075
408
  msgid "Reset log"
409
  msgstr ""
410
 
@@ -423,20 +447,18 @@ msgid "Click here to opt in."
423
  msgstr ""
424
 
425
  #: sidebar.php:51
426
- msgid ""
427
- "We recommend you always make a backup before running this tool. Changes are "
428
- "permanent!"
429
  msgstr ""
430
 
431
- #: sidebar.php:103
432
  msgid "Our other plugins"
433
  msgstr ""
434
 
435
- #: sidebar.php:126
436
  msgid "Support Forum on WordPress.org"
437
  msgstr ""
438
 
439
- #: sidebar.php:130
440
  msgid "Recreate Databases"
441
  msgstr ""
442
 
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: Delete Duplicate Posts\n"
5
+ "POT-Creation-Date: 2022-07-17 17:56+0200\n"
6
  "PO-Revision-Date: 2017-03-30 09:17-0400\n"
7
  "Last-Translator: Lars Koudal\n"
8
  "Language-Team: Lars Koudal\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
13
+ "X-Generator: Poedit 3.1.1\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
  "X-Poedit-WPHeader: delete-duplicate-posts.php\n"
21
  "X-Poedit-SearchPath-0: .\n"
22
  "X-Poedit-SearchPathExcluded-0: *.js\n"
23
 
24
+ #: delete-duplicate-posts.php:203
25
+ #, php-format
26
+ msgid "DEBUG: Redirected from %1$s to %2$s "
27
+ msgstr ""
28
+
29
+ #: delete-duplicate-posts.php:231
30
  msgid "Nonce verification failed."
31
  msgstr ""
32
 
33
+ #: delete-duplicate-posts.php:271
34
  msgid "Freemius opt choice selected."
35
  msgstr ""
36
 
37
+ #: delete-duplicate-posts.php:278
38
  msgid "Freemius opt choice not found."
39
  msgstr ""
40
 
41
+ #: delete-duplicate-posts.php:370
42
  msgid "Help Delete Duplicate Posts improve!"
43
  msgstr ""
44
 
45
+ #: delete-duplicate-posts.php:373
46
  msgid ""
47
  "Gathering non-sensitive diagnostic data about the plugin install helps us "
48
  "improve the plugin."
49
  msgstr ""
50
 
51
+ #: delete-duplicate-posts.php:373
52
  msgid "Read more about what we collect."
53
  msgstr ""
54
 
55
  #. translators:
56
+ #: delete-duplicate-posts.php:379
57
  #, php-format
58
  msgid ""
59
  "If you opt-in, some data about your usage of %1$s will be sent to Freemius."
60
  "com. If you skip this, that's okay! %1$s will still work just fine."
61
  msgstr ""
62
 
63
+ #: delete-duplicate-posts.php:384
64
  msgid "Sure, opt-in"
65
  msgstr ""
66
 
67
+ #: delete-duplicate-posts.php:387
68
  msgid "No, thank you"
69
  msgstr ""
70
 
71
  #. translators: Total number of deleted duplicates
72
  #. translators: %s: Number of deleted posts
73
+ #: delete-duplicate-posts.php:413 sidebar.php:39
74
  #, php-format
75
  msgid "%s duplicates deleted!"
76
  msgstr ""
77
 
78
  #. translators: Asking for a review text
79
+ #: delete-duplicate-posts.php:419
80
  #, php-format
81
  msgid ""
82
  "Hey, I noticed this plugin has deleted %s duplicate posts for you - that's "
84
  "WordPress? Just to help us spread the word and boost our motivation."
85
  msgstr ""
86
 
87
+ #: delete-duplicate-posts.php:453
88
  msgid "Cleaning duplicates"
89
  msgstr ""
90
 
91
+ #: delete-duplicate-posts.php:525
92
  msgid "Error: Log is empty.. do something :-)"
93
  msgstr ""
94
 
95
+ #: delete-duplicate-posts.php:754
96
  msgid "Error, choose which meta_key to look for duplicate values in."
97
  msgstr ""
98
 
99
+ #: delete-duplicate-posts.php:899
100
  msgid "Error: Choose post types to check."
101
  msgstr ""
102
 
103
+ #: delete-duplicate-posts.php:962
104
+ #, php-format
105
+ msgid "Created %1$s redirect from %2$s to %3$s"
106
+ msgstr ""
107
+
108
+ #: delete-duplicate-posts.php:1032
109
  msgid "Rendering Help Scouts beacon for easy help and support"
110
  msgstr ""
111
 
112
+ #: delete-duplicate-posts.php:1039
113
  msgid ""
114
  "Your email is added to cleverplugins.com newsletter. Unsubscribe any time."
115
  msgstr ""
116
 
117
+ #: delete-duplicate-posts.php:1119
118
  msgid "Cron job running."
119
  msgstr ""
120
 
121
+ #: delete-duplicate-posts.php:1121
122
  msgid "Manually cleaning."
123
  msgstr ""
124
 
125
+ #: delete-duplicate-posts.php:1197
126
  #, php-format
127
  msgid "DEBUG: Deleted %1$s '%2$s' (id: %3$s) in %4$s sec."
128
  msgstr ""
129
 
130
  #. translators: How many posts were deleted and how long it took in seconds
131
+ #: delete-duplicate-posts.php:1208
132
  #, php-format
133
  msgid "A total of %1$s duplicate posts were deleted in %2$s sec."
134
  msgstr ""
135
 
136
  #. translators:
137
+ #: delete-duplicate-posts.php:1216 delete-duplicate-posts.php:1225
138
  #, php-format
139
  msgid "A total of %s duplicate posts were deleted."
140
  msgstr ""
141
 
142
  #. translators:
143
+ #: delete-duplicate-posts.php:1243
144
  #, php-format
145
  msgid ""
146
  "Hi Admin, I have deleted <strong>%1$d</strong> posts on your blog, %2$s."
147
  msgstr ""
148
 
149
+ #: delete-duplicate-posts.php:1245
150
  msgid ""
151
  "You are receiving this e-mail because you have turned on e-mail "
152
  "notifications by the plugin, Delete Duplicate Posts."
153
  msgstr ""
154
 
155
+ #: delete-duplicate-posts.php:1252
156
  msgid "Deleted Duplicate Posts Status"
157
  msgstr ""
158
 
159
  #. translators:
160
+ #: delete-duplicate-posts.php:1255
161
  #, php-format
162
  msgid "Status email sent to %s."
163
  msgstr ""
164
 
165
  #. translators:
166
+ #: delete-duplicate-posts.php:1259
167
  #, php-format
168
  msgid "Not a vaild email %s."
169
  msgstr ""
170
 
171
+ #: delete-duplicate-posts.php:1281
172
  msgid "Every 5 minutes"
173
  msgstr ""
174
 
175
+ #: delete-duplicate-posts.php:1285
176
  msgid "Every 10 minutes"
177
  msgstr ""
178
 
179
+ #: delete-duplicate-posts.php:1289
180
  msgid "Every 15 minutes"
181
  msgstr ""
182
 
183
+ #: delete-duplicate-posts.php:1293
184
  msgid "Every 30 minutes"
185
  msgstr ""
186
 
187
+ #: delete-duplicate-posts.php:1355
188
  msgid "Are you sure you want to delete duplicates? There is no undo feature."
189
  msgstr ""
190
 
191
+ #: delete-duplicate-posts.php:1356
192
  msgid ""
193
  "You have to select which duplicates to delete. Tip: You can click the top or "
194
  "bottom checkbox to select all."
195
  msgstr ""
196
 
197
+ #: delete-duplicate-posts.php:1386
198
  msgid "Plugin activated."
199
  msgstr ""
200
 
201
+ #: delete-duplicate-posts.php:1510 delete-duplicate-posts.php:1778
202
  msgid "Settings"
203
  msgstr ""
204
 
205
+ #: delete-duplicate-posts.php:1533
206
  msgid "Usage and FAQ"
207
  msgstr ""
208
 
209
+ #: delete-duplicate-posts.php:1535
210
  msgid "What does this plugin do?"
211
  msgstr ""
212
 
213
+ #: delete-duplicate-posts.php:1536
214
  msgid ""
215
  "Helps you clean duplicate posts from your blog. The plugin checks for "
216
  "blogposts on your blog with the same title."
217
  msgstr ""
218
 
219
+ #: delete-duplicate-posts.php:1537
220
  msgid ""
221
  "It can run automatically via WordPress's own internal CRON-system, or you "
222
  "can run it automatically."
223
  msgstr ""
224
 
225
+ #: delete-duplicate-posts.php:1538
226
  msgid ""
227
  "It also has a nice feature that can send you an e-mail when Delete Duplicate "
228
  "Posts finds and deletes something (if you have turned on the CRON feature)."
229
  msgstr ""
230
 
231
+ #: delete-duplicate-posts.php:1539
232
  msgid "Help! Something was deleted that was not supposed to be deleted!"
233
  msgstr ""
234
 
235
+ #: delete-duplicate-posts.php:1540
236
  msgid ""
237
  "I am sorry for that, I can only recommend you restore the database you took "
238
  "just before you ran this plugin."
239
  msgstr ""
240
 
241
+ #: delete-duplicate-posts.php:1541
242
  msgid ""
243
  "If you run this plugin, manually or automatically, it is at your OWN risk!"
244
  msgstr ""
245
 
246
+ #: delete-duplicate-posts.php:1542
247
  msgid ""
248
+ "We have done our best to avoid deleting something that should not be "
249
+ "deleted, but if it happens, there is nothing we can do to help you."
250
  msgstr ""
251
 
252
+ #: delete-duplicate-posts.php:1572 delete-duplicate-posts.php:1673
253
+ #: delete-duplicate-posts.php:1684
254
  msgid "Whoops! Some error occured, try again, please!"
255
  msgstr ""
256
 
257
+ #: delete-duplicate-posts.php:1579
258
  msgid ""
259
  "Whoops! There was a problem with the data you posted. Please go back and try "
260
  "again."
261
  msgstr ""
262
 
263
+ #: delete-duplicate-posts.php:1667
264
  msgid "Settings saved."
265
  msgstr ""
266
 
267
+ #: delete-duplicate-posts.php:1677
268
  msgid "The log was cleared."
269
  msgstr ""
270
 
271
+ #: delete-duplicate-posts.php:1743 delete-duplicate-posts.php:1754
272
  msgid "Duplicate"
273
  msgstr ""
274
 
275
+ #: delete-duplicate-posts.php:1744 delete-duplicate-posts.php:1755
276
  msgid "Original"
277
  msgstr ""
278
 
279
+ #: delete-duplicate-posts.php:1766
280
  msgid "Refresh list"
281
  msgstr ""
282
 
283
+ #: delete-duplicate-posts.php:1769
284
  msgid "Delete duplicates"
285
  msgstr ""
286
 
287
+ #: delete-duplicate-posts.php:1788
288
  msgid ""
289
  "You have enabled automatic deletion, so I am running on automatic. I will "
290
  "take care of everything..."
291
  msgstr ""
292
 
293
  #. translators: Showing when the next check happens and what the current time is
294
+ #: delete-duplicate-posts.php:1794
295
  #, php-format
296
  msgid "Next automated check %1$s. Current time %2$s"
297
  msgstr ""
298
 
299
+ #: delete-duplicate-posts.php:1813
300
  msgid "Which post types?:"
301
  msgstr ""
302
 
303
  #. translators: Total number of deleted duplicates
304
+ #: delete-duplicate-posts.php:1858
305
  #, php-format
306
  msgid "(%s total found)"
307
  msgstr ""
308
 
309
+ #: delete-duplicate-posts.php:1870
310
  msgid "Choose which post types to scan for duplicates."
311
  msgstr ""
312
 
313
+ #: delete-duplicate-posts.php:1876
314
  msgid "Post status"
315
  msgstr ""
316
 
317
+ #: delete-duplicate-posts.php:1952
318
  msgid "Comparison Method"
319
  msgstr ""
320
 
321
+ #: delete-duplicate-posts.php:1960
322
  msgid "Compare by title (default)"
323
  msgstr ""
324
 
325
+ #: delete-duplicate-posts.php:1962
326
  msgid "Looks at the title of the post itself."
327
  msgstr ""
328
 
329
+ #: delete-duplicate-posts.php:1976
330
  msgid "Compare by meta tag"
331
  msgstr ""
332
 
333
+ #: delete-duplicate-posts.php:1978
334
  msgid "Compare by any meta tag."
335
  msgstr ""
336
 
337
+ #: delete-duplicate-posts.php:2023
338
  msgid "Delete which posts?:"
339
  msgstr ""
340
 
341
+ #: delete-duplicate-posts.php:2031
342
  msgid "Keep oldest"
343
  msgstr ""
344
 
345
+ #: delete-duplicate-posts.php:2036
346
  msgid "Keep latest"
347
  msgstr ""
348
 
349
+ #: delete-duplicate-posts.php:2039
350
  msgid ""
351
  "Keep the oldest or the latest version of duplicates? Default is keeping the "
352
  "oldest, and deleting any subsequent duplicate posts"
353
  msgstr ""
354
 
355
+ #: delete-duplicate-posts.php:2049
356
  msgid "Find how many duplicates:"
357
  msgstr ""
358
 
359
+ #: delete-duplicate-posts.php:2056
360
  msgid "No limit"
361
  msgstr ""
362
 
363
+ #: delete-duplicate-posts.php:2081
364
  msgid ""
365
  "If you have many duplicates, the plugin might time out before finding them "
366
  "all. Try limiting the amount of duplicates here. Default: Unlimited."
367
  msgstr ""
368
 
369
+ #: delete-duplicate-posts.php:2094
370
+ msgid "Enable 301 redirects?:"
371
+ msgstr ""
372
+
373
+ #: delete-duplicate-posts.php:2104
374
+ msgid "Automatically 301 redirects deleted posts to the original."
375
+ msgstr ""
376
+
377
+ #. translators: %s: Number of redirects registered
378
+ #: delete-duplicate-posts.php:2112
379
+ #, php-format
380
+ msgid "%s redirects saved."
381
+ msgstr ""
382
+
383
+ #: delete-duplicate-posts.php:2133
384
  msgid "Enable automatic deletion?:"
385
  msgstr ""
386
 
387
+ #: delete-duplicate-posts.php:2143
388
  msgid "Clean duplicates automatically."
389
  msgstr ""
390
 
391
+ #: delete-duplicate-posts.php:2150
392
  msgid "How often?:"
393
  msgstr ""
394
 
395
+ #: delete-duplicate-posts.php:2171
396
  msgid "How often should the cron job run?"
397
  msgstr ""
398
 
399
+ #: delete-duplicate-posts.php:2188
400
  msgid "Send status mail?:"
401
  msgstr ""
402
 
403
+ #: delete-duplicate-posts.php:2197
404
  msgid "Sends a status email if duplicates have been found."
405
  msgstr ""
406
 
407
+ #: delete-duplicate-posts.php:2204
408
  msgid "Email recipient:"
409
  msgstr ""
410
 
411
+ #: delete-duplicate-posts.php:2212
412
  msgid "Who should get the notification email."
413
  msgstr ""
414
 
415
+ #: delete-duplicate-posts.php:2226
416
  msgid "Enable debug logging?:"
417
  msgstr ""
418
 
419
+ #: delete-duplicate-posts.php:2235
420
  msgid "Should only be enabled if debugging a problem."
421
  msgstr ""
422
 
423
+ #: delete-duplicate-posts.php:2241
424
  msgid "Save Settings"
425
  msgstr ""
426
 
427
+ #: delete-duplicate-posts.php:2247
428
  msgid "The Log"
429
  msgstr ""
430
 
431
+ #: delete-duplicate-posts.php:2256
432
  msgid "Reset log"
433
  msgstr ""
434
 
447
  msgstr ""
448
 
449
  #: sidebar.php:51
450
+ msgid "We recommend you always make a backup before running this tool."
 
 
451
  msgstr ""
452
 
453
+ #: sidebar.php:104
454
  msgid "Our other plugins"
455
  msgstr ""
456
 
457
+ #: sidebar.php:125
458
  msgid "Support Forum on WordPress.org"
459
  msgstr ""
460
 
461
+ #: sidebar.php:129
462
  msgid "Recreate Databases"
463
  msgstr ""
464
 
readme.txt CHANGED
@@ -5,8 +5,8 @@ Tags: delete duplicate posts, delete, duplicate
5
  License: GPLv2 or later
6
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
7
  Requires at least: 4.7
8
- Tested up to: 6.0
9
- Stable tag: 4.7.9
10
  Requires PHP: 5.6
11
 
12
  Get rid of duplicate posts and pages on your blog!
@@ -54,6 +54,11 @@ You should restore the backup you took of your website before you ran this tool.
54
 
55
  == Changelog ==
56
 
 
 
 
 
 
57
  = 4.7.9 =
58
  * FIX: Plugin would not show results if the limit was set to "No limit".
59
 
5
  License: GPLv2 or later
6
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
7
  Requires at least: 4.7
8
+ Tested up to: 6.0.1
9
+ Stable tag: 4.8
10
  Requires PHP: 5.6
11
 
12
  Get rid of duplicate posts and pages on your blog!
54
 
55
  == Changelog ==
56
 
57
+ = 4.8 =
58
+ * Code improvements so the plugin runs faster overall.
59
+ * Updated language files.
60
+ * NEW: (Pro only) - Feature: 301 redirects deleted duplicates.
61
+
62
  = 4.7.9 =
63
  * FIX: Plugin would not show results if the limit was set to "No limit".
64
 
sidebar.php CHANGED
@@ -57,7 +57,7 @@ if ( $ddp_deleted_duplicates ) {
57
  <div class="sidebarrow">
58
  <p class="warning">
59
  <?php
60
- esc_html_e( 'We recommend you always make a backup before running this tool. Changes are permanent!', 'delete-duplicate-posts' );
61
  ?>
62
  </p>
63
  </div>
@@ -72,6 +72,7 @@ if ( $display_promotion ) {
72
  <h3><span class="dashicons dashicons-star-filled"></span> DDP Pro <span
73
  class="dashicons dashicons-star-filled"></span></h3>
74
  <ul class="linklist">
 
75
  <li><strong>New compare method</strong> - Compare by meta tag <span>Use with WooCommerce (compare SKU) or other plugins</span></li>
76
  <li><strong>Choose post status</strong> - Look for duplicates in scheduled posts, drafts or any other available post status on your site.</li>
77
  <li><strong>Premium Support</strong> - Get help from the developers behind the plugin.</li>
@@ -113,10 +114,8 @@ echo esc_url( plugin_dir_url( __FILE__ ) . 'images/security-ninja-logo.png' ) ;
113
  ?>"
114
  alt="Visit wpsecurityninja.com" class="logo"></a>
115
 
116
-
117
- <p>WordPress Security made easy</p>
118
- <p>Protect your website from hackers</p>
119
- <p>Complete WordPress site protection with firewall, malware scanner, scheduled scans, security tests and much more - all you need to keep your website secure.</p>
120
 
121
  <p>Read more on <a href="https://wpsecurityninja.com/" target="_blank" rel="noopener">wpsecurityninja.com</a></p>
122
  <br />
57
  <div class="sidebarrow">
58
  <p class="warning">
59
  <?php
60
+ esc_html_e( 'We recommend you always make a backup before running this tool.', 'delete-duplicate-posts' );
61
  ?>
62
  </p>
63
  </div>
72
  <h3><span class="dashicons dashicons-star-filled"></span> DDP Pro <span
73
  class="dashicons dashicons-star-filled"></span></h3>
74
  <ul class="linklist">
75
+ <li><strong>301 Redirects</strong> - Automatically redirect deleted duplicates.</li>
76
  <li><strong>New compare method</strong> - Compare by meta tag <span>Use with WooCommerce (compare SKU) or other plugins</span></li>
77
  <li><strong>Choose post status</strong> - Look for duplicates in scheduled posts, drafts or any other available post status on your site.</li>
78
  <li><strong>Premium Support</strong> - Get help from the developers behind the plugin.</li>
114
  ?>"
115
  alt="Visit wpsecurityninja.com" class="logo"></a>
116
 
117
+ <strong>WordPress Security made easy</strong>
118
+ <p>Complete WordPress site protection with firewall, malware scanner, scheduled scans, security tests and much more - all you need to keep your website secure. Free trial.</p>
 
 
119
 
120
  <p>Read more on <a href="https://wpsecurityninja.com/" target="_blank" rel="noopener">wpsecurityninja.com</a></p>
121
  <br />