[wp-testers] Homepage reloads automatically (Plugin Attached)

Abhinav Sood webmaster at inspiritblog.com
Mon Aug 4 10:33:02 GMT 2008


Here's the plugin code. Thanks for all your help...


   1. <?php
   2. /*
   3.  * Plugin Name: Permalink Redirect
   4.  * Plugin URI: http://scott.yang.id.au/code/permalink-redirect/
   5.  * Description: Permalink Redirect ensures that pages and entries are
   always accessed via the permalink. Otherwise, a 301 redirect will be issued.
   6.  * Version: 2.0
   7.  * Author: Scott Yang
   8.  * Author URI: http://scott.yang.id.au/
   9.  */
   10. class YLSY_PermalinkRedirect {
   11.     function admin_menu() {
   12.         add_options_page('Permalink Redirect Manager', 'Permalink
   Redirect', 5,
   13.             __FILE__, array <http://www.php.net/array>($this,
   'admin_page'));
   14.     }
   15.
   16.     function admin_page() {
   17.         global <http://www.php.net/global> $wp_version;
   18.
   19.         // If we are updating, we will flush all the rewrite rules to
   force the
   20.         // old structure to be added.
   21.         if (isset <http://www.php.net/isset>($_GET['updated'])) {
   22.             $this->regenerate_rules();
   23.         }
   24.
   25.         $options = array <http://www.php.net/array>('feedburner',
   'feedburnerbrand', 'hostname',
   26.             'oldstruct', 'skip', 'newpath');
   27.         $optionvars = array <http://www.php.net/array>();
   28.         foreach ($options as $option) {
   29.             $$option = get_option("permalink_redirect_$option");
   30.             if (!$$option) {
   31.                 $$option = ($option == 'feedburnerbrand') ?
   32.                     'feeds.feedburner.com' : '';
   33.             }
   34.             if ($wp_version < '2' && !$$option) {
   35.                 add_option("permalink_redirect_$option", $$option);
   36.             }
   37.             $optionvars[] = "permalink_redirect_$option";
   38.         }
   39.
   40.         $home = parse_url <http://www.php.net/parse_url>(get_option(
   'home'));
   41. ?>
   42. <div class="wrap">
   43.     <h2>Permalink Redirect Manager</h2>
   44.     <form action="options.php" method="post">
   45.         <fieldset class="options">
   46.             <legend>Paths to be skipped</legend>
   47.             <p>Separate each <http://www.php.net/each> entry with a
   new line. Matched with regular expression.</p>
   48.             <textarea name="permalink_redirect_skip" style=
   "width:98%;" rows="5"><?php echo <http://www.php.net/echo>
   htmlspecialchars <http://www.php.net/htmlspecialchars>($skip);
   ?></textarea>
   49.
   50.             <legend style="padding-top:20px">Path pairs to redirect
   from and to</legend>
   51.             <p>Separate each <http://www.php.net/each> entry with a
   new line. Each <http://www.php.net/each> line is [from]&lt;spaces&gt;[to]
   .</p>
   52.             <textarea name="permalink_redirect_newpath" style=
   "width:98%;" rows="5"><?php echo <http://www.php.net/echo>
   htmlspecialchars <http://www.php.net/htmlspecialchars>($newpath);
   ?></textarea>
   53.             <table class="optiontable" style="padding-top:20px">
   54.                 <tr valign="top">
   55.                     <th scope="row">Old Permalink Structures:</th>
   56.                     <td><textarea name="permalink_redirect_oldstruct"id=
   "permalink_redirect_oldstruct" style="width:98%" rows="3"><?php
echo<http://www.php.net/echo>
   htmlspecialchars <http://www.php.net/htmlspecialchars>($oldstruct);
   ?></textarea><br/><small><a href="
   http://codex.wordpress.org/Using_Permalinks">Available tags</a>. One
   Permalink Structure per line. Current
