[wp-trac] [WordPress Trac] #12935: Evolve the URL routing system

WordPress Trac wp-trac at lists.automattic.com
Thu Apr 8 23:25:01 UTC 2010


#12935: Evolve the URL routing system
--------------------------+-------------------------------------------------
 Reporter:  mikeschinkel  |       Owner:  ryan      
     Type:  enhancement   |      Status:  new       
 Priority:  normal        |   Milestone:  Unassigned
Component:  Permalinks    |     Version:  3.0       
 Severity:  normal        |    Keywords:            
--------------------------+-------------------------------------------------
 As WordPress grows into a proper CMS with MultiSite and Custom Post Types
 and Custom Taxonomies there are frequent opportunities for URL conflict
 that didn't occur as often with just Posts and Pages.

 Here's a simple example, let's say a company uses WordPress for their
 website and they offer development services as well as training on their
 website:

 {{{
 http://example.com/services/vmware/
 http://example.com/training/vmware/
 }}}

 Currently it's not possible for an end user to get that result, the best
 they can do is this:

 {{{
 http://example.com/services/vmware/
 http://example.com/training/vmware-2/
 }}}

 One key problem is WordPress considers both post_names and URLs as
 globally unique and the current system of using full path regexes makes it
 very hard to discover paths from the routes, it's only possible to test
 paths against the routes.

 '''I'd like to propose''' we add a ''backward compatible layer'' that
 allows WordPress and its theme and plugin developers to transition to a
 system where post_names are no longer required to be unique and '''URL
 routing would be specified on a path segment basis'''. This would mean
 that WordPress would maintain an internal tree structure of URL routes and
 it would traverse the tree instead of scanning a global list of URL
 routes.

 The overhead for smaller sites should be trivial but for larger sites that
 need to scan many URL routes it could make it easier to scale in size and
 complexity. It would also make special cases much easier to implement
 robustly without as much fear of breaking something that already exists.
 This proposed solution would make it possible to more easy to discover and
 test routes. It would also make it possible to display a URL sitemap and
 to enable plugins to easily let users edit the site map and thus define
 URL routings.  It would also open up lots of flexibility in areas or URL
 routing where before it was just too difficult to address.

 I'm envisioning this URL routing to have a lower priority than existing
 URL routing and by nature the community would slowly transition to this
 new system. WordPress would first check the older URL routing and if no
 matches then the new URL routing would be used. Core could transition all
 it's routes to the new system sometime in 3.x and then plugins could start
 transitioning over as well until, over time, most plugins and themes
 support the new system.  It would also be nice to have an advanced option
 (maybe via a define()d constant) that would disable the older URL routing
 system for a given site so that users, themers and plugin developers could
 ensure their plugins are using the new system only.

 This is potentially a big change so while I'm very willing to tackle this
 with community support I don't want to write code yet but I do want to
 start the discussion.  However, here is a psuedo-code that illustrates the
 structure conceptually. Note the example includes a custom post type and
 also a custom URL of the structure to illustrate flexibility:

  http://example.com/2010/top10/

 {{{
 /*
 This code demonstrates ONE potential structure for visualization and NOT
 how most route code would be built.
 */
 function set_routes() {
   global $wp_routes;

   $post_routes = array('%postname%'=> array('type'=>'post'));

   $year_routes = array(
     'top10'   =>
 array('type'=>'query','query'=>'post_type=post&taxonomy=post_tag&term=top10'),
     '%month%' =>
 array('type'=>'query','query'=>'post_type=post&year=%_parent%&month=%month%','match'=>'/[1-2][0-9]/','routes'=>$post_routes),
   );
   $category_routes = array(
     '%category%'=>
 array('type'=>'query','query'=>'post_type=post&taxonomy=category&term=%category%'),
   );
   $tag_routes = array(
     '%tag%'=>
 array('type'=>'query','query'=>'post_type=post&taxonomy=post_tag&term=%tag%'),
   );
   $wp_routes = array(
     'about' => array('type'=>'page'),
     '%year%'  =>
 array('type'=>'query','query'=>'post_type=post&year=%year%','match'=>'/[0-9]{4}/','routes'=>$year_routes),
     'products' => array('type'=>'post_list','post_type'=>'product'),
     'category' =>
 array('type'=>'tax_list','taxonomy'=>'category','routes'=>$category_routes),
     'tag' =>
 array('type'=>'tax_list','taxonomy'=>'post_tag','routes'=>$tag_routes),
   );
 }
 }}}
 And here is what it looks like when using print_r():
 {{{
 Array
 (
   [about] => Array
     (
       [type] => page
     )

   [%year%] => Array
     (
       [type] => query
       [query] => post_type=post&year=%year%
       [routes] => Array
         (
           [top10] => Array
             (
               [type] => query
               [query] => post_type=post&taxonomy=post_tag&term=top10
             )

           [%month%] => Array
             (
               [type] => query
               [query] => post_type=post&year=%_parent%&month=%month%
               [routes] => Array
                 (
                   [%postname%] => Array
                     (
                       [type] => post
                     )

                 )

             )

         )

     )

   [products] => Array
     (
       [type] => post_list
       [post_type] => product
     )

   [category] => Array
     (
       [type] => tax_list
       [taxonomy] => category
       [routes] => Array
         (
           [%category%] => Array
             (
               [type] => query
               [query] => post_type=post&taxonomy=category&term=%category%
             )

         )

     )

   [tag] => Array
     (
       [type] => tax_list
       [taxonomy] => post_tag
       [routes] => Array
         (
           [%tag%] => Array
             (
               [type] => query
               [query] => post_type=post&taxonomy=post_tag&term=%tag%
             )

         )

     )

 )
 }}}

 BTW, these tickets are probably somewhat related and I believe this
 approach would make it much easier to resolve these issues:

  * #12884 - Taxonomy Pages aren't properly redirected on main site when
 using Multi Site Subdirectories
  * #12002 - WPMU should not lock the root blog into using a /blog prefix
 on permalinks
  * #11279 - Support for putting all "blog" content under /blog/

 And these requests/issues:

  * http://wordpress.org/extend/ideas/topic/remove-category-base-from-
 permalinks
  * http://wordpress.org/support/topic/302621
  * http://wordpress.org/support/topic/346242
  * http://en.forums.wordpress.com/topic/remove-date-in-the-url
  * http://wordpress.org/support/topic/264688
  * And just:
 http://www.google.com/search?q=wordpress+remove+category+from+url

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/12935>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list