Broken Link Checker - Version 1.11.13

Version Description

  • Added filter for disabling email notifications.
  • Added filter to use GET requests.
  • Added option to disable last updated time on post types.
  • Added option to check post excerpts.
  • Added a confirmation box when unlinking.
  • Added basic multisite support.
  • Added proper error messages on YouTube video errors.
  • Fixed bulk recheck option.
  • Fixed minor database errors.
  • Improved performance.
  • Removed default YouTube API key.
  • Removed usage of depricated WP Snoopy.
Download this release

Release Info

Developer bplv
Plugin Icon 128x128 Broken Link Checker
Version 1.11.13
Comparing to
See all releases

Code changes from version 1.11.12 to 1.11.13

broken-link-checker.php CHANGED
@@ -1,16 +1,22 @@
1
  <?php
2
-
3
  /**
 
 
 
 
 
 
 
4
  * Plugin Name: Broken Link Checker
5
  * Plugin URI: https://wordpress.org/plugins/broken-link-checker/
6
  * Description: Checks your blog for broken links and missing images and notifies you on the dashboard if any are found.
7
- * Version: 1.11.12
8
  * Author: WPMU DEV
9
  * Author URI: https://premium.wpmudev.org/
10
  * Text Domain: broken-link-checker
11
  * License: GPLv2 or later
12
  * License URI: https://www.gnu.org/licenses/gpl-2.0.html
13
- */
14
 
15
  /*
16
  Broken Link Checker is free software: you can redistribute it and/or modify
@@ -27,15 +33,15 @@ You should have received a copy of the GNU General Public License
27
  along with Broken Link Checker. If not, see https://www.gnu.org/licenses/gpl-2.0.html.
28
  */
29
 
30
- //Path to this file
31
  if ( ! defined( 'BLC_PLUGIN_FILE' ) ) {
32
  define( 'BLC_PLUGIN_FILE', __FILE__ );
33
  }
34
 
35
- //Path to the plugin's directory
36
  if ( ! defined( 'BLC_DIRECTORY' ) ) {
37
  define( 'BLC_DIRECTORY', dirname( __FILE__ ) );
38
  }
39
 
40
- //Load the actual plugin
41
  require 'core/init.php';
1
  <?php
 
2
  /**
3
+ * Broken Link Checker
4
+ *
5
+ * @link https://wordpress.org/plugins/broken-link-checker/
6
+ * @since 1.0.0
7
+ * @package broken-link-checker
8
+ *
9
+ * @wordpress-plugin
10
  * Plugin Name: Broken Link Checker
11
  * Plugin URI: https://wordpress.org/plugins/broken-link-checker/
12
  * Description: Checks your blog for broken links and missing images and notifies you on the dashboard if any are found.
13
+ * Version: 1.11.13
14
  * Author: WPMU DEV
15
  * Author URI: https://premium.wpmudev.org/
16
  * Text Domain: broken-link-checker
17
  * License: GPLv2 or later
18
  * License URI: https://www.gnu.org/licenses/gpl-2.0.html
19
+ */
20
 
21
  /*
22
  Broken Link Checker is free software: you can redistribute it and/or modify
33
  along with Broken Link Checker. If not, see https://www.gnu.org/licenses/gpl-2.0.html.
34
  */
35
 
36
+ // Path to this file.
37
  if ( ! defined( 'BLC_PLUGIN_FILE' ) ) {
38
  define( 'BLC_PLUGIN_FILE', __FILE__ );
39
  }
40
 
41
+ // Path to the plugin's directory.
42
  if ( ! defined( 'BLC_DIRECTORY' ) ) {
43
  define( 'BLC_DIRECTORY', dirname( __FILE__ ) );
44
  }
45
 
46
+ // Load the actual plugin.
47
  require 'core/init.php';
core/core.php CHANGED
@@ -1,9 +1,18 @@
1
  <?php
2
-
3
  /**
4
  * Simple function to replicate PHP 5 behaviour
 
 
 
 
5
  */
 
