Redirection - Version 2.3.3

Version Description

  • Full WordPress 3.5+ compatability! Note that this contains database changes so please backup your data.

=

Download this release

Release Info

Developer johnny5
Plugin Icon 128x128 Redirection
Version 2.3.3
Comparing to
See all releases

Code changes from version 2.3.2 to 2.3.3

fileio/apache.php CHANGED
@@ -1,63 +1,37 @@
1
  <?php
2
 
3
- if (!function_exists ('strpbrk'))
4
- {
5
- function strpbrk( $haystack, $char_list )
6
- {
7
- $strlen = strlen($char_list);
8
- $found = false;
9
- for( $i=0; $i<$strlen; $i++ ) {
10
- if( ($tmp = strpos($haystack, $char_list{$i})) !== false ) {
11
- if( !$found ) {
12
- $pos = $tmp;
13
- $found = true;
14
- continue;
15
- }
16
- $pos = min($pos, $tmp);
17
- }
18
- }
19
- if( !$found ) {
20
- return false;
21
- }
22
- return substr($haystack, $pos);
23
- }
24
- }
25
-
26
- class Red_Apache_File extends Red_FileIO
27
- {
28
  var $htaccess;
29
 
30
- function collect ($module)
31
- {
32
- include_once (dirname (__FILE__).'/../models/htaccess.php');
33
 
34
- $this->htaccess = new Red_Htaccess ($module);
35
  $this->name = $module->name;
36
  $this->id = $module->id;
37
 
38
  // Get the items
39
  $items = Red_Item::get_by_module( $module->id );
40
 
41
- foreach ($items AS $item)
42
  $this->htaccess->add ($item);
 
43
 
44
  return true;
45
  }
46
 
47
- function feed ()
48
- {
49
- $filename = sprintf ('module_%d.htaccess', $this->id);
50
 
51
- header ("Content-Type: application/octet-stream");
52
- header ("Cache-Control: no-cache, must-revalidate");
53
- header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
54
- header ('Content-Disposition: attachment; filename="'.$filename.'"');
55
 
56
  echo $this->htaccess->generate ($this->name);
57
  }
58
 
59
- function load ($group, $data)
60
- {
61
  // Remove any comments
62
  $data = preg_replace ('@#(.*)@', '', $data);
63
  $data = str_replace ("\n", "\r", $data);
@@ -65,60 +39,54 @@ class Red_Apache_File extends Red_FileIO
65
 
66
  // Split it into lines
67
  $lines = array_filter (explode ("\r", $data));
68
- if (count ($lines) > 0)
69
- {
70
- foreach ($lines AS $line)
71
- {
72
- if (preg_match ('@rewriterule\s+(.*?)\s+(.*?)\s+(\[.*\])*@i', $line, $matches) > 0)
73
- $items[] = array ('source' => $this->regex_url ($matches[1]), 'target' => $this->decode_url ($matches[2]), 'code' => $this->get_code ($matches[3]), 'regex' => $this->is_regex ($matches[1]));
74
- else if (preg_match ('@Redirect\s+(.*?)\s+(.*?)\s+(.*)@i', $line, $matches) > 0)
75
- $items[] = array ('source' => $this->decode_url ($matches[2]), 'target' => $this->decode_url ($matches[3]), 'code' => $this->get_code ($matches[1]));
76
- else if (preg_match ('@Redirect\s+(.*?)\s+(.*?)@i', $line, $matches) > 0)
77
- $items[] = array ('source' => $this->decode_url ($matches[1]), 'target' => $this->decode_url ($matches[2]), 'code' => 302);
78
- else if (preg_match ('@Redirectmatch\s+(.*?)\s+(.*?)\s+(.*)@i', $line, $matches) > 0)
79
- $items[] = array ('source' => $this->decode_url ($matches[2]), 'target' => $this->decode_url ($matches[3]), 'code' => $this->get_code ($matches[1]), 'regex' => true);
80
- else if (preg_match ('@Redirectmatch\s+(.*?)\s+(.*?)@i', $line, $matches) > 0)
81
- $items[] = array ('source' => $this->decode_url ($matches[1]), 'target' => $this->decode_url ($matches[2]), 'code' => 302, 'regex' => true);
82
  }
83
 
84
  // Add items to group
85
- if (count ($items) > 0)
86
- {
87
- foreach ($items AS $item)
88
- {
89
  $item['group'] = $group;
90
  $item['red_action'] = 'url';
91
  $item['match'] = 'url';
92
- if ($item['code'] == 0)
 
93
  $item['red_action'] = 'pass';
94
 
95
- Red_Item::create ($item);
96
  }
97
 
98
- return count ($items);
99
  }
100
  }
101
 
102
  return 0;
103
  }
104
 
105
- function decode_url ($url)
106
- {
107
- $url = rawurldecode ($url);
108
- $url = str_replace ('\\.', '.', $url);
109
  return $url;
110
  }
111
 
112
- function is_str_regex ($url)
113
- {
114
  $regex = '()[]$^?+.';
115
  $escape = false;
116
 
117
- for ($x = 0; $x < strlen ($url); $x++)
118
- {
119
- if ($url{$x} == '\\')
120
  $escape = true;
121
- else if (strpos ($regex, $url{$x}) !== false && !$escape)
122
  return true;
123
  else
124
  $escape = false;
@@ -127,49 +95,43 @@ class Red_Apache_File extends Red_FileIO
127
  return false;
128
  }
129
 
130
- function is_regex ($url)
131
- {
132
- if ($this->is_str_regex ($url))
133
- {
134
- $tmp = ltrim ($url, '^');
135
- $tmp = rtrim ($tmp, '$');
136
 
137
- if ($this->is_str_regex ($tmp))
138
  return true;
139
  }
140
 
141
  return false;
142
  }
143
 
144
- function regex_url ($url)
145
- {
146
- if ($this->is_str_regex ($url))
147
- {
148
- $tmp = ltrim ($url, '^');
149
- $tmp = rtrim ($tmp, '$');
150
 
151
- if ($this->is_str_regex ($tmp) == false)
152
- return '/'.$this->decode_url ($tmp);
153
 
154
- return '/'.$this->decode_url ($url);
155
  }
156
 
157
- return $this->decode_url ($url);
158
  }
159
 
160
- function get_code ($code)
161
- {
162
- if (strpos ($code, '301') !== false || stripos ($code, 'permanent') !== false)
163
  return 301;
164
- else if (strpos ($code, '302') !== false)
165
  return 302;
166
- else if (strpos ($code, '307') !== false || stripos ($code, 'seeother') !== false)
167
  return 307;
168
- else if (strpos ($code, '404') !== false || stripos ($code, 'forbidden') !== false || strpos ($code, 'F') !== false)
169
  return 404;
170
- else if (strpos ($code, '410') !== false || stripos ($code, 'gone') !== false || strpos ($code, 'G') !== false)
171
  return 410;
172
  return 0;
173
  }
174
  }
175
- ?>
1
  <?php
2
 
3
+ class Red_Apache_File extends Red_FileIO {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  var $htaccess;
5
 
6
+ function collect( $module ) {
7
+ include_once dirname( dirname( __FILE__ ) ).'/models/htaccess.php';
 
8
 
9
+ $this->htaccess = new Red_Htaccess( $module );
10
  $this->name = $module->name;
11
  $this->id = $module->id;
12
 
13
  // Get the items
14
  $items = Red_Item::get_by_module( $module->id );
15
 
16
+ foreach ( $items AS $item ) {
17
  $this->htaccess->add ($item);
18
+ }
19
 
20
  return true;
21
  }
22
 
23
+ function feed () {
24
+ $filename = sprintf( 'module_%d.htaccess', $this->id );
 
25
 
26
+ header( 'Content-Type: application/octet-stream' );
27
+ header( 'Cache-Control: no-cache, must-revalidate' );
28
+ header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' );
29
+ header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
30
 
31
  echo $this->htaccess->generate ($this->name);
32
  }
33
 
34
+ function load( $group, $data, $filename = '' ) {
 
35
  // Remove any comments
36
  $data = preg_replace ('@#(.*)@', '', $data);
37
  $data = str_replace ("\n", "\r", $data);
39
 
40
  // Split it into lines
41
  $lines = array_filter (explode ("\r", $data));
42
+ if ( count( $lines ) > 0 ) {
43
+ foreach ( $lines AS $line ) {
44
+ if ( preg_match ('@rewriterule\s+(.*?)\s+(.*?)\s+(\[.*\])*@i', $line, $matches) > 0 )
45
+ $items[] = array('source' => $this->regex_url ($matches[1]), 'target' => $this->decode_url ($matches[2]), 'code' => $this->get_code ($matches[3]), 'regex' => $this->is_regex ($matches[1]) );
46
+ elseif ( preg_match( '@Redirect\s+(.*?)\s+(.*?)\s+(.*)@i', $line, $matches) > 0 )
47
+ $items[] = array( 'source' => $this->decode_url ($matches[2]), 'target' => $this->decode_url ($matches[3]), 'code' => $this->get_code ($matches[1]) );
48
+ elseif ( preg_match( '@Redirect\s+(.*?)\s+(.*?)@i', $line, $matches) > 0 )
49
+ $items[] = array( 'source' => $this->decode_url ($matches[1]), 'target' => $this->decode_url ($matches[2]), 'code' => 302);
50
+ elseif ( preg_match( '@Redirectmatch\s+(.*?)\s+(.*?)\s+(.*)@i', $line, $matches) > 0 )
51
+ $items[] = array( 'source' => $this->decode_url ($matches[2]), 'target' => $this->decode_url ($matches[3]), 'code' => $this->get_code ($matches[1]), 'regex' => true );
52
+ elseif ( preg_match( '@Redirectmatch\s+(.*?)\s+(.*?)@i', $line, $matches) > 0 )
53
+ $items[] = array( 'source' => $this->decode_url ($matches[1]), 'target' => $this->decode_url ($matches[2]), 'code' => 302, 'regex' => true );
 
 
54
  }
55
 
56
  // Add items to group
57
+ if ( count( $items ) > 0 ) {
58
+ foreach ( $items AS $item ) {
 
 
59
  $item['group'] = $group;
60
  $item['red_action'] = 'url';
61
  $item['match'] = 'url';
62
+
63
+ if ( $item['code'] == 0 )
64
  $item['red_action'] = 'pass';
65
 
66
+ Red_Item::create( $item );
67
  }
68
 
69
+ return count( $items );
70
  }
71
  }
72
 
73
  return 0;
74
  }
75
 
76
+ function decode_url( $url ) {
77
+ $url = rawurldecode( $url );
78
+ $url = str_replace( '\\.', '.', $url );
 
79
  return $url;
80
  }
81
 
82
+ function is_str_regex( $url ) {
 
83
  $regex = '()[]$^?+.';
84
  $escape = false;
85
 
86
+ for ( $x = 0; $x < strlen( $url ); $x++ ) {
87
+ if ( $url{$x} == '\\' )
 
88
  $escape = true;
89
+ elseif ( strpos( $regex, $url{$x} ) !== false && !$escape )
90
  return true;
91
  else
92
  $escape = false;
95
  return false;
96
  }
97
 
98
+ function is_regex( $url ) {
99
+ if ( $this->is_str_regex( $url ) ) {
100
+ $tmp = ltrim( $url, '^' );
101
+ $tmp = rtrim( $tmp, '$' );
 
 
102
 
103
+ if ( $this->is_str_regex( $tmp ) )
104
  return true;
105
  }
106
 
107
  return false;
108
  }
109
 
110
+ function regex_url ($url) {
111
+ if ( $this->is_str_regex( $url ) ) {
112
+ $tmp = ltrim( $url, '^' );
113
+ $tmp = rtrim( $tmp, '$' );
 
 
114
 
115
+ if ( $this->is_str_regex( $tmp ) == false )
116
+ return '/'.$this->decode_url( $tmp );
117
 
118
+ return '/'.$this->decode_url( $url );
119
  }
120
 
121
+ return $this->decode_url( $url );
122
  }
123
 
124
+ function get_code ($code) {
125
+ if ( strpos( $code, '301' ) !== false || stripos( $code, 'permanent' ) !== false )
 
126
  return 301;
127
+ elseif ( strpos( $code, '302' ) !== false )
128
  return 302;
129
+ elseif ( strpos( $code, '307' ) !== false || stripos( $code, 'seeother' ) !== false )
130
  return 307;
131
+ elseif ( strpos( $code, '404' ) !== false || stripos( $code, 'forbidden' ) !== false || strpos( $code, 'F' ) !== false )
132
  return 404;
133
+ elseif ( strpos( $code, '410' ) !== false || stripos( $code, 'gone' ) !== false || strpos( $code, 'G' ) !== false )
134
  return 410;
135
  return 0;
136
  }
137
  }
 
fileio/csv.php CHANGED
@@ -1,79 +1,45 @@
1
  <?php
2
 
3
- class Red_Csv_File extends Red_FileIO
4
- {
5
- function collect ($module)
6
- {
7
- $this->id = $module->id;
8
 
9
- $items = Red_Item::get_by_module( $module->id );
10
- if (count ($items) > 0)
11
- {
12
- foreach ($items AS $item)
13
- $this->items[] = array ('source' => $item->url, 'target' => ($item->action_type == 'url' ? $item->action_data : ''), 'last_count' => $item->last_count);
14
- }
15
- }
16
-
17
- function feed ($filename = '', $heading = '')
18
- {
19
- $filename = sprintf (__ ('module_%d.csv', 'redirection'), $this->id);
20
 
21
- header ("Content-Type: text/csv");
22
- header ("Cache-Control: no-cache, must-revalidate");
23
- header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
24
- header ('Content-Disposition: attachment; filename="'.$filename.'"');
25
-
26
- if (count ($this->items) > 0)
27
- {
28
- echo "source,target,hits\r\n";
29
 
30
- foreach ($this->items AS $line)
31
- echo implode (",", array_map (array (&$this, 'escape'), $line))."\r\n";
 
 
 
 
 
 
32
  }
33
  }
34
 
35
- function escape ($value)
36
- {
37
- // Escape any special values
38
- $double = false;
39
- if (strpos ($value, ',') !== false || $value == '')
40
- $double = true;
41
-
42
- if (strpos ($value, '"') !== false)
43
- {
44
- $double = true;
45
- $value = str_replace ('"', '""', $value);
46
- }
47
 
48
- if ($double)
49
- $value = '"'.$value.'"';
50
- return $value;
51
- }
52
 
53
- function parse_csv ($string, $separator = ',')
54
- {
55
- $string = str_replace('""', "'", $string);
56
- $bits = explode ('"',$string);
57
- $elements = array ();
58
 
59
- for ($i = 0; $i < count ($bits) ; $i++)
60
- {
61
- if (($i % 2) == 1)
62
- $elements[] = $bits[$i];
63
- else
64
- {
65
- $rest = $bits[$i];
66
- $rest = preg_replace ('/^'.$separator.'/', '', $rest);
67
- $rest = preg_replace ('/'.$separator.'$/', '', $rest);
68
 
69
- $elements = array_merge ($elements, explode ($separator, $rest));
 
70
  }
71
- }
72
-
73
- return $elements;
74
  }
75
 
76
- function load( $group, $data, $filename ) {
77
  $count = 0;
78
  $file = fopen( $filename, 'r' );
79
 
@@ -97,16 +63,15 @@ class Red_Csv_File extends Red_FileIO
97
  return $count;
98
  }
99
 
100
- function is_regex ($url)
101
- {
102
  $regex = '()[]$^?+';
103
  $escape = false;
104
 
105
- for ($x = 0; $x < strlen ($url); $x++)
106
- {
107
- if ($url{$x} == '\\')
108
  $escape = true;
109
- else if (strpos ($regex, $url{$x}) !== false && !$escape)
110
  return true;
111
  else
112
  $escape = false;
@@ -115,4 +80,3 @@ class Red_Csv_File extends Red_FileIO
115
  return false;
116
  }
117
  }
118
- ?>
1
  <?php
2
 
3
+ class Red_Csv_File extends Red_FileIO {
4
+ var $id;
5
+ var $items;
 
 
6
 
7
+ function collect( $module ) {
8
+ $this->id = $module->id;
 
 
 
 
 
 
 
 
 
9
 
10
+ $items = Red_Item::get_by_module( $module->id );
 
 
 
 
 
 
 
11
 
12
+ if ( count( $items ) > 0 ) {
13
+ foreach ( $items AS $item ) {
14
+ $this->items[] = array(
15
+ 'source' => $item->url,
16
+ 'target' => ( $item->action_type == 'url' ? $item->action_data : '' ),
17
+ 'last_count' => $item->last_count
18
+ );
19
+ }
20
  }
21
  }
22
 
23
+ function feed( $filename = '', $heading = '' ) {
24
+ $filename = sprintf( __( 'module_%d.csv', 'redirection' ), $this->id );
 
 
 
 
 
 
 
 
 
 
25
 
26
+ header( 'Content-Type: text/csv' );
27
+ header( 'Cache-Control: no-cache, must-revalidate' );
28
+ header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' );
29
+ header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
30
 
31
+ if ( count( $this->items ) > 0 ) {
32
+ echo "source,target,hits\r\n";
 
 
 
33
 
34
+ $stdout = fopen( 'php://output', 'w' );
 
 
 
 
 
 
 
 
35
 
36
+ foreach ( $this->items AS $line ) {
37
+ fputcsv( $stdout, $line );
38
  }
39
+ }
 
 
40
  }
41
 
42
+ function load( $group, $data, $filename = '' ) {
43
  $count = 0;
44
  $file = fopen( $filename, 'r' );
45
 
63
  return $count;
64
  }
65
 
66
+ function is_regex ($url) {
 
67
  $regex = '()[]$^?+';
68
  $escape = false;
69
 
70
+ for ( $x = 0; $x < strlen( $url ); $x++ ) {
71
+
72
+ if ( $url{$x} == '\\' )
73
  $escape = true;
74
+ elseif ( strpos( $regex, $url{$x} ) !== false && !$escape )
75
  return true;
76
  else
77
  $escape = false;
80
  return false;
81
  }
82
  }
 
fileio/rss.php CHANGED
@@ -7,7 +7,7 @@ class Red_Rss_File extends Red_FileIO
7
  function collect ($module)
8
  {
9
  $this->name = $module->name;
10
- $this->items = RE_Log::get_by_module( $module->id );
11
  }
12
 
13
  function feed ()
@@ -22,23 +22,23 @@ class Red_Rss_File extends Red_FileIO
22
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
23
  xmlns:dc="http://purl.org/dc/elements/1.1/">
24
  <channel>
25
- <title><?php echo $title.' - '; bloginfo_rss ('name'); ?></title>
26
- <link><?php bloginfo_rss('url') ?></link>
27
  <description><?php bloginfo_rss("description") ?></description>
28
- <pubDate><?php echo htmlspecialchars (mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false)); ?></pubDate>
29
- <generator><?php echo htmlspecialchars ('http://wordpress.org/?v='); bloginfo_rss ('version'); ?></generator>
30
- <language><?php echo get_option ('rss_language'); ?></language>
31
  <?php
32
  if (count ($this->items) > 0)
33
  {
34
  foreach ($this->items as $log) : ?>
35
  <item>
36
- <title><![CDATA[<?php echo $log->url; ?>]]></title>
37
- <link><![CDATA[<?php bloginfo ('home'); echo $log->url; ?>]]></link>
38
- <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', $log->created_at, false); ?></pubDate>
39
- <guid isPermaLink="false"><?php print($log->id); ?></guid>
40
- <description><![CDATA[<?php echo $log->url; ?>]]></description>
41
- <content:encoded><![CDATA[<?php if ($log->referrer) echo 'Referred by '.$log->referrer; ?>]]></content:encoded>
42
  </item>
43
  <?php endforeach; } ?>
44
  </channel>
@@ -47,5 +47,3 @@ class Red_Rss_File extends Red_FileIO
47
  die();
48
  }
49
  }
50
-
51
- ?>
7
  function collect ($module)
8
  {
9
  $this->name = $module->name;
10
+ $this->items = Red_Item::get_by_module( $module->id );
11
  }
12
 
13
  function feed ()
22
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
23
  xmlns:dc="http://purl.org/dc/elements/1.1/">
24
  <channel>
25
+ <title><?php echo esc_html( $title ).' - '; bloginfo_rss ('name'); ?></title>
26
+ <link><?php bloginfo_rss( 'url' ) ?></link>
27
  <description><?php bloginfo_rss("description") ?></description>
28
+ <pubDate><?php echo esc_html( mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified( 'GMT' ), false ) ); ?></pubDate>
29
+ <generator><?php echo esc_html( 'http://wordpress.org/?v=' ); bloginfo_rss( 'version' ); ?></generator>
30
+ <language><?php echo get_option( 'rss_language' ); ?></language>
31
  <?php