<http://www.php.net/current>permalink structure: <a href=
   "#" onclick="document.getElementById('permalink_redirect_oldstruct').value
   = '<?php echo htmlspecialchars(get_option('permalink_structure'));
   ?>';return false;"><code><?php echo <http://www.php.net/echo>
   htmlspecialchars <http://www.php.net/htmlspecialchars>(get_option(
   'permalink_structure')); ?></code></a></small></td>
   57.                 </tr>
   58.                 <tr>
   59.                     <th scope="row">FeedBurner Redirect:</th>
   60.                     <td>http://<input
   name="permalink_redirect_feedburnerbrand" type="text"
   id="permalink_redirect_feedburnerbrand" value="<?php print
   htmlspecialchars($feedburnerbrand); ?>" size="20"/>/<input
   name="permalink_redirect_feedburner" type="text"
   id="permalink_redirect_feedburner" value="<?php echo
   htmlspecialchars($feedburner) ?>" size="20" /></td>
   61.                 </tr>
   62.                 <tr>
   63.                     <th scope="row">Hostname Redirect:</th>
   64.                     <td><input name="permalink_redirect_hostname"type=
   "checkbox" id="permalink_redirect_hostname" value="1"<?php if ($hostname)
   { ?> checked="checked"<?php } ?>/> Redirect if hostname is not
   <code><?php echo <http://www.php.net/echo>
