Skip to content

Instantly share code, notes, and snippets.

@mikeschinkel
Created December 2, 2011 01:28
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save mikeschinkel/1421235 to your computer and use it in GitHub Desktop.
Save mikeschinkel/1421235 to your computer and use it in GitHub Desktop.
Enabled Root-based Category URLs in WordPress (Any bugs? Post comments below.)
<?php
/*
* Plugin Name: Root-based Category URLs
* Description: Enables root-based Category URLs, i.e. Makes /category/my-category/ URLs route as /my-category/
* Author: Mike Schinkel
* Author URI: http://about.me/mikeschinkel
* Plugin URI: https://gist.github.com/1421235
* Version: 0.1.1
* License: GPL 2+
*/
class Rootbased_Category_URLs {
static function on_load() {
add_filter( 'request', array( __CLASS__, 'request' ) );
add_filter( 'category_link', array( __CLASS__, 'category_link' ) );
}
function request( $query_vars ) {
global $wp;
if ( preg_match( self::get_category_base() . '(.*)', $wp->request, $match ) ) {
wp_safe_redirect( self::category_link( $wp->request ), 301 );
exit;
}
$category_hash = array_flip( self::get_category_slugs() );
if ( isset( $category_hash[$wp->request] ) ) {
$query_vars = array( 'category_name' => $wp->request );
}
return $query_vars;
}
function get_category_base() {
$category_base = get_option('category_base');
if ( empty( $category_base ) )
$category_base = 'category';
return "/{$category_base}/";
}
function category_link( $category_link ) {
return str_replace( self::get_category_base(), '/', $category_link );
}
function get_category_slugs() {
$categories = get_categories();
foreach( $categories as $index => $category ) {
$categories[$index] = $category->slug;
}
return $categories;
}
}
Rootbased_Category_URLs::on_load();
@Ciantic
Copy link

Ciantic commented Dec 12, 2011

Great stuff, hope it's public domain. Going to create more generalized version for custom taxonomy with add_filter('term_link', ...), get_terms()

@mikeschinkel
Copy link
Author

I just added "License: GPL 2+".

If you update it and want to share back with me I'll review it and update this?

@AverageJoe
Copy link

Mike, when I used your code I get this error.

Warning: preg_match() [function.preg-match]: Unknown modifier '(' in ... \wp-content\plugins\RemoveCategory\RemoveCategory.php on line 19

@mikeschinkel
Copy link
Author

@AverageJoe: What do you have your category base set to?

Screenshot showing Category Base option

@mikeschinkel
Copy link
Author

@AverageJoe: Alternately, do you have any other plugins that modify your URLs?

@Ciantic
Copy link

Ciantic commented May 18, 2012

@AverageJoe: Try setting rewriting on. By clicking on that image "Month and name" for example. Basically the "default" does not allow anykind of rewriting, you must set anything else than that.

@jerzyk
Copy link

jerzyk commented May 9, 2015

to avoid warnings such as:

preg_match(): Unknown modifier '(' 

change line 19 (add regexp delimiters, to avoid parsing "/" from get_category slugs as delimiters), to:

if ( preg_match( '#' . self::get_category_base() . '(.*)#', $wp->request, $match ) ) {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment