Quick Page/Post Redirect Plugin - Version 5.0.5

Version Description

  • Fix to security flaw for logged in admin users.
  • Fix to extra spaces that broke some callback functions in the redirect class in 5.0.4.
Download this release

Release Info

Developer prophecy2040
Plugin Icon 128x128 Quick Page/Post Redirect Plugin
Version 5.0.5
Comparing to
See all releases

Code changes from version 5.0.3 to 5.0.5

page_post_redirect_plugin.php CHANGED
@@ -6,13 +6,13 @@ Description: Redirect Pages, Posts or Custom Post Types to another location quic
6
  Author: Don Fischer
7
  Author URI: http://www.fischercreativemedia.com/
8
  Donate link: http://www.fischercreativemedia.com/donations/
9
- Version: 5.0.3
10
 
11
  Version info:
12
  See change log in readme.txt file.
13
  Version 3.2.4 to 4.0.1 are testing versions only
14
 
15
- Copyright (C) 2009-2012 Donald J. Fischer
16
 
17
  This program is free software: you can redistribute it and/or modify
18
  it under the terms of the GNU General Public License as published by
@@ -26,15 +26,8 @@ Version 3.2.4 to 4.0.1 are testing versions only
26
 
27
  You should have received a copy of the GNU General Public License
28
  along with this program. If not, see <http://www.gnu.org/licenses/>.
29
- */
30
-
31
- if (!function_exists('esc_attr')) {
32
- // For WordPress < 2.8 function compatibility
33
- function esc_attr($attr){return attribute_escape( $attr );}
34
- function esc_url($url){return clean_url( $url );}
35
- }
36
- add_action('init','start_ppr_class',0);
37
 
 
38
  //you can use the following action hooks with this plugin:
39
  // *** Quick Rediects function: use to take over redirect
40
  // add_action('qppr_redirect','some_callback_function',10,2);
@@ -66,6 +59,7 @@ Version 3.2.4 to 4.0.1 are testing versions only
66
  // arg 1. Meta Tag (fully generated)
67
  // arg 2. Page HTML Message (wrapped in a <div> tag)
68
  // Example:
 
69
  add_filter('ppr_meta_head_hook_filter','override_ppr_metahead_new');
70
  function override_ppr_metahead_new($meta_tag='',$meta_message=''){
71
  $meta = $meta_tag;
@@ -75,7 +69,14 @@ Version 3.2.4 to 4.0.1 are testing versions only
75
  add_filter('get_title',$function2,100,1);
76
  return $meta;
77
  }
78
- // *******************************
 
 
 
 
 
 
 
79
 
80
 
81
  //=======================================