6
  if ( ! function_exists( 'microtime_float' ) ) {
 
 
 
 
 
7
  function microtime_float() {
8
  list( $usec, $sec ) = explode( ' ', microtime() );
9
  return ( (float) $usec + (float) $sec );
@@ -16,23 +25,63 @@ require BLC_DIRECTORY . '/includes/wp-mutex.php';
16
  require BLC_DIRECTORY . '/includes/transactions-manager.php';
17
 
18
  if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
 
 
 
 
19
  class wsBrokenLinkChecker {
20
 
21
- var $conf;
22
- var $loader;
23
- var $my_basename = '';
24
- var $db_version; //The required version of the plugin's DB schema.
25
- var $execution_start_time;
26
- var $is_textdomain_loaded = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
  /**
29
  * Class constructor
30
  *
31
- * @param string $loader The fully qualified filename of the loader script that WP identifies as the "main" plugin file.
32
- * @param blcConfigurationManager $conf An instance of the configuration manager
33
- * @return void
 
34
  */
35
- function __construct( $loader, $conf ) {
36
  $this->db_version = BLC_DATABASE_VERSION;
37
 
38
  $this->conf = $conf;
@@ -41,20 +90,21 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
41
 
42
  $this->load_language();
43
 
44
- //Unlike the activation hook, the deactivation callback *can* be registered in this file
45
- //because deactivation happens after this class has already been instantiated (durinng the
46
- //'init' action).
 
47
  register_deactivation_hook( $loader, array( $this, 'deactivation' ) );
48
 
49
  add_action( 'admin_menu', array( $this, 'admin_menu' ) );
50
 
51
- //Load jQuery on Dashboard pages (probably redundant as WP already does that)
52
- add_action( 'admin_print_scripts', array( $this, 'admin_print_scripts' ) );
53
 
54
- //The dashboard widget
55
  add_action( 'wp_dashboard_setup', array( $this, 'hook_wp_dashboard_setup' ) );
56
 
57
- //AJAXy hooks
58
  add_action( 'wp_ajax_blc_full_status', array( $this, 'ajax_full_status' ) );
59
  add_action( 'wp_ajax_blc_dashboard_status', array( $this, 'ajax_dashboard_status' ) );
60
  add_action( 'wp_ajax_blc_work', array( $this, 'ajax_work' ) );
@@ -69,17 +119,18 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
69
  add_action( 'wp_ajax_blc_dismiss', array( $this, 'ajax_dismiss' ) );
70
  add_action( 'wp_ajax_blc_undismiss', array( $this, 'ajax_undismiss' ) );
71
 
72
- //Add/remove Cron events
73
  $this->setup_cron_events();
74
 
75
- //Set hooks that listen for our Cron actions
76
  add_action( 'blc_cron_email_notifications', array( $this, 'maybe_send_email_notifications' ) );
77
  add_action( 'blc_cron_check_links', array( $this, 'cron_check_links' ) );
78
  add_action( 'blc_cron_database_maintenance', array( $this, 'database_maintenance' ) );
 
79
 
80
- //Set the footer hook that will call the worker function via AJAX.
81
  add_action( 'admin_footer', array( $this, 'admin_footer' ) );
82
- //Add a "Screen Options" panel to the "Broken Links" page
83
  add_screen_options_panel(
84
  'blc-screen-options',
85
  '',
@@ -89,9 +140,12 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
89
  true
90
  );
91
 
92
- //Display an explanatory note on the "Tools -> Broken Links -> Warnings" page.
93
  add_action( 'admin_notices', array( $this, 'show_warnings_section_notice' ) );
94
 
 
 
 
95
  }
96
 
97
  /**
@@ -99,7 +153,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
99
  *
100
  * @return void
101
  */
102
- function admin_footer() {
103
  if ( ! $this->conf->options['run_in_dashboard'] ) {
104
  return;
105
  }
@@ -112,7 +166,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
112
  //(Re)starts the background worker thread
113
  function blcDoWork(){
114
  $.post(
115
- "<?php echo admin_url( 'admin-ajax.php' ); ?>",
116
  {
117
  'action' : 'blc_work',
118
  '_ajax_nonce' : '<?php echo esc_js( $nonce ); ?>'
@@ -134,10 +188,10 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
134
  /**
135
  * Check if an URL matches the exclusion list.
136
  *
137
- * @param string $url
138
  * @return bool
139
  */
140
- function is_excluded( $url ) {
141
  if ( ! is_array( $this->conf->options['exclusion_list'] ) ) {
142
  return false;
143
  }
@@ -149,16 +203,19 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
149
  return false;
150
  }
151
 
152
- function dashboard_widget() {
 
 
 
153
  ?>
154
- <p id='wsblc_activity_box'><?php _e( 'Loading...', 'broken-link-checker' ); ?></p>
155
  <script type='text/javascript'>
156
  jQuery( function($){
157
  var blc_was_autoexpanded = false;
158
 
159
  function blcDashboardStatus(){
160
  $.getJSON(
161
- "<?php echo admin_url( 'admin-ajax.php' ); ?>",
162
  {
163
  'action' : 'blc_dashboard_status',
164
  'random' : Math.random()
@@ -175,7 +232,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
175
  }
176
  <?php } ?>
177
  } else {
178
- $('#wsblc_activity_box').html('<?php _e( '[ Network error ]', 'broken-link-checker' ); ?>');
179
  }
180
 
181
  setTimeout( blcDashboardStatus, 120*1000 ); //...update every two minutes
@@ -190,14 +247,25 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
190
  <?php
191
  }
192
 
193
- function dashboard_widget_control(
194
- /** @noinspection PhpUnusedParameterInspection */ $widget_id, $form_inputs = array()
195
- ) {
196
- if ( 'POST' == $_SERVER['REQUEST_METHOD'] && 'blc_dashboard_widget' == $_POST['widget_id'] ) {
197
- //It appears $form_inputs isn't used in the current WP version, so lets just use $_POST
198
- $this->conf->options['autoexpand_widget'] = ! empty( $_POST['blc-autoexpand'] );
199
- $this->conf->save_options();
200
- }
 
 
 
 
 
 
 
 
 
 
 
201
 
202
  ?>
203
  <p><label for="blc-autoexpand">
@@ -206,30 +274,33 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
206
  if ( $this->conf->options['autoexpand_widget'] ) {
207
  echo 'checked="checked"';}
208
  ?>
209
- />
210
- <?php _e( 'Automatically expand the widget if broken links have been detected', 'broken-link-checker' ); ?>
211
  </label></p>
212
  <?php
213
- }
214
 
215
- function admin_print_scripts() {
216
- //jQuery is used for triggering the link monitor via AJAX when any admin page is open.
217
- wp_enqueue_script( 'jquery' );
218
  }
219
 
220
- function enqueue_settings_scripts() {
221
- //jQuery UI is used on the settings page
222
- wp_enqueue_script( 'jquery-ui-core' ); //Used for background color animation
 
 
 
223
  wp_enqueue_script( 'jquery-ui-dialog' );
224
  wp_enqueue_script( 'jquery-ui-tabs' );
225
- wp_enqueue_script( 'jquery-cookie', plugins_url( 'js/jquery.cookie.js', BLC_PLUGIN_FILE ) ); //Used for storing last widget states, etc
226
  }
227
 
228
- function enqueue_link_page_scripts() {
 
 
 
229
  wp_enqueue_script( 'jquery-ui-core' );
230
- wp_enqueue_script( 'jquery-ui-dialog' ); //Used for the search form
231
- wp_enqueue_script( 'jquery-color' ); //Used for background color animation
232
- wp_enqueue_script( 'sprintf', plugins_url( 'js/sprintf.js', BLC_PLUGIN_FILE ) ); //Used in error messages
233
  }
234
 
235
  /**
@@ -237,16 +308,16 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
237
  *
238
  * @return void
239
  */
240
- function initiate_recheck() {
241
- global $wpdb; /** @var wpdb $wpdb */
242
 
243
- //Delete all discovered instances
244
- $wpdb->query( "TRUNCATE {$wpdb->prefix}blc_instances" );
245
 
246
- //Delete all discovered links
247
- $wpdb->query( "TRUNCATE {$wpdb->prefix}blc_links" );
248
 
249
- //Mark all posts, custom fields and bookmarks for processing.
250
  blc_resynch( true );
251
  }
252
 
@@ -255,14 +326,15 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
255
  *
256
  * @return void
257
  */
258
- function deactivation() {
259
- //Remove our Cron events
260
  wp_clear_scheduled_hook( 'blc_cron_check_links' );
261
  wp_clear_scheduled_hook( 'blc_cron_email_notifications' );
262
  wp_clear_scheduled_hook( 'blc_cron_database_maintenance' );
263
- wp_clear_scheduled_hook( 'blc_cron_check_news' ); //Unused event.
264
- //Note the deactivation time for each module. This will help them
265
- //synch up propely if/when the plugin is reactivated.
 
266
  $moduleManager = blcModuleManager::getInstance();
267
  $the_time = current_time( 'timestamp' );
268
  foreach ( $moduleManager->get_active_modules() as $module_id => $module ) {
@@ -279,7 +351,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
279
  *
280
  * @return void
281
  */
282
- function database_maintenance() {
283
  blcContainerHelper::cleanup_containers();
284
  blc_cleanup_instances();
285
  blc_cleanup_links();
@@ -293,7 +365,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
293
  *
294
  * @return void
295
  */
296
- function admin_menu() {
297
  if ( current_user_can( 'manage_options' ) ) {
298
  add_filter( 'plugin_action_links', array( $this, 'plugin_action_links' ), 10, 2 );
299
  }
@@ -308,13 +380,13 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
308
 
309
  $menu_title = __( 'Broken Links', 'broken-link-checker' );
310
  if ( $this->conf->options['show_link_count_bubble'] ) {
311
- //To make it easier to notice when broken links appear, display the current number of
312
- //broken links in a little bubble notification in the "Broken Links" menu.
313
- //(Similar to how the number of plugin updates and unmoderated comments is displayed).
314
  $blc_link_query = blcLinkQuery::getInstance();
315
  $broken_links = $blc_link_query->get_filter_links( 'broken', array( 'count_only' => true ) );
316
  if ( $broken_links > 0 ) {
317
- //TODO: Appropriating existing CSS classes for my own purposes is hacky. Fix eventually.
318
  $menu_title .= sprintf(
319
  ' <span class="update-plugins"><span class="update-count blc-menu-bubble">%d</span></span>',
320
  $broken_links
@@ -329,13 +401,13 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
329
  array( $this, 'links_page' )
330
  );
331
 
332
- //Add plugin-specific scripts and CSS only to the it's own pages
333
  add_action( 'admin_print_styles-' . $options_page_hook, array( $this, 'options_page_css' ) );
334
  add_action( 'admin_print_styles-' . $links_page_hook, array( $this, 'links_page_css' ) );
335
  add_action( 'admin_print_scripts-' . $options_page_hook, array( $this, 'enqueue_settings_scripts' ) );
336
  add_action( 'admin_print_scripts-' . $links_page_hook, array( $this, 'enqueue_link_page_scripts' ) );
337
 
338
- //Make the Settings page link to the link list
339
  add_screen_meta_link(
340
  'blc-links-page-link',
341
  __( 'Go to Broken Links', 'broken-link-checker' ),
@@ -346,7 +418,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
346
  }
347
 
348
  /**
349
- * plugin_action_links()
350
  * Handler for the 'plugin_action_links' hook. Adds a "Settings" link to this plugin's entry
351
  * on the plugin list.
352
  *
@@ -354,18 +426,21 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
354
  * @param string $file
355
  * @return array
356
  */
357
- function plugin_action_links( $links, $file ) {
358
- if ( $file == $this->my_basename ) {
359
  $links[] = "<a href='options-general.php?page=link-checker-settings'>" . __( 'Settings' ) . '</a>';
360
  }
361
  return $links;
362
  }
363
 
364
- function options_page() {
 
 
 
365
  $moduleManager = blcModuleManager::getInstance();
366
 
367
- //Prior to 1.5.2 (released 2012-05-27), there was a bug that would cause the donation flag to be
368
- //set incorrectly. So we'll unset the flag in that case.
369
  $reset_donation_flag = ( $this->conf->get( 'first_installation_timestamp', 0 ) < strtotime( '2012-05-27 00:00' ) ) && ! $this->conf->get( 'donation_flag_fixed', false );
370
 
371
  if ( $reset_donation_flag ) {
@@ -377,7 +452,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
377
  if ( isset( $_POST['recheck'] ) && ! empty( $_POST['recheck'] ) ) {
378
  $this->initiate_recheck();
379
 
380
- //Redirect back to the settings page
381
  $base_url = remove_query_arg( array( '_wpnonce', 'noheader', 'updated', 'error', 'action', 'message' ) );
382
  wp_redirect(
383
  add_query_arg(
@@ -404,16 +479,16 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
404
 
405
  $cleanPost = $_POST;
406
  if ( function_exists( 'wp_magic_quotes' ) ) {
407
- $cleanPost = stripslashes_deep( $cleanPost ); //Ceterum censeo, WP shouldn't mangle superglobals.
408
  }
409
 
410
- //Activate/deactivate modules
411
  if ( ! empty( $_POST['module'] ) ) {
412
  $active = array_keys( $_POST['module'] );
413
  $moduleManager->set_active_modules( $active );
414
  }
415
 
416
- //Only post statuses that actually exist can be selected
417
  if ( isset( $_POST['enabled_post_statuses'] ) && is_array( $_POST['enabled_post_statuses'] ) ) {
418
  $available_statuses = get_post_stati();
419
  $enabled_post_statuses = array_intersect( $_POST['enabled_post_statuses'], $available_statuses );
@@ -489,6 +564,9 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
489
  $acf_fields_diff2 = array_diff( $this->conf->options['acf_fields'], $new_acf_fields );
490
  $this->conf->options['acf_fields'] = $new_acf_fields;
491
 
 
 
 
492
  //Turning off warnings turns existing warnings into "broken" links.
493
  $warnings_enabled = ! empty( $_POST['warnings_enabled'] );
494
  if ( $this->conf->get( 'warnings_enabled' ) && ! $warnings_enabled ) {
@@ -567,7 +645,25 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
567
 
568
  if ( $this->conf->options['logging_enabled'] ) {
569
  if ( $this->conf->options['custom_log_file_enabled'] ) {
 
570
  $log_file = strval( $cleanPost['log_file'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
571
  } else {
572
  //Default log file is /wp-content/uploads/broken-link-checker/blc-log.txt
573
  $log_directory = self::get_default_log_directory();
@@ -583,8 +679,9 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
583
  }
584
 
585
  $this->conf->options['log_file'] = $log_file;
 
586
 
587
- //Attempt to create the log file if not already there.
588
  if ( ! is_file( $log_file ) ) {
589
  file_put_contents( $log_file, '' );
590
  }
@@ -1009,6 +1106,17 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
1009
  </td>
1010
  </tr>
1011
 
 
 
 
 
 
 
 
 
 
 
 
1012
  </table>
1013
 
1014
  </div>
@@ -1318,7 +1426,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
1318
  <th scope="row"><?php _e( 'Log file location', 'broken-link-checker' ); ?></th>
1319
  <td>
1320
 
1321
- <div id="blc-logging-options">
1322
 
1323
  <p>
1324
  <label>
@@ -1349,7 +1457,32 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
1349
  </div>
1350
  </td>
1351
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1352
 
 
 
 
 
 
1353
 
1354
  <tr valign="top">
1355
  <th scope="row"><?php _e( 'Forced recheck', 'broken-link-checker' ); ?></th>
@@ -3611,7 +3744,7 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
3611
  $debug[ __( 'CURL version', 'broken-link-checker' ) ] = $data;
3612
 
3613
  //Snoopy presence
3614
- if ( class_exists( 'Snoopy' ) || file_exists( ABSPATH . WPINC . '/class-snoopy.php' ) ) {
3615
  $data = array(
3616
  'state' => 'ok',
3617
  'value' => __( 'Installed', 'broken-link-checker' ),
@@ -3768,7 +3901,12 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
3768
  function maybe_send_email_notifications() {
3769
  global $wpdb; /** @var wpdb $wpdb */
3770
 
3771
- if ( ! ( $this->conf->options['send_email_notifications'] || $this->conf->options['send_authors_email_notifications'] ) ) {
 
 
 
 
 
3772
  return;
3773
  }
3774
 
@@ -4011,8 +4149,67 @@ if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
4011
  if ( ! wp_next_scheduled( 'blc_cron_database_maintenance' ) ) {
4012
  wp_schedule_event( time(), 'daily', 'blc_cron_database_maintenance' );
4013
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4014
  }
4015
 
 
 
4016
  /**
4017
  * Load the plugin's textdomain.
4018
  *
1
  <?php
 
2
  /**
3
  * Simple function to replicate PHP 5 behaviour
4
+ *
5
+ * @link https://wordpress.org/plugins/broken-link-checker/
6
+ * @since 1.0.0
7
+ * @package broken-link-checker
8
  */
9
+
10
  if ( ! function_exists( 'microtime_float' ) ) {
11
+ /**
12
+ * Calcualate microtime_float
13
+ *
14
+ * @since 1.0.0
15
+ */
16
  function microtime_float() {
17
  list( $usec, $sec ) = explode( ' ', microtime() );
18
  return ( (float) $usec + (float) $sec );
25
  require BLC_DIRECTORY . '/includes/transactions-manager.php';
26
 
27
  if ( ! class_exists( 'wsBrokenLinkChecker' ) ) {
28
+
29
+ /**
30
+ * Broken Link Checker core
31
+ */
32
  class wsBrokenLinkChecker {
33
 
34
+ /**
35
+ * Plugin configuration.
36
+ *
37
+ * @var object
38
+ */
39
+ public $conf;
40
+
41
+ /**
42
+ * Loader script path.
43
+ *
44
+ * @var string
45
+ */
46
+ public $loader;
47
+
48
+ /**
49
+ * Loader basename.
50
+ *
51
+ * @var string
52
+ */
53
+ public $my_basename = '';
54
+
55
+ /**
56
+ * DB version.
57
+ *
58
+ * @var string
59
+ */
60
+ public $db_version; // The required version of the plugin's DB schema.
61
+
62
+ /**
63
+ * Execution start time.
64
+ *
65
+ * @var string
66
+ */
67
+ public $execution_start_time;
68
+
69
+ /**
70
+ * Text domain status.
71
+ *
72
+ * @var string
73
+ */
74
+ public $is_textdomain_loaded = false;
75
 
76
  /**
77
  * Class constructor
78
  *
79
+ * @param string $loader The fully
80
+ * qualified filename of the loader script that WP
81
+ * identifies as the "main" plugin file.
82
+ * @param blcConfigurationManager $conf An instance of the configuration manager.
83
  */
84
+ public function __construct( $loader, blcConfigurationManager $conf ) {
85
  $this->db_version = BLC_DATABASE_VERSION;
86
 
87
  $this->conf = $conf;
90
 
91
  $this->load_language();
92
 
93
+ // Unlike the activation hook, the deactivation callback *can* be registered in this file.
94
+
95
+ // because deactivation happens after this class has already been instantiated (during the 'init' action).
96
+
97
  register_deactivation_hook( $loader, array( $this, 'deactivation' ) );
98
 
99
  add_action( 'admin_menu', array( $this, 'admin_menu' ) );
100
 
101
+ // Load jQuery on Dashboard pages (probably redundant as WP already does that).
102
+ // add_action( 'admin_print_scripts', array( $this, 'admin_print_scripts' ) );.
103
 
104
+ // The dashboard widget.
105
  add_action( 'wp_dashboard_setup', array( $this, 'hook_wp_dashboard_setup' ) );
106
 
107
+ // AJAXy hooks.
108
  add_action( 'wp_ajax_blc_full_status', array( $this, 'ajax_full_status' ) );
109
  add_action( 'wp_ajax_blc_dashboard_status', array( $this, 'ajax_dashboard_status' ) );
110
  add_action( 'wp_ajax_blc_work', array( $this, 'ajax_work' ) );
119
  add_action( 'wp_ajax_blc_dismiss', array( $this, 'ajax_dismiss' ) );
120
  add_action( 'wp_ajax_blc_undismiss', array( $this, 'ajax_undismiss' ) );
121
 
122
+ // Add/remove Cron events.
123
  $this->setup_cron_events();
124
 
125
+ // Set hooks that listen for our Cron actions.
126
  add_action( 'blc_cron_email_notifications', array( $this, 'maybe_send_email_notifications' ) );
127
  add_action( 'blc_cron_check_links', array( $this, 'cron_check_links' ) );
128
  add_action( 'blc_cron_database_maintenance', array( $this, 'database_maintenance' ) );
129
+ add_action( 'blc_corn_clear_log_file', array( $this, 'clear_log_file' ) );
130
 
131
+ // Set the footer hook that will call the worker function via AJAX.
132
  add_action( 'admin_footer', array( $this, 'admin_footer' ) );
133
+ // Add a "Screen Options" panel to the "Broken Links" page.
134
  add_screen_options_panel(
135
  'blc-screen-options',
136
  '',
140
  true
141
  );
142
 
143
+ // Display an explanatory note on the "Tools -> Broken Links -> Warnings" page.
144
  add_action( 'admin_notices', array( $this, 'show_warnings_section_notice' ) );
145
 
146
+ // Restore post date updated with the update link.
147
+ add_filter( 'wp_insert_post_data', array( $this, 'disable_post_date_update' ), 10, 2 );
148
+
149
  }
150
 
151
  /**
153
  *
154
  * @return void
155
  */
156
+ public function admin_footer() {
157
  if ( ! $this->conf->options['run_in_dashboard'] ) {
158
  return;
159
  }
166
  //(Re)starts the background worker thread
167
  function blcDoWork(){
168
  $.post(
169
+ "<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>",
170
  {
171
  'action' : 'blc_work',
172
  '_ajax_nonce' : '<?php echo esc_js( $nonce ); ?>'
188
  /**
189
  * Check if an URL matches the exclusion list.
190
  *
191
+ * @param string $url The url to exclude.
192
  * @return bool
193
  */
194
+ public function is_excluded( $url ) {
195
  if ( ! is_array( $this->conf->options['exclusion_list'] ) ) {
196
  return false;
197
  }
203
  return false;
204
  }
205
 
206
+ /**
207
+ * Get dashboard_widget
208
+ */
209
+ public function dashboard_widget() {
210
  ?>
211
+ <p id='wsblc_activity_box'><?php esc_html_e( 'Loading...', 'broken-link-checker' ); ?></p>
212
  <script type='text/javascript'>
213
  jQuery( function($){
214
  var blc_was_autoexpanded = false;
215
 
216
  function blcDashboardStatus(){
217
  $.getJSON(
218
+ "<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>",
219
  {
220
  'action' : 'blc_dashboard_status',
221
  'random' : Math.random()
232
  }
233
  <?php } ?>
234
  } else {
235
+ $('#wsblc_activity_box').html('<?php esc_html_e( '[ Network error ]', 'broken-link-checker' ); ?>');
236
  }
237
 
238
  setTimeout( blcDashboardStatus, 120*1000 ); //...update every two minutes
247
  <?php
248
  }
249
 
250
+ /**
251
+ * Dashboard widget controls.
252
+ *
253
+ * @param int $widget_id The widget ID.
254
+ * @param array $form_inputs The form inputs.
255
+ */
256
+ public function dashboard_widget_control( $widget_id, $form_inputs = array() ) {
257
+ if ( isset( $_POST['blc_update_widget_nonce'] ) ) :
258
+
259
+ // Ignore sanitization field for nonce.
260
+ $nonce = sanitize_text_field( wp_unslash( $_POST['blc_update_widget_nonce'] ) );
261
+
262
+ if ( wp_verify_nonce( $nonce, 'blc_update_widget' ) && isset( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] && isset( $_POST['widget_id'] ) && 'blc_dashboard_widget' === $_POST['widget_id'] ) {
263
+
264
+ // It appears $form_inputs isn't used in the current WP version, so lets just use $_POST.
265
+ $this->conf->options['autoexpand_widget'] = ! empty( $_POST['blc-autoexpand'] );
266
+ $this->conf->save_options();
267
+ }
268
+ endif;
269
 
270
  ?>
271
  <p><label for="blc-autoexpand">
274
  if ( $this->conf->options['autoexpand_widget'] ) {
275
  echo 'checked="checked"';}
276
  ?>
277
+ />
278
+ <?php esc_html_e( 'Automatically expand the widget if broken links have been detected', 'broken-link-checker' ); ?>
279
  </label></p>
280
  <?php
 
281
 
282
+ wp_nonce_field( 'blc_update_widget', 'blc_update_widget_nonce' );
 
 
283
  }
284
 
285
+ /**
286
+ * Enqueue settings script.
287
+ */
288
+ public function enqueue_settings_scripts() {
289
+ // jQuery UI is used on the settings page.
290
+ wp_enqueue_script( 'jquery-ui-core' ); // Used for background color animation.
291
  wp_enqueue_script( 'jquery-ui-dialog' );
292
  wp_enqueue_script( 'jquery-ui-tabs' );
293
+ wp_enqueue_script( 'jquery-cookie', plugins_url( 'js/jquery.cookie.js', BLC_PLUGIN_FILE ), array(), '1.0.0', false ); // Used for storing last widget states, etc.
294
  }
295
 
296
+ /**
297
+ * Enqueue linkpage script.
298
+ */
299
+ public function enqueue_link_page_scripts() {
300
  wp_enqueue_script( 'jquery-ui-core' );
301
+ wp_enqueue_script( 'jquery-ui-dialog' ); // Used for the search form.
302
+ wp_enqueue_script( 'jquery-color' ); // Used for background color animation.
303
+ wp_enqueue_script( 'sprintf', plugins_url( 'js/sprintf.js', BLC_PLUGIN_FILE ), array(), '1.0.0', false ); // Used in error messages.
304
  }
305
 
306
  /**
308
  *
309
  * @return void
310
  */
311
+ public function initiate_recheck() {
312
+ global $wpdb; // wpdb.
313
 
314
+ // Delete all discovered instances.
315
+ $wpdb->query( "TRUNCATE {$wpdb->prefix}blc_instances" ); //phpcs:ignore
316
 
317
+ // Delete all discovered links.
318
+ $wpdb->query( "TRUNCATE {$wpdb->prefix}blc_links" ); //phpcs:ignore
319
 
320
+ // Mark all posts, custom fields and bookmarks for processing.
321
  blc_resynch( true );
322
  }
323
 
326
  *
327
  * @return void
328
  */
329
+ public function deactivation() {
330
+ // Remove our Cron events.
331
  wp_clear_scheduled_hook( 'blc_cron_check_links' );
332
  wp_clear_scheduled_hook( 'blc_cron_email_notifications' );
333
  wp_clear_scheduled_hook( 'blc_cron_database_maintenance' );
334
+ wp_clear_scheduled_hook( 'blc_corn_clear_log_file' );
335
+ wp_clear_scheduled_hook( 'blc_cron_check_news' ); // Unused event.
336
+ // Note the deactivation time for each module. This will help them
337
+ // synch up propely if/when the plugin is reactivated.
338
  $moduleManager = blcModuleManager::getInstance();
339
  $the_time = current_time( 'timestamp' );
340
  foreach ( $moduleManager->get_active_modules() as $module_id => $module ) {
351
  *
352
  * @return void
353
  */
354
+ public function database_maintenance() {
355
  blcContainerHelper::cleanup_containers();
356
  blc_cleanup_instances();
357
  blc_cleanup_links();
365
  *
366
  * @return void
367
  */
368
+ public function admin_menu() {
369
  if ( current_user_can( 'manage_options' ) ) {
370
  add_filter( 'plugin_action_links', array( $this, 'plugin_action_links' ), 10, 2 );
371
  }
380
 
381
  $menu_title = __( 'Broken Links', 'broken-link-checker' );
382
  if ( $this->conf->options['show_link_count_bubble'] ) {
383
+ // To make it easier to notice when broken links appear, display the current number of
384
+ // broken links in a little bubble notification in the "Broken Links" menu.
385
+ // (Similar to how the number of plugin updates and unmoderated comments is displayed).
386
  $blc_link_query = blcLinkQuery::getInstance();
387
  $broken_links = $blc_link_query->get_filter_links( 'broken', array( 'count_only' => true ) );
388
  if ( $broken_links > 0 ) {
389
+ // TODO: Appropriating existing CSS classes for my own purposes is hacky. Fix eventually.
390
  $menu_title .= sprintf(
391
  ' <span class="update-plugins"><span class="update-count blc-menu-bubble">%d</span></span>',
392
  $broken_links
401
  array( $this, 'links_page' )
402
  );
403
 
404
+ // Add plugin-specific scripts and CSS only to the it's own pages.
405
  add_action( 'admin_print_styles-' . $options_page_hook, array( $this, 'options_page_css' ) );
406
  add_action( 'admin_print_styles-' . $links_page_hook, array( $this, 'links_page_css' ) );
407
  add_action( 'admin_print_scripts-' . $options_page_hook, array( $this, 'enqueue_settings_scripts' ) );
408
  add_action( 'admin_print_scripts-' . $links_page_hook, array( $this, 'enqueue_link_page_scripts' ) );
409
 
410
+ // Make the Settings page link to the link list.
411
  add_screen_meta_link(
412
  'blc-links-page-link',
413
  __( 'Go to Broken Links', 'broken-link-checker' ),
418
  }
419
 
420
  /**
421
+ * Function plugin_action_links()
422
  * Handler for the 'plugin_action_links' hook. Adds a "Settings" link to this plugin's entry
423
  * on the plugin list.
424
  *
426
  * @param string $file
427
  * @return array
428
  */
429
+ public function plugin_action_links( $links, $file ) {
430
+ if ( $file === $this->my_basename ) {
431
  $links[] = "<a href='options-general.php?page=link-checker-settings'>" . __( 'Settings' ) . '</a>';
432
  }
433
  return $links;
434
  }
435
 
436
+ /**
437
+ * Function to show options page
438
+ */
439
+ public function options_page() {
440
  $moduleManager = blcModuleManager::getInstance();
441
 
442
+ // Prior to 1.5.2 (released 2012-05-27), there was a bug that would cause the donation flag to be
443
+ // set incorrectly. So we'll unset the flag in that case.
444
  $reset_donation_flag = ( $this->conf->get( 'first_installation_timestamp', 0 ) < strtotime( '2012-05-27 00:00' ) ) && ! $this->conf->get( 'donation_flag_fixed', false );
445
 
446
  if ( $reset_donation_flag ) {
452
  if ( isset( $_POST['recheck'] ) && ! empty( $_POST['recheck'] ) ) {
453
  $this->initiate_recheck();
454
 
455
+ // Redirect back to the settings page.
456
  $base_url = remove_query_arg( array( '_wpnonce', 'noheader', 'updated', 'error', 'action', 'message' ) );
457
  wp_redirect(
458
  add_query_arg(
479
 
480
  $cleanPost = $_POST;
481
  if ( function_exists( 'wp_magic_quotes' ) ) {
482
+ $cleanPost = stripslashes_deep( $cleanPost ); // Ceterum censeo, WP shouldn't mangle superglobals.
483
  }
484
 
485
+ // Activate/deactivate modules.
486
  if ( ! empty( $_POST['module'] ) ) {
487
  $active = array_keys( $_POST['module'] );
488
  $moduleManager->set_active_modules( $active );
489
  }
490
 
491
+ // Only post statuses that actually exist can be selected.
492
  if ( isset( $_POST['enabled_post_statuses'] ) && is_array( $_POST['enabled_post_statuses'] ) ) {
493
  $available_statuses = get_post_stati();
494
  $enabled_post_statuses = array_intersect( $_POST['enabled_post_statuses'], $available_statuses );
564
  $acf_fields_diff2 = array_diff( $this->conf->options['acf_fields'], $new_acf_fields );
565
  $this->conf->options['acf_fields'] = $new_acf_fields;
566
 
567
+ //Turning off warnings turns existing warnings into "broken" links.
568
+ $this->conf->options['blc_post_modified'] = ! empty( $_POST['blc_post_modified'] );
569
+
570
  //Turning off warnings turns existing warnings into "broken" links.
571
  $warnings_enabled = ! empty( $_POST['warnings_enabled'] );
572
  if ( $this->conf->get( 'warnings_enabled' ) && ! $warnings_enabled ) {
645
 
646
  if ( $this->conf->options['logging_enabled'] ) {
647
  if ( $this->conf->options['custom_log_file_enabled'] ) {
648
+
649
  $log_file = strval( $cleanPost['log_file'] );
650
+ if ( ! file_exists( $log_file ) ) {
651
+ if ( ! file_exists( dirname( $log_file ) ) ) {
652
+ mkdir( dirname( $log_file ), 0750, true );
653
+ }
654
+ // Attempt to create the log file if not already there.
655
+ if ( ! is_file( $log_file ) ) {
656
+ //Add a .htaccess to hide the log file from site visitors.
657
+ file_put_contents( dirname( $log_file ) . '/.htaccess', 'Deny from all' );
658
+ file_put_contents( $log_file, '' );
659
+ }
660
+ }
661
+ //revert to default
662
+ if ( ! is_writable( $log_file ) || ! is_file( $log_file ) ) {
663
+ $this->conf->options['custom_log_file_enabled'] = '';
664
+ $log_directory = self::get_default_log_directory();
665
+ $log_file = $log_directory . '/' . self::get_default_log_basename();
666
+ }
667
  } else {
668
  //Default log file is /wp-content/uploads/broken-link-checker/blc-log.txt
669
  $log_directory = self::get_default_log_directory();
679
  }
680
 
681
  $this->conf->options['log_file'] = $log_file;
682
+ $this->conf->options['clear_log_on'] = strval( $cleanPost['clear_log_on'] );
683
 
684
+ // Attempt to create the log file if not already there.
685
  if ( ! is_file( $log_file ) ) {
686
  file_put_contents( $log_file, '' );
687
  }
1106
  </td>
1107
  </tr>
1108
 
1109
+ <tr valign="top">
1110
+ <th scope="row"><?php echo esc_html__( 'Post Modified Date', 'broken-link-checker' ); ?></th>
1111
+ <td>
1112
+ <label>
1113
+ <input type="checkbox" name="blc_post_modified" id="blc_post_modified"
1114
+ <?php checked( $this->conf->options['blc_post_modified'] ); ?>/>
1115
+ <?php esc_html_e( 'Disable post modified date change when link is edited', 'broken-link-checker' ); ?>
1116
+ </label>
1117
+ </td>
1118
+ </tr>
1119
+
1120
  </table>
1121
 
1122
  </div>
1426
  <th scope="row"><?php _e( 'Log file location', 'broken-link-checker' ); ?></th>
1427
  <td>
1428
 
1429
+ <div class="blc-logging-options">
1430
 
1431
  <p>
1432
  <label>
1457
  </div>
1458
  </td>
1459
  </tr>
1460
+ <tr valign="top">
1461
+ <th scope="row"><?php _e( 'Log file clear schedule', 'broken-link-checker' ); ?></th>
1462
+ <td>
1463
+ <div class="blc-logging-options">
1464
+ <p>
1465
+ <?php $schedules = wp_get_schedules(); ?>
1466
+ <select name="clear_log_on">
1467
+ <option value=""> <?php esc_html_e( 'Never', 'wpmudev' ); ?></option>
1468
+ <?php
1469
+ foreach ( $schedules as $key => $schedule ) {
1470
+ $selected = selected(
1471
+ $this->conf->options['clear_log_on'],
1472
+ $key,
1473
+ false
1474
+ );
1475
+ ?>
1476
+ <option <?php echo $selected; ?>value="<?php echo esc_attr( $key ); ?>"> <?php echo esc_html( $schedule['display'] ); ?></option>
1477
+ <?php
1478
+ }
1479
+ ?>
1480
 
1481
+ </select>
1482
+ </p>
1483
+ </div>
1484
+ </td>
1485
+ </tr>
1486
 
1487
  <tr valign="top">
1488
  <th scope="row"><?php _e( 'Forced recheck', 'broken-link-checker' ); ?></th>
3744
  $debug[ __( 'CURL version', 'broken-link-checker' ) ] = $data;
3745
 
3746
  //Snoopy presence
3747
+ if ( class_exists( 'WP_Http' ) || file_exists( ABSPATH . WPINC . '/class-http.php' ) ) {
3748
  $data = array(
3749
  'state' => 'ok',
3750
  'value' => __( 'Installed', 'broken-link-checker' ),
3901
  function maybe_send_email_notifications() {
3902
  global $wpdb; /** @var wpdb $wpdb */
3903
 
3904
+ // email notificaiton.
3905
+ $send_notification = apply_filters( 'blc_allow_send_email_notification', $this->conf->options['send_email_notifications'] );
3906
+
3907
+ $send_authors_notifications = apply_filters( 'blc_allow_send_author_email_notification', $this->conf->options['send_authors_email_notifications'] );
3908
+
3909
+ if ( ! ( $send_notification || $send_authors_notifications ) ) {
3910
  return;
3911
  }
3912
 
4149
  if ( ! wp_next_scheduled( 'blc_cron_database_maintenance' ) ) {
4150
  wp_schedule_event( time(), 'daily', 'blc_cron_database_maintenance' );
4151
  }
4152
+
4153
+ $clear_log = $this->conf->options['clear_log_on'];
4154
+ if ( ! wp_next_scheduled( 'blc_corn_clear_log_file' ) && ! empty( $clear_log ) ) {
4155
+ wp_schedule_event( time(), $clear_log, 'blc_corn_clear_log_file' );
4156
+ }
4157
+
4158
+ if ( empty( $clear_log ) ) {
4159
+ wp_clear_scheduled_hook( 'blc_corn_clear_log_file' );
4160
+ }
4161
+ }
4162
+
4163
+ /**
4164
+ * Clear blc log file
4165
+ * @return void
4166
+ */
4167
+ function clear_log_file() {
4168
+ $log_file = $this->conf->options['log_file'];
4169
+
4170
+ //clear log file
4171
+ if ( is_writable( $log_file ) && is_file( $log_file ) ) {
4172
+ $handle = fopen( $log_file, 'w' );
4173
+ fclose( $handle );
4174
+ }
4175
+ }
4176
+
4177
+ /**
4178
+ * Don't update the last updated date of a post
4179
+ *
4180
+ * @param array $data An array of slashed post data.
4181
+ * @param array $postarr An array of sanitized, but otherwise unmodified post data.
4182
+ * @return array $data Resulting array of slashed post data.
4183
+ */
4184
+ public function disable_post_date_update( $data, $postarr ) {
4185
+
4186
+ $last_modified = isset( $postarr['blc_post_modified'] ) ? $postarr['blc_post_modified'] : '';
4187
+
4188
+ $last_modified_gmt = isset( $postarr['blc_post_modified_gmt'] ) ? $postarr['blc_post_modified_gmt'] : '';
4189
+
4190
+
4191
+ // if is not enabled bail!
4192
+ if( ! $this->conf->options['blc_post_modified'] ) {
4193
+ return $data;
4194
+ }
4195
+
4196
+
4197
+ // only restore the post modified for BLC links
4198
+ if( empty( $last_modified ) || empty( $last_modified_gmt ) ) {
4199
+ return $data;
4200
+ }
4201
+
4202
+ // modify the post modified date.
4203
+ $data['post_modified'] = $last_modified;
4204
+
4205
+ // modify the post modified gmt
4206
+ $data['post_modified_gmt'] = $last_modified_gmt;
4207
+
4208
+ return $data;
4209
  }
4210
 
4211
+
4212
+
4213
  /**
4214
  * Load the plugin's textdomain.
4215
  *
core/init.php CHANGED
@@ -42,7 +42,7 @@ if ( defined( 'BLC_ACTIVE' ) ) {
42
  define( 'BLC_FOR_EDITING', 'edit' );
43
  define( 'BLC_FOR_PARSING', 'parse' );
44
  define( 'BLC_FOR_DISPLAY', 'display' );
45
- define( 'BLC_DATABASE_VERSION', 10 );
46
 
47
  /***********************************************
48
  Configuration
@@ -96,6 +96,8 @@ if ( defined( 'BLC_ACTIVE' ) ) {
96
  'failure_duration_threshold' => 3, // (days) Assume a link is permanently broken if it still hasn't recovered after this many days.
97
  'logging_enabled' => false,
98
  'log_file' => '',
 
 
99
  'custom_log_file_enabled' => false,
100
  'installation_complete' => false,
101
  'installation_flag_cleared_on' => 0,
@@ -104,6 +106,7 @@ if ( defined( 'BLC_ACTIVE' ) ) {
104
  'donation_flag_fixed' => false,
105
  'show_link_actions' => array( 'blc-deredirect-action' => false ), //Visible link actions.
106
  'youtube_api_key' => '',
 
107
  )
108
  );
109
 
@@ -256,12 +259,7 @@ if ( defined( 'BLC_ACTIVE' ) ) {
256
  Main functionality
257
  ************************************************/
258
 
259
- //Execute the installation/upgrade script when the plugin is activated.
260
- function blc_activation_hook() {
261
- require BLC_DIRECTORY . '/includes/activation.php';
262
- }
263
-
264
- register_activation_hook( BLC_PLUGIN_FILE, 'blc_activation_hook' );
265
 
266
  //Load the plugin if installed successfully
267
  if ( $blc_config_manager->options['installation_complete'] ) {
@@ -325,11 +323,6 @@ if ( defined( 'BLC_ACTIVE' ) ) {
325
  '<strong>' . __( 'Broken Link Checker installation failed. Try deactivating and then reactivating the plugin.', 'broken-link-checker' ) . '</strong>',
326
  );
327
 
328
- if ( is_multisite() && is_plugin_active_for_network( plugin_basename( BLC_PLUGIN_FILE ) ) ) {
329
- $messages[] = __( 'Please activate the plugin separately on each site. Network activation is not supported.', 'broken-link-checker' );
330
- $messages[] = '';
331
- }
332
-
333
  if ( ! $blc_config_manager->db_option_loaded ) {
334
  $messages[] = sprintf(
335
  '<strong>Failed to load plugin settings from the "%s" option.</strong>',
42
  define( 'BLC_FOR_EDITING', 'edit' );
43
  define( 'BLC_FOR_PARSING', 'parse' );
44
  define( 'BLC_FOR_DISPLAY', 'display' );
45
+ define( 'BLC_DATABASE_VERSION', 16 );
46
 
47
  /***********************************************
48
  Configuration
96
  'failure_duration_threshold' => 3, // (days) Assume a link is permanently broken if it still hasn't recovered after this many days.
97
  'logging_enabled' => false,
98
  'log_file' => '',
99
+ 'incorrect_path' => false,
100
+ 'clear_log_on' => '',
101
  'custom_log_file_enabled' => false,
102
  'installation_complete' => false,
103
  'installation_flag_cleared_on' => 0,
106
  'donation_flag_fixed' => false,
107
  'show_link_actions' => array( 'blc-deredirect-action' => false ), //Visible link actions.
108
  'youtube_api_key' => '',
109
+ 'blc_post_modified' => '',
110
  )
111
  );
112
 
259
  Main functionality
260
  ************************************************/
261
 
262
+ require BLC_DIRECTORY . '/includes/activation.php';
 
 
 
 
 
263
 
264
  //Load the plugin if installed successfully
265
  if ( $blc_config_manager->options['installation_complete'] ) {
323
  '<strong>' . __( 'Broken Link Checker installation failed. Try deactivating and then reactivating the plugin.', 'broken-link-checker' ) . '</strong>',
324
  );
325
 
 
 
 
 
 
326
  if ( ! $blc_config_manager->db_option_loaded ) {
327
  $messages[] = sprintf(
328
  '<strong>Failed to load plugin settings from the "%s" option.</strong>',
css/links-page.css CHANGED
@@ -29,11 +29,11 @@ th.column-status {
29
  }
30
 
31
  th.column-new-link-text {
32
-
33
  }
34
 
35
  th.column-used-in {
36
-
37
  }
38
 
39
  th.column-source {
@@ -62,7 +62,7 @@ th.column-instance-count {
62
 
63
  /* Cells */
64
 
65
- td.column-new-url,
66
  td.column-used-in
67
  {
68
  /*
@@ -106,8 +106,8 @@ table.mini-status {
106
  background-color: #E2E2E2;
107
  }
108
 
109
- .blc-permanently-broken {
110
-
111
  }
112
 
113
  .blc-permanently-broken-hl {
@@ -199,7 +199,7 @@ td.column-status {
199
 
200
  .compact .link-last-checked,
201
  .compact .link-broken-for,
202
- .compact .link-text
203
  {
204
  display: none;
205
  }
@@ -219,7 +219,7 @@ td.column-status {
219
  padding-left: 16px;
220
  overflow: hidden;
221
 
222
- background-image: none;
223
  background-position: left center;
224
  background-repeat: no-repeat;
225
  }
@@ -258,7 +258,7 @@ img.waiting {
258
  }
259
 
260
  td.column-link-text, td.column-new-link-text {
261
- cursor: pointer;
262
  }
263
 
264
  .blc-small-image {
@@ -409,7 +409,7 @@ ul.blc-suggestion-list li {
409
  background : white !important;
410
  border: 3px solid #EEEEEE;
411
  padding: 12px;
412
-
413
  border-radius: 6px;
414
  -moz-border-radius: 6px;
415
  -webkit-border-radius: 6px;
@@ -449,7 +449,7 @@ ul.blc-suggestion-list li {
449
  #blc-search-button-row input {
450
  margin-left: 8px;
451
  margin-right: 8px;
452
- margin-top: 8px;
453
  }
454
 
455
  .blc-inline-form {
@@ -502,4 +502,8 @@ div.search-box{
502
  table#blc-links {
503
  table-layout: auto;
504
  }
 
 
 
 
505
  }
29
  }
30
 
31
  th.column-new-link-text {
32
+
33
  }
34
 
35
  th.column-used-in {
36
+
37
  }
38
 
39
  th.column-source {
62
 
63
  /* Cells */
64
 
65
+ td.column-new-url,
66
  td.column-used-in
67
  {
68
  /*
106
  background-color: #E2E2E2;
107
  }
108
 
109
+ .blc-permanently-broken {
110
+
111
  }
112
 
113
  .blc-permanently-broken-hl {
199
 
200
  .compact .link-last-checked,
201
  .compact .link-broken-for,
202
+ .compact .link-text
203
  {
204
  display: none;
205
  }
219
  padding-left: 16px;
220
  overflow: hidden;
221
 
222
+ background-image: none;
223
  background-position: left center;
224
  background-repeat: no-repeat;
225
  }
258
  }
259
 
260
  td.column-link-text, td.column-new-link-text {
261
+ cursor: pointer;
262
  }
263
 
264
  .blc-small-image {
409
  background : white !important;
410
  border: 3px solid #EEEEEE;
411
  padding: 12px;
412
+
413
  border-radius: 6px;
414
  -moz-border-radius: 6px;
415
  -webkit-border-radius: 6px;
449
  #blc-search-button-row input {
450
  margin-left: 8px;
451
  margin-right: 8px;
452
+ margin-top: 8px;
453
  }
454
 
455
  .blc-inline-form {
502
  table#blc-links {
503
  table-layout: auto;
504
  }
505
+ }
506
+ th#cb {
507
+ vertical-align: middle;
508
+ padding: 6px 0 3px;
509
  }
includes/activation.php CHANGED
@@ -1,5 +1,9 @@
1
  <?php
2
 
 
 
 
 
3
  global $blclog, $blc_config_manager, $wpdb;
4
  $queryCnt = $wpdb->num_queries;
5
 
@@ -116,3 +120,5 @@ $blclog->info(
116
  $blclog->info( sprintf( 'Total time: %.3f seconds', microtime( true ) - $activation_start ) );
117
  $blclog->save();
118
 
 
 
1
  <?php
2
 
3
+ if ( get_option( 'blc_activation_enabled' ) ) {
4
+ return;
5
+ }
6
+
7
  global $blclog, $blc_config_manager, $wpdb;
8
  $queryCnt = $wpdb->num_queries;
9
 
120
  $blclog->info( sprintf( 'Total time: %.3f seconds', microtime( true ) - $activation_start ) );
121
  $blclog->save();
122
 
123
+ // for multisite support.
124
+ update_option( 'blc_activation_enabled', true );
includes/admin/db-upgrade.php CHANGED
@@ -245,7 +245,6 @@ class blcTableDelta {
245
  ( $tablefield->Type != $definition['data_type'] ) ||
246
  ( $definition['collation'] && ( $tablefield->Collation != $definition['collation'] ) ) ||
247
  ( $definition['null_allowed'] && ( 'NO' == $tablefield->Null ) ) ||
248
- ( ! $definition['null_allowed'] && ( 'NO' == $tablefield->Null ) ) ||
249
  ( $tablefield->Default !== $definition['default'] );
250
 
251
  // Add a query to change the column type
245
  ( $tablefield->Type != $definition['data_type'] ) ||
246
  ( $definition['collation'] && ( $tablefield->Collation != $definition['collation'] ) ) ||
247
  ( $definition['null_allowed'] && ( 'NO' == $tablefield->Null ) ) ||
 
248
  ( $tablefield->Default !== $definition['default'] );
249
 
250
  // Add a query to change the column type
includes/admin/links-page-js.php CHANGED
@@ -650,69 +650,74 @@ jQuery(function($){
650
  $(".blc-unlink-button").click(function () {
651
  var me = this;
652
  var master = $(me).parents('.blc-row');
653
- $(me).html('<?php echo esc_js( __( 'Wait...', 'broken-link-checker' ) ); ?>');
654
 
655
- //Find the link ID
656
- var link_id = master.attr('id').split('-')[2];
657
-
658
- $.post(
659
- "<?php echo admin_url( 'admin-ajax.php' ); ?>",
660
- {
661
- 'action' : 'blc_unlink',
662
- 'link_id' : link_id,
663
- '_ajax_nonce' : '<?php echo esc_js( wp_create_nonce( 'blc_unlink' ) ); ?>'
664
- },
665
- function (data, textStatus){
666
- eval('data = ' + data);
667
-
668
- if ( data && (typeof(data['error']) != 'undefined') ){
669
- //An internal error occurred before the link could be edited.
670
- //data.error is an error message.
671
- alert(data.error);
672
- } else {
673
- if ( data.errors.length == 0 ){
674
- //The link was successfully removed. Hide its details.
675
- $('#link-details-'+link_id).hide();
676
- //Flash the main row green to indicate success, then hide it.
677
- var oldColor = master.css('background-color');
678
- master.animate({ backgroundColor: "#E0FFB3" }, 200).animate({ backgroundColor: oldColor }, 300, function(){
679
- master.hide();
680
- });
681
-
682
- alterLinkCounter(-1);
683
-
684
- return;
685
  } else {
686
- //Build and display an error message.
687
- var msg = '';
688
-
689
- if ( data.cnt_okay > 0 ){
690
- msg = msg + sprintf(
691
- '<?php echo esc_js( __( '%d instances of the link were successfully unlinked.', 'broken-link-checker' ) ); ?>\n',
692
- data.cnt_okay
693
- );
 
 
 
 
 
 
 
694
 
695
- if ( data.cnt_error > 0 ){
696
  msg = msg + sprintf(
697
- '<?php echo esc_js( __( "However, %d instances couldn't be removed.", 'broken-link-checker' ) ); ?>\n',
698
- data.cnt_error
699
  );
 
 
 
 
 
 
 
 
 
700
  }
701
- } else {
702
- msg = msg + '<?php echo esc_js( __( 'The plugin failed to remove the link.', 'broken-link-checker' ) ); ?>\n';
703
- }
704
 
705
- msg = msg + '\n<?php echo esc_js( __( 'The following error(s) occured :', 'broken-link-checker' ) ); ?>\n* ';
706
- msg = msg + data.errors.join('\n* ');
707
 
708
- //Show the error message
709
- alert(msg);
 
710
  }
 
 
711
  }
 
712
 
713
- $(me).html('<?php echo esc_js( __( 'Unlink', 'broken-link-checker' ) ); ?>');
714
- }
715
- );
716
  });
717
 
718
  //--------------------------------------------
650
  $(".blc-unlink-button").click(function () {
651
  var me = this;
652
  var master = $(me).parents('.blc-row');
 
653
 
654
+ var confirm_msg = "<?php echo esc_js( __( 'Are you sure you want to unlink and remove this link from all posts?', 'broken-link-checker' ) ); ?>";
655
+
656
+ if( confirm( confirm_msg ) ) {
657
+ //Find the link ID
658
+ var link_id = master.attr('id').split('-')[2];
659
+ $(me).html('<?php echo esc_js( __( 'Wait...', 'broken-link-checker' ) ); ?>');
660
+
661
+ $.post(
662
+ "<?php echo admin_url( 'admin-ajax.php' ); ?>",
663
+ {
664
+ 'action' : 'blc_unlink',
665
+ 'link_id' : link_id,
666
+ '_ajax_nonce' : '<?php echo esc_js( wp_create_nonce( 'blc_unlink' ) ); ?>'
667
+ },
668
+ function (data, textStatus){
669
+ eval('data = ' + data);
670
+
671
+ if ( data && (typeof(data['error']) != 'undefined') ){
672
+ //An internal error occurred before the link could be edited.
673
+ //data.error is an error message.
674
+ alert(data.error);
 
 
 
 
 
 
 
 
 
675
  } else {
676
+ if ( data.errors.length == 0 ){
677
+ //The link was successfully removed. Hide its details.
678
+ $('#link-details-'+link_id).hide();
679
+ //Flash the main row green to indicate success, then hide it.
680
+ var oldColor = master.css('background-color');
681
+ master.animate({ backgroundColor: "#E0FFB3" }, 200).animate({ backgroundColor: oldColor }, 300, function(){
682
+ master.hide();
683
+ });
684
+
685
+ alterLinkCounter(-1);
686
+
687
+ return;
688
+ } else {
689
+ //Build and display an error message.
690
+ var msg = '';
691
 
692
+ if ( data.cnt_okay > 0 ){
693
  msg = msg + sprintf(
694
+ '<?php echo esc_js( __( '%d instances of the link were successfully unlinked.', 'broken-link-checker' ) ); ?>\n',
695
+ data.cnt_okay
696
  );
697
+
698
+ if ( data.cnt_error > 0 ){
699
+ msg = msg + sprintf(
700
+ '<?php echo esc_js( __( "However, %d instances couldn't be removed.", 'broken-link-checker' ) ); ?>\n',
701
+ data.cnt_error
702
+ );
703
+ }
704
+ } else {
705
+ msg = msg + '<?php echo esc_js( __( 'The plugin failed to remove the link.', 'broken-link-checker' ) ); ?>\n';
706
  }
 
 
 
707
 
708
+ msg = msg + '\n<?php echo esc_js( __( 'The following error(s) occured :', 'broken-link-checker' ) ); ?>\n* ';
709
+ msg = msg + data.errors.join('\n* ');
710
 
711
+ //Show the error message
712
+ alert(msg);
713
+ }
714
  }
715
+
716
+ $(me).html('<?php echo esc_js( __( 'Unlink', 'broken-link-checker' ) ); ?>');
717
  }
718
+ );
719
 
720
+ }
 
 
721
  });
722
 
723
  //--------------------------------------------
includes/admin/options-page-js.php CHANGED
@@ -130,8 +130,8 @@ jQuery(function($){
130
 
131
  //Enable/disable log-related options depending on whether "Enable logging" is on.
132
  function blcToggleLogOptions() {
133
- $('#blc-logging-options')
134
- .find('input')
135
  .prop('disabled', ! $('#logging_enabled').is(':checked'));
136
  }
137
 
130
 
131
  //Enable/disable log-related options depending on whether "Enable logging" is on.
132
  function blcToggleLogOptions() {
133
+ $('.blc-logging-options')
134
+ .find('input,select')
135
  .prop('disabled', ! $('#logging_enabled').is(':checked'));
136
  }
137
 
includes/any-post.php CHANGED
@@ -242,42 +242,57 @@ class blcPostTypeOverlord {
242
  $blclog->log( sprintf( '...... %d rows inserted in %.3f seconds', $wpdb->rows_affected, microtime( true ) - $start ) );
243
  } else {
244
  //Delete synch records corresponding to posts that no longer exist.
245
- $blclog->log( '...... Deleting synch records for removed posts' );
246
- $start = microtime( true );
247
- $q = "DELETE synch.*
248
- FROM
249
- {$wpdb->prefix}blc_synch AS synch LEFT JOIN {$wpdb->posts} AS posts
250
- ON posts.ID = synch.container_id
251
- WHERE
252
- synch.container_type IN (%s) AND posts.ID IS NULL";
253
- $q = sprintf(
254
- $q,
255
- "'" . implode( "', '", $escaped_post_types ) . "'"
256
  );
257
- $wpdb->query( $q );
258
- $elapsed = microtime( true ) - $start;
259
- $blclog->debug( $q );
260
- $blclog->log( sprintf( '...... %d rows deleted in %.3f seconds', $wpdb->rows_affected, $elapsed ) );
261
 
262
- //Delete records where the post status is not one of the enabled statuses.
263
- $blclog->log( '...... Deleting synch records for posts that have a disallowed status' );
264
- $start = microtime( true );
265
- $q = "DELETE synch.*
266
- FROM
267
- {$wpdb->prefix}blc_synch AS synch
268
- LEFT JOIN {$wpdb->posts} AS posts
269
- ON (synch.container_id = posts.ID and synch.container_type = posts.post_type)
270
- WHERE
271
- posts.post_status NOT IN (%s)";
272
  $q = sprintf(
273
  $q,
274
- "'" . implode( "', '", $escaped_post_statuses ) . "'"
275
  );
 
276
  $wpdb->query( $q );
277
  $elapsed = microtime( true ) - $start;
278
  $blclog->debug( $q );
279
  $blclog->log( sprintf( '...... %d rows deleted in %.3f seconds', $wpdb->rows_affected, $elapsed ) );
280
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
  //Remove the 'synched' flag from all posts that have been updated
282
  //since the last time they were parsed/synchronized.
283
  $blclog->log( '...... Marking changed posts as unsynched' );
@@ -585,7 +600,10 @@ class blcAnyPostContainer extends blcContainer {
585
  );
586
  }
587
 
588
- $post_id = wp_update_post( $this->wrapped_object, true );
 
 
 
589
 
590
  if ( is_wp_error( $post_id ) ) {
591
  return $post_id;
@@ -603,7 +621,7 @@ class blcAnyPostContainer extends blcContainer {
603
  /**
604
  * Update the the links on pagebuilders
605
  *
606
- * @param $post_id Post ID of whose content to update
607
  */
608
  function update_pagebuilders( $post_id ) {
609
 
@@ -716,8 +734,6 @@ class blcAnyPostContainer extends blcContainer {
716
  }
717
  }
718
 
719
-
720
-
721
  /**
722
  * Universal manager usable for most post types.
723
  *
@@ -726,7 +742,7 @@ class blcAnyPostContainer extends blcContainer {
726
  */
727
  class blcAnyPostContainerManager extends blcContainerManager {
728
  var $container_class_name = 'blcAnyPostContainer';
729
- var $fields = array( 'post_content' => 'html' );
730
 
731
  function init() {
732
  parent::init();
@@ -747,6 +763,7 @@ class blcAnyPostContainerManager extends blcContainerManager {
747
  * @return array of blcPostContainer indexed by "container_type|container_id"
748
  */
749
  function get_containers( $containers, $purpose = '', $load_wrapped_objects = false ) {
 
750
  $containers = $this->make_containers( $containers );
751
 
752
  //Preload post data if it is likely to be useful later
242
  $blclog->log( sprintf( '...... %d rows inserted in %.3f seconds', $wpdb->rows_affected, microtime( true ) - $start ) );
243
  } else {
244
  //Delete synch records corresponding to posts that no longer exist.
245
+ //Also delete posts that don't have enabled post status
246
+ $blclog->log( '...... Deleting synch records for removed posts & post with invalid status' );
247
+ $start = microtime( true );
248
+ $all_posts_id = get_posts(
249
+ array(
250
+ 'posts_per_page' => -1,
251
+ 'fields' => 'ids',
252
+ 'post_type' => $this->enabled_post_types,
253
+ 'post_status' => $this->enabled_post_statuses,
254
+ )
 
255
  );
 
 
 
 
256
 
257
+ $q = "DELETE synch.* FROM {$wpdb->prefix}blc_synch AS synch WHERE synch.container_id NOT IN (%s)";
258
+
 
 
 
 
 
 
 
 
259
  $q = sprintf(
260
  $q,
261
+ "'" . implode( "', '", $all_posts_id ) . "'"
262
  );
263
+
264
  $wpdb->query( $q );
265
  $elapsed = microtime( true ) - $start;
266
  $blclog->debug( $q );
267
  $blclog->log( sprintf( '...... %d rows deleted in %.3f seconds', $wpdb->rows_affected, $elapsed ) );
268
 
269
+ // //Delete records where the post status is not one of the enabled statuses.
270
+ // $blclog->log( '...... Deleting synch records for posts that have a disallowed status' );
271
+ // $start = microtime( true );
272
+ // $all_posts_status = get_posts(
273
+ // array(
274
+ // 'posts_per_page' => -1,
275
+ // 'fields' => 'ids',
276
+ // 'post_type' => $this->enabled_post_types,
277
+ // 'post_status' => $this->enabled_post_statuses,
278
+ // )
279
+ // );
280
+
281
+ // $q = "DELETE synch.*
282
+ // FROM
283
+ // {$wpdb->prefix}blc_synch AS synch
284
+ // WHERE
285
+ // posts.post_status NOT IN (%s)";
286
+ // $q = sprintf(
287
+ // $q,
288
+ // "'" . implode( "', '", $escaped_post_statuses ) . "'",
289
+ // "'" . implode( "', '", wp_list_pluck( $all_posts, 'post_status' ) ) . "'",
290
+ // );
291
+ // $wpdb->query( $q );
292
+ // $elapsed = microtime( true ) - $start;
293
+ // $blclog->debug( $q );
294
+ // $blclog->log( sprintf( '...... %d rows deleted in %.3f seconds', $wpdb->rows_affected, $elapsed ) );
295
+
296
  //Remove the 'synched' flag from all posts that have been updated
297
  //since the last time they were parsed/synchronized.
298
  $blclog->log( '...... Marking changed posts as unsynched' );
600
  );
601
  }
602
 
603
+ $post = $this->wrapped_object;
604
+ $post->blc_post_modified = $post->post_modified;
605
+ $post->blc_post_modified_gmt = $post->post_modified_gmt;
606
+ $post_id = wp_update_post( $post, true );
607
 
608
  if ( is_wp_error( $post_id ) ) {
609
  return $post_id;
621
  /**
622
  * Update the the links on pagebuilders
623
  *
624
+ * @param int $post_id Post ID of whose content to update.
625
  */
626
  function update_pagebuilders( $post_id ) {
627
 
734
  }
735
  }
736
 
 
 
737
  /**
738
  * Universal manager usable for most post types.
739
  *
742
  */
743
  class blcAnyPostContainerManager extends blcContainerManager {
744
  var $container_class_name = 'blcAnyPostContainer';
745
+ var $fields = array( 'post_content' => 'html', 'post_excerpt' => 'html' );
746
 
747
  function init() {
748
  parent::init();
763
  * @return array of blcPostContainer indexed by "container_type|container_id"
764
  */
765
  function get_containers( $containers, $purpose = '', $load_wrapped_objects = false ) {
766
+ global $blclog;
767
  $containers = $this->make_containers( $containers );
768
 
769
  //Preload post data if it is likely to be useful later
includes/checkers.php CHANGED
@@ -89,7 +89,6 @@ class blcCheckerHelper {
89
 
90
  $manager = blcModuleManager::getInstance();
91
  $active_checkers = $manager->get_active_by_category( 'checker' );
92
-
93
  foreach ( $active_checkers as $module_id => $module_data ) {
94
  //Try the URL pattern in the header first. If it doesn't match,
95
  //we can avoid loading the module altogether.
89
 
90
  $manager = blcModuleManager::getInstance();
91
  $active_checkers = $manager->get_active_by_category( 'checker' );
 
92
  foreach ( $active_checkers as $module_id => $module_data ) {
93
  //Try the URL pattern in the header first. If it doesn't match,
94
  //we can avoid loading the module altogether.
includes/links.php CHANGED
@@ -283,6 +283,7 @@ if ( ! class_exists( 'blcLink' ) ) {
283
 
284
  $results = array_merge( $defaults, $rez );
285
 
 
286
  //Some HTTP errors can be treated as warnings.
287
  $results = $this->decide_warning_state( $results );
288
 
283
 
284
  $results = array_merge( $defaults, $rez );
285
 
286
+
287
  //Some HTTP errors can be treated as warnings.
288
  $results = $this->decide_warning_state( $results );
289
 
languages/broken-link-checker.pot CHANGED
@@ -1,8 +1,8 @@
1
- # Copyright (C) 2020 Broken Link Checker 1.11.12
2
- # This file is distributed under the same license as the Broken Link Checker 1.11.12 package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Broken Link Checker 1.11.12\n"
6
  "MIME-Version: 1.0\n"
7
  "Content-Type: text/plain; charset=UTF-8\n"
8
  "Content-Transfer-Encoding: 8bit\n"
@@ -13,810 +13,822 @@ msgstr ""
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
- #: core/core.php:154, includes/admin/links-page-js.php:45
17
  msgid "Loading..."
18
  msgstr ""
19
 
20
- #: core/core.php:178, includes/admin/options-page-js.php:18
21
  msgid "[ Network error ]"
22
  msgstr ""
23
 
24
- #: core/core.php:210
25
  msgid "Automatically expand the widget if broken links have been detected"
26
  msgstr ""
27
 
28
- #: core/core.php:302
29
  msgid "Link Checker Settings"
30
  msgstr ""
31
 
32
- #: core/core.php:303
33
  msgid "Link Checker"
34
  msgstr ""
35
 
36
- #: core/core.php:309, includes/link-query.php:37
37
  msgid "Broken Links"
38
  msgstr ""
39
 
40
- #: core/core.php:325
41
  msgid "View Broken Links"
42
  msgstr ""
43
 
44
- #: core/core.php:341
45
  msgid "Go to Broken Links"
46
  msgstr ""
47
 
48
- #: core/core.php:359
49
  msgid "Settings"
50
  msgstr ""
51
 
52
- #: core/core.php:394, includes/admin/table-printer.php:292, includes/admin/table-printer.php:710
53
  msgid "Edit URL"
54
  msgstr ""
55
 
56
- #: core/core.php:395, includes/admin/links-page-js.php:713, includes/admin/table-printer.php:297, includes/admin/table-printer.php:713
57
  msgid "Unlink"
58
  msgstr ""
59
 
60
- #: core/core.php:396, includes/admin/links-page-js.php:111, includes/admin/table-printer.php:719
61
  msgid "Not broken"
62
  msgstr ""
63
 
64
- #: core/core.php:397, includes/admin/table-printer.php:296, includes/admin/table-printer.php:727
65
  msgid "Dismiss"
66
  msgstr ""
67
 
68
- #: core/core.php:398, includes/admin/table-printer.php:293, includes/admin/table-printer.php:739
69
  msgid "Recheck"
70
  msgstr ""
71
 
72
- #: core/core.php:399, includes/admin/table-printer.php:747
73
  msgctxt "link action; replace one redirect with a direct link"
74
  msgid "Fix redirect"
75
  msgstr ""
76
 
77
- #: core/core.php:653
78
  msgid "Settings saved."
79
  msgstr ""
80
 
81
- #: core/core.php:659
82
  msgid "Thank you for your donation!"
83
  msgstr ""
84
 
85
- #: core/core.php:667
86
  msgid "Complete site recheck started."
87
  msgstr ""
88
 
89
- #: core/core.php:690
90
  msgid "General"
91
  msgstr ""
92
 
93
- #: core/core.php:691
94
  msgid "Look For Links In"
95
  msgstr ""
96
 
97
- #: core/core.php:692
98
  msgid "Which Links To Check"
99
  msgstr ""
100
 
101
- #: core/core.php:693
102
  msgid "Protocols & APIs"
103
  msgstr ""
104
 
105
- #: core/core.php:694
106
  msgid "Advanced"
107
  msgstr ""
108
 
109
- #: core/core.php:709
110
  msgid "Broken Link Checker Options"
111
  msgstr ""
112
 
113
- #: core/core.php:753, includes/admin/table-printer.php:215
114
  msgid "Status"
115
  msgstr ""
116
 
117
- #: core/core.php:755, includes/admin/options-page-js.php:56
118
  msgid "Show debug info"
119
  msgstr ""
120
 
121
- #: core/core.php:783
122
  msgid "Check each link"
123
  msgstr ""
124
 
125
- #: core/core.php:788
126
  msgid "Every %s hours"
127
  msgstr ""
128
 
129
- #: core/core.php:797
130
  msgid "Existing links will be checked this often. New links will usually be checked ASAP."
131
  msgstr ""
132
 
133
- #: core/core.php:804
134
  msgid "E-mail notifications"
135
  msgstr ""
136
 
137
- #: core/core.php:814
138
  msgid "Send me e-mail notifications about newly detected broken links"
139
  msgstr ""
140
 
141
- #: core/core.php:826
142
  msgid "Send authors e-mail notifications about broken links in their posts"
143
  msgstr ""
144
 
145
- #: core/core.php:833
146
  msgid "Notification e-mail address"
147
  msgstr ""
148
 
149
- #: core/core.php:845
150
  msgid "Leave empty to use the e-mail address specified in Settings &rarr; General."
151
  msgstr ""
152
 
153
- #: core/core.php:852
154
  msgid "Link tweaks"
155
  msgstr ""
156
 
157
- #: core/core.php:862
158
  msgid "Apply custom formatting to broken links"
159
  msgstr ""
160
 
161
- #: core/core.php:867, core/core.php:910
162
  msgid "Edit CSS"
163
  msgstr ""
164
 
165
- #: core/core.php:889
166
  msgid "Example : Lorem ipsum <a %s>broken link</a>, dolor sit amet."
167
  msgstr ""
168
 
169
- #: core/core.php:892, core/core.php:936
170
  msgid "Click \"Save Changes\" to update example output."
171
  msgstr ""
172
 
173
- #: core/core.php:905
174
  msgid "Apply custom formatting to removed links"
175
  msgstr ""
176
 
177
- #: core/core.php:933
178
  msgid "Example : Lorem ipsum <span %s>removed link</span>, dolor sit amet."
179
  msgstr ""
180
 
181
- #: core/core.php:950
182
  msgid "Stop search engines from following broken links"
183
  msgstr ""
184
 
185
- #: core/core.php:956
186
  msgctxt "\"Link tweaks\" settings"
187
  msgid "These settings only apply to the content of posts, not comments or custom fields."
188
  msgstr ""
189
 
190
- #: core/core.php:967
191
  msgctxt "settings page"
192
  msgid "Suggestions"
193
  msgstr ""
194
 
195
- #: core/core.php:972
196
  msgid "Suggest alternatives to broken links"
197
  msgstr ""
198
 
199
- #: core/core.php:978
200
  msgctxt "settings page"
201
  msgid "Warnings"
202
  msgstr ""
203
 
204
- #: core/core.php:983
205
  msgid "Show uncertain or minor problems as \"warnings\" instead of \"broken\""
206
  msgstr ""
207
 
208
- #: core/core.php:987
209
  msgid "Turning off this option will make the plugin report all problems as broken links."
210
  msgstr ""
211
 
212
- #: core/core.php:994
213
  msgid "YouTube API Key"
214
  msgstr ""
215
 
216
- #: core/core.php:1006
217
  msgid "Use your own %1$sapi key%2$s for checking youtube links."
218
  msgstr ""
219
 
220
- #: core/core.php:1022
 
 
 
 
 
 
 
 
221
  msgid "Look for links in"
222
  msgstr ""
223
 
224
- #: core/core.php:1038
225
  msgid "Post statuses"
226
  msgstr ""
227
 
228
- #: core/core.php:1071
229
  msgid "Link types"
230
  msgstr ""
231
 
232
- #: core/core.php:1077
233
  msgid "Error : All link parsers missing!"
234
  msgstr ""
235
 
236
- #: core/core.php:1084
237
  msgid "Exclusion list"
238
  msgstr ""
239
 
240
- #: core/core.php:1085
241
  msgid "Don't check links where the URL contains any of these words (one per line) :"
242
  msgstr ""
243
 
244
- #: core/core.php:1106
245
  msgid "Check links using"
246
  msgstr ""
247
 
248
- #: core/core.php:1125, includes/links.php:1032
249
  msgid "Timeout"
250
  msgstr ""
251
 
252
- #: core/core.php:1131, core/core.php:1226, core/core.php:3667
253
  msgid "%s seconds"
254
  msgstr ""
255
 
256
- #: core/core.php:1140
257
  msgid "Links that take longer than this to load will be marked as broken."
258
  msgstr ""
259
 
260
- #: core/core.php:1147
261
  msgid "Link monitor"
262
  msgstr ""
263
 
264
- #: core/core.php:1159
265
  msgid "Run continuously while the Dashboard is open"
266
  msgstr ""
267
 
268
- #: core/core.php:1171
269
  msgid "Run hourly in the background"
270
  msgstr ""
271
 
272
- #: core/core.php:1179
273
  msgid "Show the dashboard widget for"
274
  msgstr ""
275
 
276
- #: core/core.php:1184
277
  msgctxt "dashboard widget visibility"
278
  msgid "Administrator"
279
  msgstr ""
280
 
281
- #: core/core.php:1185
282
  msgctxt "dashboard widget visibility"
283
  msgid "Editor and above"
284
  msgstr ""
285
 
286
- #: core/core.php:1186
287
  msgctxt "dashboard widget visibility"
288
  msgid "Nobody (disables the widget)"
289
  msgstr ""
290
 
291
- #: core/core.php:1202
292
  msgctxt "settings page"
293
  msgid "Show link actions"
294
  msgstr ""
295
 
296
- #: core/core.php:1220
297
  msgid "Max. execution time"
298
  msgstr ""
299
 
300
- #: core/core.php:1237
301
  msgid "The plugin works by periodically launching a background job that parses your posts for links, checks the discovered URLs, and performs other time-consuming tasks. Here you can set for how long, at most, the link monitor may run each time before stopping."
302
  msgstr ""
303
 
304
- #: core/core.php:1246
305
  msgid "Server load limit"
306
  msgstr ""
307
 
308
- #: core/core.php:1261
309
  msgid "Current load : %s"
310
  msgstr ""
311
 
312
- #: core/core.php:1266
313
  msgid "Link checking will be suspended if the average <a href=\"%s\">server load</a> rises above this number. Leave this field blank to disable load limiting."
314
  msgstr ""
315
 
316
- #: core/core.php:1275
317
  msgid "Not available"
318
  msgstr ""
319
 
320
- #: core/core.php:1277
321
  msgid "Load limiting only works on Linux-like systems where <code>/proc/loadavg</code> is present and accessible."
322
  msgstr ""
323
 
324
- #: core/core.php:1285
325
  msgid "Target resource usage"
326
  msgstr ""
327
 
328
- #: core/core.php:1305
329
  msgid "Logging"
330
  msgstr ""
331
 
332
- #: core/core.php:1311
333
  msgid "Enable logging"
334
  msgstr ""
335
 
336
- #: core/core.php:1318
337
  msgid "Log file location"
338
  msgstr ""
339
 
340
- #: core/core.php:1327
341
  msgctxt "log file location"
342
  msgid "Default"
343
  msgstr ""
344
 
345
- #: core/core.php:1343
346
  msgctxt "log file location"
347
  msgid "Custom"
348
  msgstr ""
349
 
350
- #: core/core.php:1355
 
 
 
 
 
 
 
 
351
  msgid "Forced recheck"
352
  msgstr ""
353
 
354
- #: core/core.php:1358
355
  msgid "Re-check all pages"
356
  msgstr ""
357
 
358
- #: core/core.php:1363
359
  msgid "The \"Nuclear Option\". Click this button to make the plugin empty its link database and recheck the entire site from scratch."
360
  msgstr ""
361
 
362
- #: core/core.php:1375
363
  msgid "Save Changes"
364
  msgstr ""
365
 
366
- #: core/core.php:1426
367
  msgid "Configure"
368
  msgstr ""
369
 
370
- #: core/core.php:1508
371
  msgid "Enter the names of custom fields you want to check (one per line). If a field contains HTML code, prefix its name with <code>html:</code>. For example, <code>html:field_name</code>."
372
  msgstr ""
373
 
374
- #: core/core.php:1522
375
  msgid "Enter the keys of acf fields you want to check (one per line). If a field contains HTML code, prefix its name with <code>html:</code>. For example, <code>html:field_586a3eaa4091b</code>."
376
  msgstr ""
377
 
378
- #: core/core.php:1653, core/core.php:1739, core/core.php:1771
379
  msgid "Database error : %s"
380
  msgstr ""
381
 
382
- #: core/core.php:1720
383
  msgid "You must enter a filter name!"
384
  msgstr ""
385
 
386
- #: core/core.php:1724
387
  msgid "Invalid search query."
388
  msgstr ""
389
 
390
- #: core/core.php:1734
391
  msgid "Filter \"%s\" created"
392
  msgstr ""
393
 
394
- #: core/core.php:1761
395
  msgid "Filter ID not specified."
396
  msgstr ""
397
 
398
- #: core/core.php:1768
399
  msgid "Filter deleted"
400
  msgstr ""
401
 
402
- #: core/core.php:1817
403
  msgid "Replaced %d redirect with a direct link"
404
  msgid_plural "Replaced %d redirects with direct links"
405
  msgstr[0] ""
406
  msgstr[1] ""
407
 
408
- #: core/core.php:1828
409
  msgid "Failed to fix %d redirect"
410
  msgid_plural "Failed to fix %d redirects"
411
  msgstr[0] ""
412
  msgstr[1] ""
413
 
414
- #: core/core.php:1839
415
  msgid "None of the selected links are redirects!"
416
  msgstr ""
417
 
418
- #: core/core.php:1919
419
  msgid "%d link updated."
420
  msgid_plural "%d links updated."
421
  msgstr[0] ""
422
  msgstr[1] ""
423
 
424
- #: core/core.php:1930
425
  msgid "Failed to update %d link."
426
  msgid_plural "Failed to update %d links."
427
  msgstr[0] ""
428
  msgstr[1] ""
429
 
430
- #: core/core.php:2021
431
  msgid "%d link removed"
432
  msgid_plural "%d links removed"
433
  msgstr[0] ""
434
  msgstr[1] ""
435
 
436
- #: core/core.php:2032
437
  msgid "Failed to remove %d link"
438
  msgid_plural "Failed to remove %d links"
439
  msgstr[0] ""
440
  msgstr[1] ""
441
 
442
- #: core/core.php:2142
443
  msgid "%d item was skipped because it can't be moved to the Trash. You need to delete it manually."
444
  msgid_plural "%d items were skipped because they can't be moved to the Trash. You need to delete them manually."
445
  msgstr[0] ""
446
  msgstr[1] ""
447
 
448
- #: core/core.php:2164
449
  msgid "Didn't find anything to delete!"
450
  msgstr ""
451
 
452
- #: core/core.php:2202
453
  msgid "%d link scheduled for rechecking"
454
  msgid_plural "%d links scheduled for rechecking"
455
  msgstr[0] ""
456
  msgstr[1] ""
457
 
458
- #: core/core.php:2251, core/core.php:3088
459
  msgid "This link was manually marked as working by the user."
460
  msgstr ""
461
 
462
- #: core/core.php:2259, core/core.php:2322
463
  msgid "Couldn't modify link %d"
464
  msgstr ""
465
 
466
- #: core/core.php:2270
467
  msgid "%d link marked as not broken"
468
  msgid_plural "%d links marked as not broken"
469
  msgstr[0] ""
470
  msgstr[1] ""
471
 
472
- #: core/core.php:2333
473
  msgid "%d link dismissed"
474
  msgid_plural "%d links dismissed"
475
  msgstr[0] ""
476
  msgstr[1] ""
477
 
478
- #: core/core.php:2390
479
  msgid "The \"Warnings\" page lists problems that are probably temporary or suspected to be false positives.<br> Warnings that persist for a long time will usually be reclassified as broken links."
480
  msgstr ""
481
 
482
- #: core/core.php:2395
483
  msgctxt "admin notice under Tools - Broken links - Warnings"
484
  msgid "Hide notice"
485
  msgstr ""
486
 
487
- #: core/core.php:2401
488
  msgctxt "a link from the admin notice under Tools - Broken links - Warnings"
489
  msgid "Change warning settings"
490
  msgstr ""
491
 
492
- #: core/core.php:2426
493
  msgid "Table columns"
494
  msgstr ""
495
 
496
- #: core/core.php:2445
497
  msgid "Show on screen"
498
  msgstr ""
499
 
500
- #: core/core.php:2452
501
  msgid "links"
502
  msgstr ""
503
 
504
- #: core/core.php:2453, includes/admin/table-printer.php:175
505
  msgid "Apply"
506
  msgstr ""
507
 
508
- #: core/core.php:2457
509
  msgid "Misc"
510
  msgstr ""
511
 
512
- #: core/core.php:2472
513
  msgid "Highlight links broken for at least %s days"
514
  msgstr ""
515
 
516
- #: core/core.php:2481
517
  msgid "Color-code status codes"
518
  msgstr ""
519
 
520
- #: core/core.php:2500, core/core.php:3072, core/core.php:3119, core/core.php:3158, core/core.php:3282, core/core.php:3341, core/core.php:3419
521
  msgid "You're not allowed to do that!"
522
  msgstr ""
523
 
524
- #: core/core.php:2940
525
  msgid "View broken links"
526
  msgstr ""
527
 
528
- #: core/core.php:2941
529
  msgid "Found %d broken link"
530
  msgid_plural "Found %d broken links"
531
  msgstr[0] ""
532
  msgstr[1] ""
533
 
534
- #: core/core.php:2947
535
  msgid "No broken links found."
536
  msgstr ""
537
 
538
- #: core/core.php:2954
539
  msgid "%d URL in the work queue"
540
  msgid_plural "%d URLs in the work queue"
541
  msgstr[0] ""
542
  msgstr[1] ""
543
 
544
- #: core/core.php:2958
545
  msgid "No URLs in the work queue."
546
  msgstr ""
547
 
548
- #: core/core.php:2964
549
  msgctxt "for the \"Detected X unique URLs in Y links\" message"
550
  msgid "%d unique URL"
551
  msgid_plural "%d unique URLs"
552
  msgstr[0] ""
553
  msgstr[1] ""
554
 
555
- #: core/core.php:2968
556
  msgctxt "for the \"Detected X unique URLs in Y links\" message"
557
  msgid "%d link"
558
  msgid_plural "%d links"
559
  msgstr[0] ""
560
  msgstr[1] ""
561
 
562
- #: core/core.php:2974
563
  msgid "Detected %1$s in %2$s and still searching..."
564
  msgstr ""
565
 
566
- #: core/core.php:2980
567
  msgid "Detected %1$s in %2$s."
568
  msgstr ""
569
 
570
- #: core/core.php:2987
571
  msgid "Searching your blog for links..."
572
  msgstr ""
573
 
574
- #: core/core.php:2989
575
  msgid "No links detected."
576
  msgstr ""
577
 
578
- #: core/core.php:3015
579
  msgctxt "current load"
580
  msgid "Unknown"
581
  msgstr ""
582
 
583
- #: core/core.php:3080, core/core.php:3127, core/core.php:3181, core/core.php:3296, core/core.php:3364, core/core.php:3442
584
  msgid "Oops, I can't find the link %d"
585
  msgstr ""
586
 
587
- #: core/core.php:3100, core/core.php:3141
588
  msgid "Oops, couldn't modify the link!"
589
  msgstr ""
590
 
591
- #: core/core.php:3103, core/core.php:3144, core/core.php:3329, core/core.php:3351, core/core.php:3429
592
  msgid "Error : link_id not specified"
593
  msgstr ""
594
 
595
- #: core/core.php:3168
596
  msgid "Error : link_id or new_url not specified"
597
  msgstr ""
598
 
599
- #: core/core.php:3194, core/core.php:3208
600
  msgid "Oops, the new URL is invalid!"
601
  msgstr ""
602
 
603
- #: core/core.php:3228
604
  msgid "An unexpected error occurred!"
605
  msgstr ""
606
 
607
- #: core/core.php:3309
608
  msgid "An unexpected error occured!"
609
  msgstr ""
610
 
611
- #: core/core.php:3477
612
  msgid "You don't have sufficient privileges to access this information!"
613
  msgstr ""
614
 
615
- #: core/core.php:3490
616
  msgid "Error : link ID not specified"
617
  msgstr ""
618
 
619
- #: core/core.php:3504
620
  msgid "Failed to load link details (%s)"
621
  msgstr ""
622
 
623
- #: core/core.php:3558
624
  msgid "Broken Link Checker"
625
  msgstr ""
626
 
627
- #: core/core.php:3597
628
  msgid "You have an old version of CURL. Redirect detection may not work properly."
629
  msgstr ""
630
 
631
- #: core/core.php:3608, core/core.php:3624, core/core.php:3629
632
  msgid "Not installed"
633
  msgstr ""
634
 
635
- #: core/core.php:3617
636
  msgid "Installed"
637
  msgstr ""
638
 
639
- #: core/core.php:3630
640
  msgid "You must have either CURL or Snoopy installed for the plugin to work!"
641
  msgstr ""
642
 
643
- #: core/core.php:3640
644
  msgid "On"
645
  msgstr ""
646
 
647
- #: core/core.php:3641
648
  msgid "Redirects may be detected as broken links when safe_mode is on."
649
  msgstr ""
650
 
651
- #: core/core.php:3646, core/core.php:3660
652
  msgid "Off"
653
  msgstr ""
654
 
655
- #: core/core.php:3654
656
  msgid "On ( %s )"
657
  msgstr ""
658
 
659
- #: core/core.php:3655
660
  msgid "Redirects may be detected as broken links when open_basedir is on."
661
  msgstr ""
662
 
663
- #: core/core.php:3692
664
  msgid "If this value is zero even after several page reloads you have probably encountered a bug."
665
  msgstr ""
666
 
667
- #: core/core.php:3816, core/core.php:3935
668
  msgid "[%s] Broken links detected"
669
  msgstr ""
670
 
671
- #: core/core.php:3821
672
  msgid "Broken Link Checker has detected %d new broken link on your site."
673
  msgid_plural "Broken Link Checker has detected %d new broken links on your site."
674
  msgstr[0] ""
675
  msgstr[1] ""
676
 
677
- #: core/core.php:3852
678
  msgid "Here's a list of the first %d broken links:"
679
  msgid_plural "Here's a list of the first %d broken links:"
680
  msgstr[0] ""
681
  msgstr[1] ""
682
 
683
- #: core/core.php:3861
684
  msgid "Here's a list of the new broken links: "
685
  msgstr ""
686
 
687
- #: core/core.php:3870
688
  msgid "Link text : %s"
689
  msgstr ""
690
 
691
- #: core/core.php:3871
692
  msgid "Link URL : <a href=\"%1$s\">%2$s</a>"
693
  msgstr ""
694
 
695
- #: core/core.php:3872
696
  msgid "Source : %s"
697
  msgstr ""
698
 
699
- #: core/core.php:3886
700
  msgid "You can see all broken links here:"
701
  msgstr ""
702
 
703
- #: core/core.php:3940
704
  msgid "Broken Link Checker has detected %d new broken link in your posts."
705
  msgid_plural "Broken Link Checker has detected %d new broken links in your posts."
706
  msgstr[0] ""
707
  msgstr[1] ""
708
 
709
- #: core/init.php:234
710
  msgid "Every 10 minutes"
711
  msgstr ""
712
 
713
- #: core/init.php:241
714
  msgid "Once Weekly"
715
  msgstr ""
716
 
717
- #: core/init.php:247
718
  msgid "Twice a Month"
719
  msgstr ""
720
 
721
- #: core/init.php:325
722
  msgid "Broken Link Checker installation failed. Try deactivating and then reactivating the plugin."
723
  msgstr ""
724
 
725
- #: core/init.php:329
726
- msgid "Please activate the plugin separately on each site. Network activation is not supported."
727
- msgstr ""
728
-
729
- #: includes/any-post.php:462, modules/containers/acf_field.php:248, modules/containers/blogroll.php:46, modules/containers/comment.php:159, modules/containers/custom_field.php:252
730
  msgid "Edit"
731
  msgstr ""
732
 
733
- #: includes/any-post.php:470, modules/containers/acf_field.php:252, modules/containers/custom_field.php:258
734
  msgid "Move this item to the Trash"
735
  msgstr ""
736
 
737
- #: includes/any-post.php:472, modules/containers/acf_field.php:252, modules/containers/custom_field.php:260
738
  msgid "Trash"
739
  msgstr ""
740
 
741
- #: includes/any-post.php:477, modules/containers/acf_field.php:254, modules/containers/custom_field.php:265
742
  msgid "Delete this item permanently"
743
  msgstr ""
744
 
745
- #: includes/any-post.php:479, modules/containers/acf_field.php:254, modules/containers/blogroll.php:47, modules/containers/custom_field.php:267
746
  msgid "Delete"
747
  msgstr ""
748
 
749
- #: includes/any-post.php:492
750
  msgid "Preview &#8220;%s&#8221;"
751
  msgstr ""
752
 
753
- #: includes/any-post.php:493
754
  msgid "Preview"
755
  msgstr ""
756
 
757
- #: includes/any-post.php:500
758
  msgid "View &#8220;%s&#8221;"
759
  msgstr ""
760
 
761
- #: includes/any-post.php:501, modules/containers/acf_field.php:258, modules/containers/comment.php:172, modules/containers/custom_field.php:272
762
  msgid "View"
763
  msgstr ""
764
 
765
- #: includes/any-post.php:520, modules/containers/acf_field.php:248, modules/containers/custom_field.php:252
766
  msgid "Edit this item"
767
  msgstr ""
768
 
769
- #: includes/any-post.php:584, modules/containers/blogroll.php:83, modules/containers/comment.php:43
770
  msgid "Nothing to update"
771
  msgstr ""
772
 
773
- #: includes/any-post.php:595
774
  msgid "Updating post %d failed"
775
  msgstr ""
776
 
777
- #: includes/any-post.php:656, modules/containers/acf_field.php:327, modules/containers/custom_field.php:341
778
  msgid "Failed to delete post \"%1$s\" (%2$d)"
779
  msgstr ""
780
 
781
- #: includes/any-post.php:675, modules/containers/acf_field.php:341, modules/containers/custom_field.php:360
782
  msgid "Can't move post \"%1$s\" (%2$d) to the trash because the trash feature is disabled"
783
  msgstr ""
784
 
785
- #: includes/any-post.php:695, modules/containers/acf_field.php:353, modules/containers/custom_field.php:379
786
  msgid "Failed to move post \"%1$s\" (%2$d) to the trash"
787
  msgstr ""
788
 
789
- #: includes/any-post.php:803
790
  msgid "%d post deleted."
791
  msgid_plural "%d posts deleted."
792
  msgstr[0] ""
793
  msgstr[1] ""
794
 
795
- #: includes/any-post.php:805
796
  msgid "%d page deleted."
797
  msgid_plural "%d pages deleted."
798
  msgstr[0] ""
799
  msgstr[1] ""
800
 
801
- #: includes/any-post.php:807
802
  msgid "%1$d \"%2$s\" deleted."
803
  msgid_plural "%1$d \"%2$s\" deleted."
804
  msgstr[0] ""
805
  msgstr[1] ""
806
 
807
- #: includes/any-post.php:826
808
  msgid "%d post moved to the Trash."
809
  msgid_plural "%d posts moved to the Trash."
810
  msgstr[0] ""
811
  msgstr[1] ""
812
 
813
- #: includes/any-post.php:828
814
  msgid "%d page moved to the Trash."
815
  msgid_plural "%d pages moved to the Trash."
816
  msgstr[0] ""
817
  msgstr[1] ""
818
 
819
- #: includes/any-post.php:830
820
  msgid "%1$d \"%2$s\" moved to the Trash."
821
  msgid_plural "%1$d \"%2$s\" moved to the Trash."
822
  msgstr[0] ""
@@ -1013,52 +1025,52 @@ msgstr ""
1013
  msgid "The plugin doesn't know how to check this type of link."
1014
  msgstr ""
1015
 
1016
- #: includes/links.php:502
1017
  msgid "Link is broken."
1018
  msgstr ""
1019
 
1020
- #: includes/links.php:504
1021
  msgid "Link is valid."
1022
  msgstr ""
1023
 
1024
- #: includes/links.php:737, includes/links.php:840, includes/links.php:874
1025
  msgid "Link is not valid"
1026
  msgstr ""
1027
 
1028
- #: includes/links.php:754
1029
  msgid "This link can not be edited because it is not used anywhere on this site."
1030
  msgstr ""
1031
 
1032
- #: includes/links.php:780
1033
  msgid "Failed to create a DB entry for the new URL."
1034
  msgstr ""
1035
 
1036
- #: includes/links.php:847
1037
  msgid "This link is not a redirect"
1038
  msgstr ""
1039
 
1040
- #: includes/links.php:901, includes/links.php:938
1041
  msgid "Couldn't delete the link's database record"
1042
  msgstr ""
1043
 
1044
- #: includes/links.php:1015
1045
  msgctxt "link status"
1046
  msgid "Unknown"
1047
  msgstr ""
1048
 
1049
- #: includes/links.php:1028, modules/checkers/http.php:318, modules/extras/mediafire.php:115, modules/extras/youtube.php:136, modules/extras/youtube.php:231
1050
  msgid "Unknown Error"
1051
  msgstr ""
1052
 
1053
- #: includes/links.php:1051
1054
  msgid "Not checked"
1055
  msgstr ""
1056
 
1057
- #: includes/links.php:1054
1058
  msgid "False positive"
1059
  msgstr ""
1060
 
1061
- #: includes/links.php:1057, modules/extras/rapidshare.php:145, modules/extras/rapidshare.php:151, modules/extras/rapidshare.php:178, modules/extras/youtube.php:142, modules/extras/youtube.php:218
1062
  msgctxt "link status"
1063
  msgid "OK"
1064
  msgstr ""
@@ -1135,7 +1147,7 @@ msgstr[1] ""
1135
  msgid "Failed to delete old DB tables. Database error : %s"
1136
  msgstr ""
1137
 
1138
- #: includes/admin/links-page-js.php:64, includes/admin/links-page-js.php:653
1139
  msgid "Wait..."
1140
  msgstr ""
1141
 
@@ -1184,49 +1196,53 @@ msgstr ""
1184
  msgid "Error: Link URL must not be empty."
1185
  msgstr ""
1186
 
1187
- #: includes/admin/links-page-js.php:691
 
 
 
 
1188
  msgid "%d instances of the link were successfully unlinked."
1189
  msgstr ""
1190
 
1191
- #: includes/admin/links-page-js.php:697
1192
  msgid "However, %d instances couldn't be removed."
1193
  msgstr ""
1194
 
1195
- #: includes/admin/links-page-js.php:702
1196
  msgid "The plugin failed to remove the link."
1197
  msgstr ""
1198
 
1199
- #: includes/admin/links-page-js.php:705
1200
  msgid "The following error(s) occured :"
1201
  msgstr ""
1202
 
1203
- #: includes/admin/links-page-js.php:751
1204
  msgid "Enter a name for the new custom filter"
1205
  msgstr ""
1206
 
1207
- #: includes/admin/links-page-js.php:763
1208
  msgid ""
1209
  "You are about to delete the current filter.\n"
1210
  "'Cancel' to stop, 'OK' to delete"
1211
  msgstr ""
1212
 
1213
- #: includes/admin/links-page-js.php:787
1214
  msgid ""
1215
  "Are you sure you want to delete all posts, bookmarks or other items that contain any of the selected links? This action can't be undone.\n"
1216
  "'Cancel' to stop, 'OK' to delete"
1217
  msgstr ""
1218
 
1219
- #: includes/admin/links-page-js.php:801
1220
  msgid ""
1221
  "Are you sure you want to remove the selected links? This action can't be undone.\n"
1222
  "'Cancel' to stop, 'OK' to remove"
1223
  msgstr ""
1224
 
1225
- #: includes/admin/links-page-js.php:931
1226
  msgid "Enter a search string first."
1227
  msgstr ""
1228
 
1229
- #: includes/admin/links-page-js.php:938
1230
  msgid "Select one or more links to edit."
1231
  msgstr ""
1232
 
@@ -1362,10 +1378,6 @@ msgstr ""
1362
  msgid "Link last checked"
1363
  msgstr ""
1364
 
1365
- #: includes/admin/table-printer.php:548
1366
- msgid "Never"
1367
- msgstr ""
1368
-
1369
  #: includes/admin/table-printer.php:566
1370
  msgid "Response time"
1371
  msgstr ""
@@ -1478,19 +1490,19 @@ msgstr ""
1478
  msgid "Use this URL"
1479
  msgstr ""
1480
 
1481
- #: modules/checkers/http.php:295
1482
  msgid "Server Not Found"
1483
  msgstr ""
1484
 
1485
- #: modules/checkers/http.php:311
1486
  msgid "Connection Failed"
1487
  msgstr ""
1488
 
1489
- #: modules/checkers/http.php:359, modules/checkers/http.php:444
1490
  msgid "HTTP code : %d"
1491
  msgstr ""
1492
 
1493
- #: modules/checkers/http.php:361, modules/checkers/http.php:446
1494
  msgid "(No response)"
1495
  msgstr ""
1496
 
@@ -1498,12 +1510,12 @@ msgstr ""
1498
  msgid "Most likely the connection timed out or the domain doesn't exist."
1499
  msgstr ""
1500
 
1501
- #: modules/checkers/http.php:454
1502
  msgid "Request timed out."
1503
  msgstr ""
1504
 
1505
- #: modules/checkers/http.php:473
1506
- msgid "Using Snoopy"
1507
  msgstr ""
1508
 
1509
  #: modules/containers/acf_field.php:102, modules/containers/custom_field.php:107
@@ -1679,44 +1691,44 @@ msgstr ""
1679
  msgid "Embedded YouTube playlist"
1680
  msgstr ""
1681
 
1682
- #: modules/extras/youtube.php:141
1683
  msgid "Video OK"
1684
  msgstr ""
1685
 
1686
- #: modules/extras/youtube.php:152, modules/extras/youtube.php:155
1687
  msgid "Video Not Found"
1688
  msgstr ""
1689
 
1690
- #: modules/extras/youtube.php:174, modules/extras/youtube.php:177
1691
  msgid "Playlist Not Found"
1692
  msgstr ""
1693
 
1694
- #: modules/extras/youtube.php:184
1695
  msgid "Playlist Restricted"
1696
  msgstr ""
1697
 
1698
- #: modules/extras/youtube.php:191
1699
  msgid "This playlist has no entries or all entries have been deleted."
1700
  msgstr ""
1701
 
1702
- #: modules/extras/youtube.php:192
1703
  msgctxt "link status"
1704
  msgid "Empty Playlist"
1705
  msgstr ""
1706
 
1707
- #: modules/extras/youtube.php:202
1708
  msgid "Video status : %1$s%2$s"
1709
  msgstr ""
1710
 
1711
- #: modules/extras/youtube.php:208
1712
  msgid "Video Restricted"
1713
  msgstr ""
1714
 
1715
- #: modules/extras/youtube.php:217
1716
  msgid "Playlist OK"
1717
  msgstr ""
1718
 
1719
- #: modules/extras/youtube.php:265
1720
  msgid "Unknown YouTube API response received."
1721
  msgstr ""
1722
 
1
+ # Copyright (C) 2020 Broken Link Checker 1.11.13
2
+ # This file is distributed under the same license as the Broken Link Checker 1.11.13 package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Broken Link Checker 1.11.13\n"
6
  "MIME-Version: 1.0\n"
7
  "Content-Type: text/plain; charset=UTF-8\n"
8
  "Content-Transfer-Encoding: 8bit\n"
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
+ #: core/core.php:211, includes/admin/links-page-js.php:45
17
  msgid "Loading..."
18
  msgstr ""
19
 
20
+ #: core/core.php:235, includes/admin/options-page-js.php:18
21
  msgid "[ Network error ]"
22
  msgstr ""
23
 
24
+ #: core/core.php:278
25
  msgid "Automatically expand the widget if broken links have been detected"
26
  msgstr ""
27
 
28
+ #: core/core.php:374
29
  msgid "Link Checker Settings"
30
  msgstr ""
31
 
32
+ #: core/core.php:375
33
  msgid "Link Checker"
34
  msgstr ""
35
 
36
+ #: core/core.php:381, includes/link-query.php:37
37
  msgid "Broken Links"
38
  msgstr ""
39
 
40
+ #: core/core.php:397
41
  msgid "View Broken Links"
42
  msgstr ""
43
 
44
+ #: core/core.php:413
45
  msgid "Go to Broken Links"
46
  msgstr ""
47
 
48
+ #: core/core.php:431
49
  msgid "Settings"
50
  msgstr ""
51
 
52
+ #: core/core.php:469, includes/admin/table-printer.php:292, includes/admin/table-printer.php:710
53
  msgid "Edit URL"
54
  msgstr ""
55
 
56
+ #: core/core.php:470, includes/admin/links-page-js.php:716, includes/admin/table-printer.php:297, includes/admin/table-printer.php:713
57
  msgid "Unlink"
58
  msgstr ""
59
 
60
+ #: core/core.php:471, includes/admin/links-page-js.php:111, includes/admin/table-printer.php:719
61
  msgid "Not broken"
62
  msgstr ""
63
 
64
+ #: core/core.php:472, includes/admin/table-printer.php:296, includes/admin/table-printer.php:727
65
  msgid "Dismiss"
66
  msgstr ""
67
 
68
+ #: core/core.php:473, includes/admin/table-printer.php:293, includes/admin/table-printer.php:739
69
  msgid "Recheck"
70
  msgstr ""
71
 
72
+ #: core/core.php:474, includes/admin/table-printer.php:747
73
  msgctxt "link action; replace one redirect with a direct link"
74
  msgid "Fix redirect"
75
  msgstr ""
76
 
77
+ #: core/core.php:750
78
  msgid "Settings saved."
79
  msgstr ""
80
 
81
+ #: core/core.php:756
82
  msgid "Thank you for your donation!"
83
  msgstr ""
84
 
85
+ #: core/core.php:764
86
  msgid "Complete site recheck started."
87
  msgstr ""
88
 
89
+ #: core/core.php:787
90
  msgid "General"
91
  msgstr ""
92
 
93
+ #: core/core.php:788
94
  msgid "Look For Links In"
95
  msgstr ""
96
 
97
+ #: core/core.php:789
98
  msgid "Which Links To Check"
99
  msgstr ""
100
 
101
+ #: core/core.php:790
102
  msgid "Protocols & APIs"
103
  msgstr ""
104
 
105
+ #: core/core.php:791
106
  msgid "Advanced"
107
  msgstr ""
108
 
109
+ #: core/core.php:806
110
  msgid "Broken Link Checker Options"
111
  msgstr ""
112
 
113
+ #: core/core.php:850, includes/admin/table-printer.php:215
114
  msgid "Status"
115
  msgstr ""
116
 
117
+ #: core/core.php:852, includes/admin/options-page-js.php:56
118
  msgid "Show debug info"
119
  msgstr ""
120
 
121
+ #: core/core.php:880
122
  msgid "Check each link"
123
  msgstr ""
124
 
125
+ #: core/core.php:885
126
  msgid "Every %s hours"
127
  msgstr ""
128
 
129
+ #: core/core.php:894
130
  msgid "Existing links will be checked this often. New links will usually be checked ASAP."
131
  msgstr ""
132
 
133
+ #: core/core.php:901
134
  msgid "E-mail notifications"
135
  msgstr ""
136
 
137
+ #: core/core.php:911
138
  msgid "Send me e-mail notifications about newly detected broken links"
139
  msgstr ""
140
 
141
+ #: core/core.php:923
142
  msgid "Send authors e-mail notifications about broken links in their posts"
143
  msgstr ""
144
 
145
+ #: core/core.php:930
146
  msgid "Notification e-mail address"
147
  msgstr ""
148
 
149
+ #: core/core.php:942
150
  msgid "Leave empty to use the e-mail address specified in Settings &rarr; General."
151
  msgstr ""
152
 
153
+ #: core/core.php:949
154
  msgid "Link tweaks"
155
  msgstr ""
156
 
157
+ #: core/core.php:959
158
  msgid "Apply custom formatting to broken links"
159
  msgstr ""
160
 
161
+ #: core/core.php:964, core/core.php:1007
162
  msgid "Edit CSS"
163
  msgstr ""
164
 
165
+ #: core/core.php:986
166
  msgid "Example : Lorem ipsum <a %s>broken link</a>, dolor sit amet."
167
  msgstr ""
168
 
169
+ #: core/core.php:989, core/core.php:1033
170
  msgid "Click \"Save Changes\" to update example output."
171
  msgstr ""
172
 
173
+ #: core/core.php:1002
174
  msgid "Apply custom formatting to removed links"
175
  msgstr ""
176
 
177
+ #: core/core.php:1030
178
  msgid "Example : Lorem ipsum <span %s>removed link</span>, dolor sit amet."
179
  msgstr ""
180
 
181
+ #: core/core.php:1047
182
  msgid "Stop search engines from following broken links"
183
  msgstr ""
184
 
185
+ #: core/core.php:1053
186
  msgctxt "\"Link tweaks\" settings"
187
  msgid "These settings only apply to the content of posts, not comments or custom fields."
188
  msgstr ""
189
 
190
+ #: core/core.php:1064
191
  msgctxt "settings page"
192
  msgid "Suggestions"
193
  msgstr ""
194
 
195
+ #: core/core.php:1069
196
  msgid "Suggest alternatives to broken links"
197
  msgstr ""
198
 
199
+ #: core/core.php:1075
200
  msgctxt "settings page"
201
  msgid "Warnings"
202
  msgstr ""
203
 
204
+ #: core/core.php:1080
205
  msgid "Show uncertain or minor problems as \"warnings\" instead of \"broken\""
206
  msgstr ""
207
 
208
+ #: core/core.php:1084
209
  msgid "Turning off this option will make the plugin report all problems as broken links."
210
  msgstr ""
211
 
212
+ #: core/core.php:1091
213
  msgid "YouTube API Key"
214
  msgstr ""
215
 
216
+ #: core/core.php:1103
217
  msgid "Use your own %1$sapi key%2$s for checking youtube links."
218
  msgstr ""
219
 
220
+ #: core/core.php:1110
221
+ msgid "Post Modified Date"
222
+ msgstr ""
223
+
224
+ #: core/core.php:1115
225
+ msgid "Disable post modified date change when link is edited"
226
+ msgstr ""
227
+
228
+ #: core/core.php:1130
229
  msgid "Look for links in"
230
  msgstr ""
231
 
232
+ #: core/core.php:1146
233
  msgid "Post statuses"
234
  msgstr ""
235
 
236
+ #: core/core.php:1179
237
  msgid "Link types"
238
  msgstr ""
239
 
240
+ #: core/core.php:1185
241
  msgid "Error : All link parsers missing!"
242
  msgstr ""
243
 
244
+ #: core/core.php:1192
245
  msgid "Exclusion list"
246
  msgstr ""
247
 
248
+ #: core/core.php:1193
249
  msgid "Don't check links where the URL contains any of these words (one per line) :"
250
  msgstr ""
251
 
252
+ #: core/core.php:1214
253
  msgid "Check links using"
254
  msgstr ""
255
 
256
+ #: core/core.php:1233, includes/links.php:1033
257
  msgid "Timeout"
258
  msgstr ""
259
 
260
+ #: core/core.php:1239, core/core.php:1334, core/core.php:3800
261
  msgid "%s seconds"
262
  msgstr ""
263
 
264
+ #: core/core.php:1248
265
  msgid "Links that take longer than this to load will be marked as broken."
266
  msgstr ""
267
 
268
+ #: core/core.php:1255
269
  msgid "Link monitor"
270
  msgstr ""
271
 
272
+ #: core/core.php:1267
273
  msgid "Run continuously while the Dashboard is open"
274
  msgstr ""
275
 
276
+ #: core/core.php:1279
277
  msgid "Run hourly in the background"
278
  msgstr ""
279
 
280
+ #: core/core.php:1287
281
  msgid "Show the dashboard widget for"
282
  msgstr ""
283
 
284
+ #: core/core.php:1292
285
  msgctxt "dashboard widget visibility"
286
  msgid "Administrator"
287
  msgstr ""
288
 
289
+ #: core/core.php:1293
290
  msgctxt "dashboard widget visibility"
291
  msgid "Editor and above"
292
  msgstr ""
293
 
294
+ #: core/core.php:1294
295
  msgctxt "dashboard widget visibility"
296
  msgid "Nobody (disables the widget)"
297
  msgstr ""
298
 
299
+ #: core/core.php:1310
300
  msgctxt "settings page"
301
  msgid "Show link actions"
302
  msgstr ""
303
 
304
+ #: core/core.php:1328
305
  msgid "Max. execution time"
306
  msgstr ""
307
 
308
+ #: core/core.php:1345
309
  msgid "The plugin works by periodically launching a background job that parses your posts for links, checks the discovered URLs, and performs other time-consuming tasks. Here you can set for how long, at most, the link monitor may run each time before stopping."
310
  msgstr ""
311
 
312
+ #: core/core.php:1354
313
  msgid "Server load limit"
314
  msgstr ""
315
 
316
+ #: core/core.php:1369
317
  msgid "Current load : %s"
318
  msgstr ""
319
 
320
+ #: core/core.php:1374
321
  msgid "Link checking will be suspended if the average <a href=\"%s\">server load</a> rises above this number. Leave this field blank to disable load limiting."
322
  msgstr ""
323
 
324
+ #: core/core.php:1383
325
  msgid "Not available"
326
  msgstr ""
327
 
328
+ #: core/core.php:1385
329
  msgid "Load limiting only works on Linux-like systems where <code>/proc/loadavg</code> is present and accessible."
330
  msgstr ""
331
 
332
+ #: core/core.php:1393
333
  msgid "Target resource usage"
334
  msgstr ""
335
 
336
+ #: core/core.php:1413
337
  msgid "Logging"
338
  msgstr ""
339
 
340
+ #: core/core.php:1419
341
  msgid "Enable logging"
342
  msgstr ""
343
 
344
+ #: core/core.php:1426
345
  msgid "Log file location"
346
  msgstr ""
347
 
348
+ #: core/core.php:1435
349
  msgctxt "log file location"
350
  msgid "Default"
351
  msgstr ""
352
 
353
+ #: core/core.php:1451
354
  msgctxt "log file location"
355
  msgid "Custom"
356
  msgstr ""
357
 
358
+ #: core/core.php:1461
359
+ msgid "Log file clear schedule"
360
+ msgstr ""
361
+
362
+ #: core/core.php:1467, includes/admin/table-printer.php:548
363
+ msgid "Never"
364
+ msgstr ""
365
+
366
+ #: core/core.php:1488
367
  msgid "Forced recheck"
368
  msgstr ""
369
 
370
+ #: core/core.php:1491
371
  msgid "Re-check all pages"
372
  msgstr ""
373
 
374
+ #: core/core.php:1496
375
  msgid "The \"Nuclear Option\". Click this button to make the plugin empty its link database and recheck the entire site from scratch."
376
  msgstr ""
377
 
378
+ #: core/core.php:1508
379
  msgid "Save Changes"
380
  msgstr ""
381
 
382
+ #: core/core.php:1559
383
  msgid "Configure"
384
  msgstr ""
385
 
386
+ #: core/core.php:1641
387
  msgid "Enter the names of custom fields you want to check (one per line). If a field contains HTML code, prefix its name with <code>html:</code>. For example, <code>html:field_name</code>."
388
  msgstr ""
389
 
390
+ #: core/core.php:1655
391
  msgid "Enter the keys of acf fields you want to check (one per line). If a field contains HTML code, prefix its name with <code>html:</code>. For example, <code>html:field_586a3eaa4091b</code>."
392
  msgstr ""
393
 
394
+ #: core/core.php:1786, core/core.php:1872, core/core.php:1904
395
  msgid "Database error : %s"
396
  msgstr ""
397
 
398
+ #: core/core.php:1853
399
  msgid "You must enter a filter name!"
400
  msgstr ""
401
 
402
+ #: core/core.php:1857
403
  msgid "Invalid search query."
404
  msgstr ""
405
 
406
+ #: core/core.php:1867
407
  msgid "Filter \"%s\" created"
408
  msgstr ""
409
 
410
+ #: core/core.php:1894
411
  msgid "Filter ID not specified."
412
  msgstr ""
413
 
414
+ #: core/core.php:1901
415
  msgid "Filter deleted"
416
  msgstr ""
417
 
418
+ #: core/core.php:1950
419
  msgid "Replaced %d redirect with a direct link"
420
  msgid_plural "Replaced %d redirects with direct links"
421
  msgstr[0] ""
422
  msgstr[1] ""
423
 
424
+ #: core/core.php:1961
425
  msgid "Failed to fix %d redirect"
426
  msgid_plural "Failed to fix %d redirects"
427
  msgstr[0] ""
428
  msgstr[1] ""
429
 
430
+ #: core/core.php:1972
431
  msgid "None of the selected links are redirects!"
432
  msgstr ""
433
 
434
+ #: core/core.php:2052
435
  msgid "%d link updated."
436
  msgid_plural "%d links updated."
437
  msgstr[0] ""
438
  msgstr[1] ""
439
 
440
+ #: core/core.php:2063
441
  msgid "Failed to update %d link."
442
  msgid_plural "Failed to update %d links."
443
  msgstr[0] ""
444
  msgstr[1] ""
445
 
446
+ #: core/core.php:2154
447
  msgid "%d link removed"
448
  msgid_plural "%d links removed"
449
  msgstr[0] ""
450
  msgstr[1] ""
451
 
452
+ #: core/core.php:2165
453
  msgid "Failed to remove %d link"
454
  msgid_plural "Failed to remove %d links"
455
  msgstr[0] ""
456
  msgstr[1] ""
457
 
458
+ #: core/core.php:2275
459
  msgid "%d item was skipped because it can't be moved to the Trash. You need to delete it manually."
460
  msgid_plural "%d items were skipped because they can't be moved to the Trash. You need to delete them manually."
461
  msgstr[0] ""
462
  msgstr[1] ""
463
 
464
+ #: core/core.php:2297
465
  msgid "Didn't find anything to delete!"
466
  msgstr ""
467
 
468
+ #: core/core.php:2335
469
  msgid "%d link scheduled for rechecking"
470
  msgid_plural "%d links scheduled for rechecking"
471
  msgstr[0] ""
472
  msgstr[1] ""
473
 
474
+ #: core/core.php:2384, core/core.php:3221
475
  msgid "This link was manually marked as working by the user."
476
  msgstr ""
477
 
478
+ #: core/core.php:2392, core/core.php:2455
479
  msgid "Couldn't modify link %d"
480
  msgstr ""
481
 
482
+ #: core/core.php:2403
483
  msgid "%d link marked as not broken"
484
  msgid_plural "%d links marked as not broken"
485
  msgstr[0] ""
486
  msgstr[1] ""
487
 
488
+ #: core/core.php:2466
489
  msgid "%d link dismissed"
490
  msgid_plural "%d links dismissed"
491
  msgstr[0] ""
492
  msgstr[1] ""
493
 
494
+ #: core/core.php:2523
495
  msgid "The \"Warnings\" page lists problems that are probably temporary or suspected to be false positives.<br> Warnings that persist for a long time will usually be reclassified as broken links."
496
  msgstr ""
497
 
498
+ #: core/core.php:2528
499
  msgctxt "admin notice under Tools - Broken links - Warnings"
500
  msgid "Hide notice"
501
  msgstr ""
502
 
503
+ #: core/core.php:2534
504
  msgctxt "a link from the admin notice under Tools - Broken links - Warnings"
505
  msgid "Change warning settings"
506
  msgstr ""
507
 
508
+ #: core/core.php:2559
509
  msgid "Table columns"
510
  msgstr ""
511
 
512
+ #: core/core.php:2578
513
  msgid "Show on screen"
514
  msgstr ""
515
 
516
+ #: core/core.php:2585
517
  msgid "links"
518
  msgstr ""
519
 
520
+ #: core/core.php:2586, includes/admin/table-printer.php:175
521
  msgid "Apply"
522
  msgstr ""
523
 
524
+ #: core/core.php:2590
525
  msgid "Misc"
526
  msgstr ""
527
 
528
+ #: core/core.php:2605
529
  msgid "Highlight links broken for at least %s days"
530
  msgstr ""
531
 
532
+ #: core/core.php:2614
533
  msgid "Color-code status codes"
534
  msgstr ""
535
 
536
+ #: core/core.php:2633, core/core.php:3205, core/core.php:3252, core/core.php:3291, core/core.php:3415, core/core.php:3474, core/core.php:3552
537
  msgid "You're not allowed to do that!"
538
  msgstr ""
539
 
540
+ #: core/core.php:3073
541
  msgid "View broken links"
542
  msgstr ""
543
 
544
+ #: core/core.php:3074
545
  msgid "Found %d broken link"
546
  msgid_plural "Found %d broken links"
547
  msgstr[0] ""
548
  msgstr[1] ""
549
 
550
+ #: core/core.php:3080
551
  msgid "No broken links found."
552
  msgstr ""
553
 
554
+ #: core/core.php:3087
555
  msgid "%d URL in the work queue"
556
  msgid_plural "%d URLs in the work queue"
557
  msgstr[0] ""
558
  msgstr[1] ""
559
 
560
+ #: core/core.php:3091
561
  msgid "No URLs in the work queue."
562
  msgstr ""
563
 
564
+ #: core/core.php:3097
565
  msgctxt "for the \"Detected X unique URLs in Y links\" message"
566
  msgid "%d unique URL"
567
  msgid_plural "%d unique URLs"
568
  msgstr[0] ""
569
  msgstr[1] ""
570
 
571
+ #: core/core.php:3101
572
  msgctxt "for the \"Detected X unique URLs in Y links\" message"
573
  msgid "%d link"
574
  msgid_plural "%d links"
575
  msgstr[0] ""
576
  msgstr[1] ""
577
 
578
+ #: core/core.php:3107
579
  msgid "Detected %1$s in %2$s and still searching..."
580
  msgstr ""
581
 
582
+ #: core/core.php:3113
583
  msgid "Detected %1$s in %2$s."
584
  msgstr ""
585
 
586
+ #: core/core.php:3120
587
  msgid "Searching your blog for links..."
588
  msgstr ""
589
 
590
+ #: core/core.php:3122
591
  msgid "No links detected."
592
  msgstr ""
593
 
594
+ #: core/core.php:3148
595
  msgctxt "current load"
596
  msgid "Unknown"
597
  msgstr ""
598
 
599
+ #: core/core.php:3213, core/core.php:3260, core/core.php:3314, core/core.php:3429, core/core.php:3497, core/core.php:3575
600
  msgid "Oops, I can't find the link %d"
601
  msgstr ""
602
 
603
+ #: core/core.php:3233, core/core.php:3274
604
  msgid "Oops, couldn't modify the link!"
605
  msgstr ""
606
 
607
+ #: core/core.php:3236, core/core.php:3277, core/core.php:3462, core/core.php:3484, core/core.php:3562
608
  msgid "Error : link_id not specified"
609
  msgstr ""
610
 
611
+ #: core/core.php:3301
612
  msgid "Error : link_id or new_url not specified"
613
  msgstr ""
614
 
615
+ #: core/core.php:3327, core/core.php:3341
616
  msgid "Oops, the new URL is invalid!"
617
  msgstr ""
618
 
619
+ #: core/core.php:3361
620
  msgid "An unexpected error occurred!"
621
  msgstr ""
622
 
623
+ #: core/core.php:3442
624
  msgid "An unexpected error occured!"
625
  msgstr ""
626
 
627
+ #: core/core.php:3610
628
  msgid "You don't have sufficient privileges to access this information!"
629
  msgstr ""
630
 
631
+ #: core/core.php:3623
632
  msgid "Error : link ID not specified"
633
  msgstr ""
634
 
635
+ #: core/core.php:3637
636
  msgid "Failed to load link details (%s)"
637
  msgstr ""
638
 
639
+ #: core/core.php:3691
640
  msgid "Broken Link Checker"
641
  msgstr ""
642
 
643
+ #: core/core.php:3730
644
  msgid "You have an old version of CURL. Redirect detection may not work properly."
645
  msgstr ""
646
 
647
+ #: core/core.php:3741, core/core.php:3757, core/core.php:3762
648
  msgid "Not installed"
649
  msgstr ""
650
 
651
+ #: core/core.php:3750
652
  msgid "Installed"
653
  msgstr ""
654
 
655
+ #: core/core.php:3763
656
  msgid "You must have either CURL or Snoopy installed for the plugin to work!"
657
  msgstr ""
658
 
659
+ #: core/core.php:3773
660
  msgid "On"
661
  msgstr ""
662
 
663
+ #: core/core.php:3774
664
  msgid "Redirects may be detected as broken links when safe_mode is on."
665
  msgstr ""
666
 
667
+ #: core/core.php:3779, core/core.php:3793
668
  msgid "Off"
669
  msgstr ""
670
 
671
+ #: core/core.php:3787
672
  msgid "On ( %s )"
673
  msgstr ""
674
 
675
+ #: core/core.php:3788
676
  msgid "Redirects may be detected as broken links when open_basedir is on."
677
  msgstr ""
678
 
679
+ #: core/core.php:3825
680
  msgid "If this value is zero even after several page reloads you have probably encountered a bug."
681
  msgstr ""
682
 
683
+ #: core/core.php:3954, core/core.php:4073
684
  msgid "[%s] Broken links detected"
685
  msgstr ""
686
 
687
+ #: core/core.php:3959
688
  msgid "Broken Link Checker has detected %d new broken link on your site."
689
  msgid_plural "Broken Link Checker has detected %d new broken links on your site."
690
  msgstr[0] ""
691
  msgstr[1] ""
692
 
693
+ #: core/core.php:3990
694
  msgid "Here's a list of the first %d broken links:"
695
  msgid_plural "Here's a list of the first %d broken links:"
696
  msgstr[0] ""
697
  msgstr[1] ""
698
 
699
+ #: core/core.php:3999
700
  msgid "Here's a list of the new broken links: "
701
  msgstr ""
702
 
703
+ #: core/core.php:4008
704
  msgid "Link text : %s"
705
  msgstr ""
706
 
707
+ #: core/core.php:4009
708
  msgid "Link URL : <a href=\"%1$s\">%2$s</a>"
709
  msgstr ""
710
 
711
+ #: core/core.php:4010
712
  msgid "Source : %s"
713
  msgstr ""
714
 
715
+ #: core/core.php:4024
716
  msgid "You can see all broken links here:"
717
  msgstr ""
718
 
719
+ #: core/core.php:4078
720
  msgid "Broken Link Checker has detected %d new broken link in your posts."
721
  msgid_plural "Broken Link Checker has detected %d new broken links in your posts."
722
  msgstr[0] ""
723
  msgstr[1] ""
724
 
725
+ #: core/init.php:237
726
  msgid "Every 10 minutes"
727
  msgstr ""
728
 
729
+ #: core/init.php:244
730
  msgid "Once Weekly"
731
  msgstr ""
732
 
733
+ #: core/init.php:250
734
  msgid "Twice a Month"
735
  msgstr ""
736
 
737
+ #: core/init.php:323
738
  msgid "Broken Link Checker installation failed. Try deactivating and then reactivating the plugin."
739
  msgstr ""
740
 
741
+ #: includes/any-post.php:477, modules/containers/acf_field.php:248, modules/containers/blogroll.php:46, modules/containers/comment.php:159, modules/containers/custom_field.php:252
 
 
 
 
742
  msgid "Edit"
743
  msgstr ""
744
 
745
+ #: includes/any-post.php:485, modules/containers/acf_field.php:252, modules/containers/custom_field.php:258
746
  msgid "Move this item to the Trash"
747
  msgstr ""
748
 
749
+ #: includes/any-post.php:487, modules/containers/acf_field.php:252, modules/containers/custom_field.php:260
750
  msgid "Trash"
751
  msgstr ""
752
 
753
+ #: includes/any-post.php:492, modules/containers/acf_field.php:254, modules/containers/custom_field.php:265
754
  msgid "Delete this item permanently"
755
  msgstr ""
756
 
757
+ #: includes/any-post.php:494, modules/containers/acf_field.php:254, modules/containers/blogroll.php:47, modules/containers/custom_field.php:267
758
  msgid "Delete"
759
  msgstr ""
760
 
761
+ #: includes/any-post.php:507
762
  msgid "Preview &#8220;%s&#8221;"
763
  msgstr ""
764
 
765
+ #: includes/any-post.php:508
766
  msgid "Preview"
767
  msgstr ""
768
 
769
+ #: includes/any-post.php:515
770
  msgid "View &#8220;%s&#8221;"
771
  msgstr ""
772
 
773
+ #: includes/any-post.php:516, modules/containers/acf_field.php:258, modules/containers/comment.php:172, modules/containers/custom_field.php:272
774
  msgid "View"
775
  msgstr ""
776
 
777
+ #: includes/any-post.php:535, modules/containers/acf_field.php:248, modules/containers/custom_field.php:252
778
  msgid "Edit this item"
779
  msgstr ""
780
 
781
+ #: includes/any-post.php:599, modules/containers/blogroll.php:83, modules/containers/comment.php:43
782
  msgid "Nothing to update"
783
  msgstr ""
784
 
785
+ #: includes/any-post.php:613
786
  msgid "Updating post %d failed"
787
  msgstr ""
788
 
789
+ #: includes/any-post.php:674, modules/containers/acf_field.php:327, modules/containers/custom_field.php:341
790
  msgid "Failed to delete post \"%1$s\" (%2$d)"
791
  msgstr ""
792
 
793
+ #: includes/any-post.php:693, modules/containers/acf_field.php:341, modules/containers/custom_field.php:360
794
  msgid "Can't move post \"%1$s\" (%2$d) to the trash because the trash feature is disabled"
795
  msgstr ""
796
 
797
+ #: includes/any-post.php:713, modules/containers/acf_field.php:353, modules/containers/custom_field.php:379
798
  msgid "Failed to move post \"%1$s\" (%2$d) to the trash"
799
  msgstr ""
800
 
801
+ #: includes/any-post.php:820
802
  msgid "%d post deleted."
803
  msgid_plural "%d posts deleted."
804
  msgstr[0] ""
805
  msgstr[1] ""
806
 
807
+ #: includes/any-post.php:822
808
  msgid "%d page deleted."
809
  msgid_plural "%d pages deleted."
810
  msgstr[0] ""
811
  msgstr[1] ""
812
 
813
+ #: includes/any-post.php:824
814
  msgid "%1$d \"%2$s\" deleted."
815
  msgid_plural "%1$d \"%2$s\" deleted."
816
  msgstr[0] ""
817
  msgstr[1] ""
818
 
819
+ #: includes/any-post.php:843
820
  msgid "%d post moved to the Trash."
821
  msgid_plural "%d posts moved to the Trash."
822
  msgstr[0] ""
823
  msgstr[1] ""
824
 
825
+ #: includes/any-post.php:845
826
  msgid "%d page moved to the Trash."
827
  msgid_plural "%d pages moved to the Trash."
828
  msgstr[0] ""
829
  msgstr[1] ""
830
 
831
+ #: includes/any-post.php:847
832
  msgid "%1$d \"%2$s\" moved to the Trash."
833
  msgid_plural "%1$d \"%2$s\" moved to the Trash."
834
  msgstr[0] ""
1025
  msgid "The plugin doesn't know how to check this type of link."
1026
  msgstr ""
1027
 
1028
+ #: includes/links.php:503
1029
  msgid "Link is broken."
1030
  msgstr ""
1031
 
1032
+ #: includes/links.php:505
1033
  msgid "Link is valid."
1034
  msgstr ""
1035
 
1036
+ #: includes/links.php:738, includes/links.php:841, includes/links.php:875
1037
  msgid "Link is not valid"
1038
  msgstr ""
1039
 
1040
+ #: includes/links.php:755
1041
  msgid "This link can not be edited because it is not used anywhere on this site."
1042
  msgstr ""
1043
 
1044
+ #: includes/links.php:781
1045
  msgid "Failed to create a DB entry for the new URL."
1046
  msgstr ""
1047
 
1048
+ #: includes/links.php:848
1049
  msgid "This link is not a redirect"
1050
  msgstr ""
1051
 
1052
+ #: includes/links.php:902, includes/links.php:939
1053
  msgid "Couldn't delete the link's database record"
1054
  msgstr ""
1055
 
1056
+ #: includes/links.php:1016
1057
  msgctxt "link status"
1058
  msgid "Unknown"
1059
  msgstr ""
1060
 
1061
+ #: includes/links.php:1029, modules/checkers/http.php:312, modules/checkers/http.php:316, modules/extras/mediafire.php:115, modules/extras/youtube.php:135, modules/extras/youtube.php:230
1062
  msgid "Unknown Error"
1063
  msgstr ""
1064
 
1065
+ #: includes/links.php:1052
1066
  msgid "Not checked"
1067
  msgstr ""
1068
 
1069
+ #: includes/links.php:1055
1070
  msgid "False positive"
1071
  msgstr ""
1072
 
1073
+ #: includes/links.php:1058, modules/extras/rapidshare.php:145, modules/extras/rapidshare.php:151, modules/extras/rapidshare.php:178, modules/extras/youtube.php:141, modules/extras/youtube.php:217
1074
  msgctxt "link status"
1075
  msgid "OK"
1076
  msgstr ""
1147
  msgid "Failed to delete old DB tables. Database error : %s"
1148
  msgstr ""
1149
 
1150
+ #: includes/admin/links-page-js.php:64, includes/admin/links-page-js.php:659
1151
  msgid "Wait..."
1152
  msgstr ""
1153
 
1196
  msgid "Error: Link URL must not be empty."
1197
  msgstr ""
1198
 
1199
+ #: includes/admin/links-page-js.php:654
1200
+ msgid "Are you sure you want to unlink and remove this link from all posts?"
1201
+ msgstr ""
1202
+
1203
+ #: includes/admin/links-page-js.php:694
1204
  msgid "%d instances of the link were successfully unlinked."
1205
  msgstr ""
1206
 
1207
+ #: includes/admin/links-page-js.php:700
1208
  msgid "However, %d instances couldn't be removed."
1209
  msgstr ""
1210
 
1211
+ #: includes/admin/links-page-js.php:705
1212
  msgid "The plugin failed to remove the link."
1213
  msgstr ""
1214
 
1215
+ #: includes/admin/links-page-js.php:708
1216
  msgid "The following error(s) occured :"
1217
  msgstr ""
1218
 
1219
+ #: includes/admin/links-page-js.php:756
1220
  msgid "Enter a name for the new custom filter"
1221
  msgstr ""
1222
 
1223
+ #: includes/admin/links-page-js.php:768
1224
  msgid ""
1225
  "You are about to delete the current filter.\n"
1226
  "'Cancel' to stop, 'OK' to delete"
1227
  msgstr ""
1228
 
1229
+ #: includes/admin/links-page-js.php:792
1230
  msgid ""
1231
  "Are you sure you want to delete all posts, bookmarks or other items that contain any of the selected links? This action can't be undone.\n"
1232
  "'Cancel' to stop, 'OK' to delete"
1233
  msgstr ""
1234
 
1235
+ #: includes/admin/links-page-js.php:806
1236
  msgid ""
1237
  "Are you sure you want to remove the selected links? This action can't be undone.\n"
1238
  "'Cancel' to stop, 'OK' to remove"
1239
  msgstr ""
1240
 
1241
+ #: includes/admin/links-page-js.php:936
1242
  msgid "Enter a search string first."
1243
  msgstr ""
1244
 
1245
+ #: includes/admin/links-page-js.php:943
1246
  msgid "Select one or more links to edit."
1247
  msgstr ""
1248
 
1378
  msgid "Link last checked"
1379
  msgstr ""
1380
 
 
 
 
 
1381
  #: includes/admin/table-printer.php:566
1382
  msgid "Response time"
1383
  msgstr ""
1490
  msgid "Use this URL"
1491
  msgstr ""
1492
 
1493
+ #: modules/checkers/http.php:289
1494
  msgid "Server Not Found"
1495
  msgstr ""
1496
 
1497
+ #: modules/checkers/http.php:305
1498
  msgid "Connection Failed"
1499
  msgstr ""
1500
 
1501
+ #: modules/checkers/http.php:359, modules/checkers/http.php:448
1502
  msgid "HTTP code : %d"
1503
  msgstr ""
1504
 
1505
+ #: modules/checkers/http.php:361, modules/checkers/http.php:450
1506
  msgid "(No response)"
1507
  msgstr ""
1508
 
1510
  msgid "Most likely the connection timed out or the domain doesn't exist."
1511
  msgstr ""
1512
 
1513
+ #: modules/checkers/http.php:459
1514
  msgid "Request timed out."
1515
  msgstr ""
1516
 
1517
+ #: modules/checkers/http.php:466
1518
+ msgid "Using WP HTTP"
1519
  msgstr ""
1520
 
1521
  #: modules/containers/acf_field.php:102, modules/containers/custom_field.php:107
1691
  msgid "Embedded YouTube playlist"
1692
  msgstr ""
1693
 
1694
+ #: modules/extras/youtube.php:140
1695
  msgid "Video OK"
1696
  msgstr ""
1697
 
1698
+ #: modules/extras/youtube.php:151, modules/extras/youtube.php:154
1699
  msgid "Video Not Found"
1700
  msgstr ""
1701
 
1702
+ #: modules/extras/youtube.php:173, modules/extras/youtube.php:176
1703
  msgid "Playlist Not Found"
1704
  msgstr ""
1705
 
1706
+ #: modules/extras/youtube.php:183
1707
  msgid "Playlist Restricted"
1708
  msgstr ""
1709
 
1710
+ #: modules/extras/youtube.php:190
1711
  msgid "This playlist has no entries or all entries have been deleted."
1712
  msgstr ""
1713
 
1714
+ #: modules/extras/youtube.php:191
1715
  msgctxt "link status"
1716
  msgid "Empty Playlist"
1717
  msgstr ""
1718
 
1719
+ #: modules/extras/youtube.php:201
1720
  msgid "Video status : %1$s%2$s"
1721
  msgstr ""
1722
 
1723
+ #: modules/extras/youtube.php:207
1724
  msgid "Video Restricted"
1725
  msgstr ""
1726
 
1727
+ #: modules/extras/youtube.php:216
1728
  msgid "Playlist OK"
1729
  msgstr ""
1730
 
1731
+ #: modules/extras/youtube.php:264
1732
  msgid "Unknown YouTube API response received."
1733
  msgstr ""
1734
 
modules/checkers/http.php CHANGED
@@ -42,23 +42,13 @@ class blcHttpChecker extends blcChecker {
42
  $this->module_manager
43
  );
44
  } else {
45
- //Try to load Snoopy.
46
- if ( ! class_exists( 'Snoopy' ) ) {
47
- $snoopy_file = ABSPATH . WPINC . '/class-snoopy.php';
48
- if ( file_exists( $snoopy_file ) ) {
49
- include $snoopy_file;
50
- }
51
- }
52
-
53
- //If Snoopy is available, it will be used in place of CURL.
54
- if ( class_exists( 'Snoopy' ) ) {
55
- $this->implementation = new blcSnoopyHttp(
56
- $this->module_id,
57
- $this->cached_header,
58
- $this->plugin_conf,
59
- $this->module_manager
60
- );
61
- }
62
  }
63
  }
64
 
@@ -199,7 +189,10 @@ class blcCurlHttp extends blcHttpCheckerBase {
199
  //Redirects don't work when safe mode or open_basedir is enabled.
200
  if ( ! blcUtility::is_safe_mode() && ! blcUtility::is_open_basedir() ) {
201
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
 
 
202
  }
 
203
  //Set maximum redirects
204
  curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
205
 
@@ -267,6 +260,7 @@ class blcCurlHttp extends blcHttpCheckerBase {
267
 
268
  $info = curl_getinfo( $ch );
269
 
 
270
  //Store the results
271
  $result['http_code'] = intval( $info['http_code'] );
272
  $result['final_url'] = $info['url'];
@@ -317,6 +311,10 @@ class blcCurlHttp extends blcHttpCheckerBase {
317
  $result['status_code'] = BLC_LINK_STATUS_WARNING;
318
  $result['status_text'] = __( 'Unknown Error', 'broken-link-checker' );
319
  }
 
 
 
 
320
  } else {
321
  $result['broken'] = $this->is_error_code( $result['http_code'] );
322
  }
@@ -335,7 +333,9 @@ class blcCurlHttp extends blcHttpCheckerBase {
335
  )
336
  );
337
 
338
- if ( $nobody && $result['broken'] && ! $result['timeout'] && ! $use_get ) {
 
 
339
  //The site in question might be expecting GET instead of HEAD, so lets retry the request
340
  //using the GET verb...but not in cases of timeout, or where we've already done it.
341
  return $this->check( $url, true );
@@ -403,10 +403,11 @@ class blcCurlHttp extends blcHttpCheckerBase {
403
 
404
  }
405
 
406
- class blcSnoopyHttp extends blcHttpCheckerBase {
407
 
408
  function check( $url ) {
409
- $url = $this->clean_url( $url );
 
410
  //Note : Snoopy doesn't work too well with HTTPS URLs.
411
 
412
  $result = array(
@@ -422,20 +423,23 @@ class blcSnoopyHttp extends blcHttpCheckerBase {
422
  $start_time = microtime_float();
423
 
424
  //Fetch the URL with Snoopy
425
- $snoopy = new Snoopy;
426
- $snoopy->read_timeout = $timeout; //read timeout in seconds
427
- $snoopy->agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'; //masquerade as IE 7
428
- $snoopy->referer = home_url(); //valid referer helps circumvent some hotlink protection schemes
429
- $snoopy->maxlength = 1024 * 5; //load up to 5 kilobytes
430
- $snoopy->fetch( $this->urlencodefix( $url ) );
431
-
432
- $result['request_duration'] = microtime_float() - $start_time;
433
-
434
- $result['http_code'] = $snoopy->status; //HTTP status code
435
- //Snoopy returns -100 on timeout
436
- if ( -100 == $result['http_code'] ) {
437
  $result['http_code'] = 0;
438
  $result['timeout'] = true;
 
 
 
 
 
439
  }
440
 
441
  //Build the log
@@ -447,32 +451,23 @@ class blcSnoopyHttp extends blcHttpCheckerBase {
447
  }
448
  $log .= " ===\n\n";
449
 
450
- if ( $snoopy->error ) {
451
- $log .= $snoopy->error . "\n";
452
  }
453
- if ( $snoopy->timed_out ) {
 
454
  $log .= __( 'Request timed out.', 'broken-link-checker' ) . "\n";
455
  $result['timeout'] = true;
456
  }
457
 
458
- if ( is_array( $snoopy->headers ) ) {
459
- $log .= implode( '', $snoopy->headers ) . "\n"; //those headers already contain newlines
460
- }
461
-
462
- //Redirected?
463
- if ( $snoopy->lastredirectaddr ) {
464
- $result['final_url'] = $snoopy->lastredirectaddr;
465
- $result['redirect_count'] = $snoopy->_redirectdepth;
466
- } else {
467
- $result['final_url'] = $url;
468
- }
469
-
470
  //Determine if the link counts as "broken"
471
  $result['broken'] = $this->is_error_code( $result['http_code'] ) || $result['timeout'];
472
 
473
- $log .= '<em>(' . __( 'Using Snoopy', 'broken-link-checker' ) . ')</em>';
474
  $result['log'] = $log;
475
 
 
 
476
  //The hash should contain info about all pieces of data that pertain to determining if the
477
  //link is working.
478
  $result['result_hash'] = implode(
42
  $this->module_manager
43
  );
44
  } else {
45
+ //try and use wp request method
46
+ $this->implementation = new blcWPHttp(
47
+ $this->module_id,
48
+ $this->cached_header,
49
+ $this->plugin_conf,
50
+ $this->module_manager
51
+ );
 
 
 
 
 
 
 
 
 
 
52
  }
53
  }
54
 
189
  //Redirects don't work when safe mode or open_basedir is enabled.
190
  if ( ! blcUtility::is_safe_mode() && ! blcUtility::is_open_basedir() ) {
191
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
192
+ } else {
193
+ $log .= "[Warning] Could't follow the redirect URL (if any) because safemode or open base dir enabled\n";
194
  }
195
+
196
  //Set maximum redirects
197
  curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
198
 
260
 
261
  $info = curl_getinfo( $ch );
262
 
263
+ // var_dump( $info ); die();
264
  //Store the results
265
  $result['http_code'] = intval( $info['http_code'] );
266
  $result['final_url'] = $info['url'];
311
  $result['status_code'] = BLC_LINK_STATUS_WARNING;
312
  $result['status_text'] = __( 'Unknown Error', 'broken-link-checker' );
313
  }
314
+ } elseif ( 999 === $result['http_code'] ) {
315
+ $result['status_code'] = BLC_LINK_STATUS_WARNING;
316
+ $result['status_text'] = __( 'Unknown Error', 'broken-link-checker' );
317
+ $result['warning'] = true;
318
  } else {
319
  $result['broken'] = $this->is_error_code( $result['http_code'] );
320
  }
333
  )
334
  );
335
 
336
+ $use_get = apply_filters( 'blc_use_get_checker', false, $result );
337
+
338
+ if ( $nobody && !$result['timeout'] && !$use_get && ($result['broken'] || $result['redirect_count'] == 1)){
339
  //The site in question might be expecting GET instead of HEAD, so lets retry the request
340
  //using the GET verb...but not in cases of timeout, or where we've already done it.
341
  return $this->check( $url, true );
403
 
404
  }
405
 
406
+ class blcWPHttp extends blcHttpCheckerBase {
407
 
408
  function check( $url ) {
409
+
410
+ // $url = $this->clean_url( $url );
411
  //Note : Snoopy doesn't work too well with HTTPS URLs.
412
 
413
  $result = array(
423
  $start_time = microtime_float();
424
 
425
  //Fetch the URL with Snoopy
426
+ $snoopy = new WP_Http;
427
+ $request_args = array(
428
+ 'timeout' => $timeout,
429
+ 'user-agent' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', //masquerade as IE 7
430
+ 'aa' => 1024 * 5,
431
+ );
432
+ $request = wp_safe_remote_get( $this->urlencodefix( $url ), $request_args );
433
+
434
+ //request timeout results in WP ERROR
435
+ if ( is_wp_error( $request ) ) {
 
 
436
  $result['http_code'] = 0;
437
  $result['timeout'] = true;
438
+ $result['message'] = $request::get_error_message();
439
+ } else {
440
+ $http_resp = $request['http_response'];
441
+ $result['http_code'] = $request['response']['status']; //HTTP status code
442
+ $result['message'] = $request['response']['message'];
443
  }
444
 
445
  //Build the log
451
  }
452
  $log .= " ===\n\n";
453
 
454
+ if ( $result['message'] ) {
455
+ $log .= $result['message'] . "\n";
456
  }
457
+
458
+ if ( is_wp_error( $request ) ) {
459
  $log .= __( 'Request timed out.', 'broken-link-checker' ) . "\n";
460
  $result['timeout'] = true;
461
  }
462
 
 
 
 
 
 
 
 
 
 
 
 
 
463
  //Determine if the link counts as "broken"
464
  $result['broken'] = $this->is_error_code( $result['http_code'] ) || $result['timeout'];
465
 
466
+ $log .= '<em>(' . __( 'Using WP HTTP', 'broken-link-checker' ) . ')</em>';
467
  $result['log'] = $log;
468
 
469
+ $result['final_url'] = $url;
470
+
471
  //The hash should contain info about all pieces of data that pertain to determining if the
472
  //link is working.
473
  $result['result_hash'] = implode(
modules/extras/youtube.php CHANGED
@@ -129,9 +129,8 @@ class blcYouTubeChecker extends blcChecker {
129
  if ( isset( $api['error'] ) && ( 404 !== $result['http_code'] ) ) { //404's are handled later.
130
  $result['status_code'] = BLC_LINK_STATUS_WARNING;
131
  $result['warning'] = true;
132
-
133
- if ( isset( $api['error']['message'] ) ) {
134
- $result['status_text'] = $api['error']['message'];
135
  } else {
136
  $result['status_text'] = __( 'Unknown Error', 'broken-link-checker' );
137
  }
@@ -287,8 +286,7 @@ class blcYouTubeChecker extends blcChecker {
287
  public function get_youtube_api_key() {
288
  $conf = blc_get_configuration();
289
 
290
- //todo: Remove defualt API key.
291
- $api_key = ! empty( $conf->options['youtube_api_key'] ) ? $conf->options['youtube_api_key'] : 'AIzaSyCE2HKP0BneF8YdVT45UpadENdBeYCzFrE';
292
 
293
  return apply_filters( 'blc_youtube_api_key', $conf->options['youtube_api_key'] );
294
  }
129
  if ( isset( $api['error'] ) && ( 404 !== $result['http_code'] ) ) { //404's are handled later.
130
  $result['status_code'] = BLC_LINK_STATUS_WARNING;
131
  $result['warning'] = true;
132
+ if ( isset( $api['error']['errors'] ) ) {
133
+ $result['status_text'] = $api['error']['errors'][0]['reason'];
 
134
  } else {
135
  $result['status_text'] = __( 'Unknown Error', 'broken-link-checker' );
136
  }
286
  public function get_youtube_api_key() {
287
  $conf = blc_get_configuration();
288
 
289
+ $api_key = ! empty( $conf->options['youtube_api_key'] ) ? $conf->options['youtube_api_key'] : '';
 
290
 
291
  return apply_filters( 'blc_youtube_api_key', $conf->options['youtube_api_key'] );
292
  }
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link:
4
  Tags: links, broken, maintenance, blogroll, custom fields, admin, comments, posts
5
  Requires at least: 4.6
6
  Tested up to: 5.4
7
- Stable tag: 1.11.12
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -37,7 +37,7 @@ There are several actions associated with each link. They show up when you move
37
  * "Edit URL" lets you change the URL of that link. If the link is present in more than one place (e.g. both in a post and in the blogroll), all occurrences of that URL will be changed.
38
  * "Unlink" removes the link but leaves the link text intact.
39
  * "Not broken" lets you manually mark a "broken" link as working. This is useful if you know it was incorrectly detected as broken due to a network glitch or a bug. The marked link will still be checked periodically, but the plugin won't consider it broken unless it gets a new result.
40
- * "Dismiss" hides the link from the "Broken Links" and "Redirects" views. It will still be checked as normal and get the normal link styles (e.g. a strike-through effect for broken links), but won't be reported again unless its status changes. Useful if you want to acknowledge a link as broken/redirected and just leave as it is.
41
 
42
  You can also click on the contents of the "Status" or "Link Text" columns to get more info about the status of each link.
43
 
@@ -67,6 +67,20 @@ To upgrade your installation
67
  1. Reactivate the plugin. Your settings will be retained from the previous version.
68
 
69
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  = 1.11.12 =
71
  * Added an interface to use personal YouTube API Key
72
  * Fixed database errors on installation for some hosts.
4
  Tags: links, broken, maintenance, blogroll, custom fields, admin, comments, posts
5
  Requires at least: 4.6
6
  Tested up to: 5.4
7
+ Stable tag: 1.11.13
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
37
  * "Edit URL" lets you change the URL of that link. If the link is present in more than one place (e.g. both in a post and in the blogroll), all occurrences of that URL will be changed.
38
  * "Unlink" removes the link but leaves the link text intact.
39
  * "Not broken" lets you manually mark a "broken" link as working. This is useful if you know it was incorrectly detected as broken due to a network glitch or a bug. The marked link will still be checked periodically, but the plugin won't consider it broken unless it gets a new result.
40
+ * "Dismiss" hides the link frm the "Broken Links" and "Redirects" views. It will still be checked as normal and get the normal link styles (e.g. a strike-through effect for broken links), but won't be reported again unless its status changes. Useful if you want to acknowledge a link as broken/redirected and just leave as it is.
41
 
42
  You can also click on the contents of the "Status" or "Link Text" columns to get more info about the status of each link.
43
 
67
  1. Reactivate the plugin. Your settings will be retained from the previous version.
68
 
69
  == Changelog ==
70
+ = 1.11.13 =
71
+ * Added filter for disabling email notifications.
72
+ * Added filter to use GET requests.
73
+ * Added option to disable last updated time on post types.
74
+ * Added option to check post excerpts.
75
+ * Added a confirmation box when unlinking.
76
+ * Added basic multisite support.
77
+ * Added proper error messages on YouTube video errors.
78
+ * Fixed bulk recheck option.
79
+ * Fixed minor database errors.
80
+ * Improved performance.
81
+ * Removed default YouTube API key.
82
+ * Removed usage of depricated WP Snoopy.
83
+
84
  = 1.11.12 =
85
  * Added an interface to use personal YouTube API Key
86
  * Fixed database errors on installation for some hosts.
uninstall.php CHANGED
@@ -10,6 +10,7 @@ if ( defined( 'ABSPATH' ) && defined( 'WP_UNINSTALL_PLUGIN' ) ) {
10
 
11
  // Remove the plugin's settings & installation log.
12
  delete_option( 'wsblc_options' );
 
13
  delete_option( 'blc_installation_log' );
14
 
15
  // Remove the database tables.
10
 
11
  // Remove the plugin's settings & installation log.
12
  delete_option( 'wsblc_options' );
13
+ delete_option( 'blc_activation_enabled' );
14
  delete_option( 'blc_installation_log' );
15
 
16
  // Remove the database tables.