]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/canonical.php
Wordpress 2.6.2
[autoinstalls/wordpress.git] / wp-includes / canonical.php
index e4a5c5309f15ae5bf270aef0b1d9ba12ccffd988..4c1e3657f71bfb949a77873a70aa1a54070d6c36 100644 (file)
@@ -1,10 +1,45 @@
 <?php
-// Based on "Permalink Redirect" from Scott Yang and "Enforce www. Preference" by Mark Jaquith
-
-function redirect_canonical($requested_url=NULL, $do_redirect=true) {
-       global $wp_rewrite, $posts, $is_IIS;
-
-       if ( is_feed() || is_trackback() || is_search() || is_comments_popup() || is_admin() || $is_IIS || ( isset($_POST) && count($_POST) ) || is_preview() )
+/**
+ * Canonical API to handle WordPress Redirecting
+ *
+ * Based on "Permalink Redirect" from Scott Yang and "Enforce www. Preference"
+ * by Mark Jaquith
+ *
+ * @author Scott Yang
+ * @author Mark Jaquith
+ * @package WordPress
+ * @since 2.3
+ */
+
+/**
+ * Redirects incoming links to the proper URL based on the site url
+ *
+ * Search engines consider www.somedomain.com and somedomain.com to be two
+ * different URLs when they both go to the same location. This SEO enhancement
+ * prevents penality for duplicate content by redirecting all incoming links to
+ * one or the other.
+ *
+ * Prevents redirection for feeds, trackbacks, searches, comment popup, and
+ * admin URLs. Does not redirect on IIS, page/post previews, and on form data.
+ *
+ * Will also attempt to find the correct link when a user enters a URL that does
+ * not exist based on exact WordPress query. Will instead try to parse the URL
+ * or query in an attempt to figure the correct page to go to.
+ *
+ * @since 2.3
+ * @uses $wp_rewrite
+ * @uses $is_IIS
+ *
+ * @param string $requested_url Optional. The URL that was requested, used to
+ *             figure if redirect is needed.
+ * @param bool $do_redirect Optional. Redirect to the new URL.
+ * @return null|false|string Null, if redirect not needed. False, if redirect
+ *             not needed or the string of the URL
+ */
+function redirect_canonical($requested_url=null, $do_redirect=true) {
+       global $wp_rewrite, $is_IIS;
+
+       if ( is_feed() || is_trackback() || is_search() || is_comments_popup() || is_admin() || $is_IIS || ( isset($_POST) && count($_POST) ) || is_preview() || is_robots() )
                return;
 
        if ( !$requested_url ) {
@@ -106,7 +141,8 @@ function redirect_canonical($requested_url=NULL, $do_redirect=true) {
 
        // www.example.com vs example.com
        $user_home = @parse_url(get_option('home'));
-       $redirect['host'] = $user_home['host'];
+       if ( isset($user_home['host']) )
+               $redirect['host'] = $user_home['host'];
 
        // Handle ports
        if ( isset($user_home['port']) )
@@ -129,11 +165,12 @@ function redirect_canonical($requested_url=NULL, $do_redirect=true) {
                } else {
                        foreach ( array('single', 'category', 'page', 'day', 'month', 'year') as $type ) {
                                $func = 'is_' . $type;
-                               if ( call_user_func($func) )
+                               if ( call_user_func($func) ) {
                                        $user_ts_type = $type;
                                        break;
                                }
                        }
+               }
                $redirect['path'] = user_trailingslashit($redirect['path'], $user_ts_type);
        } elseif ( is_home() ) {
                $redirect['path'] = trailingslashit($redirect['path']);
@@ -156,39 +193,51 @@ function redirect_canonical($requested_url=NULL, $do_redirect=true) {
                        $redirect_url .= '?' . $redirect['query'];
        }
 
-       if ( $redirect_url && $redirect_url != $requested_url ) {
-               // var_dump($redirect_url); die();
-               $redirect_url = apply_filters('redirect_canonical', $redirect_url, $requested_url);
-               if ( $do_redirect) {
-                       // protect against chained redirects
-                       if ( !redirect_canonical($redirect_url, false) ) {
-                               wp_redirect($redirect_url, 301);
-                               exit();
-                       } else {
-                               return false;
-                       }
+       if ( !$redirect_url || $redirect_url == $requested_url )
+               return false;
+
+       // Note that you can use the "redirect_canonical" filter to cancel a canonical redirect for whatever reason by returning FALSE
+       $redirect_url = apply_filters('redirect_canonical', $redirect_url, $requested_url);
+
+       if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
+               return false;
+
+       if ( $do_redirect ) {
+               // protect against chained redirects
+               if ( !redirect_canonical($redirect_url, false) ) {
+                       wp_redirect($redirect_url, 301);
+                       exit();
                } else {
-                       return $redirect_url;
+                       return false;
                }
        } else {
-               return false;
+               return $redirect_url;
        }
 }
 
+/**
+ * Attempts to guess correct post based on query vars
+ *
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @return bool|string Returns False, if it can't find post, returns correct
+ *             location on success.
+ */
 function redirect_guess_404_permalink() {
-       global $wp_query, $wpdb;
+       global $wpdb;
        if ( !get_query_var('name') )
                return false;
 
-       $where = "post_name LIKE '" . $wpdb->escape(get_query_var('name')) . "%'";
+       $where = $wpdb->prepare("post_name LIKE %s", get_query_var('name') . '%');
 
        // if any of year, monthnum, or day are set, use them to refine the query
        if ( get_query_var('year') )
-               $where .= " AND YEAR(post_date) = '" . $wpdb->escape(get_query_var('year')) . "'";
+               $where .= $wpdb->prepare(" AND YEAR(post_date) = %d", get_query_var('year'));
        if ( get_query_var('monthnum') )
-               $where .= " AND MONTH(post_date) = '" . $wpdb->escape(get_query_var('monthnum')) . "'";
+               $where .= $wpdb->prepare(" AND MONTH(post_date) = %d", get_query_var('monthnum'));
        if ( get_query_var('day') )
-               $where .= " AND DAYOFMONTH(post_date) = '" . $wpdb->escape(get_query_var('day')) . "'";
+               $where .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", get_query_var('day'));
 
        $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'");
        if ( !$post_id )
@@ -198,4 +247,4 @@ function redirect_guess_404_permalink() {
 
 add_action('template_redirect', 'redirect_canonical');
 
-?>
\ No newline at end of file
+?>