Version Description
Download this release
Release Info
Developer | whiteshadow |
Plugin | Broken Link Checker |
Version | 0.5.3 |
Comparing to | |
See all releases |
Code changes from version 0.5.2 to 0.5.3
- broken-link-checker.php +45 -48
- link-classes.php +15 -7
- readme.txt +2 -2
broken-link-checker.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: Broken Link Checker
|
4 |
Plugin URI: http://w-shadow.com/blog/2007/08/05/broken-link-checker-for-wordpress/
|
5 |
Description: Checks your posts for broken links and missing images and notifies you on the dashboard if any are found.
|
6 |
-
Version: 0.5.
|
7 |
Author: Janis Elsts
|
8 |
Author URI: http://w-shadow.com/blog/
|
9 |
*/
|
@@ -57,14 +57,14 @@ if (!class_exists('ws_broken_link_checker')) {
|
|
57 |
class ws_broken_link_checker {
|
58 |
var $options;
|
59 |
var $options_name='wsblc_options';
|
60 |
-
var $myfile='';
|
61 |
-
var $myfolder='';
|
62 |
-
var $mybasename='';
|
63 |
-
var $siteurl;
|
64 |
var $defaults;
|
65 |
|
66 |
-
var $execution_start_time;
|
67 |
-
var $lockfile_handle = null;
|
68 |
|
69 |
function ws_broken_link_checker() {
|
70 |
global $wpdb;
|
@@ -78,14 +78,14 @@ class ws_broken_link_checker {
|
|
78 |
'exclusion_list' => array(), //Links that contain a substring listed in this array won't be checked.
|
79 |
'recheck_count' => 3, //[Internal] How many times a broken link should be re-checked (slightly buggy)
|
80 |
|
81 |
-
//These are currently ignored. Everything is checked by default.
|
82 |
'check_posts' => true,
|
83 |
'check_custom_fields' => true,
|
84 |
'check_blogroll' => true,
|
85 |
|
86 |
'custom_fields' => array(), //List of custom fields that can contain URLs and should be checked.
|
87 |
|
88 |
-
'autoexpand_widget' => true,
|
89 |
|
90 |
'need_resynch' => false, //[Internal flag]
|
91 |
|
@@ -149,13 +149,16 @@ class ws_broken_link_checker {
|
|
149 |
{
|
150 |
'action' : 'blc_work'
|
151 |
},
|
152 |
-
function (data, textStatus){
|
|
|
|
|
153 |
);
|
154 |
}
|
155 |
//Call it the first time
|
156 |
blcDoWork();
|
157 |
-
|
158 |
-
|
|
|
159 |
|
160 |
})(jQuery);
|
161 |
</script>
|
@@ -233,7 +236,7 @@ class ws_broken_link_checker {
|
|
233 |
'action' : 'blc_dashboard_status'
|
234 |
},
|
235 |
function (data, textStatus){
|
236 |
-
if ( typeof(data
|
237 |
$('#wsblc_activity_box').html(data.text);
|
238 |
<?php if ( $this->options['autoexpand_widget'] ) { ?>
|
239 |
//Expand the widget if there are broken links.
|
@@ -251,6 +254,7 @@ class ws_broken_link_checker {
|
|
251 |
}
|
252 |
);
|
253 |
}
|
|
|
254 |
blcDashboardStatus();//Call it the first time
|
255 |
|
256 |
});
|
@@ -562,7 +566,7 @@ class ws_broken_link_checker {
|
|
562 |
?>
|
563 |
<div class="wrap"><h2>Broken Link Checker Options</h2>
|
564 |
|
565 |
-
<form name="link_checker_options" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?page=link-checker-settings&updated=true">
|
566 |
|
567 |
<table class="form-table">
|
568 |
|
@@ -584,7 +588,7 @@ class ws_broken_link_checker {
|
|
584 |
'action' : 'blc_full_status'
|
585 |
},
|
586 |
function (data, textStatus){
|
587 |
-
if ( typeof(data['text']) != 'undefined'){
|
588 |
$('#wsblc_full_status').html(data.text);
|
589 |
} else {
|
590 |
$('#wsblc_full_status').html('[ Network error ]');
|
@@ -599,7 +603,7 @@ class ws_broken_link_checker {
|
|
599 |
})(jQuery);
|
600 |
</script>
|
601 |
<?php //JHS: Recheck all posts link: ?>
|
602 |
-
<p><input class="button" type="button" name="recheckbutton" value="Re-check all pages" onclick="location.replace('<?php echo $_SERVER['PHP_SELF']; ?>?page=link-checker-settings&recheck=true')" /></p>
|
603 |
</td>
|
604 |
</tr>
|
605 |
|
@@ -1094,7 +1098,7 @@ jQuery(function($){
|
|
1094 |
function (data, textStatus){
|
1095 |
var display_url = '';
|
1096 |
|
1097 |
-
if ( typeof(data['error']) != 'undefined'){
|
1098 |
//data.error is an error message
|
1099 |
alert(data.error);
|
1100 |
display_url = orig_url;
|
@@ -1179,7 +1183,7 @@ jQuery(function($){
|
|
1179 |
function (data, textStatus){
|
1180 |
eval('data = ' + data);
|
1181 |
|
1182 |
-
if ( typeof(data['ok']) != 'undefined'){
|
1183 |
//Hide the details
|
1184 |
master.next('.blc-link-details').hide();
|
1185 |
//Flash the main row green to indicate success, then hide it.
|
@@ -1216,7 +1220,7 @@ jQuery(function($){
|
|
1216 |
function (data, textStatus){
|
1217 |
eval('data = ' + data);
|
1218 |
|
1219 |
-
if ( typeof(data['ok']) != 'undefined'){
|
1220 |
|
1221 |
if ( 'broken' == blc_current_filter ){
|
1222 |
//Flash the row green to indicate success, then hide it.
|
@@ -1243,32 +1247,6 @@ jQuery(function($){
|
|
1243 |
|
1244 |
});
|
1245 |
|
1246 |
-
function removeLinkFromPost(link_id){
|
1247 |
-
if (!confirm('Do you really want to remove this link from all posts, custom fields and the blogroll?')) return;
|
1248 |
-
|
1249 |
-
$('unlink_button-'+link_id).innerHTML = 'Wait...';
|
1250 |
-
|
1251 |
-
new Ajax.Request(
|
1252 |
-
'<?php
|
1253 |
-
echo get_option( "siteurl" ).'/wp-content/plugins/'.$this->myfolder.'/wsblc_ajax.php?';
|
1254 |
-
?>action=remove_link&id='+link_id,
|
1255 |
-
{
|
1256 |
-
method:'get',
|
1257 |
-
onSuccess: function(transport){
|
1258 |
-
var re = /OK:.*/i
|
1259 |
-
var response = transport.responseText || "";
|
1260 |
-
if (re.test(response)){
|
1261 |
-
$('link-'+link_id).hide();
|
1262 |
-
$('link-details-'+link_id).hide();
|
1263 |
-
alterLinkCounter(-1);
|
1264 |
-
} else {
|
1265 |
-
$('unlink_button-'+link_id).innerHTML = 'Unlink';
|
1266 |
-
alert(response);
|
1267 |
-
}
|
1268 |
-
}
|
1269 |
-
}
|
1270 |
-
);
|
1271 |
-
}
|
1272 |
</script>
|
1273 |
<?php
|
1274 |
}
|
@@ -1398,10 +1376,10 @@ jQuery(function($){
|
|
1398 |
|
1399 |
function load_options(){
|
1400 |
$this->options = get_option($this->options_name);
|
1401 |
-
if(!is_array($this->options)){
|
1402 |
$this->options = $this->defaults;
|
1403 |
} else {
|
1404 |
-
$this->options = array_merge($this->defaults, $this->options);
|
1405 |
}
|
1406 |
}
|
1407 |
|
@@ -1763,6 +1741,13 @@ jQuery(function($){
|
|
1763 |
die();
|
1764 |
}
|
1765 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1766 |
function status_text( $status ){
|
1767 |
$text = '';
|
1768 |
|
@@ -1825,6 +1810,18 @@ jQuery(function($){
|
|
1825 |
*/
|
1826 |
}
|
1827 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1828 |
function get_status(){
|
1829 |
global $wpdb;
|
1830 |
|
@@ -1996,7 +1993,7 @@ jQuery(function($){
|
|
1996 |
die('Error : link ID not specified');
|
1997 |
}
|
1998 |
|
1999 |
-
//Load the link.
|
2000 |
//we'll have to do this the long way.
|
2001 |
$q = "SELECT
|
2002 |
links.*,
|
3 |
Plugin Name: Broken Link Checker
|
4 |
Plugin URI: http://w-shadow.com/blog/2007/08/05/broken-link-checker-for-wordpress/
|
5 |
Description: Checks your posts for broken links and missing images and notifies you on the dashboard if any are found.
|
6 |
+
Version: 0.5.3
|
7 |
Author: Janis Elsts
|
8 |
Author URI: http://w-shadow.com/blog/
|
9 |
*/
|
57 |
class ws_broken_link_checker {
|
58 |
var $options;
|
59 |
var $options_name='wsblc_options';
|
60 |
+
var $myfile=''; //should be removed
|
61 |
+
var $myfolder=''; //should be removed
|
62 |
+
var $mybasename=''; //should be removed
|
63 |
+
var $siteurl; //should be removed
|
64 |
var $defaults;
|
65 |
|
66 |
+
var $execution_start_time; //Used for a simple internal execution timer in start_timer()/execution_time()
|
67 |
+
var $lockfile_handle = null;
|
68 |
|
69 |
function ws_broken_link_checker() {
|
70 |
global $wpdb;
|
78 |
'exclusion_list' => array(), //Links that contain a substring listed in this array won't be checked.
|
79 |
'recheck_count' => 3, //[Internal] How many times a broken link should be re-checked (slightly buggy)
|
80 |
|
81 |
+
//These three are currently ignored. Everything is checked by default.
|
82 |
'check_posts' => true,
|
83 |
'check_custom_fields' => true,
|
84 |
'check_blogroll' => true,
|
85 |
|
86 |
'custom_fields' => array(), //List of custom fields that can contain URLs and should be checked.
|
87 |
|
88 |
+
'autoexpand_widget' => true, //Autoexpand the Dashboard widget if broken links are detected
|
89 |
|
90 |
'need_resynch' => false, //[Internal flag]
|
91 |
|
149 |
{
|
150 |
'action' : 'blc_work'
|
151 |
},
|
152 |
+
function (data, textStatus){
|
153 |
+
|
154 |
+
}
|
155 |
);
|
156 |
}
|
157 |
//Call it the first time
|
158 |
blcDoWork();
|
159 |
+
|
160 |
+
//Then call it periodically every X seconds
|
161 |
+
setInterval(blcDoWork, <?php echo (intval($this->options['max_execution_time']) + 1 )*1000; ?>);
|
162 |
|
163 |
})(jQuery);
|
164 |
</script>
|
236 |
'action' : 'blc_dashboard_status'
|
237 |
},
|
238 |
function (data, textStatus){
|
239 |
+
if ( data && ( typeof(data.text) != 'undefined' ) ) {
|
240 |
$('#wsblc_activity_box').html(data.text);
|
241 |
<?php if ( $this->options['autoexpand_widget'] ) { ?>
|
242 |
//Expand the widget if there are broken links.
|
254 |
}
|
255 |
);
|
256 |
}
|
257 |
+
|
258 |
blcDashboardStatus();//Call it the first time
|
259 |
|
260 |
});
|
566 |
?>
|
567 |
<div class="wrap"><h2>Broken Link Checker Options</h2>
|
568 |
|
569 |
+
<form name="link_checker_options" method="post" action="<?php echo basename($_SERVER['PHP_SELF']); ?>?page=link-checker-settings&updated=true">
|
570 |
|
571 |
<table class="form-table">
|
572 |
|
588 |
'action' : 'blc_full_status'
|
589 |
},
|
590 |
function (data, textStatus){
|
591 |
+
if ( data && ( typeof(data['text']) != 'undefined' ) ){
|
592 |
$('#wsblc_full_status').html(data.text);
|
593 |
} else {
|
594 |
$('#wsblc_full_status').html('[ Network error ]');
|
603 |
})(jQuery);
|
604 |
</script>
|
605 |
<?php //JHS: Recheck all posts link: ?>
|
606 |
+
<p><input class="button" type="button" name="recheckbutton" value="Re-check all pages" onclick="location.replace('<?php echo basename($_SERVER['PHP_SELF']); ?>?page=link-checker-settings&recheck=true')" /></p>
|
607 |
</td>
|
608 |
</tr>
|
609 |
|
1098 |
function (data, textStatus){
|
1099 |
var display_url = '';
|
1100 |
|
1101 |
+
if ( data && (typeof(data['error']) != 'undefined') ){
|
1102 |
//data.error is an error message
|
1103 |
alert(data.error);
|
1104 |
display_url = orig_url;
|
1183 |
function (data, textStatus){
|
1184 |
eval('data = ' + data);
|
1185 |
|
1186 |
+
if ( data && ( typeof(data['ok']) != 'undefined') ){
|
1187 |
//Hide the details
|
1188 |
master.next('.blc-link-details').hide();
|
1189 |
//Flash the main row green to indicate success, then hide it.
|
1220 |
function (data, textStatus){
|
1221 |
eval('data = ' + data);
|
1222 |
|
1223 |
+
if ( data && ( typeof(data['ok']) != 'undefined' ) ){
|
1224 |
|
1225 |
if ( 'broken' == blc_current_filter ){
|
1226 |
//Flash the row green to indicate success, then hide it.
|
1247 |
|
1248 |
});
|
1249 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1250 |
</script>
|
1251 |
<?php
|
1252 |
}
|
1376 |
|
1377 |
function load_options(){
|
1378 |
$this->options = get_option($this->options_name);
|
1379 |
+
if( !is_array( $this->options ) ){
|
1380 |
$this->options = $this->defaults;
|
1381 |
} else {
|
1382 |
+
$this->options = array_merge( $this->defaults, $this->options );
|
1383 |
}
|
1384 |
}
|
1385 |
|
1741 |
die();
|
1742 |
}
|
1743 |
|
1744 |
+
/**
|
1745 |
+
* ws_broken_link_checker::status_text()
|
1746 |
+
* Generates a status message based on the status info in $status
|
1747 |
+
*
|
1748 |
+
* @param array $status
|
1749 |
+
* @return string
|
1750 |
+
*/
|
1751 |
function status_text( $status ){
|
1752 |
$text = '';
|
1753 |
|
1810 |
*/
|
1811 |
}
|
1812 |
|
1813 |
+
/**
|
1814 |
+
* ws_broken_link_checker::get_status()
|
1815 |
+
* Returns an array with various status information about the plugin. Array key reference:
|
1816 |
+
* check_threshold - date/time; links checked before this threshold should be checked again.
|
1817 |
+
* recheck_threshold - date/time; broken links checked before this threshold should be re-checked.
|
1818 |
+
* known_links - the number of detected unique URLs (a misleading name, yes).
|
1819 |
+
* known_instances - the number of detected link instances, i.e. actual link elements in posts and other places.
|
1820 |
+
* broken_links - the number of detected broken links.
|
1821 |
+
* unchecked_links - the number of URLs that need to be checked ASAP; based on check_threshold and recheck_threshold.
|
1822 |
+
*
|
1823 |
+
* @return array
|
1824 |
+
*/
|
1825 |
function get_status(){
|
1826 |
global $wpdb;
|
1827 |
|
1993 |
die('Error : link ID not specified');
|
1994 |
}
|
1995 |
|
1996 |
+
//Load the link. link_details_row needs it as an array, so
|
1997 |
//we'll have to do this the long way.
|
1998 |
$q = "SELECT
|
1999 |
links.*,
|
link-classes.php
CHANGED
@@ -143,7 +143,7 @@ class blcLink {
|
|
143 |
}
|
144 |
|
145 |
//******* Use CURL if available ***********
|
146 |
-
if (function_exists('curl_init')) {
|
147 |
$ch = curl_init();
|
148 |
curl_setopt($ch, CURLOPT_URL, $url);
|
149 |
//Masquerade as Internet explorer
|
@@ -211,7 +211,7 @@ class blcLink {
|
|
211 |
|
212 |
curl_close($ch);
|
213 |
|
214 |
-
} elseif (class_exists('Snoopy')) {
|
215 |
//******** Use Snoopy if CURL is not available *********
|
216 |
//Note : Snoopy doesn't work too well with HTTPS URLs.
|
217 |
$this->log .= "<em>(Using Snoopy)</em>\n";
|
@@ -220,11 +220,16 @@ class blcLink {
|
|
220 |
|
221 |
$snoopy = new Snoopy;
|
222 |
$snoopy->read_timeout = 60; //read timeout in seconds
|
|
|
223 |
$snoopy->fetch($url);
|
224 |
|
225 |
-
$this->request_duration =
|
226 |
|
227 |
-
$this->http_code = $snoopy->status; //HTTP status code
|
|
|
|
|
|
|
|
|
228 |
|
229 |
if ($snoopy->error)
|
230 |
$this->log .= $snoopy->error."\n";
|
@@ -234,10 +239,13 @@ class blcLink {
|
|
234 |
if ( is_array($snoopy->headers) )
|
235 |
$this->log .= implode("", $snoopy->headers)."\n"; //those headers already contain newlines
|
236 |
|
237 |
-
|
|
|
238 |
$this->final_url = $snoopy->lastredirectaddr;
|
239 |
$this->redirect_count = $snoopy->_redirectdepth;
|
240 |
-
}
|
|
|
|
|
241 |
}
|
242 |
|
243 |
/*"Good" response codes are anything in the 2XX range (e.g "200 OK") and redirects - the 3XX range.
|
@@ -251,7 +259,7 @@ class blcLink {
|
|
251 |
return true;
|
252 |
} else {
|
253 |
$this->log .= "Link is broken.";
|
254 |
-
if ($this->http_code == 0){
|
255 |
//This is probably a timeout
|
256 |
$this->timeout = true;
|
257 |
$this->log .= "\r\n(Most likely the connection timed out)";
|
143 |
}
|
144 |
|
145 |
//******* Use CURL if available ***********
|
146 |
+
if ( function_exists('curl_init') ) {
|
147 |
$ch = curl_init();
|
148 |
curl_setopt($ch, CURLOPT_URL, $url);
|
149 |
//Masquerade as Internet explorer
|
211 |
|
212 |
curl_close($ch);
|
213 |
|
214 |
+
} elseif ( class_exists('Snoopy') ) {
|
215 |
//******** Use Snoopy if CURL is not available *********
|
216 |
//Note : Snoopy doesn't work too well with HTTPS URLs.
|
217 |
$this->log .= "<em>(Using Snoopy)</em>\n";
|
220 |
|
221 |
$snoopy = new Snoopy;
|
222 |
$snoopy->read_timeout = 60; //read timeout in seconds
|
223 |
+
$snoopy->maxlength = 1024*5; //load up to 5 kilobytes
|
224 |
$snoopy->fetch($url);
|
225 |
|
226 |
+
$this->request_duration = microtime_float(true) - $start_time;
|
227 |
|
228 |
+
$this->http_code = $snoopy->status; //HTTP status code (note : Snoopy returns -100 on timeout)
|
229 |
+
if ( $this->http_code == -100 ){
|
230 |
+
$this->http_code = 0;
|
231 |
+
$this->timeout = true;
|
232 |
+
}
|
233 |
|
234 |
if ($snoopy->error)
|
235 |
$this->log .= $snoopy->error."\n";
|
239 |
if ( is_array($snoopy->headers) )
|
240 |
$this->log .= implode("", $snoopy->headers)."\n"; //those headers already contain newlines
|
241 |
|
242 |
+
//Redirected?
|
243 |
+
if ( $snoopy->lastredirectaddr ) {
|
244 |
$this->final_url = $snoopy->lastredirectaddr;
|
245 |
$this->redirect_count = $snoopy->_redirectdepth;
|
246 |
+
} else {
|
247 |
+
$this->final_url = $this->url;
|
248 |
+
}
|
249 |
}
|
250 |
|
251 |
/*"Good" response codes are anything in the 2XX range (e.g "200 OK") and redirects - the 3XX range.
|
259 |
return true;
|
260 |
} else {
|
261 |
$this->log .= "Link is broken.";
|
262 |
+
if ( $this->http_code == 0 ){
|
263 |
//This is probably a timeout
|
264 |
$this->timeout = true;
|
265 |
$this->log .= "\r\n(Most likely the connection timed out)";
|
readme.txt
CHANGED
@@ -2,8 +2,8 @@
|
|
2 |
Contributors: whiteshadow
|
3 |
Tags: links, broken, maintenance, blogroll, custom fields, admin
|
4 |
Requires at least: 2.7.0
|
5 |
-
Tested up to: 2.
|
6 |
-
Stable tag: 0.5.
|
7 |
|
8 |
This plugin will check your posts, custom fields and the blogroll for broken links and missing images and notify you on the dashboard if any are found.
|
9 |
|
2 |
Contributors: whiteshadow
|
3 |
Tags: links, broken, maintenance, blogroll, custom fields, admin
|
4 |
Requires at least: 2.7.0
|
5 |
+
Tested up to: 2.9
|
6 |
+
Stable tag: 0.5.3
|
7 |
|
8 |
This plugin will check your posts, custom fields and the blogroll for broken links and missing images and notify you on the dashboard if any are found.
|
9 |
|