32
  if (count ($this->items) > 0)
33
  {
34
  foreach ($this->items as $log) : ?>
35
  <item>
36
+ <title><?php echo esc_html( $log->url ); ?></title>
37
+ <link><![CDATA[<?php echo home_url(); echo esc_html( $log->url ); ?>]]></link>
38
+ <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', $log->created, false); ?></pubDate>
39
+ <guid isPermaLink="false"><?php echo $log->id; ?></guid>
40
+ <description><?php echo esc_html( $log->url ); ?></description>
41
+ <content:encoded><?php if ( $log->referrer ) echo 'Referred by '.esc_html( $log->referrer ); ?></content:encoded>
42
  </item>
43
  <?php endforeach; } ?>
44
  </channel>
47
  die();
48
  }
49
  }
 
 
models/action.php CHANGED
@@ -15,9 +15,9 @@ class Red_Action
15
 
16
  function config () { }
17
 
18
- function create ($name, $code)
19
  {
20
- $avail = Red_Action::available ();
21
  if (isset ($avail[$name]))
22
  {
23
  if (!class_exists (strtolower ($avail[$name][1])))
@@ -31,7 +31,7 @@ class Red_Action
31
  return false;
32
  }
33
 
34
- function available ()
35
  {
36
  return array
37
  (
@@ -60,4 +60,4 @@ class Red_Action
60
  }
61
 
62
  }
63
- ?>
15
 
16
  function config () { }
17
 
18
+ static function create ($name, $code)
19
  {
20
+ $avail = self::available ();
21
  if (isset ($avail[$name]))
22
  {
23
  if (!class_exists (strtolower ($avail[$name][1])))
31
  return false;
32
  }
33
 
34
+ static function available ()
35
  {
36
  return array
37
  (
60
  }
61
 
62
  }
63
+ ?>
models/database.php CHANGED
@@ -122,7 +122,6 @@ class RE_Database {
122
  if ( $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->prefix}redirection_modules" ) == 0 ) {
123
  $wpdb->insert( $wpdb->prefix.'redirection_modules', array( 'type' => 'wp', 'name' => __( 'WordPress', 'redirection' ), 'options' => '' ) );
124
  $wpdb->insert( $wpdb->prefix.'redirection_modules', array( 'type' => 'apache', 'name' => __( 'Apache', 'redirection' ), 'options' => '' ) );
125
- $wpdb->insert( $wpdb->prefix.'redirection_modules', array( 'type' => '404', 'name' => __( '404', 'redirection' ), 'options' => '' ) );
126
  }
127
 
128
  // Groups
@@ -192,7 +191,7 @@ class RE_Database {
192
  PRIMARY KEY (`id`),
193
  KEY `created` (`created`),
194
  KEY `url` (`url`),
195
- KEY `ip` (`ip`,`id`)
196
  KEY `referrer` (`referrer`)
197
  ) $charset_collate;" );
198
  }
122
  if ( $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->prefix}redirection_modules" ) == 0 ) {
123
  $wpdb->insert( $wpdb->prefix.'redirection_modules', array( 'type' => 'wp', 'name' => __( 'WordPress', 'redirection' ), 'options' => '' ) );
124
  $wpdb->insert( $wpdb->prefix.'redirection_modules', array( 'type' => 'apache', 'name' => __( 'Apache', 'redirection' ), 'options' => '' ) );
 
125
  }
126
 
127
  // Groups
191
  PRIMARY KEY (`id`),
192
  KEY `created` (`created`),
193
  KEY `url` (`url`),
194
+ KEY `ip` (`ip`,`id`),
195
  KEY `referrer` (`referrer`)
196
  ) $charset_collate;" );
197
  }
models/file_io.php CHANGED
@@ -31,12 +31,12 @@ class Red_FileIO
31
  $parts = pathinfo( $file['name'] );
32
 
33
  if ( $parts['extension'] == 'csv' ) {
34
- include dirname( __FILE__ ).'/../fileio/csv.php';
35
  $importer = new Red_Csv_File();
36
  $data = '';
37
  }
38
  else {
39
- include dirname( __FILE__ ).'/../fileio/apache.php';
40
  $importer = new Red_Apache_File();
41
  $data = @file_get_contents ($file['tmp_name']);
42
  }
@@ -47,5 +47,5 @@ class Red_FileIO
47
  return 0;
48
  }
49
 
50
- function load ($group, $data) { }
51
  }
31
  $parts = pathinfo( $file['name'] );
32
 
33
  if ( $parts['extension'] == 'csv' ) {
34
+ include dirname( dirname( __FILE__ ) ).'/fileio/csv.php';
35
  $importer = new Red_Csv_File();
36
  $data = '';
37
  }