htmlspecialchars<http://www.php.net/htmlspecialchars>
   ($home['host']); ?></code>.</td>
   65.                 </tr>
   66.             </table>
   67.         </fieldset>
   68.         <p class="submit">
   69.             <input type="submit" name="Submit" value="<?php
   _e('Update Options') ?> &raquo;" />
   70.             <input type="hidden" name="action" value="update" />
   71.             <input type="hidden" name="page_options" value="<?php
   echo join(',', $optionvars); ?>"/>
   72.             <?php if (function_exists<http://www.php.net/function_exists>
   ('wp_nonce_field')) { wp_nonce_field('update-options'); } ?>
   73.         </p>
   74.     </form>
   75. </div>
   76. <?php
   77.     }
   78.
   79.     function check_hostname() {
   80.         if (! get_option('permalink_redirect_hostname')) {
   81.             return false;
   82.         }
   83.         $requested = $_SERVER['HTTP_HOST'];
   84.         $home = parse_url <http://www.php.net/parse_url>(get_option(
   'home'));
   85.         return $requested != $home['host'];
   86.     }
   87.
   88.     function execute() {
   89.         global <http://www.php.net/global> $wp_query;
   90.         $this->execute2($wp_query);
   91.     }
   92.
   93.     function execute2($query, $testold=true) {
   94.         $req_uri = $_SERVER['REQUEST_URI'];
   95.
   96.         if ($query->is_trackback ||
   97.             $query->is_search ||
   98.             $query->is_comments_popup ||
   99.             $query->is_robots ||
   100.             $this->is_skip($req_uri))
   101.         {
   102.             return;
   103.         }
   104.
   105.         $this->redirect_newpath($req_uri);
   106.         $this->redirect_feedburner($query);
   107.
   108.         if ($query->is_404) {
   109.             if ($testold) {
   110.                 $this->redirect_old_permalink($req_uri);
   111.             }
   112.             return;
   113.         }
   114.
   115.         if (($req_uri = @parse_url <http://www.php.net/parse_url>(
   $_SERVER['REQUEST_URI'])) === false) {
   116.             return;
   117.         }
   118.
   119.         $req_path = $req_uri['path'];
   120.         $new_uri = $this->guess_permalink($query);
   121.         if (!$new_uri) {
   122.             return;
   123.         }
   124.         $permalink = @parse_url <http://www.php.net/parse_url>(
   $new_uri);
   125.
   126.         // WP2.1: If a static page has been set as the front-page,
   we'll get
   127.         // empty string here.
   128.         if (!$permalink['path']) {
   129.             $permalink['path'] = '/';
   130.         }
   131.         if (($req_path != $permalink['path']) || $this->
   check_hostname()) {
   132.             wp_redirect($new_uri, 301);
   133.         }
   134.     }
   135.
   136.     function guess_permalink($query) {
   137.         $haspost = count <http://www.php.net/count>($query->posts) >
   0;
   138.         if (get_query_var('m')) {
   139.             // Handling special case with '?m=yyyymmddHHMMSS'
   140.             // Since there is no code for producing the archive
   links for
   141.             // is_time, we will give up and not trying any
   redirection.
   142.             $m = preg_replace <http://www.php.net/preg_replace>(
   '/[^0-9]/', '', get_query_var('m'));
   143.             switch (strlen <http://www.php.net/strlen>($m)) {
   144.                 case 4: // Yearly
   145.                     $link = get_year_link($m);
   146.                     break;
   147.                 case 6: // Monthly
   148.                     $link =
get_month_link(substr<http://www.php.net/substr>
   ($m, 0, 4), substr <http://www.php.net/substr>($m, 4, 2));
   149.                     break;
   150.                 case 8: // Daily
   151.                     $link =
get_day_link(substr<http://www.php.net/substr>
   ($m, 0, 4), substr <http://www.php.net/substr>($m, 4, 2),
   152.
substr<http://www.php.net/substr>
   ($m, 6, 2));
   153.                     break;
   154.                 default:
   155.                     return false;
   156.             }
   157.         } elseif (($query->is_single || $query->is_page) && $haspost
   ) {
   158.             $post = $query->posts[0];
   159.             $link = get_permalink($post->ID);
   160.             $page = get_query_var('page');
   161.             if ($page && $page > 1)
   162.                 $link = trailingslashit($link) . "$page/";
   163.             // WP2.2: In Wordpress 2.2+ is_home() returns false and
   is_page()
   164.             // returns true if front page is a static page.
   165.             if ($query->is_page && ('page' == get_option(
   'show_on_front')) &&
   166.                 $post->ID == get_option('page_on_front'))
   167.             {
   168.                 $link = trailingslashit($link);
   169.             }
   170.         } elseif ($query->is_author && $haspost) {
   171.             global <http://www.php.net/global> $wp_version;
   172.             if ($wp_version >= '2') {
   173.                 $author = get_userdata(get_query_var('author'));
   174.                 if ($author === false)
   175.                     return false;
   176.                 $link = get_author_link(false, $author->ID,
   177.                     $author->user_nicename);
   178.             } else {
   179.                 // XXX: get_author_link() bug in WP 1.5.1.2
   180.                 //      s/author_nicename/user_nicename/
   181.                 global <http://www.php.net/global> $cache_userdata;
   182.                 $userid = get_query_var('author');
   183.                 $link = get_author_link(false, $userid,
   184.                     $cache_userdata[$userid]->user_nicename);
   185.             }
   186.         } elseif ($query->is_category && $haspost) {
   187.             $link = get_category_link(get_query_var('cat'));
   188.         } elseif ($query->is_day && $haspost) {
   189.             $link = get_day_link(get_query_var('year'),
   190.                                  get_query_var('monthnum'),
   191.                                  get_query_var('day'));
   192.         } elseif ($query->is_month && $haspost) {
   193.             $link = get_month_link(get_query_var('year'),
   194.                                    get_query_var('monthnum'));
   195.         } elseif ($query->is_year && $haspost) {
   196.             $link = get_year_link(get_query_var('year'));
   197.         } elseif ($query->is_home) {
   198.             // WP2.1: Handling "Posts page" option. In WordPress 2.1
   is_home()
   199.             // returns true and is_page() returns false if home page
   has been
   200.             // set to a page, and we are getting the permalink of
   that page
   201.             // here.
   202.             if ((get_option('show_on_front') == 'page') &&
   203.                 ($pageid = get_option('page_for_posts')))
   204.             {
   205.                 $link = trailingslashit(get_permalink($pageid));
   206.             } else {
   207.                 $link = trailingslashit(get_option('home'));
   208.             }
   209.         } else {
   210.             return false;
   211.         }
   212.
   213.         if ($query->is_paged) {
   214.             $paged = get_query_var('paged');
   215.             if ($paged)
   216.                 $link = trailingslashit($link) . "page/$paged/";
   217.         }
   218.
   219.         if ($query->is_feed) {
   220.             $link = trailingslashit($link) . 'feed/';
   221.         }
   222.
   223.         return $link;
   224.     }
   225.
   226.     function is_feedburner() {
   227.         return strncmp <http://www.php.net/strncmp>('FeedBurner/',
   $_SERVER['HTTP_USER_AGENT'], 11) == 0;
   228.     }
   229.
   230.     function is_skip($path) {
   231.         $permalink_redirect_skip = get_option(
   'permalink_redirect_skip');
   232.         $permalink_redirect_skip = explode<http://www.php.net/explode>
   ("\n", $permalink_redirect_skip);
   233.
   234.         // Apply 'permalink_redirect_skip' filter so other plugins
   can
   235.         // customise the skip behaviour. (Denis de Bernardy @
   2006-04-23)
   236.         $permalink_redirect_skip = apply_filters(
   'permalink_redirect_skip',
   237.             $permalink_redirect_skip);
   238.
   239.         foreach ($permalink_redirect_skip as $skip) {
   240.             $skip = trim <http://www.php.net/trim>($skip);
   241.             if ($skip && ereg <http://www.php.net/ereg>($skip, $path
   ))
   242.                 return true;
   243.         }
   244.
   245.         return false;
   246.     }
   247.
   248.     function redirect_feedburner($query) {
   249.         // Check whether we need to do redirect for FeedBurner.
   250.         // NOTE this might not always get executed. For feeds,
   251.         // WP::send_headers() might send back a 304 before
   template_redirect
   252.         // action can be called.
   253.         global <http://www.php.net/global> $withcomments;
   254.
   255.         if ($query->is_feed && !$query->is_archive && !$withcomments
   ) {
   256.             if (($feedburner = get_option(
   'permalink_redirect_feedburner')) &&
   257.                 (strncmp <http://www.php.net/strncmp>('FeedBurner/',
   $_SERVER['HTTP_USER_AGENT'], 11) != 0))
   258.             {
   259.                 $brand = get_option(
   'permalink_redirect_feedburnerbrand');
   260.                 $brand = $brand ? $brand : 'feeds.feedburner.com';
   261.                 wp_redirect("http://$brand/$feedburner", 302);
   262.             }
   263.         }
   264.     }
   265.
   266.     // Static page redirect contributed by Sergey Menshikov.
   267.     function redirect_newpath($path) {
   268.         if ($newpathlist = get_option('permalink_redirect_newpath'))
   {
   269.             $newpathlist = explode <http://www.php.net/explode>("\n",
   $newpathlist);
   270.             foreach ($newpathlist as $newpath) {
   271.                 $pair = preg_split <http://www.php.net/preg_split>(
   '/\s+/', trim <http://www.php.net/trim>($newpath));
   272.                 if ($pair[0] == $path) {
   273.                     wp_redirect($pair[1], 301);
   274.                 }
   275.             }
   276.         }
   277.     }
   278.
   279.     /**
   280.      * Called when the main execute function gets a 404 to check
   against old
   281.      * permalink structures and perform redirect if an old post can
   be
   282.      * matched.
   283.      */
   284.     function redirect_old_permalink($req_uri) {
   285.         global <http://www.php.net/global> $wp_query, $wp_rewrite;
   286.         global <http://www.php.net/global> $wp_version;
   287.
   288.         $rules = get_option('permalink_redirect_rules');
   289.         if (!$rules) {
   290.             return;
   291.         }
   292.
   293.         // Backing up the rewrite object for you, imperative
   programmers!
   294.         $wp_rewrite_old = $wp_rewrite;
   295.
   296.         // Unsetting the globals. Argh! Evil global variables!
   297.         foreach ($wp_query->query_vars as $key => $val) {
   298.             unset <http://www.php.net/unset>($GLOBALS[$key]);
   299.         }
   300.
   301.         // Going through the rules.
   302.         foreach ($rules as $rules2) {
   303.             $wp2 = new WP();
   304.             $wp_rewrite = new YLSY_Rewrite();
   305.             $wp_rewrite->index = $wp_rewrite_old->index;
   306.             $wp_rewrite->rules = $rules2;
   307.
   308.             $wp2->parse_request();
   309.             if (isset <http://www.php.net/isset>($wp2->query_vars[
   'error']) &&
   310.                 ($wp2->query_vars['error'] == 404))
   311.             {
   312.                 continue;
   313.             }
   314.             $query = new WP_Query();
   315.             if ($wp_version >= '2.1') {
   316.                 $posts = $query->query($wp2->query_vars);
   317.             } else {
   318.                 $wp2->build_query_string();
   319.                 $posts = $query->query($wp2->query_string);
   320.             }
   321.             if (count <http://www.php.net/count>($posts) > 0) {
   322.                 $wp_rewrite = $wp_rewrite_old;
   323.                 $this->execute2($query, false);
   324.                 return;
   325.             }
   326.         }
   327.
   328.         // Restoring global variables. We don't bother to reset the
   other
   329.         // variables as we are going to do a 404 anyway.
   330.         $wp_rewrite = $wp_rewrite_old;
   331.     }
   332.
   333.     /**
   334.      * This function is called after someone saved the old permalink

   335.      * structure. It will create cached version of rewrite rules
   from the
   336.      * old structure.
   337.      */
   338.     function regenerate_rules() {
   339.         global <http://www.php.net/global> $wp_rewrite;
   340.         $oldstruct = get_option('permalink_redirect_oldstruct');
   341.         if ($oldstruct) {
   342.             $rules = array <http://www.php.net/array>();
   343.             $oldstruct = explode <http://www.php.net/explode>("\n",
   $oldstruct);
   344.             foreach ($oldstruct as $item) {
   345.                 $rules2 =
$wp_rewrite->generate_rewrite_rule(trim<http://www.php.net/trim>
   ($item),
   346.                     false, false, false, true);
   347.                 $rules3 = array <http://www.php.net/array>();
   348.                 foreach ($rules2 as $match => $query) {
   349.                     $query =
preg_replace<http://www.php.net/preg_replace>
   ('/\$(\d+)/', '\$matches[\1]', $query);
   350.                     $rules3[$match] = $query;
   351.                 }
   352.                 $rules[] = $rules3;
   353.             }
   354.             update_option('permalink_redirect_rules', $rules);
   355.         } else {
   356.             delete_option('permalink_redirect_rules');
   357.         }
   358.     }
   359. }
   360.
   361. /**
   362.  * I am a dummy class to simulate the WP_Rewite class, but only has
   one
   363.  * method implemented.
   364.  */
   365. class YLSY_Rewrite {
   366.     function wp_rewrite_rules() {
   367.         return $this->rules;
   368.     }
   369. }
   370.
   371. if (!function_exists <http://www.php.net/function_exists>(
   'wp_redirect')) {
   372.     function wp_redirect($location, $status=302) {
   373.         global <http://www.php.net/global> $is_IIS;
   374.
   375.         $location = apply_filters('wp_redirect', $location, $status)
   ;
   376.         $status = apply_filters('wp_redirect_status', $status,
   $location);
   377.
   378.         if (!$location)
   379.             return false;
   380.
   381.         if (function_exists <http://www.php.net/function_exists>(
   'wp_sanitize_redirect')) {
   382.             $location = wp_sanitize_redirect($location);
   383.         }
   384.
   385.         if ($is_IIS) {
   386.             header <http://www.php.net/header>("Refresh:
   0;url=$location");
   387.         } else {
   388.             status_header($status);
   389.             header <http://www.php.net/header>("Location: $location"
   );
   390.         }
   391.     }
   392. }
   393.
   394.
   395. $_permalink_redirect = new YLSY_PermalinkRedirect();
   396. add_action('admin_menu', array <http://www.php.net/array>(
   $_permalink_redirect, 'admin_menu'));
   397. add_action('template_redirect', array <http://www.php.net/array>(
   $_permalink_redirect, 'execute'));