@@ -113,200 +114,75 @@ class quick_page_post_reds {
113
  public $pprptypes_ok;
114
 
115
  function __construct() {
116
- $this->ppr_curr_version = '5.0.3';
117
- $this->ppr_nofollow = array();
118
- $this->ppr_newindow = array();
119
- $this->ppr_url = array();
120
- $this->ppr_url_rewrite = array();
121
- $this->thepprversion = get_option( 'ppr_version');
122
- $this->thepprmeta = get_option( 'ppr_meta_clean');
123
- $this->quickppr_redirects = get_option( 'quickppr_redirects');
124
- $this->quickppr_redirectsmeta= get_option('quickppr_redirects_meta');
125
- $this->homelink = get_option( 'home');
126
- $this->pproverride_nofollow = get_option( 'ppr_override-nofollow' );
127
- $this->pproverride_newwin = get_option( 'ppr_override-newwindow' );
128
- $this->ppruse_jquery = get_option( 'ppr_use-jquery' );
129
- $this->pprptypes_ok = array();
130
- $this->pproverride_type = get_option( 'ppr_override-redirect-type' );
131
- $this->pproverride_active = get_option( 'ppr_override-active' );
132
- $this->pproverride_URL = get_option( 'ppr_override-URL' );
133
- $this->pproverride_rewrite = get_option( 'ppr_override-rewrite' );
134
- $this->pprmeta_message = get_option( 'ppr_meta-message' );
135
- $this->pprmeta_seconds = get_option( 'ppr_meta-seconds' );
136
- $this->pproverride_casesensitive = get_option( 'ppr_override-casesensitive' );
137
- $this->adminlink = admin_url('/', 'admin');
138
- $this->fcmlink = 'http://www.fischercreativemedia.com/plugins';
139
- $this->ppr_metaurl = '';
140
- $this->quickppr_jquerycache = ''; //get_option( 'qppr_jQuery_cache' );
141
- $this->updatemsg = '';
142
  if($this->pprmeta_seconds==''){$this->pprmeta_seconds='0';}
143
 
144
  //these are for all the time - even if there are overrides
145
- add_action( 'init', array($this,'ppr_init_check_version'), 1 ); // checks version of plugin in DB and updates if needed.
146
- add_action( 'save_post', array($this,'ppr_save_metadata'),20,2 ); // save the custom fields
147
- add_action( 'wp',array($this,'ppr_parse_request') ); // parse query vars
148
- add_action( 'init',array($this,'ppr_parse_request_new') ); // parse query vars
149
- //add_action( 'wp_enqueue_scripts',array($this,'ppr_do_jQuery'), 1, 2); // do the jQuery in site header
150
- add_action( 'admin_menu', array($this,'ppr_add_menu') ); // add the menu items needed
151
- add_action( 'admin_menu', array($this,'ppr_add_metabox') ); // add the metaboxes where needed
152
  add_action( 'plugin_action_links_' . plugin_basename(__FILE__), array($this,'ppr_filter_plugin_actions') );
153
- add_filter( 'query_vars',array($this,'ppr_queryhook') );
154
- add_filter( 'plugin_row_meta', array($this,'ppr_filter_plugin_links'), 10, 2 );
155
- //add_filter( 'wp_feed_cache_transient_lifetime','ppr_wp_feed_options',10, 2);
 
156
 
157
- if($this->pproverride_active!='1' && !is_admin()){ // don't run these if override active is set
158
- add_action( 'init', array($this,'redirect'), 1 ); // add the 301 redirect action, high priority
159
- add_action( 'init', array($this,'redirect_post_type'), 1 ); // add the normal redirect action, high priority
160
- add_action( 'template_redirect',array($this,'ppr_do_redirect'), 1, 2); // do the redirects
161
- add_filter( 'wp_get_nav_menu_items',array($this,'ppr_new_nav_menu_fix'),1,1 );
162
- add_filter( 'wp_list_pages',array($this,'ppr_fix_targetsandrels') );
163
- add_filter( 'page_link',array($this,'ppr_filter_page_links'),20, 2 );
164
- add_filter( 'post_link',array($this,'ppr_filter_page_links'),20, 2 );
165
- add_filter( 'post_type_link', array($this, 'ppr_filter_page_links'), 20, 2 );
166
- add_filter( 'get_permalink', array($this, 'ppr_filter_links'), 20, 2 );
167
  }
168
- if (isset( $_POST['submit_301']) ) {$this->quickppr_redirects = $this->save_redirects($_POST['quickppr_redirects']);$this->updatemsg ='Quick Redirects Updated.';} //if submitted, process the data
169
- if (isset( $_REQUEST['settings-updated'] ) && $_REQUEST['settings-updated']=='true'){/*$this->updatemsg ='Settings Updated.';*/}
170
  }
171
 
172
  function ppr_add_menu(){
173
- add_menu_page('Redirect Options', 'Redirect Options', 'administrator', 'redirect-options', array($this,'ppr_settings_page'),plugins_url( 'settings-16-icon.png' , __FILE__));
174
  add_submenu_page( 'redirect-options', 'Quick Redirects', 'Quick Redirects', 'manage_options', 'redirect-updates', array($this,'ppr_options_page') );
175
  add_submenu_page( 'redirect-options', 'Redirect Summary', 'Redirect Summary', 'manage_options', 'redirect-summary', array($this,'ppr_summary_page') );
176
  add_submenu_page( 'redirect-options', 'FAQs/Help', 'FAQs/Help', 'manage_options', 'redirect-faqs', array($this,'ppr_faq_page') );
177
  add_action( 'admin_init', array($this,'register_pprsettings') );
178
  }
179
-
180
- function ppr_do_jQuery($wphead){
181
- $this->build_jQueryCache();
182
- wp_enqueue_script( 'pprjquery', get_bloginfo('url').'/', array('jquery'), 'pprjq1');
183
- }
184
-
185
- function build_jQueryCache(){
186
- return;
187
- $redirects = $this->quickppr_redirects;
188
- $redirectsmeta = $this->quickppr_redirectsmeta;
189
- $ppr_newWindowArray = array();
190
- $ppr_noFollowArray = array();
191
- $ppr_newwin = $this->ppr_newwindow;
192
- $ppr_nofoll = $this->ppr_nofollow;
193
-
194
- //quick redirects
195
- if (!empty($redirects)) {
196
- foreach ($redirects as $request => $destination) {
197
- if($redirectsmeta[$request]['nofollow'] == '1' || $this->pproverride_nofollow =='1'){$ppr_noFollowArray[] = str_replace(array(get_bloginfo('url'),'/'),array('',''),$request);}
198
- if($redirectsmeta[$request]['newwindow'] == '1' || $this->pproverride_newwin =='1'){$ppr_newWindowArray[] = str_replace(array(get_bloginfo('url'),'/'),array('',''),$request);}
199
- }
200
  }
201
-
202
- //New Window Array
203
- if (!empty($ppr_newwin)) {
204
- foreach ($ppr_newwin as $request) {
205
- if($ppr_newwin != ''){$ppr_newWindowArray[] = str_replace(array(get_bloginfo('url'),'/'),array('',''),$request);}
206
- }
207
- }
208
-
209
- //No Follow Array
210
- if (!empty($ppr_nofoll)) {
211
- foreach ($ppr_nofoll as $request) {
212
- if($ppr_nofoll != ''){$ppr_noFollowArray[] = str_replace(array(get_bloginfo('url'),'/'),array('',''),$request);}
213
- }
214
- }
215
-
216
- $newWin = implode('", "',$ppr_newWindowArray);
217
- if($newWin!=''){$newWin = '"'.$newWin.'"';}
218
- $newFoll = implode('", "',$ppr_noFollowArray);
219
- if($newFoll!=''){$newFoll = '"'.$newFoll.'"';}
220
- $pprextrajqrw = '0';
221
- $pprextrajqurl = '';
222
- if($this->pproverride_rewrite == '1'){
223
- $pprextrajqrw = '1';
224
- $pprextrajqurl = $this->pproverride_URL;
225
- }
226
- $theScript ="
227
- jQuery(document).ready(function() {
228
- var pprrewrite = '".$pprextrajqrw."';
229
- var pprrewriteurl = '".$pprextrajqurl."';
230
- var pprNoFollArr = new Array(".$newFoll.");
231
- var pprNewWinArr = new Array(".$newWin.");
232
- var pprchechhref = '';
233
- var pprchechhref2 = '';
234
- var pprspoturl = '".get_bloginfo('url')."';
235
- var tempdf = '';
236
- var jqvers = parseFloat(jQuery().jquery, 3);
237
- //this checks for jQuery version and serves correct script (i.e., prop vs attr)
238
- //alert(jqvers);
239
- if(jqvers >= 1.6){
240
- jQuery('a').each(function (i) {
241
- var tempfga = jQuery(this).attr('href');
242
- if(tempfga == '' || typeof tempfga == 'undefined' || tempfga === undefined ){
243
- // do nothing
244
- }else{
245
- var tempfg = tempfga.replace(pprspoturl,'');
246
- var tempfg2 = tempfg.replace(/\//gi,'');
247
- var tempfg3 = tempfga.replace(/\//gi,'');
248
- var tempfh = jQuery(this).prop('rel');
249
- var tempfi = jQuery(this).prop('target');
250
- if(pprrewrite == '1'){
251
- //pprnewurl = jQuery(this).attr('href',pprrewriteurl);
252
- // Temp Remove as it causes the all links to be redirected in 5.0.1
253
- }
254
- if(jQuery.inArray(tempfg2, pprNoFollArr) >= 0 || jQuery.inArray(tempfg3, pprNoFollArr) >= 0){
255
- if(tempfh =='' || tempfh =='undefined' || tempfh === undefined || typeof tempfh == 'undefined' ){
256
- jQuery(this).prop('rel','nofollow');
257
- }else{
258
- if(tempfh != 'nofollow' && tempfh.indexOf('nofollow') == -1){
259
- jQuery(this).prop('rel','nofollow '+tempfh);
260
- }
261
- }
262
- jQuery(this).addClass('qppr-nf');
263
- }
264
- if(jQuery.inArray(tempfg2,pprNewWinArr) >= 0 || jQuery.inArray(tempfg3, pprNewWinArr) >= 0){
265
- jQuery(this).addClass('qppr-nw');
266
- if(tempfi =='' || tempfi =='undefined' || tempfi === undefined || typeof tempfi == 'undefined'){jQuery(this).prop('target','_blank');}
267
- }
268
- }
269
- });
270
- }else{
271
- jQuery('a').each(function (i) {
272
- var tempfga = jQuery(this).attr('href');
273
- if(tempfga == '' || typeof tempfga == 'undefined' || tempfga === undefined ){
274
- // do nothing
275
- }else{
276
- var tempfg = tempfga.replace(pprspoturl,'');
277
- var tempfg2 = tempfg.replace(/\//gi,'');
278
- var tempfg3 = tempfga.replace(/\//gi,'');
279
- var tempfh = jQuery(this).attr('rel');
280
- var tempfi = jQuery(this).attr('target');
281
- if(pprrewrite == '1'){
282
- //pprnewurl = jQuery(this).attr('href',pprrewriteurl);
283
- // Temp Remove as it causes the all links to be redirected in 5.0.1
284
- }
285
- if(jQuery.inArray(tempfg2, pprNoFollArr) >= 0 || jQuery.inArray(tempfg3, pprNoFollArr) >= 0){
286
- if(tempfh =='' || tempfh =='undefined' || tempfh === undefined || typeof tempfh == 'undefined' ){
287
- jQuery(this).attr('rel','nofollow');
288
- }else{
289
- if(tempfh != 'nofollow' && tempfh.indexOf('nofollow') == -1){
290
- jQuery(this).attr('rel','nofollow '+tempfh);
291
- }
292
- }
293
- jQuery(this).addClass('qppr-nf');
294
- }
295
- if(jQuery.inArray(tempfg2,pprNewWinArr) >= 0 || jQuery.inArray(tempfg3, pprNewWinArr) >= 0){
296
- jQuery(this).addClass('qppr-nw');
297
- if(tempfi =='' || tempfi =='undefined' || tempfi === undefined || typeof tempfi == 'undefined' ){jQuery(this).attr('target','_blank');}
298
- }
299
- }
300
- });
301
- }
302
- });
303
- ";
304
- //temp fix until this is resolved:
305
- $theScript = '';
306
- update_option('qppr_jQuery_cache',$theScript);
307
- $this->quickppr_jquerycache = get_option('qppr_jQuery_cache');
308
- }
309
-
310
  function register_pprsettings() {
311
  register_setting( 'ppr-settings-group', 'ppr_use-custom-post-types' );
312
  register_setting( 'ppr-settings-group', 'ppr_override-nofollow' );
@@ -417,7 +293,6 @@ jQuery(document).ready(function() {
417
  $tempReportArray = array();
418
  $tempa = array();
419
  $tempQTReportArray = array();
420
- $this->build_jQueryCache();
421
  if( !empty( $this->quickppr_redirects)){
422
  foreach($this->quickppr_redirects as $key=>$redir){
423
  $tempQTReportArray = array('url'=>$key,'destinaition'=>$redir);
@@ -653,9 +528,9 @@ jQuery(document).ready(function() {
653
  <tr valign="top">
654
  <td><label><span style="color:#FF0000;font-weight:bold;font-size:100%;margin-left:0px;">Hide</span> meta box for following Post Types:</label><?php echo $ptypeHTML;?></td>
655
  </tr>
656
- <tr valign="top">
657
  <td><label>Use with jQuery? <i><font size="2" color="#FF0000">(unavailable at this time)</font></i></label> <!--input type="checkbox" name="ppr_use-jquery" value="1"<?php if(get_option('ppr_use-jquery')=='1'){echo ' checked="checked" ';} ?>/--> <input type="checkbox" name="ppr_use-jquery" value="0" disabled /><span>disabled in current version<!--Increases effectiveness of plugin. If you have a jQuery conflict, try turning this off.--></span></td>
658
- </tr>
659
  <tr valign="top">
660
  <td><label>Meta Refresh Time (in seconds):</label> <input type="text" size="5" name="ppr_meta-seconds" value="<?php echo get_option('ppr_meta-seconds');?>" /> <span>Only needed for Meta Refresh. 0=default (instant)</span></td>
661
  </tr>
@@ -678,10 +553,10 @@ jQuery(document).ready(function() {
678
  <td><label>Make ALL Redirects this type: </label>
679
  <select name="ppr_override-redirect-type">
680
  <option value="0">Use Individual Settings</option>
681
- <option value="301" <?php if( get_option('ppr_override-redirect-type')=='301') {echo ' selected="selected" ';} ?>/>301 Permanant Redirect</option>
682
- <option value="302" <?php if( get_option('ppr_override-redirect-type')=='302') {echo ' selected="selected" ';} ?>/>302 Temporary Redirect</option>
683
- <option value="307" <?php if( get_option('ppr_override-redirect-type')=='307') {echo ' selected="selected" ';} ?>/>307 Temporary Redirect</option>
684
- <option value="meta" <?php if(get_option('ppr_override-redirect-type')=='meta'){echo ' selected="selected" ';} ?>/>Meta Refresh Redirect</option>
685
  </select>
686
  <span> (Quick 301 Redirects will always be 301)</span></td>
687
  </tr>
@@ -713,7 +588,6 @@ jQuery(document).ready(function() {
713
  ?>
714
  <div class="wrap">
715
  <div class="icon32" style="<?php echo 'background: url('.plugins_url( 'settings-icon.png' , __FILE__ ).') no-repeat transparent;';?>"><br></div>
716
- <!--script type="text/javascript">jQuery(document).ready(function() { var mainurl = '<?php echo get_bloginfo('url');?>'; jQuery(".delete-qppr").click(function(){ var thepprdel = jQuery(this).attr('id'); if(confirm('Are you sure you want to delete this redirect?')){ jQuery.ajax({ url: mainurl+"/",data : "pprd="+thepprdel+"&scid=<?php echo md5($tohash);?>", success: function(data){ jQuery('#row'+thepprdel).remove(); }, complete: function(){ jQuery(".pprnewwin").each(function (i) { jQuery(this).attr('name','quickppr_redirects[newwindow]['+jQuery(".pprnewwin").index(this)+']'); }); jQuery(".pprnofoll").each(function (i) { jQuery(this).attr('name','quickppr_redirects[nofollow]['+jQuery(".pprnofoll").index(this)+']'); }); } }); return false; }else{ return false; } }); jQuery("#hidepprjqmessage").click(function(){ jQuery.ajax({ url: mainurl+"/",data : "pprhidemessage=1", success: function(data){ jQuery('#usejqpprmessage').remove(); } }); return false; }); jQuery("#hidepprjqmessage2").click(function(){ jQuery.ajax({ url: mainurl+"/",data : "pprhidemessage=2", success: function(data){ jQuery('#usejqpprmessage2').remove(); } }); return false; }); });</script-->
717
  <script type="text/javascript">jQuery(document).ready(function() { var mainurl = '<?php echo site_url('/', 'admin') ;?>'; jQuery(".delete-qppr").click(function(){ var thepprdel = jQuery(this).attr('id'); if(confirm('Are you sure you want to delete this redirect?')){ jQuery.ajax({ url: mainurl,data : "pprd="+thepprdel+"&scid=<?php echo md5($tohash);?>", success: function(data, textStatus){ jQuery('#row'+thepprdel).remove(); }, complete: function(){ jQuery(".pprnewwin").each(function (i) { jQuery(this).attr('name','quickppr_redirects[newwindow]['+jQuery(".pprnewwin").index(this)+']'); }); jQuery(".pprnofoll").each(function (i) { jQuery(this).attr('name','quickppr_redirects[nofollow]['+jQuery(".pprnofoll").index(this)+']'); }); } }); return false; }else{ return false; } }); jQuery("#hidepprjqmessage").click(function(){ jQuery.ajax({ url: mainurl,data : "pprhidemessage=1", success: function(data){ jQuery('#usejqpprmessage').remove(); } }); return false; }); jQuery("#hidepprjqmessage2").click(function(){ jQuery.ajax({ url: mainurl,data : "pprhidemessage=2", success: function(data){ jQuery('#usejqpprmessage2').remove(); } }); return false; }); });</script>
718
  <style type="text/css">div.info{background-color:#dceff8;border-color:#c00;margin: 5px 0 15px;padding: 5px;border:1px solid #2e92c1;border-radius: 3px;}div.info a{color:#2e92c1;}.usejqpprmessage{overflow:hidden;}.hidepprjqmessage{float:right;font-size:11px;}.delete-qppr{border: 1px solid #FFBBBB;display: inline-block;font-weight: bold;padding: 0 5px;text-decoration: none;text-transform: uppercase;}</style>
719
  <h2>Quick 301 Redirects</h2>
@@ -786,21 +660,20 @@ jQuery(document).ready(function() {
786
  $redirects = array();
787
  $redirectsmeta = array();
788
  for($i = 0; $i < sizeof($data['request']); ++$i) {
789
- $request = trim($data['request'][$i]);
790
- $destination = trim($data['destination'][$i]);
791
- $newwin = trim($data['newwindow'][$i]);
792
- $nofoll = trim($data['nofollow'][$i]);
793
  if(strpos($request,'/',0) !== 0 && strpos($request,'http',0) !== 0){$request = '/'.$request;} // adds root marker to front if not there
794
  if((strpos($request,'.') === false && strpos($request,'?') === false) && strpos($request,'/',strlen($request)-1) === false){$request = $request.'/';} // adds end folder marker if not a file end
795
  if (($request == '' || $request == '/') && $destination == '') { continue;} elseif($request != '' && $request != '/' && $destination == '' ){$redirects[$request] = $this->homelink.'/';}else { $redirects[$request] = $destination; }
796
- $redirectsmeta[$request]['newwindow'] = $newwin;
797
- $redirectsmeta[$request]['nofollow'] = $nofoll;
798
  }
799
- update_option('quickppr_redirects', $redirects);
800
- update_option('quickppr_redirects_meta', $redirectsmeta);
801
  $this->quickppr_redirectsmeta = get_option('quickppr_redirects_meta');
802
  $this->quickppr_redirects = get_option('quickppr_redirects');
803
- $this->build_jQueryCache();
804
  return $redirects;
805
  }
806
 
@@ -816,8 +689,8 @@ jQuery(document).ready(function() {
816
  if($noFollow == '1'){$noChecked = ' checked="checked"';}else{$noChecked = '';}
817
  $output .= '
818
  <tr id="rowpprdel-'.$ww.'">
819
- <td><input type="text" name="quickppr_redirects[request][]" value="'.$request.'" style="width:27em" />&nbsp;&raquo;&nbsp;</td>
820
- <td><input type="text" name="quickppr_redirects[destination][]" value="'.$destination.'" style="width:27em;" /></td>
821
  <td align="center"><input class="pprnewwin" type="checkbox" name="quickppr_redirects[newwindow]['.($ww - 1).']" value="1"'.$newChecked.' title="open in a New Window" /></td>
822
  <td align="center"><input class="pprnofoll" type="checkbox" name="quickppr_redirects[nofollow]['.($ww - 1).']" value="1"'.$noChecked.' title="add No Follow" /></td>
823
  <td align="center">&nbsp;&nbsp;<a href="javascript:void();" id="pprdel-'.$ww.'" class="delete-qppr">X</a>&nbsp;</td>
@@ -918,7 +791,7 @@ jQuery(document).ready(function() {
918
  if(!isset($theArray[$key->post_id]['_pprredirect_url'])){$theArray[$key->post_id]['_pprredirect_url'] = '';}
919
  if(!isset($theArray[$key->post_id]['_pprredirect_type'] )){$theArray[$key->post_id]['_pprredirect_type'] = 302;}
920
  if(!isset($theArray[$key->post_id]['_pprredirect_relnofollow'])){$theArray[$key->post_id]['_pprredirect_relnofollow'] = 0;}
921
- if(!isset($theArray[$key->post_id]['_pprredirect_newwindow'] )) {$theArray[$key->post_id]['_pprredirect_newwindow'] = 0;}
922
  if(!isset($theArray[$key->post_id]['_pprredirect_active'] )){$theArray[$key->post_id]['_pprredirect_active'] = 0;}
923
 
924
  if($theArray[$key->post_id]['_pprredirect_newwindow']!= '0' || $this->pproverride_newwin =='1'){
@@ -937,71 +810,7 @@ jQuery(document).ready(function() {
937
  }
938
 
939
  function get_value($theval='none'){
940
- if($theval==''){return;}
941
- switch($theval){
942
- case 'ppr_all_redir_array':
943
- return $this->ppr_all_redir_array;
944
- break;
945
- case 'ppr_nofollow':
946
- return $this->ppr_all_redir_array;
947
- break;
948
- case 'ppr_newindow':
949
- return $this->ppr_newindow;
950
- break;
951
- case 'ppr_url':
952
- return $this->ppr_url;
953
- break;
954
- case 'ppr_url_rewrite':
955
- return $this->ppr_url_rewrite;
956
- break;
957
- case 'ppr_type':
958
- return $this->ppr_type;
959
- break;
960
- case 'ppr_curr_version':
961
- return $this->ppr_curr_version;
962
- break;
963
- case 'ppr_metaurlnew':
964
- return $this->ppr_metaurlnew;
965
- break;
966
- case 'ppr_casesensitive':
967
- return $this->pproverride_casesensitive;
968
- break;
969
- case 'hepprversion':
970
- return $this->hepprversion;
971
- break;
972
- case 'thepprmeta':
973
- return $this->thepprmeta;
974
- break;
975
- case 'quickppr_redirects':
976
- return $this->quickppr_redirects;
977
- break;
978
- case 'tohash':
979
- return $this->tohash;
980
- break;
981
- case 'fcmlink':
982
- return $this->fcmlink;
983
- break;
984
- case 'adminlink':
985
- return $this->adminlink;
986
- break;
987
- case 'homelink':
988
- return $this->homelink;
989
- break;
990
- case 'updatemsg':
991
- return $this->updatemsg;
992
- break;
993
- case 'pprmeta_seconds':
994
- return $this->pprmeta_seconds;
995
- break;
996
- case 'pprmeta_message':
997
- return $this->pprmeta_message;
998
- break;
999
- case 'none':
1000
- return 0;
1001
- break;
1002
- }
1003
-
1004
- return '';
1005
  }
1006
 
1007
  function ppr_addmetatohead_theme(){
@@ -1112,7 +921,7 @@ jQuery(document).ready(function() {
1112
  foreach($text as $nl){
1113
  if($nl!=''){
1114
  $elem = explode('|',$nl);
1115
- $newfile1['quickppr_redirects'][$elem[0]] = $elem[1];
1116
  $nw = isset($elem[2]) && $elem[2] == '1' ? '1' : '';
1117
  $nf = isset($elem[3]) && $elem[3] == '1' ? '1' : '';
1118
  $newfile1['quickppr_redirects_meta'][$elem[0]]['newwindow'] = $nw;
@@ -1163,7 +972,7 @@ jQuery(document).ready(function() {
1163
  if($qrtoadd != '' && strpos($qrtoadd,'|') !== false){
1164
  $item = explode('|',str_replace(array("\r","\n"), array('',''),$qrtoadd));
1165
  if(is_array($item) && !empty($item)){
1166
- $tempArr[$item[0]] = $item[1];
1167
  if(isset( $item[2]) || isset( $item[3])){
1168
  $newwin = (isset($item[2]) && ($item[2] != '' && $item[2] != '0')) ? 1 : '';
1169
  $nofoll = (isset($item[3]) && ($item[3] != '' && $item[3] != '0')) ? 1 : '';
@@ -1219,26 +1028,12 @@ jQuery(document).ready(function() {
1219
  } // end if
1220
  update_option('quickppr_redirects',$quickppr_redirects);
1221
  update_option('quickppr_redirects_meta',$quickppr_redirectsmeta);
1222
- $this->build_jQueryCache();
1223
  echo 1;
1224
  exit;
1225
  }else{
1226
  echo 0;
1227
  exit;
1228
  }
1229
- }elseif(array_key_exists('ver', $wp->query_vars)){
1230
- if( $wp->query_vars['ver'] =='pprjq1'){
1231
- if($this->ppruse_jquery == '1'){
1232
- $pprscript = get_option('qppr_jQuery_cache');
1233
- }else{
1234
- $pprscript = '//not set';
1235
- }
1236
- if($pprscript == ''){$pprscript = $this->build_jQueryCache();}
1237
- header('Content-type: text/javascript');
1238
- echo $pprscript;
1239
- exit;
1240
- }
1241
- return;
1242
  }elseif(array_key_exists('pprhidemessage', $wp->query_vars)){
1243
  if( $wp->query_vars['pprhidemessage'] =='1'){
1244
  update_option('qppr_jQuery_hide_message','1');
@@ -1299,19 +1094,19 @@ jQuery(document).ready(function() {
1299
  $ppr_option5='';
1300
  // Use nonce for verification ... ONLY USE ONCE!
1301
  wp_nonce_field( 'pprredirect_noncename', 'pprredirect_noncename', false, true );
1302
-
1303
  // The actual fields for data entry
1304
- echo '<label for="pprredirect_active" style="padding:2px 0;"><input type="checkbox" name="pprredirect_active" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_active',true),0).' />&nbsp;Make Redirect <b>Active</b>. (check to turn on)</label><br />';
1305
- echo '<label for="pprredirect_newwindow" style="padding:2px 0;"><input type="checkbox" name="pprredirect_newwindow" id="pprredirect_newwindow" value="_blank" '. checked('_blank',get_post_meta($post->ID,'_pprredirect_newwindow',true),0).'>&nbsp;Open redirect link in a <b>new window.</b></label><br />';
1306
- echo '<label for="pprredirect_relnofollow" style="padding:2px 0;"><input type="checkbox" name="pprredirect_relnofollow" id="pprredirect_relnofollow" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_relnofollow',true),0).'>&nbsp;Add <b>rel=\"nofollow\"</b> to redirect link.</label><br />';
1307
- echo '<label for="pprredirect_rewritelink" style="padding:2px 0;"><input type="checkbox" name="pprredirect_rewritelink" id="pprredirect_rewritelink" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_rewritelink',true),0).'>&nbsp;<b>Show</b> the Redirect URL below in the link instead of this page URL. <b>NOTE: You may have to use the <u>FULL</u> URL below!</b></label><br /><br />';
 
 
 
1308
  //echo '<label for="pprredirect_casesensitive" style="padding:2px 0;"><input type="checkbox" name="pprredirect_casesensitive" id="pprredirect_casesensitive" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_casesensitive',true),0).'>&nbsp;Make the Redirect Case Insensitive.</label><br /><br />';
1309
  echo '<label for="pprredirect_url"><b>Redirect URL:</b></label><br />';
1310
- if(get_post_meta($post->ID, '_pprredirect_url', true)!=''){$pprredirecturl=get_post_meta($post->ID, '_pprredirect_url', true);}else{$pprredirecturl="";}
1311
- echo '<input type="text" style="width:75%;margin-top:2px;margin-bottom:2px;" name="pprredirect_url" value="'.$pprredirecturl.'" /><br />(i.e., <code>http://example.com</code> or <code>/somepage/</code> or <code>p=15</code> or <code>155</code>. Use <b>FULL URL</b> <i>including</i> <code>http://</code> for all external <i>and</i> meta redirects. )<br /><br />';
1312
-
1313
- echo '<label for="pprredirect_type">Type of Redirect:</label> ';
1314
- if(get_post_meta($post->ID, '_pprredirect_type', true)!=''){$pprredirecttype=get_post_meta($post->ID, '_pprredirect_type', true);}else{$pprredirecttype="";}
1315
  switch($pprredirecttype):
1316
  case "":
1317
  $ppr_option2=" selected";//default
@@ -1330,51 +1125,89 @@ jQuery(document).ready(function() {
1330
  break;
1331
  endswitch;
1332
 
1333
- echo '<select style="margin-top:2px;margin-bottom:2px;width:40%;" name="pprredirect_type"><option value="301" '.$ppr_option1.'>301 Permanent</option><option value="302" '.$ppr_option2.'>302 Temporary</option><option value="307" '.$ppr_option3.'>307 Temporary</option><option value="meta" '.$ppr_option5.'>Meta Redirect</option></select> (Default is 302)<br /><br />';
1334
- echo '<b>NOTE:</b> For This Option to work, the page or post needs to be published for the redirect to happen <i><b>UNLESS</b></i> you publish it first, then save it as a Draft. If you want to add a redirect without adding a page/post or having it published, use the <a href="./admin.php?page=redirect-updates">Quick Redirects</a> method.';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1335
  }
1336
 
1337
  function ppr_save_metadata($post_id, $post) {
1338
-
1339
  if($post->post_type == 'revision'){return;}
1340
- if(isset($_REQUEST['pprredirect_noncename']) && (isset($_POST['pprredirect_active']) || isset($_POST['pprredirect_url']) || isset($_POST['pprredirect_type']) || isset($_POST['pprredirect_newwindow']) || isset($_POST['pprredirect_relnofollow']))):
1341
- unset($my_meta_data);
1342
- $my_meta_data = array();
1343
- // verify authorization
1344
- if(isset($_POST['pprredirect_noncename'])){
1345
- if ( !wp_verify_nonce( $_REQUEST['pprredirect_noncename'], 'pprredirect_noncename' )) {
1346
- return $post_id;
1347
- }
1348
  }
1349
- // check allowed to editing
1350
- if ( !(current_user_can('edit_page', $post_id ) || current_user_can( 'edit_post', $post_id ))){
1351
- return $post_id;
1352
- }
1353
-
 
 
 
1354
  // find & save the form data & put it into an array
1355
- $my_meta_data['_pprredirect_active'] = isset($_REQUEST['pprredirect_active']) ? $_REQUEST['pprredirect_active'] : '';
1356
- $my_meta_data['_pprredirect_newwindow'] = isset($_REQUEST['pprredirect_newwindow']) ? $_REQUEST['pprredirect_newwindow'] : '';
1357
- $my_meta_data['_pprredirect_relnofollow'] = isset($_REQUEST['pprredirect_relnofollow']) ? $_REQUEST['pprredirect_relnofollow'] : '';
1358
- $my_meta_data['_pprredirect_type'] = isset($_REQUEST['pprredirect_type']) ? $_REQUEST['pprredirect_type'] : '';
1359
- $my_meta_data['_pprredirect_rewritelink'] = isset($_REQUEST['pprredirect_rewritelink']) ? $_REQUEST['pprredirect_rewritelink'] : '';
1360
- $my_meta_data['_pprredirect_url'] = isset($_REQUEST['pprredirect_url']) ? $_REQUEST['pprredirect_url'] : '';
1361
- //$my_meta_data['_pprredirect_casesensitive'] = isset($_REQUEST['pprredirect_casesensitive']) ? $_REQUEST['pprredirect_casesensitive']: '';
1362
-
1363
- if ( 0 === strpos($my_meta_data['_pprredirect_url'], 'www.'))
1364
- $my_meta_data['_pprredirect_url'] = 'http://' . $my_meta_data['_pprredirect_url'] ; // Starts with www., so add http://
1365
 
1366
- if($my_meta_data['_pprredirect_url'] == ''){
 
 
 
 
1367
  $my_meta_data['_pprredirect_type'] = NULL; //clear Type if no URL is set.
1368
  $my_meta_data['_pprredirect_active'] = NULL; //turn it off if no URL is set
 
 
 
1369
  }
1370
 
1371
  // Add values of $my_meta_data as custom fields
1372
  if(count($my_meta_data)>0){
1373
- foreach ($my_meta_data as $key => $value) { //Let's cycle through the $my_meta_data array!
1374
- if( $post->post_type == 'revision' ){ return; } //don't store custom data twice
1375
- $value = implode(',', (array)$value); //if $value is an array, make it a CSV (unlikely)
1376
-
1377
- if($value=='' || $value == NULL){
1378
  delete_post_meta($post->ID, $key);
1379
  }else{
1380
  if(get_post_meta($post->ID, $key, true) != '') {
@@ -1386,7 +1219,6 @@ jQuery(document).ready(function() {
1386
  }
1387
  }
1388
  endif;
1389
- $this->build_jQueryCache();
1390
  }
1391
 
1392
  function ppr_fix_targetsandrels($pages) {
@@ -1494,7 +1326,6 @@ jQuery(document).ready(function() {
1494
  $useURLQS = array();
1495
  if(count($_GET) >= 1){
1496
  foreach($_GET as $key => $value){$useURLQS[] = $key.'='.$value;}
1497
- //TODO: Make this an option?
1498
  $finalQS = '?'.implode('&',$useURLQS);
1499
  $userrequest = preg_replace('/\?.*/', '', $userrequest);
1500
  }
@@ -1524,12 +1355,14 @@ jQuery(document).ready(function() {
1524
  if($val) {
1525
  $useURL = $this->pproverride_URL != '' ? $this->pproverride_URL : $val;
1526
  $useURL .= $finalQS; //add QS back
1527
- do_action('qppr_redirect',$useURL,$this->pproverride_type);
1528
- if($this->pproverride_type == 'meta'){
 
 
1529
  $this->ppr_metaurl = $useURL;
1530
  add_action('wp_head', array($this,'ppr_addmetatohead_theme'),1);
1531
  }else{
1532
- wp_redirect($useURL,$this->pproverride_type);
1533
  exit();
1534
  }
1535
  }
@@ -1560,7 +1393,6 @@ jQuery(document).ready(function() {
1560
  }else{ // we assume they are using the permalink / page name??
1561
  $urlsite=$this->homelink.'/'.$redrurl;
1562
  }
1563
-
1564
  // check if override is set for all redirects to go to one URL
1565
  if($this->pproverride_URL !=''){$urlsite=$this->pproverride_URL;}
1566
  if($this->pproverride_type!='0' && $this->pproverride_type!=''){$redrtype = $this->pproverride_type;} //override check
6
  Author: Don Fischer
7
  Author URI: http://www.fischercreativemedia.com/
8
  Donate link: http://www.fischercreativemedia.com/donations/
9
+ Version: 5.0.5
10
 
11
  Version info:
12
  See change log in readme.txt file.
13
  Version 3.2.4 to 4.0.1 are testing versions only
14
 
15
+ Copyright (C) 2009-2014 Donald J. Fischer
16
 
17
  This program is free software: you can redistribute it and/or modify
18
  it under the terms of the GNU General Public License as published by
26
 
27
  You should have received a copy of the GNU General Public License
28
  along with this program. If not, see <http://www.gnu.org/licenses/>.
 
 
 
 
 
 
 
 
29
 
30
+ ==========
31
  //you can use the following action hooks with this plugin:
32
  // *** Quick Rediects function: use to take over redirect
33
  // add_action('qppr_redirect','some_callback_function',10,2);
59
  // arg 1. Meta Tag (fully generated)
60
  // arg 2. Page HTML Message (wrapped in a <div> tag)
61
  // Example:
62
+ /*
63
  add_filter('ppr_meta_head_hook_filter','override_ppr_metahead_new');
64
  function override_ppr_metahead_new($meta_tag='',$meta_message=''){
65
  $meta = $meta_tag;
69
  add_filter('get_title',$function2,100,1);
70
  return $meta;
71
  }
72
+ /*
73
+ // ********************************/
74
+ global $newqppr;
75
+ if (!function_exists('esc_attr')) { // For WordPress < 2.8 function compatibility
76
+ function esc_attr($attr){return attribute_escape( $attr );}
77
+ function esc_url($url){return clean_url( $url );}
78
+ }
79
+ $newqppr = new quick_page_post_reds();
80
 
81
 
82
  //=======================================
114
  public $pprptypes_ok;
115
 
116
  function __construct() {
117
+ $this->ppr_curr_version = '5.0.5';
118
+ $this->ppr_nofollow = array();
119
+ $this->ppr_newindow = array();
120
+ $this->ppr_url = array();
121
+ $this->ppr_url_rewrite = array();
122
+ $this->thepprversion = get_option( 'ppr_version');
123
+ $this->thepprmeta = get_option( 'ppr_meta_clean');
124
+ $this->quickppr_redirects = get_option( 'quickppr_redirects');
125
+ $this->quickppr_redirectsmeta = get_option('quickppr_redirects_meta');
126
+ $this->homelink = get_option( 'home');
127
+ $this->pproverride_nofollow = get_option( 'ppr_override-nofollow' );
128
+ $this->pproverride_newwin = get_option( 'ppr_override-newwindow' );
129
+ $this->ppruse_jquery = get_option( 'ppr_use-jquery' );
130
+ $this->pprptypes_ok = array();
131
+ $this->pproverride_type = get_option( 'ppr_override-redirect-type' );
132
+ $this->pproverride_active = get_option( 'ppr_override-active' );
133
+ $this->pproverride_URL = get_option( 'ppr_override-URL' );
134
+ $this->pproverride_rewrite = get_option( 'ppr_override-rewrite' );
135
+ $this->pprmeta_message = get_option( 'ppr_meta-message' );
136
+ $this->pprmeta_seconds = get_option( 'ppr_meta-seconds' );
137
+ $this->pproverride_casesensitive= get_option( 'ppr_override-casesensitive' );
138
+ $this->adminlink = admin_url('/', 'admin');
139
+ $this->fcmlink = 'http://www.fischercreativemedia.com/plugins';
140
+ $this->ppr_metaurl = '';
141
+ $this->quickppr_jquerycache = ''; //get_option( 'qppr_jQuery_cache' );
142
+ $this->updatemsg = '';
143
  if($this->pprmeta_seconds==''){$this->pprmeta_seconds='0';}
144
 
145
  //these are for all the time - even if there are overrides
146
+ add_action( 'init', array( $this,'ppr_init_check_version'), 1 ); // checks version of plugin in DB and updates if needed.
147
+ add_action( 'init', array( $this,'ppr_parse_request_new') ); // parse query vars
148
+ add_action( 'save_post', array( $this,'ppr_save_metadata'), 11, 2 ); // save the custom fields
149
+ add_action( 'wp', array( $this, 'ppr_parse_request') ); // parse query vars
150
+ add_action( 'admin_menu', array( $this,'ppr_add_menu' ) ); // add the menu items needed
151
+ add_action( 'admin_menu', array( $this,'ppr_add_metabox' ) ); // add the metaboxes where needed
 
152
  add_action( 'plugin_action_links_' . plugin_basename(__FILE__), array($this,'ppr_filter_plugin_actions') );
153
+ add_filter( 'query_vars', array( $this,'ppr_queryhook' ) );
154
+ add_filter( 'plugin_row_meta', array( $this,'ppr_filter_plugin_links' ), 10, 2 );
155
+ add_action( 'admin_enqueue_scripts' , array( $this,'qppr_admin_scripts' ) );
156
+ //add_filter( 'wp_feed_cache_transient_lifetime',array($this,'ppr_wp_feed_options',10, 2));
157
 
158
+ if( $this->pproverride_active!='1' && !is_admin() ){ // don't run these if override active is set
159
+ add_action( 'init', array( $this, 'redirect' ), 1 ); // add the 301 redirect action, high priority
160
+ add_action( 'init', array( $this, 'redirect_post_type' ), 1 ); // add the normal redirect action, high priority
161
+ add_action( 'template_redirect', array( $this, 'ppr_do_redirect' ), 1, 2); // do the redirects
162
+ add_filter( 'wp_get_nav_menu_items', array( $this, 'ppr_new_nav_menu_fix' ), 1, 1 );
163
+ add_filter( 'wp_list_pages', array( $this, 'ppr_fix_targetsandrels' ) );
164
+ add_filter( 'page_link', array( $this, 'ppr_filter_page_links' ), 20, 2 );
165
+ add_filter( 'post_link', array( $this, 'ppr_filter_page_links'), 20, 2 );
166
+ add_filter( 'post_type_link', array( $this, 'ppr_filter_page_links' ), 20, 2 );
167
+ add_filter( 'get_permalink', array( $this, 'ppr_filter_links' ), 20, 2 );
168
  }
169
+ if( isset( $_POST['submit_301'] ) ) {$this->quickppr_redirects = $this->save_redirects( $_POST['quickppr_redirects'] /* sanatized individually */ );$this->updatemsg ='Quick Redirects Updated.';} //if submitted, process the data
 
170
  }
171
 
172
  function ppr_add_menu(){
173
+ add_menu_page( 'Redirect Options', 'Redirect Options', 'administrator', 'redirect-options', array($this,'ppr_settings_page'),plugins_url( 'settings-16-icon.png' , __FILE__));
174
  add_submenu_page( 'redirect-options', 'Quick Redirects', 'Quick Redirects', 'manage_options', 'redirect-updates', array($this,'ppr_options_page') );
175
  add_submenu_page( 'redirect-options', 'Redirect Summary', 'Redirect Summary', 'manage_options', 'redirect-summary', array($this,'ppr_summary_page') );
176
  add_submenu_page( 'redirect-options', 'FAQs/Help', 'FAQs/Help', 'manage_options', 'redirect-faqs', array($this,'ppr_faq_page') );
177
  add_action( 'admin_init', array($this,'register_pprsettings') );
178
  }
179
+ function qppr_admin_scripts($hook){
180
+ if(in_array($hook, array('edit.php','post.php'))){
181
+ wp_enqueue_script( 'qppr_admin_meta_script', plugins_url('/qppr_admin_script.js', __FILE__ ) , array('jquery'),'5.0.5');
182
+ wp_enqueue_style( 'qppr_admin_meta_style', plugins_url('/qppr_admin_style.css', __FILE__ ) , null ,'5.0.5' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  }
184
+ return;
185
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  function register_pprsettings() {
187
  register_setting( 'ppr-settings-group', 'ppr_use-custom-post-types' );
188
  register_setting( 'ppr-settings-group', 'ppr_override-nofollow' );
293
  $tempReportArray = array();
294
  $tempa = array();
295
  $tempQTReportArray = array();
 
296
  if( !empty( $this->quickppr_redirects)){
297
  foreach($this->quickppr_redirects as $key=>$redir){
298
  $tempQTReportArray = array('url'=>$key,'destinaition'=>$redir);
528
  <tr valign="top">
529
  <td><label><span style="color:#FF0000;font-weight:bold;font-size:100%;margin-left:0px;">Hide</span> meta box for following Post Types:</label><?php echo $ptypeHTML;?></td>
530
  </tr>
531
+ <!--tr valign="top">
532
  <td><label>Use with jQuery? <i><font size="2" color="#FF0000">(unavailable at this time)</font></i></label> <!--input type="checkbox" name="ppr_use-jquery" value="1"<?php if(get_option('ppr_use-jquery')=='1'){echo ' checked="checked" ';} ?>/--> <input type="checkbox" name="ppr_use-jquery" value="0" disabled /><span>disabled in current version<!--Increases effectiveness of plugin. If you have a jQuery conflict, try turning this off.--></span></td>
533
+ </tr-->
534
  <tr valign="top">
535
  <td><label>Meta Refresh Time (in seconds):</label> <input type="text" size="5" name="ppr_meta-seconds" value="<?php echo get_option('ppr_meta-seconds');?>" /> <span>Only needed for Meta Refresh. 0=default (instant)</span></td>
536
  </tr>
553
  <td><label>Make ALL Redirects this type: </label>
554
  <select name="ppr_override-redirect-type">
555
  <option value="0">Use Individual Settings</option>
556
+ <option value="301" <?php if( get_option('ppr_override-redirect-type')=='301') {echo ' selected="selected" ';} ?>>301 Permanant Redirect</option>
557
+ <option value="302" <?php if( get_option('ppr_override-redirect-type')=='302') {echo ' selected="selected" ';} ?>>302 Temporary Redirect</option>
558
+ <option value="307" <?php if( get_option('ppr_override-redirect-type')=='307') {echo ' selected="selected" ';} ?>>307 Temporary Redirect</option>
559
+ <option value="meta" <?php if(get_option('ppr_override-redirect-type')=='meta'){echo ' selected="selected" ';} ?>>Meta Refresh Redirect</option>
560
  </select>
561
  <span> (Quick 301 Redirects will always be 301)</span></td>
562
  </tr>
588
  ?>
589
  <div class="wrap">
590
  <div class="icon32" style="<?php echo 'background: url('.plugins_url( 'settings-icon.png' , __FILE__ ).') no-repeat transparent;';?>"><br></div>
 
591
  <script type="text/javascript">jQuery(document).ready(function() { var mainurl = '<?php echo site_url('/', 'admin') ;?>'; jQuery(".delete-qppr").click(function(){ var thepprdel = jQuery(this).attr('id'); if(confirm('Are you sure you want to delete this redirect?')){ jQuery.ajax({ url: mainurl,data : "pprd="+thepprdel+"&scid=<?php echo md5($tohash);?>", success: function(data, textStatus){ jQuery('#row'+thepprdel).remove(); }, complete: function(){ jQuery(".pprnewwin").each(function (i) { jQuery(this).attr('name','quickppr_redirects[newwindow]['+jQuery(".pprnewwin").index(this)+']'); }); jQuery(".pprnofoll").each(function (i) { jQuery(this).attr('name','quickppr_redirects[nofollow]['+jQuery(".pprnofoll").index(this)+']'); }); } }); return false; }else{ return false; } }); jQuery("#hidepprjqmessage").click(function(){ jQuery.ajax({ url: mainurl,data : "pprhidemessage=1", success: function(data){ jQuery('#usejqpprmessage').remove(); } }); return false; }); jQuery("#hidepprjqmessage2").click(function(){ jQuery.ajax({ url: mainurl,data : "pprhidemessage=2", success: function(data){ jQuery('#usejqpprmessage2').remove(); } }); return false; }); });</script>
592
  <style type="text/css">div.info{background-color:#dceff8;border-color:#c00;margin: 5px 0 15px;padding: 5px;border:1px solid #2e92c1;border-radius: 3px;}div.info a{color:#2e92c1;}.usejqpprmessage{overflow:hidden;}.hidepprjqmessage{float:right;font-size:11px;}.delete-qppr{border: 1px solid #FFBBBB;display: inline-block;font-weight: bold;padding: 0 5px;text-decoration: none;text-transform: uppercase;}</style>
593
  <h2>Quick 301 Redirects</h2>
660
  $redirects = array();
661
  $redirectsmeta = array();
662
  for($i = 0; $i < sizeof($data['request']); ++$i) {
663
+ $request = sanitize_text_field(trim($data['request'][$i]));
664
+ $destination = sanitize_text_field(trim($data['destination'][$i]));
665
+ $newwin = sanitize_text_field(trim($data['newwindow'][$i]));
666
+ $nofoll = sanitize_text_field(trim($data['nofollow'][$i]));
667
  if(strpos($request,'/',0) !== 0 && strpos($request,'http',0) !== 0){$request = '/'.$request;} // adds root marker to front if not there
668
  if((strpos($request,'.') === false && strpos($request,'?') === false) && strpos($request,'/',strlen($request)-1) === false){$request = $request.'/';} // adds end folder marker if not a file end
669
  if (($request == '' || $request == '/') && $destination == '') { continue;} elseif($request != '' && $request != '/' && $destination == '' ){$redirects[$request] = $this->homelink.'/';}else { $redirects[$request] = $destination; }
670
+ $redirectsmeta[$request]['newwindow'] = ($newwin == '1' || $newwin =='0') ? $newwin : '0' ;
671
+ $redirectsmeta[$request]['nofollow'] = ($nofoll == '1' || $nofoll == '0') ? $nofoll : '0' ;
672
  }
673
+ update_option('quickppr_redirects', sanitize_option('quickppr_redirects',$redirects));
674
+ update_option('quickppr_redirects_meta', sanitize_option('quickppr_redirects_meta',$redirectsmeta));
675
  $this->quickppr_redirectsmeta = get_option('quickppr_redirects_meta');
676
  $this->quickppr_redirects = get_option('quickppr_redirects');
 
677
  return $redirects;
678
  }
679
 
689
  if($noFollow == '1'){$noChecked = ' checked="checked"';}else{$noChecked = '';}
690
  $output .= '
691
  <tr id="rowpprdel-'.$ww.'">
692
+ <td><input type="text" name="quickppr_redirects[request][]" value="'.esc_attr($request).'" style="width:27em" />&nbsp;&raquo;&nbsp;</td>
693
+ <td><input type="text" name="quickppr_redirects[destination][]" value="'.esc_attr($destination).'" style="width:27em;" /></td>
694
  <td align="center"><input class="pprnewwin" type="checkbox" name="quickppr_redirects[newwindow]['.($ww - 1).']" value="1"'.$newChecked.' title="open in a New Window" /></td>
695
  <td align="center"><input class="pprnofoll" type="checkbox" name="quickppr_redirects[nofollow]['.($ww - 1).']" value="1"'.$noChecked.' title="add No Follow" /></td>
696
  <td align="center">&nbsp;&nbsp;<a href="javascript:void();" id="pprdel-'.$ww.'" class="delete-qppr">X</a>&nbsp;</td>
791
  if(!isset($theArray[$key->post_id]['_pprredirect_url'])){$theArray[$key->post_id]['_pprredirect_url'] = '';}
792
  if(!isset($theArray[$key->post_id]['_pprredirect_type'] )){$theArray[$key->post_id]['_pprredirect_type'] = 302;}
793
  if(!isset($theArray[$key->post_id]['_pprredirect_relnofollow'])){$theArray[$key->post_id]['_pprredirect_relnofollow'] = 0;}
794
+ if(!isset($theArray[$key->post_id]['_pprredirect_newwindow'] )) {$theArray[$key->post_id]['_pprredirect_newwindow'] = 0;}
795
  if(!isset($theArray[$key->post_id]['_pprredirect_active'] )){$theArray[$key->post_id]['_pprredirect_active'] = 0;}
796
 
797
  if($theArray[$key->post_id]['_pprredirect_newwindow']!= '0' || $this->pproverride_newwin =='1'){
810
  }
811
 
812
  function get_value($theval='none'){
813
+ return isset($this->$theval) ? $this->$theval : 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
814
  }
815
 
816
  function ppr_addmetatohead_theme(){
921
  foreach($text as $nl){
922
  if($nl!=''){
923
  $elem = explode('|',$nl);
924
+ $newfile1['quickppr_redirects'][sanitize_text_field($elem[0])] = sanitize_text_field($elem[1]);
925
  $nw = isset($elem[2]) && $elem[2] == '1' ? '1' : '';
926
  $nf = isset($elem[3]) && $elem[3] == '1' ? '1' : '';
927
  $newfile1['quickppr_redirects_meta'][$elem[0]]['newwindow'] = $nw;
972
  if($qrtoadd != '' && strpos($qrtoadd,'|') !== false){
973
  $item = explode('|',str_replace(array("\r","\n"), array('',''),$qrtoadd));
974
  if(is_array($item) && !empty($item)){
975
+ $tempArr[sanitize_text_field($item[0])] = sanitize_text_field($item[1]);
976
  if(isset( $item[2]) || isset( $item[3])){
977
  $newwin = (isset($item[2]) && ($item[2] != '' && $item[2] != '0')) ? 1 : '';
978
  $nofoll = (isset($item[3]) && ($item[3] != '' && $item[3] != '0')) ? 1 : '';
1028
  } // end if
1029
  update_option('quickppr_redirects',$quickppr_redirects);
1030
  update_option('quickppr_redirects_meta',$quickppr_redirectsmeta);
 
1031
  echo 1;
1032
  exit;
1033
  }else{
1034
  echo 0;
1035
  exit;
1036
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
1037
  }elseif(array_key_exists('pprhidemessage', $wp->query_vars)){
1038
  if( $wp->query_vars['pprhidemessage'] =='1'){
1039
  update_option('qppr_jQuery_hide_message','1');
1094
  $ppr_option5='';
1095
  // Use nonce for verification ... ONLY USE ONCE!
1096
  wp_nonce_field( 'pprredirect_noncename', 'pprredirect_noncename', false, true );
 
1097
  // The actual fields for data entry
1098
+ $pprredirecttype = get_post_meta($post->ID, '_pprredirect_type', true) !='' ? get_post_meta($post->ID, '_pprredirect_type', true) : "";
1099
+ $pprredirecturl = get_post_meta($post->ID, '_pprredirect_url', true)!='' ? get_post_meta($post->ID, '_pprredirect_url', true) : "";
1100
+ //echo $pprredirecttype.'|'.$pprredirecturl;
1101
+ echo '<label for="pprredirect_active" style="padding:2px 0;"><input type="checkbox" name="pprredirect_active" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_active',true),0).' />&nbsp;Make Redirect <b>Active</b>.<span class="qppr_meta_help_wrap"><span class="qppr_meta_help_icon">?</span><span class="qppr_meta_help">Check to turn on or redirect will not work.</span></span></label><br />';
1102
+ echo '<label for="pprredirect_newwindow" style="padding:2px 0;"><input type="checkbox" name="pprredirect_newwindow" id="pprredirect_newwindow" value="_blank" '. checked('_blank',get_post_meta($post->ID,'_pprredirect_newwindow',true),0).'>&nbsp;Open redirect link in a <b>new window.</b><span class="qppr_meta_help_wrap"><span class="qppr_meta_help_icon">?</span><span class="qppr_meta_help">May not work in all cases.</span></span></label><br />';
1103
+ echo '<label for="pprredirect_relnofollow" style="padding:2px 0;"><input type="checkbox" name="pprredirect_relnofollow" id="pprredirect_relnofollow" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_relnofollow',true),0).'>&nbsp;Add <b>rel="nofollow"</b> to redirect link.<span class="qppr_meta_help_wrap"><span class="qppr_meta_help_icon">?</span><span class="qppr_meta_help">May not work in all cases.</span></span></label><br />';
1104
+ echo '<label for="pprredirect_rewritelink" style="padding:2px 0;"><input type="checkbox" name="pprredirect_rewritelink" id="pprredirect_rewritelink" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_rewritelink',true),0).'>&nbsp;<b>Show</b> the Redirect URL instead of original URL. <span class="qppr_meta_help_wrap"><span class="qppr_meta_help_icon">?</span><span class="qppr_meta_help">May not always work and will only show the link - <strong><em>NOT in the Address bar.</em></strong></span></span></label><br /><br />';
1105
  //echo '<label for="pprredirect_casesensitive" style="padding:2px 0;"><input type="checkbox" name="pprredirect_casesensitive" id="pprredirect_casesensitive" value="1" '. checked('1',get_post_meta($post->ID,'_pprredirect_casesensitive',true),0).'>&nbsp;Make the Redirect Case Insensitive.</label><br /><br />';
1106
  echo '<label for="pprredirect_url"><b>Redirect URL:</b></label><br />';
1107
+ echo '<input type="text" style="width:75%;margin-top:2px;margin-bottom:2px;" name="pprredirect_url" value="'.$pprredirecturl.'" /><span class="qppr_meta_help_wrap"><span class="qppr_meta_help_icon">?</span><span class="qppr_meta_help"><br />(i.e., <strong>http://example.com</strong> or <strong>/somepage/</strong> or <strong>p=15</strong> or <strong>155</strong>. Use <b>FULL URL</b> <i>including</i> <strong>http://</strong> for all external <i>and</i> meta redirects.)</span></span><br /><br />';
1108
+ echo '<label for="pprredirect_type"><b>Type of Redirect:</b></label><br />';
1109
+
 
 
1110
  switch($pprredirecttype):
1111
  case "":
1112
  $ppr_option2=" selected";//default
1125
  break;
1126
  endswitch;
1127
 
1128
+ echo '
1129
+ <select style="margin-top:2px;margin-bottom:2px;width:40%;" name="pprredirect_type">
1130
+ <option value="301" '.$ppr_option1.'>301 Permanent</option>
1131
+ <option value="302" '.$ppr_option2.'>302 Temporary</option>
1132
+ <option value="307" '.$ppr_option3.'>307 Temporary</option>
1133
+ <option value="meta" '.$ppr_option5.'>Meta Redirect</option>
1134
+ </select><span class="qppr_meta_help_wrap"><span class="qppr_meta_help_icon">?</span><span class="qppr_meta_help">Default is 302 (Temporary Redirect). </span></span><br /><br />
1135
+ ';
1136
+ echo '<b>NOTE:</b> For a Page or Post (or Custom Post) Redirect to work, it may need to be published first and then saved again as a Draft. If you do not already have a page/post created you can add a \'Quick\' redirect using the <a href="./admin.php?page=redirect-updates">Quick Redirects</a> method.';
1137
+ }
1138
+ function appip_parseURI($url){
1139
+ /*
1140
+ [scheme]
1141
+ [host]
1142
+ [user]
1143
+ [pass]
1144
+ [path]
1145
+ [query]
1146
+ [fragment]
1147
+ */
1148
+ if(substr($url,0,2) == 'p='){ // page or post id
1149
+ $url = network_site_url().'/?'.$url;
1150
+ }elseif(is_numeric($url)){ // page or post id
1151
+ $url = network_site_url().'/?'.$url;
1152
+ }elseif($url[0] == "/" ){ // root
1153
+ $url = network_site_url().'/';
1154
+ }elseif(strpos($url,"://") === false ){ // no protocol so add it
1155
+ $url = "http://".$url;
1156
+ }
1157
+ $info = parse_url($url);
1158
+ $info['url'] = $url;
1159
+ //echo $info['url'];
1160
+ return $info;
1161
+ }
1162
+ function isOne_none($val=''){ //true (1) or false =''
1163
+ if($val == '_blank'){
1164
+ return $val;
1165
+ }elseif($val == '1' || $val == 'true' || $val === true ){
1166
+ return 1;
1167
+ }
1168
+ return '';
1169
  }
1170
 
1171
  function ppr_save_metadata($post_id, $post) {
 
1172
  if($post->post_type == 'revision'){return;}
1173
+ // verify authorization
1174
+ if(isset($_POST['pprredirect_noncename'])){
1175
+ if ( !wp_verify_nonce( $_REQUEST['pprredirect_noncename'], 'pprredirect_noncename' )) {
1176
+ return $post_id;
 
 
 
 
1177
  }
1178
+ }
1179
+ // check allowed to editing
1180
+ if ( !current_user_can('edit_posts', $post_id)){
1181
+ return $post_id;
1182
+ }
1183
+ if(!empty($my_meta_data)){unset($my_meta_data);}
1184
+ $my_meta_data = array();
1185
+ if(isset($_POST['pprredirect_active']) || isset($_POST['pprredirect_url']) || isset($_POST['pprredirect_type']) || isset($_POST['pprredirect_newwindow']) || isset($_POST['pprredirect_relnofollow'])):
1186
  // find & save the form data & put it into an array
1187
+ $my_meta_data['_pprredirect_active'] = isset($_REQUEST['pprredirect_active']) ? sanitize_meta( '_pprredirect_active', $this->isOne_none(intval( $_REQUEST['pprredirect_active'])), 'post' ) : '';
1188
+ $my_meta_data['_pprredirect_newwindow'] = isset($_REQUEST['pprredirect_newwindow']) ? sanitize_meta( '_pprredirect_newwindow', $this->isOne_none( $_REQUEST['pprredirect_newwindow']), 'post' ) : '';
1189
+ $my_meta_data['_pprredirect_relnofollow'] = isset($_REQUEST['pprredirect_relnofollow']) ? sanitize_meta( '_pprredirect_relnofollow', $this->isOne_none(intval( $_REQUEST['pprredirect_relnofollow'])), 'post' ) : '';
1190
+ $my_meta_data['_pprredirect_type'] = isset($_REQUEST['pprredirect_type']) ? sanitize_meta( '_pprredirect_type', sanitize_text_field( $_REQUEST['pprredirect_type'] ), 'post' ) : '';
1191
+ $my_meta_data['_pprredirect_rewritelink'] = isset($_REQUEST['pprredirect_rewritelink']) ? sanitize_meta( '_pprredirect_rewritelink', $this->isOne_none(intval( $_REQUEST['pprredirect_rewritelink'])), 'post' ) : '';
1192
+ $my_meta_data['_pprredirect_url'] = isset($_REQUEST['pprredirect_url']) ? sanitize_meta( '_pprredirect_url', ( $_REQUEST['pprredirect_url'] ), 'post' ) : '';
 
 
 
 
1193
 
1194
+ $info = $this->appip_parseURI($my_meta_data['_pprredirect_url']);
1195
+
1196
+ $my_meta_data['_pprredirect_url'] = esc_url_raw($info['url']);
1197
+ if($my_meta_data['_pprredirect_url'] == 'http://' || $my_meta_data['_pprredirect_url'] == 'https://' || $my_meta_data['_pprredirect_url'] == ''){
1198
+ $my_meta_data['_pprredirect_url'] = ''; //reset to nothing
1199
  $my_meta_data['_pprredirect_type'] = NULL; //clear Type if no URL is set.
1200
  $my_meta_data['_pprredirect_active'] = NULL; //turn it off if no URL is set
1201
+ $my_meta_data['_pprredirect_rewritelink'] = NULL; //turn it off if no URL is set
1202
+ $my_meta_data['_pprredirect_newwindow'] = NULL; //turn it off if no URL is set
1203
+ $my_meta_data['_pprredirect_relnofollow'] = NULL; //turn it off if no URL is set
1204
  }
1205
 
1206
  // Add values of $my_meta_data as custom fields
1207
  if(count($my_meta_data)>0){
1208
+ foreach ($my_meta_data as $key => $value) {
1209
+ $value = implode(',', (array)$value);
1210
+ if($value == '' || $value == NULL || $value == ','){
 
 
1211
  delete_post_meta($post->ID, $key);
1212
  }else{
1213
  if(get_post_meta($post->ID, $key, true) != '') {
1219
  }
1220
  }
1221
  endif;
 
1222
  }
1223
 
1224
  function ppr_fix_targetsandrels($pages) {
1326
  $useURLQS = array();
1327
  if(count($_GET) >= 1){
1328
  foreach($_GET as $key => $value){$useURLQS[] = $key.'='.$value;}
 
1329
  $finalQS = '?'.implode('&',$useURLQS);
1330
  $userrequest = preg_replace('/\?.*/', '', $userrequest);
1331
  }
1355
  if($val) {
1356
  $useURL = $this->pproverride_URL != '' ? $this->pproverride_URL : $val;
1357
  $useURL .= $finalQS; //add QS back
1358
+ //$this->pproverride_type = 301;
1359
+ $qpprRedType = 301;
1360
+ do_action('qppr_redirect',$useURL,$qpprRedType);
1361
+ if($qpprRedType == 'meta'){
1362
  $this->ppr_metaurl = $useURL;
1363
  add_action('wp_head', array($this,'ppr_addmetatohead_theme'),1);
1364
  }else{
1365
+ wp_redirect($useURL,$qpprRedType);
1366
  exit();
1367
  }
1368
  }
1393
  }else{ // we assume they are using the permalink / page name??
1394
  $urlsite=$this->homelink.'/'.$redrurl;
1395
  }
 
1396
  // check if override is set for all redirects to go to one URL
1397
  if($this->pproverride_URL !=''){$urlsite=$this->pproverride_URL;}
1398
  if($this->pproverride_type!='0' && $this->pproverride_type!=''){$redrtype = $this->pproverride_type;} //override check
qppr_admin_script.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($){
2
+ $(document).ready(function() {
3
+ $('span.qppr_meta_help').css('display','none');
4
+ $('span.qppr_meta_help_wrap').live('hover',function(e){
5
+ var $curdisp = $(this).find('span.qppr_meta_help').css('display');
6
+ if($curdisp == 'none'){
7
+ $(this).find('span.qppr_meta_help').css('display','inline');
8
+ }else{
9
+ $(this).find('span.qppr_meta_help').css('display','none');
10
+ }
11
+ e.preventDefault();
12
+ });
13
+ });
14
+ })(jQuery)
qppr_admin_style.css ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ span.qppr_meta_help{display:none;}
2
+ .qppr_meta_help_icon {
3
+ padding: 0;
4
+ background: #9ED5FA;
5
+ display: inline-block;
6
+ height: 1.15em;
7
+ width: 1.15em;
8
+ text-align: center;
9
+ font-weight: bold;
10
+ font-size: .95em;
11
+ line-height: 1.15em;
12
+ margin: 0 2px;
13
+ border: 1px solid #4D8ED6;
14
+ }
15
+ .qppr_meta_help_icon:hover {
16
+ color: aliceblue;
17
+ background: #1489D4;
18
+ }
19
+ .qppr_meta_help_wrap {
20
+ padding: 0;
21
+ font-size: 11px;
22
+ /*text-transform: uppercase;*/
23
+ background: #FFF8C8;
24
+ line-height: 1.15em;
25
+ }
readme.txt CHANGED
@@ -3,13 +3,13 @@ Contributors: Don Fischer
3
  Donate link: http://www.fischercreativemedia.com/donations/
4
  Tags: redirect, 301, 302, meta, post, plugin, page, forward, re-direct, nofollow, menu links, posts, pages, admin, 404, custom post types, nav menu, import, export, restore
5
  Requires at least: 3.1
6
- Tested up to: 3.5.1
7
  Stable tag: trunk
8
 
9
  Redirect Pages/Posts to another page/post or external URL. Has edit box as well as global options. Specify the redirect Location and type. For PHP5+
10
 
11
  == Description ==
12
- Version 5.0.3.
13
  This plugin adds adds an option box to the edit section where you can specify the redirect location and type of redirect that you want, temporary, permanent, or meta. See below for additional features added.
14
 
15
  = Features: =
@@ -129,6 +129,16 @@ NO it isn't! Check the plugin FAQs/Help page for a more up to date list of Frequ
129
  5. Summary of redirects plugin page.
130
 
131
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
132
  = 5.0.3 =
133
  * Minor bug cleanup update - (no new features added)
134
  * Bug fixes: Javascript ghost js file call fixed. Actions hooks not applying issue fixed. Querystring redirect issue addressed. Unset index errors addressed. Some Network/MU problems fixed.
@@ -241,5 +251,5 @@ NO it isn't! Check the plugin FAQs/Help page for a more up to date list of Frequ
241
  * Initial Plugin creation (7/1/2009)
242
 
243
  == Upgrade Notice ==
244
- = 5.0.1 =
245
- Fix to jQuery issue in versions 5.0 and 5.0.1 that caused some jQuery features to malfunction on frontend of site and updated default settingq for use with jQuery (default to off) and Case Seneitive (default to on).
3
  Donate link: http://www.fischercreativemedia.com/donations/
4
  Tags: redirect, 301, 302, meta, post, plugin, page, forward, re-direct, nofollow, menu links, posts, pages, admin, 404, custom post types, nav menu, import, export, restore
5
  Requires at least: 3.1
6
+ Tested up to: 3.8.2
7
  Stable tag: trunk
8
 
9
  Redirect Pages/Posts to another page/post or external URL. Has edit box as well as global options. Specify the redirect Location and type. For PHP5+
10
 
11
  == Description ==
12
+ Version 5.0.5.
13
  This plugin adds adds an option box to the edit section where you can specify the redirect location and type of redirect that you want, temporary, permanent, or meta. See below for additional features added.
14
 
15
  = Features: =
129
  5. Summary of redirects plugin page.
130
 
131
  == Changelog ==
132
+ = 5.0.5 =
133
+ * Fix to security flaw for logged in admin users.
134
+ * Fix to extra spaces that broke some callback functions in the redirect class in 5.0.4.
135
+
136
+ = 5.0.4 =
137
+ * Minor bug cleanup
138
+ * Security fixes: fixed possible cross-scripting vulnerability in saving of data to options.
139
+ * Changed the hook call level for the redirects hook on normal redirects so it will not interfere with some other plugins.
140
+
141
+
142
  = 5.0.3 =
143
  * Minor bug cleanup update - (no new features added)
144
  * Bug fixes: Javascript ghost js file call fixed. Actions hooks not applying issue fixed. Querystring redirect issue addressed. Unset index errors addressed. Some Network/MU problems fixed.
251
  * Initial Plugin creation (7/1/2009)
252
 
253
  == Upgrade Notice ==
254
+ = 5.0.5 =
255
+ Fix to security flaw for logged in admin users and extra spaces that broke some callback functions in the class in 5.0.4.