38
  else {
39
+ include dirname( dirname( __FILE__ ) ).'/fileio/apache.php';
40
  $importer = new Red_Apache_File();
41
  $data = @file_get_contents ($file['tmp_name']);
42
  }
47
  return 0;
48
  }
49
 
50
+ function load ($group, $data, $filename = '' ) { }
51
  }
models/group.php CHANGED
@@ -12,7 +12,7 @@ class Red_Group {
12
  /**
13
  * Get list of groups
14
  */
15
- function get( $id ) {
16
  global $wpdb;
17
 
18
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT {$wpdb->prefix}redirection_groups.*,COUNT( {$wpdb->prefix}redirection_items.id ) AS items,SUM( {$wpdb->prefix}redirection_items.last_count ) AS redirects FROM {$wpdb->prefix}redirection_groups LEFT JOIN {$wpdb->prefix}redirection_items ON {$wpdb->prefix}redirection_items.group_id={$wpdb->prefix}redirection_groups.id WHERE {$wpdb->prefix}redirection_groups.id=%d GROUP BY {$wpdb->prefix}redirection_groups.id", $id ) );
@@ -21,7 +21,7 @@ class Red_Group {
21
  return false;
22
  }
23
 
24
- function get_for_module( $module ) {
25
  global $wpdb;
26
 
27
  $sql = $wpdb->prepare( "SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}redirection_groups.* FROM {$wpdb->prefix}redirection_groups WHERE {$wpdb->prefix}redirection_groups.module_id=%d", $module );
@@ -41,7 +41,7 @@ class Red_Group {
41
  * Get all groups with number of items in each group
42
  * DBW
43
  */
44
- function get_all( $module, $pager ) {
45
  global $wpdb;
46
 
47
  $sql = $wpdb->prepare( "SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}redirection_groups.*,COUNT( {$wpdb->prefix}redirection_items.id ) AS items,SUM( {$wpdb->prefix}redirection_items.last_count ) AS redirects FROM {$wpdb->prefix}redirection_groups LEFT JOIN {$wpdb->prefix}redirection_items ON {$wpdb->prefix}redirection_items.group_id={$wpdb->prefix}redirection_groups.id WHERE {$wpdb->prefix}redirection_groups.module_id=%d", $module );
@@ -63,7 +63,7 @@ class Red_Group {
63
  * Get list of groups
64
  * DBW
65
  */
66
- function get_for_select() {
67
  global $wpdb;
68
 
69
  $data = array();
@@ -80,13 +80,13 @@ class Red_Group {
80
  /**
81
  * Get first group ID
82
  */
83
- function get_first_id() {
84
  global $wpdb;
85
 
86
  return $wpdb->get_var( "SELECT id FROM {$wpdb->prefix}redirection_groups ORDER BY id LIMIT 0,1" );
87
  }
88
 
89
- function create( $data ) {
90
  global $wpdb;
91
 
92
  $name = trim( $data['name'] );
@@ -126,10 +126,10 @@ class Red_Group {
126
  Red_Module::flush( $this->module_id );
127
  }
128
 
129
- function delete( $group ) {
130
  global $wpdb;
131
 
132
- $obj = Red_Group::get( $group );
133
 
134
  // Delete all items in this group
135
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_items WHERE group_id=%d", $group ) );
@@ -146,14 +146,14 @@ class Red_Group {
146
  }
147
  }
148
 
149
- function save_order( $items, $start ) {
150
  global $wpdb;
151
 
152
  foreach ( $items AS $pos => $id ) {
153
  $wpdb->update( $wpdb->prefix.'redirection_groups', array( 'position' => $pos + $start ), array( 'id' => intval( $id ) ) );
154
  }
155
 
156
- $group = Red_Group::get( $items[0] );
157
  Red_Module::flush( $group->module_id );
158
  }
159
 
@@ -206,9 +206,6 @@ class Red_Group {
206
  function hits() {
207
  global $wpdb;
208
 
209
- $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM {$wpdb->prefix}redirection_logs WHERE group_id=%d", $this->id ) );
210
- if ( $count > 0 )
211
- return $count;
212
- return 0;
213
  }
214
  }
12
  /**
13
  * Get list of groups
14
  */
15
+ static function get( $id ) {
16
  global $wpdb;
17
 
18
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT {$wpdb->prefix}redirection_groups.*,COUNT( {$wpdb->prefix}redirection_items.id ) AS items,SUM( {$wpdb->prefix}redirection_items.last_count ) AS redirects FROM {$wpdb->prefix}redirection_groups LEFT JOIN {$wpdb->prefix}redirection_items ON {$wpdb->prefix}redirection_items.group_id={$wpdb->prefix}redirection_groups.id WHERE {$wpdb->prefix}redirection_groups.id=%d GROUP BY {$wpdb->prefix}redirection_groups.id", $id ) );
21
  return false;
22
  }
23
 
24
+ static function get_for_module( $module ) {
25
  global $wpdb;
26
 
27
  $sql = $wpdb->prepare( "SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}redirection_groups.* FROM {$wpdb->prefix}redirection_groups WHERE {$wpdb->prefix}redirection_groups.module_id=%d", $module );
41
  * Get all groups with number of items in each group
42
  * DBW
43
  */
44
+ static function get_all( $module, $pager ) {
45
  global $wpdb;
46
 
47
  $sql = $wpdb->prepare( "SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}redirection_groups.*,COUNT( {$wpdb->prefix}redirection_items.id ) AS items,SUM( {$wpdb->prefix}redirection_items.last_count ) AS redirects FROM {$wpdb->prefix}redirection_groups LEFT JOIN {$wpdb->prefix}redirection_items ON {$wpdb->prefix}redirection_items.group_id={$wpdb->prefix}redirection_groups.id WHERE {$wpdb->prefix}redirection_groups.module_id=%d", $module );
63
  * Get list of groups
64
  * DBW
65
  */
66
+ static function get_for_select() {
67
  global $wpdb;
68
 
69
  $data = array();
80
  /**
81
  * Get first group ID
82
  */
83
+ static function get_first_id() {
84
  global $wpdb;
85
 
86
  return $wpdb->get_var( "SELECT id FROM {$wpdb->prefix}redirection_groups ORDER BY id LIMIT 0,1" );
87
  }
88
 
89
+ static function create( $data ) {
90
  global $wpdb;
91
 
92
  $name = trim( $data['name'] );
126
  Red_Module::flush( $this->module_id );
127
  }
128
 
129
+ static function delete( $group ) {
130
  global $wpdb;
131
 
132
+ $obj = self::get( $group );
133
 
134
  // Delete all items in this group
135
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_items WHERE group_id=%d", $group ) );
146
  }
147
  }
148
 
149
+ static function save_order( $items, $start ) {
150
  global $wpdb;
151
 
152
  foreach ( $items AS $pos => $id ) {
153
  $wpdb->update( $wpdb->prefix.'redirection_groups', array( 'position' => $pos + $start ), array( 'id' => intval( $id ) ) );
154
  }
155
 
156
+ $group = self::get( $items[0] );
157
  Red_Module::flush( $group->module_id );
158
  }
159
 
206
  function hits() {
207
  global $wpdb;
208
 
209
+ return (int)$wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}redirection_logs WHERE group_id=%d", $this->id ) );
 
 
 
210
  }
211
  }
models/htaccess.php CHANGED
@@ -1,167 +1,144 @@
1
  <?php
2
 
3
- class Red_Htaccess
4
- {
5
  var $settings;
6
  var $items;
7
 
8
- function Red_Htaccess ($settings)
9
- {
10
- foreach ($settings AS $key => $value)
11
  $this->settings[$key] = $value;
 
12
  }
13
 
14
- function encode_from ($url)
15
- {
16
- return '^'.$this->encode ($url).'$';
17
  }
18
 
19
- function encode2nd ($url)
20
- {
21
- $url = urlencode ($url);
22
- $url = str_replace ('%2F', '/', $url);
23
- $url = str_replace ('%3A', ':', $url);
24
- $url = str_replace ('+', '%20', $url);
25
- $url = str_replace ('%24', '$', $url);
26
  return $url;
27
  }
28
 
29
- function encode ($url)
30
- {
31
- $url = urlencode ($url);
32
- $url = str_replace ('%2F', '/', $url);
33
- $url = str_replace ('+', '%20', $url);
34
- $url = str_replace ('.', '\\.', $url);
35
  return $url;
36
  }
37
 
38
- function encode_regex ($url)
39
- {
40
- $url = str_replace (' ', '%20', $url);
41
- $url = str_replace ('.', '\\.', $url);
42
- $url = str_replace ('\\.*', '.*', $url);
43
- $url = str_replace ('%24', '$', $url);
44
  return $url;
45
  }
46
 
47
- function add_referrer ($item, $match)
48
- {
49
- $from = $this->encode_from (ltrim ($item->url, '/'));
50
- if ($item->regex)
51
- $from = $this->encode_regex (ltrim ($item->url, '/'));
52
 
53
- if (($match->url_from || $match->url_notfrom) && $match->referrer)
54
- {
55
- $this->items[] = sprintf ('RewriteCond %%{HTTP_REFERER} %s [NC]', ($match->regex ? $this->encode_regex ($match->referrer) : $this->encode_from ($match->referrer)));
56
 
57
- if ($match->url_from)
58
- {
59
- $to = $this->target ($item->action_type, $match->url_from, $item->action_code, $item->regex);
60
- $this->items[] = sprintf ('RewriteRule %s %s', $from, $to);
61
  }
62
 
63
- if ($match->url_notfrom)
64
- {
65
- $to = $this->target ($item->action_type, $match->url_notfrom, $item->action_code, $item->regex);
66
- $this->items[] = sprintf ('RewriteRule %s %s', $from, $to);
67
  }
68
  }
69
  }
70
 
71
- function add_agent ($item, $match)
72
- {
73
- $from = $this->encode (ltrim ($item->url, '/'));
74
- if ($item->regex)
75
- $from = $this->encode_regex (ltrim ($item->url, '/'));
76
 
77
- if (($match->url_from || $match->url_notfrom) && $match->user_agent)
78
- {
79
- $this->items[] = sprintf ('RewriteCond %%{HTTP_USER_AGENT} %s [NC]', ($match->regex ? $this->encode_regex ($match->user_agent) : $this->encode2nd ($match->user_agent)));
80
 
81
- if ($match->url_from)
82
- {
83
- $to = $this->target ($item->action_type, $match->url_from, $item->action_code, $item->regex);
84
- $this->items[] = sprintf ('RewriteRule %s %s', $from, $to);
85
  }
86
 
87
- if ($match->url_notfrom)
88
- {
89
- $to = $this->target ($item->action_type, $match->url_notfrom, $item->action_code, $item->regex);
90
- $this->items[] = sprintf ('RewriteRule %s %s', $from, $to);
91
  }
92
  }
93
  }
94
 
95
- function add_url ($item, $match)
96
- {
97
- $to = $this->target ($item->action_type, $match->url, $item->action_code, $item->regex);
98
- $from = $this->encode_from (ltrim ($item->url, '/'));
99
- if ($item->regex)
100
- $from = $this->encode_regex (ltrim ($item->url, '/'));
101
 
102
- if ($to)
103
- $this->items[] = sprintf ('RewriteRule %s %s', $from, $to);
104
  }
105
 
106
- function action_random ($data, $code, $regex)
107
- {
108
  // Pick a WP post at random
109
  global $wpdb;
110
 
111
- $post = $wpdb->get_var ("SELECT ID FROM {$wpdb->posts} ORDER BY RAND() LIMIT 0,1");
112
- $url = parse_url (get_permalink ($post));
113
 
114
- return sprintf ('%s [R=%d,L]', $this->encode ($url['path']), $code);
115
  }
116
 
117
- function action_pass ($data, $code, $regex)
118
- {
119
- if ($regex)
120
- return sprintf ('%s [L]', $this->encode2nd ($data), $code);
121
- else
122
- return sprintf ('%s [L]', $this->encode2nd ($data), $code);
123
  }
124
 
125
- function action_error ($data, $code, $regex)
126
- {
127
- if ($code == '410')
128
  return '/ [G,L]';
129
  return '/ [F,L]';
130
  }
131
 
132
- function action_url ($data, $code, $regex)
133
- {
134
- if ($regex)
135
- return sprintf ('%s [R=%d,L]', $this->encode2nd ($data), $code);
136
- else
137
- return sprintf ('%s [R=%d,L]', $this->encode2nd ($data), $code);
138
  }
139
 
140
- function target ($action, $data, $code, $regex)
141
- {
142
  $target = 'action_'.$action;
143
 
144
- if (method_exists ($this, $target))
145
- return $this->$target ($data, $code, $regex);
146
  return '';
147
  }
148
 
149
- function add ($item)
150
- {
151
  $target = 'add_'.$item->match_type;
152
 
153
- if (method_exists ($this, $target))
154
- $this->$target ($item, $item->match);
155
  }
156
 
157
- function generate ($name)
158
- {
159
  // Head of redirection section - do not localize this
160
  global $redirection;
161
 
162
  $text[] = '# Created by Redirection Module: '.$name;
163
  $text[] = '# '.date ('r');
164
- $text[] = '# Redirection '.$redirection->version ().' - http://urbangiraffe.com/plugins/redirection/';
165
  $text[] = '';
166
 
167
  // Default blocked files - I can't think of a reason not to block these
@@ -172,33 +149,33 @@ class Red_Htaccess
172
  $text[] = '';
173
 
174
  // PHP options
175
- if (isset ($this->settings['error_level']) && $this->settings['error_level'] != 'default')
176
- $text[] = 'php_value error_reporting '.($this->settings == 'none' ? '0' : 'E_ALL');
177
 
178
- if (isset ($this->settings['memory_limit']) && $this->settings['memory_limit'] != 0)
179
  $text[] = 'php_value memory_limit '.$this->settings['memory_limit'].'M';
180
 
181
- if ($this->settings['allow_ip'] || $this->settings['ban_ip'])
182
- {
183
  $text[] = '';
184
  $text[] = 'order allow,deny';
185
- if ($this->settings['ban_ip'])
186
- {
187
- $ips = array_filter (explode (',', $this->settings['ban_ip']));
188
- if (count ($ips) > 0)
189
- {
190
- foreach ($ips AS $ip)
191
  $text[] = 'deny from '.$ip;
 
192
  }
193
  }
194
 
195
- if ($this->settings['allow_ip'])
196
- {
197
- $ips = array_filter (explode (',', $this->settings['allow_ip']));
198
- if (count ($ips) > 0)
199
- {
200
- foreach ($ips AS $ip)
201
  $text[] = 'allow from '.$ip;
 
202
  }
203
  }
204
  else
@@ -211,79 +188,73 @@ class Red_Htaccess
211
  $text[] = '';
212
  $text[] = '<IfModule mod_rewrite.c>';
213
 
214
- if ($this->settings['canonical'] != 'default')
215
- {
216
  $text[] = 'RewriteEngine On';
217
  $base = $this->settings['site'];
218
- if ($base == '')
219
- $base = get_option ('home');
220
 
221
- $parts = parse_url ($base);
222
- $base = str_replace ('www.', '', $parts['host']);
 
 
 
223
 
224
- if ($this->settings['canonical'] == 'nowww')
225
- {
226
- $text[] = 'RewriteCond %{HTTP_HOST} ^www\.'.str_replace ('.', '\\.', $base).'$ [NC]';
227
  $text[] = 'RewriteRule ^(.*)$ http://'.$base.'/$1 [R=301,L]';
228
  }
229
- else if ($this->settings['canonical'] == 'www')
230
- {
231
- $text[] = 'RewriteCond %{HTTP_HOST} ^'.str_replace ('.', '\\.', $base).'$ [NC]';
232
  $text[] = 'RewriteRule ^(.*)$ http://www.'.$base.'/$1 [R=301,L]';
233
  }
234
 
235
  $text[] = '';
236
  }
237
 
238
- if ($this->settings['strip_index'] == 'yes')
239
- {
240
  $text[] = 'RewriteCond %{THE_REQUEST} (.*)index\.(php|htm|html)\ HTTP/';
241
  $text[] = 'RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,NC,L]';
242
  $text[] = '';
243
  }
244
 
245
  // Add redirects
246
- if (is_array ($this->items))
247
- $text = array_merge ($text, $this->items);
248
 
249
  // End of mod_rewrite
250
  $text[] = '</IfModule>';
251
  $text[] = '';
252
 
253
- if ($this->settings['raw'])
254
  $text[] = $this->settings['raw'];
255
 
256
  // End of redirection section
257
  $text[] = '# End of Redirection';
258
  $text[] = '';
259
 
260
- $text = implode ("\r\n", $text);
261
- $text = str_replace ("\r\n\r\n\r\n", "\r\n", $text);
262
- $text = str_replace ("\r\n\r\n\r\n", "\r\n", $text);
263
  return $text;
264
  }
265
 
266
- function save ($filename, $name)
267
- {
268
- $text = $this->generate ($name);
269
 
270
  // Does the file already exist?
271
- if (file_exists ($filename))
272
- {
273
- $existing = @file_get_contents ($filename);
274
 
275
  // Remove any existing Redirection module
276
- $text .= preg_replace ('@# Created by Redirection Module: '.$name.'(.*?)# End of Redirection@s', '', $existing);
277
  }
278
 
279
- $file = @fopen ($filename, 'w');
280
- if ($file)
281
- {
282
- $text = str_replace ("\r\n\r\n\r\n", "\r\n", $text);
283
- $text = str_replace ("\r\n\r\n\r\n", "\r\n", $text);
284
 
285
- fwrite ($file, $text);
286
- fclose ($file);
287
  return true;
288
  }
289
 
1
  <?php
2
 
3
+ class Red_Htaccess {
 
4
  var $settings;
5
  var $items;
6
 
7
+ function __construct( $settings ) {
8
+ foreach ( $settings AS $key => $value ) {
 
9
  $this->settings[$key] = $value;
10
+ }
11
  }
12
 
13
+ function encode_from( $url ) {
14
+ return '^'.$this->encode( $url ).'$';
 
15
  }
16
 
17
+ function encode2nd( $url ) {
18
+ $url = urlencode( $url );
19
+ $url = str_replace( '%2F', '/', $url );
20
+ $url = str_replace( '%3A', ':', $url );
21
+ $url = str_replace( '+', '%20', $url );
22
+ $url = str_replace( '%24', '$', $url );
 
23
  return $url;
24
  }
25
 
26
+ function encode( $url ) {
27
+ $url = urlencode( $url );
28
+ $url = str_replace( '%2F', '/', $url );
29
+ $url = str_replace( '+', '%20', $url );
30
+ $url = str_replace( '.', '\\.', $url );
 
31
  return $url;
32
  }
33
 
34
+ function encode_regex( $url ) {
35
+ $url = str_replace( ' ', '%20', $url );
36
+ $url = str_replace( '.', '\\.', $url );
37
+ $url = str_replace( '\\.*', '.*', $url );
38
+ $url = str_replace( '%24', '$', $url );
 
39
  return $url;
40
  }
41
 
42
+ function add_referrer( $item, $match ) {
43
+ $from = $this->encode_from( ltrim( $item->url, '/' ) );
44
+ if ( $item->regex )
45
+ $from = $this->encode_regex( ltrim( $item->url, '/' ) );
 
46
 
47
+ if ( ( $match->url_from || $match->url_notfrom ) && $match->referrer ) {
48
+ $this->items[] = sprintf( 'RewriteCond %%{HTTP_REFERER} %s [NC]', ( $match->regex ? $this->encode_regex( $match->referrer ) : $this->encode_from( $match->referrer ) ) );
 
49
 
50
+ if ( $match->url_from ) {
51
+ $to = $this->target( $item->action_type, $match->url_from, $item->action_code, $item->regex );
52
+ $this->items[] = sprintf( 'RewriteRule %s %s', $from, $to );
 
53
  }
54
 
55
+ if ( $match->url_notfrom ) {
56
+ $to = $this->target( $item->action_type, $match->url_notfrom, $item->action_code, $item->regex );
57
+ $this->items[] = sprintf( 'RewriteRule %s %s', $from, $to );
 
58
  }
59
  }
60
  }
61
 
62
+ function add_agent( $item, $match ) {
63
+ $from = $this->encode( ltrim( $item->url, '/' ) );
64
+ if ( $item->regex )
65
+ $from = $this->encode_regex( ltrim( $item->url, '/' ) );
 
66
 
67
+ if ( ( $match->url_from || $match->url_notfrom ) && $match->user_agent ) {
68
+ $this->items[] = sprintf( 'RewriteCond %%{HTTP_USER_AGENT} %s [NC]', ( $match->regex ? $this->encode_regex( $match->user_agent ) : $this->encode2nd( $match->user_agent ) ) );
 
69
 
70
+ if ( $match->url_from ) {
71
+ $to = $this->target( $item->action_type, $match->url_from, $item->action_code, $item->regex );
72
+ $this->items[] = sprintf( 'RewriteRule %s %s', $from, $to );
 
73
  }
74
 
75
+ if ( $match->url_notfrom ) {
76
+ $to = $this->target( $item->action_type, $match->url_notfrom, $item->action_code, $item->regex );
77
+ $this->items[] = sprintf( 'RewriteRule %s %s', $from, $to );
 
78
  }
79
  }
80
  }
81
 
82
+ function add_url( $item, $match ) {
83
+ $to = $this->target( $item->action_type, $match->url, $item->action_code, $item->regex );
84
+ $from = $this->encode_from( ltrim( $item->url, '/' ) );
85
+ if ( $item->regex )
86
+ $from = $this->encode_regex( ltrim ($item->url, '/' ) );
 
87
 
88
+ if ( $to )
89
+ $this->items[] = sprintf( 'RewriteRule %s %s', $from, $to );
90
  }
91
 
92
+ function action_random( $data, $code, $regex ) {
 
93
  // Pick a WP post at random
94
  global $wpdb;
95
 
96
+ $post = $wpdb->get_var( "SELECT ID FROM {$wpdb->posts} ORDER BY RAND() LIMIT 0,1" );
97
+ $url = parse_url( get_permalink( $post ) );
98
 
99
+ return sprintf( '%s [R=%d,L]', $this->encode( $url['path'] ), $code );
100
  }
101
 
102
+ function action_pass( $data, $code, $regex ) {
103
+ if ( $regex )
104
+ return sprintf( '%s [L]', $this->encode2nd( $data ), $code );
105
+ return sprintf( '%s [L]', $this->encode2nd( $data ), $code );
 
 
106
  }
107
 
108
+ function action_error( $data, $code, $regex) {
109
+ if ( $code == '410' )
 
110
  return '/ [G,L]';
111
  return '/ [F,L]';
112
  }
113
 
114
+ function action_url( $data, $code, $regex ) {
115
+ if ( $regex )
116
+ return sprintf( '%s [R=%d,L]', $this->encode2nd( $data ), $code );
117
+ return sprintf( '%s [R=%d,L]', $this->encode2nd( $data ), $code );
 
 
118
  }
119
 
120
+ function target( $action, $data, $code, $regex ) {
 
121
  $target = 'action_'.$action;
122
 
123
+ if ( method_exists( $this, $target ) )
124
+ return $this->$target( $data, $code, $regex );
125
  return '';
126
  }
127
 
128
+ function add( $item ) {
 
129
  $target = 'add_'.$item->match_type;
130
 
131
+ if ( method_exists( $this, $target ) )
132
+ $this->$target( $item, $item->match );
133
  }
134
 
135
+ function generate( $name ) {
 
136
  // Head of redirection section - do not localize this
137
  global $redirection;
138
 
139
  $text[] = '# Created by Redirection Module: '.$name;
140
  $text[] = '# '.date ('r');
141
+ $text[] = '# Redirection '.$redirection->version().' - http://urbangiraffe.com/plugins/redirection/';
142
  $text[] = '';
143
 
144
  // Default blocked files - I can't think of a reason not to block these
149
  $text[] = '';
150
 
151
  // PHP options
152
+ if ( isset( $this->settings['error_level'] ) && $this->settings['error_level'] != 'default' )
153
+ $text[] = 'php_value error_reporting '.( $this->settings == 'none' ? '0' : 'E_ALL' );
154
 
155
+ if ( isset( $this->settings['memory_limit'] ) && $this->settings['memory_limit'] != 0 )
156
  $text[] = 'php_value memory_limit '.$this->settings['memory_limit'].'M';
157
 
158
+ if ( ( isset( $this->settings['allow_ip'] ) && $this->settings['allow_ip'] ) || ( isset( $this->settings['ban_ip'] ) && $this->settings['ban_ip'] ) ) {
 
159
  $text[] = '';
160
  $text[] = 'order allow,deny';
161
+
162
+ if ( isset( $this->settings['ban_ip'] ) && $this->settings['ban_ip'] ) {
163
+ $ips = array_filter( explode( ',', $this->settings['ban_ip'] ) );
164
+
165
+ if ( count( $ips ) > 0 ) {
166
+ foreach ( $ips AS $ip ) {
167
  $text[] = 'deny from '.$ip;
168
+ }
169
  }
170
  }
171
 
172
+ if ( $this->settings['allow_ip'] ) {
173
+ $ips = array_filter( explode( ',', $this->settings['allow_ip'] ) );
174
+
175
+ if ( count( $ips ) > 0 ) {
176
+ foreach ( $ips AS $ip ) {
 
177
  $text[] = 'allow from '.$ip;
178
+ }
179
  }
180
  }
181
  else
188
  $text[] = '';
189
  $text[] = '<IfModule mod_rewrite.c>';
190
 
191
+ if ( $this->settings['canonical'] != 'default' ) {
 
192
  $text[] = 'RewriteEngine On';
193
  $base = $this->settings['site'];
 
 
194
 
195
+ if ( $base == '' )
196
+ $base = get_option( 'home' );
197
+
198
+ $parts = parse_url( $base );
199
+ $base = str_replace( 'www.', '', $parts['host'] );
200
 
201
+ if ( $this->settings['canonical'] == 'nowww' ) {
202
+ $text[] = 'RewriteCond %{HTTP_HOST} ^www\.'.str_replace( '.', '\\.', $base ).'$ [NC]';
 
203
  $text[] = 'RewriteRule ^(.*)$ http://'.$base.'/$1 [R=301,L]';
204
  }
205
+ elseif ( $this->settings['canonical'] == 'www' ) {
206
+ $text[] = 'RewriteCond %{HTTP_HOST} ^'.str_replace( '.', '\\.', $base ).'$ [NC]';
 
207
  $text[] = 'RewriteRule ^(.*)$ http://www.'.$base.'/$1 [R=301,L]';
208
  }
209
 
210
  $text[] = '';
211
  }
212
 
213
+ if ( $this->settings['strip_index'] == 'yes' ) {
 
214
  $text[] = 'RewriteCond %{THE_REQUEST} (.*)index\.(php|htm|html)\ HTTP/';
215
  $text[] = 'RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,NC,L]';
216
  $text[] = '';
217
  }
218
 
219
  // Add redirects
220
+ if ( is_array( $this->items ) )
221
+ $text = array_merge( $text, $this->items );
222
 
223
  // End of mod_rewrite
224
  $text[] = '</IfModule>';
225
  $text[] = '';
226
 
227
+ if ( isset( $this->settings['raw'] ) && $this->settings['raw'] )
228
  $text[] = $this->settings['raw'];
229
 
230
  // End of redirection section
231
  $text[] = '# End of Redirection';
232
  $text[] = '';
233
 
234
+ $text = implode( "\r\n", $text );
235
+ $text = str_replace( "\r\n\r\n\r\n", "\r\n", $text );
236
+ $text = str_replace( "\r\n\r\n\r\n", "\r\n", $text );
237
  return $text;
238
  }
239
 
240
+ function save( $filename, $name ) {
241
+ $text = $this->generate( $name );
 
242
 
243
  // Does the file already exist?
244
+ if ( file_exists( $filename) ) {
245
+ $existing = @file_get_contents( $filename );
 
246
 
247
  // Remove any existing Redirection module
248
+ $text .= preg_replace( '@# Created by Redirection Module: '.$name.'(.*?)# End of Redirection@s', '', $existing );
249
  }
250
 
251
+ $file = @fopen( $filename, 'w' );
252
+ if ( $file ) {
253
+ $text = str_replace( "\r\n\r\n\r\n", "\r\n", $text );
254
+ $text = str_replace( "\r\n\r\n\r\n", "\r\n", $text );
 
255
 
256
+ fwrite( $file, $text );
257
+ fclose( $file );
258
  return true;
259
  }
260
 
models/log.php CHANGED
@@ -37,7 +37,7 @@ class RE_Log {
37
  $this->url = stripslashes ($this->url);
38
  }
39
 
40
- function get_by_id( $id ) {
41
  global $wpdb;
42
 
43
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_logs WHERE id=%d", $id ) );
@@ -46,7 +46,7 @@ class RE_Log {
46
  return false;
47
  }
48
 
49
- function create( $url, $target, $agent, $ip, $referrer, $extra = array()) {
50
  global $wpdb, $redirection;
51
 
52
  $insert = array(
@@ -69,32 +69,31 @@ class RE_Log {
69
  $wpdb->insert( $wpdb->prefix.'redirection_logs', $insert );
70
  }
71
 
72
- function show_url( $url ) {
73
- $url = urldecode( $url );
74
  return implode('&#8203;/', explode( '/', substr( $url, 0, 80 ) ) ).( strlen( $url ) > 80 ? '...' : '' );
75
  }
76
 
77
- function delete( $id ) {
78
  global $wpdb;
79
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE id=%d", $id ) );
80
  }
81
 
82
- function delete_for_id( $id ) {
83
  global $wpdb;
84
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE redirection_id=%d", $id ) );
85
  }
86
 
87
- function delete_for_group( $id ) {
88
  global $wpdb;
89
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE group_id=%d", $id ) );
90
  }
91
 
92
- function delete_for_module( $id ) {
93
  global $wpdb;
94
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE module_id=%d", $id ) );
95
  }
96
 
97
- function delete_all( $type = 'all', $id = 0 ) {
98
  global $wpdb;
99
 
100
  $where = array();
@@ -132,7 +131,7 @@ class RE_404 {
132
  $this->created = mysql2date ('U', $this->created);
133
  }
134
 
135
- function get_by_id( $id ) {
136
  global $wpdb;
137
 
138
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_404 WHERE id=%d", $id ) );
@@ -141,7 +140,7 @@ class RE_404 {
141
  return false;
142
  }
143
 
144
- function create( $url, $agent, $ip, $referrer ) {
145
  global $wpdb, $redirection;
146
 
147
  $insert = array(
@@ -159,13 +158,13 @@ class RE_404 {
159
  $wpdb->insert( $wpdb->prefix.'redirection_404', $insert );
160
  }
161
 
162
- function delete( $id ) {
163
  global $wpdb;
164
 
165
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_404 WHERE id=%d", $id ) );
166
  }
167
 
168
- function delete_all() {
169
  global $wpdb;
170
 
171
  $where = array();
37
  $this->url = stripslashes ($this->url);
38
  }
39
 
40
+ static function get_by_id( $id ) {
41
  global $wpdb;
42
 
43
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_logs WHERE id=%d", $id ) );
46
  return false;
47
  }
48
 
49
+ static function create( $url, $target, $agent, $ip, $referrer, $extra = array()) {
50
  global $wpdb, $redirection;
51
 
52
  $insert = array(
69
  $wpdb->insert( $wpdb->prefix.'redirection_logs', $insert );
70
  }
71
 
72
+ static function show_url( $url ) {
 
73
  return implode('&#8203;/', explode( '/', substr( $url, 0, 80 ) ) ).( strlen( $url ) > 80 ? '...' : '' );
74
  }
75
 
76
+ static function delete( $id ) {
77
  global $wpdb;
78
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE id=%d", $id ) );
79
  }
80
 
81
+ static function delete_for_id( $id ) {
82
  global $wpdb;
83
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE redirection_id=%d", $id ) );
84
  }
85
 
86
+ static function delete_for_group( $id ) {
87
  global $wpdb;
88
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE group_id=%d", $id ) );
89
  }
90
 
91
+ static function delete_for_module( $id ) {
92
  global $wpdb;
93
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_logs WHERE module_id=%d", $id ) );
94
  }
95
 
96
+ static function delete_all( $type = 'all', $id = 0 ) {
97
  global $wpdb;
98
 
99
  $where = array();
131
  $this->created = mysql2date ('U', $this->created);
132
  }
133
 
134
+ static function get_by_id( $id ) {
135
  global $wpdb;
136
 
137
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_404 WHERE id=%d", $id ) );
140
  return false;
141
  }
142
 
143
+ static function create( $url, $agent, $ip, $referrer ) {
144
  global $wpdb, $redirection;
145
 
146
  $insert = array(
158
  $wpdb->insert( $wpdb->prefix.'redirection_404', $insert );
159
  }
160
 
161
+ static function delete( $id ) {
162
  global $wpdb;
163
 
164
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_404 WHERE id=%d", $id ) );
165
  }
166
 
167
+ static function delete_all() {
168
  global $wpdb;
169
 
170
  $where = array();
models/match.php CHANGED
@@ -25,10 +25,11 @@ class Red_Match {
25
 
26
  function Red_Match( $values = '' ) {
27
  if ( $values ) {
28
- $obj = @unserialize( $values );
29
- if ( $obj === false )
30
- $this->url = $values;
31
- else {
 
32
  foreach ( $obj AS $key => $value ) {
33
  $this->$key = $value;
34
  }
@@ -64,8 +65,8 @@ class Red_Match {
64
  return $false;
65
  }
66
 
67
- function create( $name, $data = '' ) {
68
- $avail = Red_Match::available();
69
  if ( isset( $avail[strtolower( $name )] ) ) {
70
  $classname = $name.'_match';
71
 
@@ -77,19 +78,19 @@ class Red_Match {
77
  return false;
78
  }
79
 
80
- function all() {
81
  $data = array();
82
 
83
- $avail = Red_Match::available();
84
  foreach ( $avail AS $name => $file ) {
85
- $obj = Red_Match::create( $name );
86
  $data[$name] = $obj->name();
87
  }
88
 
89
  return $data;
90
  }
91
 
92
- function available() {
93
  return array (
94
  'url' => 'url.php',
95
  'referrer' => 'referrer.php',
25
 
26
  function Red_Match( $values = '' ) {
27
  if ( $values ) {
28
+ $this->url = $values;
29
+
30
+ $obj = maybe_unserialize( $values );
31
+
32
+ if ( is_array( $obj ) ) {
33
  foreach ( $obj AS $key => $value ) {
34
  $this->$key = $value;
35
  }
65
  return $false;
66
  }
67
 
68
+ static function create( $name, $data = '' ) {
69
+ $avail = self::available();
70
  if ( isset( $avail[strtolower( $name )] ) ) {
71
  $classname = $name.'_match';
72
 
78
  return false;
79
  }
80
 
81
+ static function all() {
82
  $data = array();
83
 
84
+ $avail = self::available();
85
  foreach ( $avail AS $name => $file ) {
86
+ $obj = self::create( $name );
87
  $data[$name] = $obj->name();
88
  }
89
 
90
  return $data;
91
  }
92
 
93
+ static function available() {
94
  return array (
95
  'url' => 'url.php',
96
  'referrer' => 'referrer.php',
models/module.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
 
3
  class Red_Module {
 
 
4
  function Red_Module( $values = '' ) {
5
  if ( is_object( $values ) ) {
6
  foreach ( $values AS $key => $value ) {
@@ -18,14 +20,14 @@ class Red_Module {
18
  function module_flush_delete() {
19
  }
20
 
21
- function flush( $id ) {
22
- $module = Red_Module::get( $id );
23
  if ( $module && $module->is_valid() )
24
  $module->module_flush( Red_Item::get_all_for_module( $id ) );
25
  }
26
 
27
- function flush_delete( $id ) {
28
- $module = Red_Module::get( $id );
29
  if ( $module )
30
  $module->module_flush_delete();
31
  }
@@ -37,7 +39,7 @@ class Red_Module {
37
  $options = $this->save( $data );
38
  $wpdb->update( $wpdb->prefix.'redirection_modules', array( 'name' => trim( $data['name'] ), 'options' => empty( $options ) ? '' : serialize( $options ) ), array( 'id' => intval( $this->id ) ) );
39
 
40
- Red_Module::clear_cache( $this->id );
41
  }
42
 
43
  function delete() {
@@ -53,13 +55,13 @@ class Red_Module {
53
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_modules WHERE id=%d", $this->id ) );
54
 
55
  RE_Log::delete_for_module( $this->id );
56
- Red_Module::clear_cache( $this->id );
57
- Red_Module::flush_delete( $this->id );
58
  }
59
 
60
- function clear_cache( $module ) {
61
  delete_option( 'redirection_module_cache' );
62
- Red_Module::flush( $module );
63
  }
64
 
65
  function create( $data ) {
@@ -76,19 +78,19 @@ class Red_Module {
76
 
77
  $wpdb->insert( $wpdb->prefix.'redirection_modules', $db );
78
 
79
- Red_Module::flush( $wpdb->insert_id );
80
  return $wpdb->insert_id;
81
  }
82
 
83
  return false;
84
  }
85
 
86
- function get( $id ) {
87
  global $wpdb;
88
 
89
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_modules WHERE id=%d", $id ) );
90
  if ( $row )
91
- return Red_Module::new_item( $row );
92
  return false;
93
  }
94
 
@@ -103,7 +105,7 @@ class Red_Module {
103
  $items = array();
104
  if ( count( $rows ) > 0 ) {
105
  foreach ( $rows AS $row ) {
106
- $items[] = Red_Module::new_item( $row );
107
  }
108
  }
109
 
@@ -115,24 +117,24 @@ class Red_Module {
115
  /**
116
  * Get all modules
117
  */
118
- function get_all() {
119
  global $wpdb;
120
 
121
  $rows = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}redirection_modules WHERE id > 0 ORDER BY id" );
122
  $items = array();
123
  if ( count( $rows ) > 0 ) {
124
  foreach ( $rows AS $row ) {
125
- $items[] = Red_Module::new_item( $row );
126
  }
127
  }
128
 
129
- return $items;
130
  }
131
 
132
  /**
133
  * Get first module
134
  */
135
- function get_first_id() {
136
  global $wpdb;
137
  return $wpdb->get_var( "SELECT id FROM {$wpdb->prefix}redirection_modules ORDER BY id LIMIT 0,1" );
138
  }
@@ -141,9 +143,9 @@ class Red_Module {
141
  * Get all modules
142
  */
143
 
144
- function get_for_select() {
145
  $data = array();
146
- $items = Red_Module::get_all();
147
 
148
  foreach ( $items AS $item ) {
149
  $data[$item->id] = $item->name;
@@ -155,14 +157,14 @@ class Red_Module {
155
  /**
156
  * Get all module types
157
  */
158
- function get_types() {
159
  return array (
160
  'apache' => __( 'Apache', 'redirection' ),
161
  'wp' => __( 'WordPress', 'redirection' ),
162
  );
163
  }
164
 
165
- function new_item( $data ) {
166
  $map = array (
167
  'apache' => array( 'Apache_Module', 'apache.php' ),
168
  'wp' => array( 'WordPress_Module', 'wordpress.php' ),
@@ -234,14 +236,14 @@ class Red_Module {
234
  function hits() {
235
  global $wpdb;
236
 
237
- $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id ) FROM {$wpdb->prefix}redirection_logs WHERE module_id=%d", $this->id ) );
238
  if ( $count > 0 )
239
  return $count;
240
  return 0;
241
  }
242
 
243
  function reset() {
244
- Red_Module::clear_cache( $this->id );
245
 
246
  $groups = Red_Group::get_for_module( $this->id );
247
  if ( count( $groups ) > 0 ) {
@@ -263,4 +265,3 @@ class Red_Module {
263
  function config() {
264
  }
265
  }
266
-
1
  <?php
2
 
3
  class Red_Module {
4
+ var $id;
5
+
6
  function Red_Module( $values = '' ) {
7
  if ( is_object( $values ) ) {
8
  foreach ( $values AS $key => $value ) {
20
  function module_flush_delete() {
21
  }
22
 
23
+ static function flush( $id ) {
24
+ $module = self::get( $id );
25
  if ( $module && $module->is_valid() )
26
  $module->module_flush( Red_Item::get_all_for_module( $id ) );
27
  }
28
 
29
+ static function flush_delete( $id ) {
30
+ $module = self::get( $id );
31
  if ( $module )
32
  $module->module_flush_delete();
33
  }
39
  $options = $this->save( $data );
40
  $wpdb->update( $wpdb->prefix.'redirection_modules', array( 'name' => trim( $data['name'] ), 'options' => empty( $options ) ? '' : serialize( $options ) ), array( 'id' => intval( $this->id ) ) );
41
 
42
+ self::clear_cache( $this->id );
43
  }
44
 
45
  function delete() {
55
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_modules WHERE id=%d", $this->id ) );
56
 
57
  RE_Log::delete_for_module( $this->id );
58
+ self::clear_cache( $this->id );
59
+ self::flush_delete( $this->id );
60
  }
61
 
62
+ static function clear_cache( $module ) {
63
  delete_option( 'redirection_module_cache' );
64
+ self::flush( $module );
65
  }
66
 
67
  function create( $data ) {
78
 
79
  $wpdb->insert( $wpdb->prefix.'redirection_modules', $db );
80
 
81
+ self::flush( $wpdb->insert_id );
82
  return $wpdb->insert_id;
83
  }
84
 
85
  return false;
86
  }
87
 
88
+ static function get( $id ) {
89
  global $wpdb;
90
 
91
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_modules WHERE id=%d", $id ) );
92
  if ( $row )
93
+ return self::new_item( $row );
94
  return false;
95
  }
96
 
105
  $items = array();
106
  if ( count( $rows ) > 0 ) {
107
  foreach ( $rows AS $row ) {
108
+ $items[] = self::new_item( $row );
109
  }
110
  }
111
 
117
  /**
118
  * Get all modules
119
  */
120
+ static function get_all() {
121
  global $wpdb;
122
 
123
  $rows = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}redirection_modules WHERE id > 0 ORDER BY id" );
124
  $items = array();
125
  if ( count( $rows ) > 0 ) {
126
  foreach ( $rows AS $row ) {
127
+ $items[] = self::new_item( $row );
128
  }
129
  }
130
 
131
+ return array_filter( $items );
132
  }
133
 
134
  /**
135
  * Get first module
136
  */
137
+ static function get_first_id() {
138
  global $wpdb;
139
  return $wpdb->get_var( "SELECT id FROM {$wpdb->prefix}redirection_modules ORDER BY id LIMIT 0,1" );
140
  }
143
  * Get all modules
144
  */
145
 
146
+ static function get_for_select() {
147
  $data = array();
148
+ $items = self::get_all();
149
 
150
  foreach ( $items AS $item ) {
151
  $data[$item->id] = $item->name;
157
  /**
158
  * Get all module types
159
  */
160
+ static function get_types() {
161
  return array (
162
  'apache' => __( 'Apache', 'redirection' ),
163
  'wp' => __( 'WordPress', 'redirection' ),
164
  );
165
  }
166
 
167
+ static function new_item( $data ) {
168
  $map = array (
169
  'apache' => array( 'Apache_Module', 'apache.php' ),
170
  'wp' => array( 'WordPress_Module', 'wordpress.php' ),
236
  function hits() {
237
  global $wpdb;
238
 
239
+ $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}redirection_logs WHERE module_id=%d", $this->id ) );
240
  if ( $count > 0 )
241
  return $count;
242
  return 0;
243
  }
244
 
245
  function reset() {
246
+ self::clear_cache( $this->id );
247
 
248
  $groups = Red_Group::get_for_module( $this->id );
249
  if ( count( $groups ) > 0 ) {
265
  function config() {
266
  }
267
  }
 
models/monitor.php CHANGED
@@ -34,7 +34,7 @@ class Red_Monitor {
34
  $before = esc_url( $_POST['redirection_slug'] );
35
  $site = parse_url( get_site_url() );
36
 
37
- if ( in_array( $post->post_status, array( 'publish', 'static' ) ) && $before != $after && $before != '/' && $before != $site['path'].'/' ) {
38
  Red_Item::create( array(
39
  'source' => $before,
40
  'target' => $after,
34
  $before = esc_url( $_POST['redirection_slug'] );
35
  $site = parse_url( get_site_url() );
36
 
37
+ if ( in_array( $post->post_status, array( 'publish', 'static' ) ) && $before != $after && $before != '/' && ( !isset( $site['path'] ) || ( isset( $site['path'] ) && $before != $site['path'].'/' ) ) ) {
38
  Red_Item::create( array(
39
  'source' => $before,
40
  'target' => $after,
models/pager.php CHANGED
@@ -4,7 +4,11 @@ if ( !class_exists( 'WP_List_Table' ) )
4
  require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
5
 
6
  class Redirection_Log_Table extends WP_List_Table {
7
- function __construct() {
 
 
 
 
8
  //Set parent defaults
9
  parent::__construct( array(
10
  'singular' => 'item', //singular name of the listed records
@@ -24,7 +28,7 @@ class Redirection_Log_Table extends WP_List_Table {
24
  }
25
 
26
  function column_ip( $item ) {
27
- return '<a href="http://urbangiraffe.com/map/?ip='.esc_attr( $item->ip ).'&amp;from=redirection">'.esc_html( $item->ip ).'</a>';
28
  }
29
 
30
  function column_url( $item ) {
@@ -143,7 +147,11 @@ class Redirection_Log_Table extends WP_List_Table {
143
  }
144
 
145
  class Redirection_404_Table extends WP_List_Table {
146
- function __construct() {
 
 
 
 
147
  //Set parent defaults
148
  parent::__construct( array(
149
  'singular' => 'item', //singular name of the listed records
@@ -161,7 +169,7 @@ class Redirection_404_Table extends WP_List_Table {
161
  function column_ip( $item ) {
162
  $actions['add'] = '<a href="'.admin_url( 'tools.php?page=redirection.php&sub=404s&ip='.esc_attr( long2ip( $item->ip ) ) ).'">'.__( 'Show only this IP', 'redirection' ).'</a>';
163
 
164
- return sprintf( '%1$s %2$s', '<a href="http://urbangiraffe.com/map/?ip='.esc_attr( long2ip( $item->ip ) ).'&amp;from=redirection">'.long2ip( $item->ip ).'</a>', $this->row_actions( $actions ) );
165
  }
166
 
167
  function column_url( $item ) {
@@ -398,7 +406,7 @@ class RE_Pager
398
 
399
  $searchbits = array ();
400
  foreach ($searches AS $search)
401
- $searchbits[] = $wpdb->prepare( $search.' LIKE "%s"', '%'.$this->search.'%' );
402
 
403
  $sql .= implode (' OR ', $searchbits);
404
  $sql .= ')';
4
  require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
5
 
6
  class Redirection_Log_Table extends WP_List_Table {
7
+ private $lookup;
8
+
9
+ function __construct( $options ) {
10
+ $this->lookup = $options['lookup'];
11
+
12
  //Set parent defaults
13
  parent::__construct( array(
14
  'singular' => 'item', //singular name of the listed records
28
  }
29
 
30
  function column_ip( $item ) {
31
+ return '<a href="'.esc_attr( $this->lookup ).esc_attr( $item->ip ).'">'.esc_html( $item->ip ).'</a>';
32
  }
33
 
34
  function column_url( $item ) {
147
  }
148
 
149
  class Redirection_404_Table extends WP_List_Table {
150
+ private $lookup;
151
+
152
+ function __construct( $options ) {
153
+ $this->lookup = $options['lookup'];
154
+
155
  //Set parent defaults
156
  parent::__construct( array(
157
  'singular' => 'item', //singular name of the listed records
169
  function column_ip( $item ) {
170
  $actions['add'] = '<a href="'.admin_url( 'tools.php?page=redirection.php&sub=404s&ip='.esc_attr( long2ip( $item->ip ) ) ).'">'.__( 'Show only this IP', 'redirection' ).'</a>';
171
 
172
+ return sprintf( '%1$s %2$s', '<a href="'.esc_attr( $this->lookup ).esc_attr( long2ip( $item->ip ) ).'">'.long2ip( $item->ip ).'</a>', $this->row_actions( $actions ) );
173
  }
174
 
175
  function column_url( $item ) {
406
 
407
  $searchbits = array ();
408
  foreach ($searches AS $search)
409
+ $searchbits[] = $wpdb->prepare( $search.' LIKE %s', '%'.like_escape( $this->search ).'%' );
410
 
411
  $sql .= implode (' OR ', $searchbits);
412
  $sql .= ')';
models/redirect.php CHANGED
@@ -20,7 +20,9 @@ this software, even if advised of the possibility of such damage.
20
  For full license details see license.txt
21
  ============================================================================================================ */
22
  class Red_Item {
23
- var $id = null;
 
 
24
  var $url = null;
25
  var $regex = false;
26
  var $action_data = null;
@@ -62,7 +64,7 @@ class Red_Item {
62
  }
63
  }
64
 
65
- function get_all_for_module( $module ) {
66
  global $wpdb;
67
 
68
  $sql = "SELECT @redirection_items.*,@redirection_groups.tracking FROM @redirection_items INNER JOIN @redirection_groups ON @redirection_groups.id=@redirection_items.group_id AND @redirection_groups.status='enabled' AND @redirection_groups.module_id='$module' WHERE @redirection_items.status='enabled' ORDER BY @redirection_groups.position,@redirection_items.position";
@@ -79,7 +81,7 @@ class Red_Item {
79
  return $items;
80
  }
81
 
82
- function exists( $url ) {
83
  global $wpdb;
84
 
85
  if ( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM {$wpdb->prefix}redirection_items WHERE url=%s", $url ) ) > 0 )
@@ -87,7 +89,7 @@ class Red_Item {
87
  return false;
88
  }
89
 
90
- function get_for_url( $url, $type ) {
91
  global $wpdb;
92
 
93
  $sql = $wpdb->prepare( "SELECT @redirection_items.*,@redirection_groups.tracking,@redirection_groups.position AS group_pos,@redirection_modules.id AS module_id FROM @redirection_items INNER JOIN @redirection_groups ON @redirection_groups.id=@redirection_items.group_id AND @redirection_groups.status='enabled' INNER JOIN @redirection_modules ON @redirection_modules.id=@redirection_groups.module_id AND @redirection_modules.type=%s WHERE( @redirection_items.regex=1 OR @redirection_items.url=%s)", $type, $url );
@@ -107,7 +109,7 @@ class Red_Item {
107
  return $items;
108
  }
109
 
110
- function get_by_module( $module ) {
111
  global $wpdb;
112
 
113
  $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM {$wpdb->prefix}redirection_items INNER JOIN {$wpdb->prefix}redirection_groups ON {$wpdb->prefix}redirection_groups.id={$wpdb->prefix}redirection_items.group_id";
@@ -126,11 +128,16 @@ class Red_Item {
126
  /**
127
  * Get redirection items in a group
128
  */
129
- function get_by_group( $group, &$pager ) {
130
  global $wpdb;
131
 
132
- $rows = $wpdb->get_results( "SELECT SQL_CALC_FOUND_ROWS * FROM {$wpdb->prefix}redirection_items ".$pager->to_limits( 'group_id='.$group, array( 'url', 'action_data' ) ) );
133
- $pager->set_total( $wpdb->get_var( "SELECT FOUND_ROWS()" ));
 
 
 
 
 
134
 
135
  $items = array();
136
  if ( count( $rows ) > 0 ) {
@@ -142,7 +149,7 @@ class Red_Item {
142
  return $items;
143
  }
144
 
145
- function get_by_id( $id ) {
146
  global $wpdb;
147
 
148
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_items WHERE id=%d", $id ) );
@@ -151,7 +158,7 @@ class Red_Item {
151
  return false;
152
  }
153
 
154
- function auto_generate() {
155
  global $redirection;
156
 
157
  $options = $redirection->get_options();
@@ -163,15 +170,15 @@ class Red_Item {
163
  return $url;
164
  }
165
 
166
- function create( $details ) {
167
  global $wpdb;
168
 
169
  // Auto generate URLs
170
  if ( $details['source'] == '' )
171
- $details['source'] = Red_Item::auto_generate();
172
 
173
  if ( $details['target'] == '' )
174
- $details['target'] = Red_Item::auto_generate();
175
 
176
  // Make sure we don't redirect to ourself
177
  if ( $details['source'] == $details['target'] )
@@ -195,7 +202,7 @@ class Red_Item {
195
  $action_code = intval( $details['action_code'] );
196
 
197
  $data = array(
198
- 'url' => Red_Item::sanitize_url( $details['source'], $regex),
199
  'action_type' => $details['red_action'],
200
  'regex' => $regex,
201
  'position' => $position,
@@ -206,18 +213,20 @@ class Red_Item {
206
  'group_id' => $group_id
207
  );
208
 
 
 
209
  $wpdb->insert( $wpdb->prefix.'redirection_items', $data );
210
 
211
  $group = Red_Group::get( $group_id );
212
  Red_Module::flush( $group->module_id );
213
 
214
- return Red_Item::get_by_id( $wpdb->insert_id );
215
  }
216
 
217
  return false;
218
  }
219
 
220
- function delete_by_group( $group ) {
221
  global $wpdb;
222
 
223
  RE_Log::delete_for_group( $group);
@@ -228,7 +237,7 @@ class Red_Item {
228
  Red_Module::flush( $group->module_id );
229
  }
230
 
231
- function delete( $id ) {
232
  global $wpdb;
233
 
234
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_items WHERE id=%d", $id ) );
@@ -245,7 +254,7 @@ class Red_Item {
245
  }
246
 
247
 
248
- function sanitize_url( $url, $regex ) {
249
  // Make sure that the old URL is relative
250
  $url = preg_replace( '@^https?://(.*?)/@', '/', $url );
251
  $url = preg_replace( '@^https?://(.*?)$@', '/', $url );
@@ -261,7 +270,7 @@ class Red_Item {
261
  global $wpdb;
262
 
263
  $this->regex = isset( $details['regex'] ) ? 1 : 0;
264
- $this->url = $this->sanitize_url( $details['old'], $this->regex );
265
  $this->title = $details['title'];
266
 
267
  $data = $this->match->data( $details );
@@ -283,14 +292,14 @@ class Red_Item {
283
  }
284
  }
285
 
286
- function save_order( $items, $start ) {
287
  global $wpdb;
288
 
289
  foreach ( $items AS $pos => $id ) {
290
  $wpdb->update( $wpdb->prefix.'redirection_items', array( 'position' => $pos + $start ), array( 'id' => $id ) );
291
  }
292
 
293
- $item = Red_Item::get_by_id( $id );
294
  $group = Red_Group::get( $item->group_id );
295
  if ( $group )
296
  Red_Module::flush( $group->module_id );
@@ -380,7 +389,7 @@ class Red_Item {
380
  $wpdb->update( $wpdb->prefix.'redirection_items', array( 'status' => $this->status ), array( 'id' => $this->id ) );
381
  }
382
 
383
- function actions( $action = '' ) {
384
  $actions = array(
385
  'url' => __( 'Redirect to URL', 'redirection' ),
386
  'random' => __( 'Redirect to random post', 'redirection' ),
20
  For full license details see license.txt
21
  ============================================================================================================ */
22
  class Red_Item {
23
+ var $id = null;
24
+ var $created;
25
+ var $referrer;
26
  var $url = null;
27
  var $regex = false;
28
  var $action_data = null;
64
  }
65
  }
66
 
67
+ static function get_all_for_module( $module ) {
68
  global $wpdb;
69
 
70
  $sql = "SELECT @redirection_items.*,@redirection_groups.tracking FROM @redirection_items INNER JOIN @redirection_groups ON @redirection_groups.id=@redirection_items.group_id AND @redirection_groups.status='enabled' AND @redirection_groups.module_id='$module' WHERE @redirection_items.status='enabled' ORDER BY @redirection_groups.position,@redirection_items.position";
81
  return $items;
82
  }
83
 
84
+ static function exists( $url ) {
85
  global $wpdb;
86
 
87
  if ( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM {$wpdb->prefix}redirection_items WHERE url=%s", $url ) ) > 0 )
89
  return false;
90
  }
91
 
92
+ static function get_for_url( $url, $type ) {
93
  global $wpdb;
94
 
95
  $sql = $wpdb->prepare( "SELECT @redirection_items.*,@redirection_groups.tracking,@redirection_groups.position AS group_pos,@redirection_modules.id AS module_id FROM @redirection_items INNER JOIN @redirection_groups ON @redirection_groups.id=@redirection_items.group_id AND @redirection_groups.status='enabled' INNER JOIN @redirection_modules ON @redirection_modules.id=@redirection_groups.module_id AND @redirection_modules.type=%s WHERE( @redirection_items.regex=1 OR @redirection_items.url=%s)", $type, $url );
109
  return $items;
110
  }
111
 
112
+ static function get_by_module( $module ) {
113
  global $wpdb;
114
 
115
  $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM {$wpdb->prefix}redirection_items INNER JOIN {$wpdb->prefix}redirection_groups ON {$wpdb->prefix}redirection_groups.id={$wpdb->prefix}redirection_items.group_id";
128
  /**
129
  * Get redirection items in a group
130
  */
131
+ static function get_by_group( $group, &$pager ) {
132
  global $wpdb;
133
 
134
+ $sql = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_items WHERE group_id=%d", $group );
135
+
136
+ if ( $pager->search )
137
+ $sql .= $wpdb->prepare( ' AND url LIKE %s', '%'.like_escape( $pager->search ).'%' );
138
+
139
+ $rows = $wpdb->get_results( $sql.' ORDER BY position' );
140
+ $pager->set_total( $wpdb->get_var( $sql ) );
141
 
142
  $items = array();
143
  if ( count( $rows ) > 0 ) {
149
  return $items;
150
  }
151
 
152
+ static function get_by_id( $id ) {
153
  global $wpdb;
154
 
155
  $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}redirection_items WHERE id=%d", $id ) );
158
  return false;
159
  }
160
 
161
+ static function auto_generate() {
162
  global $redirection;
163
 
164
  $options = $redirection->get_options();
170
  return $url;
171
  }
172
 
173
+ static function create( $details ) {
174
  global $wpdb;
175
 
176
  // Auto generate URLs
177
  if ( $details['source'] == '' )
178
+ $details['source'] = self::auto_generate();
179
 
180
  if ( $details['target'] == '' )
181
+ $details['target'] = self::auto_generate();
182
 
183
  // Make sure we don't redirect to ourself
184
  if ( $details['source'] == $details['target'] )
202
  $action_code = intval( $details['action_code'] );
203
 
204
  $data = array(
205
+ 'url' => self::sanitize_url( $details['source'], $regex),
206
  'action_type' => $details['red_action'],
207
  'regex' => $regex,
208
  'position' => $position,
213
  'group_id' => $group_id
214
  );
215
 
216
+ $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_items WHERE url=%s AND action_type=%s AND action_data=%s", $data['action_data'], $data['action_type'], $data['url'] ) );
217
+
218
  $wpdb->insert( $wpdb->prefix.'redirection_items', $data );
219
 
220
  $group = Red_Group::get( $group_id );
221
  Red_Module::flush( $group->module_id );
222
 
223
+ return self::get_by_id( $wpdb->insert_id );
224
  }
225
 
226
  return false;
227
  }
228
 
229
+ static function delete_by_group( $group ) {
230
  global $wpdb;
231
 
232
  RE_Log::delete_for_group( $group);
237
  Red_Module::flush( $group->module_id );
238
  }
239
 
240
+ static function delete( $id ) {
241
  global $wpdb;
242
 
243
  $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}redirection_items WHERE id=%d", $id ) );
254
  }
255
 
256
 
257
+ static function sanitize_url( $url, $regex ) {
258
  // Make sure that the old URL is relative
259
  $url = preg_replace( '@^https?://(.*?)/@', '/', $url );
260
  $url = preg_replace( '@^https?://(.*?)$@', '/', $url );
270
  global $wpdb;
271
 
272
  $this->regex = isset( $details['regex'] ) ? 1 : 0;
273
+ $this->url = self::sanitize_url( $details['old'], $this->regex );
274
  $this->title = $details['title'];
275
 
276
  $data = $this->match->data( $details );
292
  }
293
  }
294
 
295
+ static function save_order( $items, $start ) {
296
  global $wpdb;
297
 
298
  foreach ( $items AS $pos => $id ) {
299
  $wpdb->update( $wpdb->prefix.'redirection_items', array( 'position' => $pos + $start ), array( 'id' => $id ) );
300
  }
301
 
302
+ $item = self::get_by_id( $id );
303
  $group = Red_Group::get( $item->group_id );
304
  if ( $group )
305
  Red_Module::flush( $group->module_id );
389
  $wpdb->update( $wpdb->prefix.'redirection_items', array( 'status' => $this->status ), array( 'id' => $this->id ) );
390
  }
391
 
392
+ static function actions( $action = '' ) {
393
  $actions = array(
394
  'url' => __( 'Redirect to URL', 'redirection' ),
395
  'random' => __( 'Redirect to random post', 'redirection' ),
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
- === Plugin Name ===
2
  Contributors: johnny5
3
  Donate link: http://urbangiraffe.com/about/
4
  Tags: post, admin, seo, pages, manage, 301, 404, redirect, permalink
5
- Requires at least: 3.0
6
- Tested up to: 3.5
7
- Stable tag: 2.2.14
8
 
9
  Redirection is a WordPress plugin to manage 301 redirections and keep track of 404 errors without requiring knowledge of Apache .htaccess files.
10
 
@@ -88,8 +88,18 @@ The plugin works in a similar manner to how WordPress handles permalinks and sho
88
 
89
  Full documentation can be found on the [Redirection](http://urbangiraffe.com/plugins/redirection/) page.
90
 
 
 
 
 
 
91
  == Changelog ==
92
 
 
 
 
 
 
93
  = 2.3.2 =
94
  * WP 3.5 compat
95
  * Fix export
1
+ === Plugin Name ===
2
  Contributors: johnny5
3
  Donate link: http://urbangiraffe.com/about/
4
  Tags: post, admin, seo, pages, manage, 301, 404, redirect, permalink
5
+ Requires at least: 3.2
6
+ Tested up to: 3.7
7
+ Stable tag: 2.3.3
8
 
9
  Redirection is a WordPress plugin to manage 301 redirections and keep track of 404 errors without requiring knowledge of Apache .htaccess files.
10
 
88
 
89
  Full documentation can be found on the [Redirection](http://urbangiraffe.com/plugins/redirection/) page.
90
 
91
+ == Upgrade Notice ==
92
+
93
+ = 2.3.3 =
94
+ * Full WordPress 3.5+ compatability! Note that this contains database changes so please backup your data.
95
+
96
  == Changelog ==
97
 
98
+ = 2.3.3 =
99
+ * Fix PHP strict, props to Juliette Folmer
100
+ * Fix RSS entry date, props to Juliette
101
+ * Fix pagination
102
+
103
  = 2.3.2 =
104
  * WP 3.5 compat
105
  * Fix export
redirection.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Redirection
4
  Plugin URI: http://urbangiraffe.com/plugins/redirection/
5
  Description: Manage all your 301 redirects and monitor 404 errors
6
- Version: 2.3.2
7
  Author: John Godley
8
  Author URI: http://urbangiraffe.com
9
  ============================================================================================================
@@ -169,7 +169,6 @@ class Redirection extends Redirection_Plugin {
169
  $options = array();
170
 
171
  $defaults = array (
172
- 'lookup' => 'http://urbangiraffe.com/map/?from=redirection&amp;ip=',
173
  'support' => false,
174
  'log_redirections' => true,
175
  'log_404s' => true,
@@ -185,8 +184,7 @@ class Redirection extends Redirection_Plugin {
185
  $options[$key] = $value;
186
  }
187
 
188
- if ( $options['lookup'] == 'http://geomaplookup.cinnamonthoughts.org/?ip=' || $options['lookup'] == 'http://geomaplookup.net/?ip=' )
189
- $options['lookup'] = 'http://urbangiraffe.com/map/?from=redirection&amp;ip=';
190
 
191
  return $options;
192
  }
@@ -262,7 +260,9 @@ class Redirection extends Redirection_Plugin {
262
  $this->render_message( __( 'Your logs have been deleted', 'redirection' ) );
263
  }
264
 
265
- $table = new Redirection_Log_Table();
 
 
266
 
267
  if ( isset( $_GET['module'] ) )
268
  $table->prepare_items( 'module', intval( $_GET['module'] ) );
@@ -273,7 +273,6 @@ class Redirection extends Redirection_Plugin {
273
  else
274
  $table->prepare_items();
275
 
276
- $options = $this->get_options();
277
  $this->render_admin( 'log', array( 'options' => $options, 'table' => $table, 'lookup' => $options['lookup'] ) );
278
  }
279
 
@@ -285,10 +284,11 @@ class Redirection extends Redirection_Plugin {
285
  $this->render_message( __( 'Your logs have been deleted', 'redirection' ) );
286
  }
287
 
288
- $table = new Redirection_404_Table();
 
 
289
  $table->prepare_items( isset( $_GET['ip'] ) ? $_GET['ip'] : false );
290
 
291
- $options = $this->get_options();
292
  $this->render_admin( 'log', array( 'options' => $options, 'table' => $table, 'lookup' => $options['lookup'] ) );
293
  }
294
 
@@ -310,7 +310,11 @@ class Redirection extends Redirection_Plugin {
310
  $pager = new RE_Pager( $_GET, admin_url( add_query_arg( array( 'sub' => 'groups' ), 'tools.php?page=redirection.php' ) ), 'position', 'ASC' );
311
  $items = Red_Group::get_all( $module, $pager );
312
 
313
- $this->render_admin( 'group_list', array( 'options' => $this->get_options(), 'groups' => $items, 'pager' => $pager, 'modules' => Red_Module::get_for_select(), 'module' => Red_Module::get( $module ) ) );
 
 
 
 
314
  }
315
 
316
  function admin_redirects( $group ) {
3
  Plugin Name: Redirection
4
  Plugin URI: http://urbangiraffe.com/plugins/redirection/
5
  Description: Manage all your 301 redirects and monitor 404 errors
6
+ Version: 2.3.3
7
  Author: John Godley
8
  Author URI: http://urbangiraffe.com
9
  ============================================================================================================
169
  $options = array();
170
 
171
  $defaults = array (
 
172
  'support' => false,
173
  'log_redirections' => true,
174
  'log_404s' => true,
184
  $options[$key] = $value;
185
  }
186
 
187
+ $options['lookup'] = 'http://geomaplookup.net/?ip=';
 
188
 
189
  return $options;
190
  }
260
  $this->render_message( __( 'Your logs have been deleted', 'redirection' ) );
261
  }
262
 
263
+ $options = $this->get_options();
264
+
265
+ $table = new Redirection_Log_Table( $options );
266
 
267
  if ( isset( $_GET['module'] ) )
268
  $table->prepare_items( 'module', intval( $_GET['module'] ) );
273
  else
274
  $table->prepare_items();
275
 
 
276
  $this->render_admin( 'log', array( 'options' => $options, 'table' => $table, 'lookup' => $options['lookup'] ) );
277
  }
278
 
284
  $this->render_message( __( 'Your logs have been deleted', 'redirection' ) );
285
  }
286
 
287
+ $options = $this->get_options();
288
+
289
+ $table = new Redirection_404_Table( $options );
290
  $table->prepare_items( isset( $_GET['ip'] ) ? $_GET['ip'] : false );
291
 
 
292
  $this->render_admin( 'log', array( 'options' => $options, 'table' => $table, 'lookup' => $options['lookup'] ) );
293
  }
294
 
310
  $pager = new RE_Pager( $_GET, admin_url( add_query_arg( array( 'sub' => 'groups' ), 'tools.php?page=redirection.php' ) ), 'position', 'ASC' );
311
  $items = Red_Group::get_all( $module, $pager );
312
 
313
+ $module = Red_Module::get( $module );
314
+ if ( $module )
315
+ $this->render_admin( 'group_list', array( 'options' => $this->get_options(), 'groups' => $items, 'pager' => $pager, 'modules' => Red_Module::get_for_select(), 'module' => $module ) );
316
+ else
317
+ $this->render_message( __( 'Unknown module', 'redirection' ) );
318
  }
319
 
320
  function admin_redirects( $group ) {
view/admin/group_list.php CHANGED
@@ -102,7 +102,10 @@
102
  </tr>
103
  <tr>
104
  <th width="50"></th>
105
- <td><input class="button-primary" type="submit" name="add" value="<?php _e( 'Add', 'redirection' ); ?>"/><input type="hidden" name="module_id" value="<?php echo $module->id ?>"/></td>
 
 
 
106
  </tr>
107
  </table>
108
  </form>
102
  </tr>
103
  <tr>
104
  <th width="50"></th>
105
+ <td>
106
+ <input class="button-primary" type="submit" name="add" value="<?php esc_attr_e( 'Add', 'redirection' ); ?>"/>
107
+ <input type="hidden" name="module_id" value="<?php echo $module->id ?>"/>
108
+ </td>
109
  </tr>
110
  </table>
111
  </form>
view/admin/item.php CHANGED
@@ -19,7 +19,7 @@
19
  <div class="item<?php if ($redirect->regex) echo ' item-regex' ?>">
20
  <input type="checkbox" class="check" name="checkall[]" value="<?php echo $redirect->id ?>"/>
21
 
22
- <a href="<?php echo $this->url ($redirect->url) ?>" class="redirection-edit"><?php if ($redirect->title) echo esc_html( $redirect->title ); else echo RE_Log::show_url ($redirect->url); ?></a>
23
 
24
  <?php if ($redirect->match_type != 'url') echo '('.esc_html( $redirect->match_name() ).')' ?>
25
 
19
  <div class="item<?php if ($redirect->regex) echo ' item-regex' ?>">
20
  <input type="checkbox" class="check" name="checkall[]" value="<?php echo $redirect->id ?>"/>
21
 
22
+ <a href="<?php echo $this->url ($redirect->url) ?>" class="redirection-edit"><?php if ($redirect->title) echo esc_html( $redirect->title ); else echo esc_html( RE_Log::show_url( $redirect->url ) ); ?></a>
23
 
24
  <?php if ($redirect->match_type != 'url') echo '('.esc_html( $redirect->match_name() ).')' ?>
25
 
view/admin/options.php CHANGED
@@ -12,20 +12,14 @@
12
 
13
  <table cellpadding="3" width="100%" class="form-table">
14
  <tr>
15
- <th valign="top" align="right"><?php _e( 'Auto-generate URL', 'redirection' ) ?>:</th>
16
- <td>
17
- <input type="text" name="auto_target" style="width: 95%" value="<?php echo esc_attr( $options['auto_target'] ) ?>"/>
18
- <br/>
19
- <span class="sub"><?php _e( 'This will be used to auto-generate a URL if no URL is given. You can use the special tags $dec$ or $hex$ to have a unique ID inserted (either decimal or hex)', 'redirection' ); ?></span>
20
-
21
- </td>
22
- </tr>
23
- <tr>
24
- <th align="right" valign="top"><?php _e( 'IP Lookup Service', 'redirection' ); ?>:</th>
25
- <td>
26
- <input type="text" style="width: 95%" name="lookup" value="<?php echo esc_attr( $options['lookup'] ) ?>" id="lookup"/><br/>
27
- </td>
28
- </tr>
29
  <tr>
30
  <th align="right"><?php _e( 'Plugin Support', 'redirection' ); ?>:</th>
31
  <td>
12
 
13
  <table cellpadding="3" width="100%" class="form-table">
14
  <tr>
15
+ <th valign="top" align="right"><?php _e( 'Auto-generate URL', 'redirection' ) ?>:</th>
16
+ <td>
17
+ <input type="text" name="auto_target" style="width: 95%" value="<?php echo esc_attr( $options['auto_target'] ) ?>"/>
18
+ <br/>
19
+ <span class="sub"><?php _e( 'This will be used to auto-generate a URL if no URL is given. You can use the special tags $dec$ or $hex$ to have a unique ID inserted (either decimal or hex)', 'redirection' ); ?></span>
20
+
21
+ </td>
22
+ </tr>
 
 
 
 
 
 
23
  <tr>
24
  <th align="right"><?php _e( 'Plugin Support', 'redirection' ); ?>:</th>
25
  <td>
view/admin/submenu.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  <ul class="subsubsub">
4
  <li>
5
- <a <?php if ( !isset( $_GET['sub'] ) ) echo 'class="current"'; ?> href="<?php echo admin_url( 'tools.php?page=redirection.php' ); ?><?php if ( isset( $_GET['id'] ) ) echo '&amp;id='.intval( $_GET['id'] ) ?>">
6
  <?php _e( 'Redirects', 'redirection' ); ?>
7
  </a> |
8
  </li>
2
 
3
  <ul class="subsubsub">
4
  <li>
5
+ <a <?php if ( !isset( $_GET['sub'] ) || $_GET['sub'] == '' ) echo 'class="current"'; ?> href="<?php echo admin_url( 'tools.php?page=redirection.php' ); ?><?php if ( isset( $_GET['id'] ) ) echo '&amp;id='.intval( $_GET['id'] ) ?>">
6
  <?php _e( 'Redirects', 'redirection' ); ?>
7
  </a> |
8
  </li>
view/admin/support.php CHANGED
@@ -7,9 +7,11 @@
7
 
8
  <p style="clear: both">
9
  <?php _e( 'Redirection is free to use - life is wonderful and lovely! However, it has required a great deal of time and effort to develop and if it has been useful you can help support this development by <strong>making a small donation</strong>.', 'redirection'); ?>
10
- <?php _e( 'This will act as an incentive for me to carry on developing, providing countless hours of support, and including new features and suggestions. You get some useful software and I get to carry on making it. Everybody wins.', 'redirection'); ?>
11
  </p>
12
 
 
 
13
  <p><?php _e( 'If you are using this plugin in a commercial setup, or feel that it\'s been particularly useful, then you may want to consider a <strong>commercial donation</strong>.', 'redirection' )?>
14
 
15
  <ul class="donations">
@@ -18,7 +20,7 @@
18
  <input type="hidden" name="cmd" value="_xclick">
19
  <input type="hidden" name="business" value="admin@urbangiraffe.com">
20
  <input type="hidden" name="item_name" value="Redirection - Individual">
21
- <input type="hidden" name="amount" value="14.00">
22
  <input type="hidden" name="buyer_credit_promo_code" value="">
23
  <input type="hidden" name="buyer_credit_product_category" value="">
24
  <input type="hidden" name="buyer_credit_shipping_method" value="">
7
 
8
  <p style="clear: both">
9
  <?php _e( 'Redirection is free to use - life is wonderful and lovely! However, it has required a great deal of time and effort to develop and if it has been useful you can help support this development by <strong>making a small donation</strong>.', 'redirection'); ?>
10
+ <?php _e( 'This will act as an incentive for me to carry on developing. You get some useful software and I get to carry on making it. Everybody wins.', 'redirection'); ?>
11
  </p>
12
 
13
+ <p><?php _e( 'Please note that a donation is just a donation - it is not a payment for support. I am not a business, this is not a product, and I\'m afraid I cannot provide paid support' ); ?></p>
14
+
15
  <p><?php _e( 'If you are using this plugin in a commercial setup, or feel that it\'s been particularly useful, then you may want to consider a <strong>commercial donation</strong>.', 'redirection' )?>
16
 
17
  <ul class="donations">
20
  <input type="hidden" name="cmd" value="_xclick">
21
  <input type="hidden" name="business" value="admin@urbangiraffe.com">
22
  <input type="hidden" name="item_name" value="Redirection - Individual">
23
+ <input type="hidden" name="amount" value="16.00">
24
  <input type="hidden" name="buyer_credit_promo_code" value="">
25
  <input type="hidden" name="buyer_credit_product_category" value="">
26
  <input type="hidden" name="buyer_credit_shipping_method" value="">