On Mon, Aug 4, 2008 at 6:09 AM, John Blackbourn
<johnbillion+wp at gmail.com<johnbillion%2Bwp at gmail.com>
> wrote:

> Abhinav,
>
> Attachments get removed form emails to the list so you'll need to
> upload the plugin and link to it instead. Try pastebin.com.
>
> Regards,
> John.
>
> On Sun, Aug 3, 2008 at 3:10 PM, Abhinav Sood <webmaster at inspiritblog.com>
> wrote:
> > I have been facing this weird problem with my blog running Wordpress 2.6
> > Public release.
> >
> > I am on an IIS host and for a fairly long period was using the ugly
> > permalink structure ( /?p=%post_id% )..
> > I wasn't satisfied with it and only recently found a way out. I have
> managed
> > to set up pretty permalinks on IIS
> > host but then I had two link structures - the old ugly permalinks didn't
> > redirect to pretty permalinks automatically
> > so I risked losing my page rank and indexing in Google.
> >
> > To prevent that I used many redirection plugins but none worked
> effectively
> > -
> > Except the one by Scott Yang (I have attached the file...)
> > The problem is that the homepage keeps on reloading again and again,
> > indefinitely
> > (and so does the each page of sitemap reload automatically except the
> first
> > page...)
> >
> > my blog is www.inspiritblog.com and I'll be really grateful if you guys
> can
> > help in anyway
> >
> > --
> > Regards.
> > Abhinav Sood
> >
> > www.inspiritblog.com | www.teenagerforums.net
> >
> > _______________________________________________
> > wp-testers mailing list
> > wp-testers at lists.automattic.com
> > http://lists.automattic.com/mailman/listinfo/wp-testers
> >
> >
> _______________________________________________
> wp-testers mailing list
> wp-testers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-testers
>
>


-- 
Regards.
Abhinav Sood

www.inspiritblog.com | www.teenagerforums.net


More information about the wp-testers mailing list