Skip to content

Instantly share code, notes, and snippets.

@aahan
Last active December 27, 2015 16:49
Show Gist options
  • Select an option

  • Save aahan/7357347 to your computer and use it in GitHub Desktop.

Select an option

Save aahan/7357347 to your computer and use it in GitHub Desktop.

NOTES

1. When initial code didn't work, I installed Debug Bar plugin and then not-yet-released Debug Bar Rewrite Rules plugin by Oleg Butuzov (who mailed it to me).

With the two plugins installed, click Debug link in admin bar, and in the popover select the Rewrite Rules tab. Now you'll see a list of all the rewrite rules in place on your site.

By comparing the regex, rewrite rules used for similar stuff (e.g. category archives, category archive pagination, category feeds, etc.) I was able to frame my own rules properly.

2. Resources

...use add_rewrite_rule() over messing directly with $wp_rewrite->rules if possible. The latter is a bit low-level.

Stephen Harris

3. Related core files: /wp-includes/rewrite.php and /wp-includes/canonical.php

<?php
function wtnerd_edition_specific_categories() {
/*
Rewrite e.g.:
`example.com/?category_name=uk&channel=tech&feed=rss2` as `example.com/uk/channel/tech/feed/rss2/`
`example.com/?category_name=uk&channel=tech&feed=rss2` as `example.com/uk/channel/tech/feed/`
`example.com/?category_name=uk&channel=tech&paged=2` as `example.com/uk/channel/tech/page/2/`
`example.com/?category_name=uk&channel=tech` as `example.com/uk/channel/tech/`
*/
add_rewrite_rule( '(.+?)/channel/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?category_name=$matches[1]&channel=$matches[2]&feed=$matches[3]', 'top' );
add_rewrite_rule( '(.+?)/channel/(.+?)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?category_name=$matches[1]&channel=$matches[2]&feed=$matches[3]', 'top' );
add_rewrite_rule( '(.+?)/channel/(.+?)/page/?([0-9]{1,})/?$', 'index.php?category_name=$matches[1]&channel=$matches[2]&paged=$matches[3]', 'top' );
add_rewrite_rule( '(.+?)/channel/(.+?)/?$', 'index.php?category_name=$matches[1]&channel=$matches[2]', 'top' );
/*
Rewrite e.g.:
`example.com/?category_name=uk&tag=linux&feed=rss2` as `example.com/uk/section/linux/feed/rss2/`
`example.com/?category_name=uk&tag=linux&feed=rss2` as `example.com/uk/section/linux/feed/`
`example.com/?category_name=uk&tag=linux&paged=2` as `example.com/uk/section/linux/page/2/`
`example.com/?category_name=uk&tag=linux` as `example.com/uk/section/linux/`
*/
add_rewrite_rule( '(.+?)/section/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?category_name=$matches[1]&tag=$matches[2]&feed=$matches[3]', 'top' );
add_rewrite_rule( '(.+?)/section/(.+?)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?category_name=$matches[1]&tag=$matches[2]&feed=$matches[3]', 'top' );
add_rewrite_rule( '(.+?)/section/(.+?)/page/?([0-9]{1,})/?$', 'index.php?category_name=$matches[1]&tag=$matches[2]&paged=$matches[3]', 'top' );
add_rewrite_rule( '(.+?)/section/(.+?)/?$', 'index.php?category_name=$matches[1]&tag=$matches[2]', 'top' );
}
add_action( 'init', 'wtnerd_edition_specific_categories' );
// THE SAME CAN BE DONE LIKE THIS (BUT ABOVE METHOD IS RECOMMENDED)
function wtnerd_edition_specific_categories( $wp_rewrite ) {
$rewrite_rules = array(
'(.+?)/channel/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&channel='. $wp_rewrite->preg_index(2) .'&feed='. $wp_rewrite->preg_index(3),
'(.+?)/channel/(.+?)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&channel='. $wp_rewrite->preg_index(2) .'&feed='. $wp_rewrite->preg_index(3),
'(.+?)/channel/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&channel='. $wp_rewrite->preg_index(2) .'&paged='. $wp_rewrite->preg_index(3),
'(.+?)/channel/(.+?)/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&channel='. $wp_rewrite->preg_index(2),
'(.+?)/section/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&tag='. $wp_rewrite->preg_index(2) .'&feed='. $wp_rewrite->preg_index(3),
'(.+?)/section/(.+?)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&tag='. $wp_rewrite->preg_index(2) .'&feed='. $wp_rewrite->preg_index(3),
'(.+?)/section/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&tag='. $wp_rewrite->preg_index(2) .'&paged='. $wp_rewrite->preg_index(3),
'(.+?)/section/(.+?)/?$' => 'index.php?category_name='. $wp_rewrite->preg_index(1) .'&tag='. $wp_rewrite->preg_index(2)
);
$wp_rewrite->rules = $rewrite_rules + $wp_rewrite->rules;
}
add_filter( 'generate_rewrite_rules', 'wtnerd_edition_specific_categories' );
// OR LIKE THIS
function wtnerd_edition_specific_categories( $wp_rewrite ) {
$rewrite_rules = array(
'(.+?)/channel/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name=$matches[1]&channel=$matches[2]&feed=$matches[3]',
'(.+?)/channel/(.+?)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name=$matches[1]&channel=$matches[2]&feed=$matches[3]',
'(.+?)/channel/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?category_name=$matches[1]&channel=$matches[2]&paged=$matches[3]',
'(.+?)/channel/(.+?)/?$' => 'index.php?category_name=$matches[1]&channel=$matches[2]',
'(.+?)/section/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name=$matches[1]&tag=$matches[2]&feed=$matches[3]',
'(.+?)/section/(.+?)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?category_name=$matches[1]&tag=$matches[2]&feed=$matches[3]',
'(.+?)/section/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?category_name=$matches[1]&tag=$matches[2]&paged=$matches[3]',
'(.+?)/section/(.+?)/?$' => 'index.php?category_name=$matches[1]&tag=$matches[2]'
);
$wp_rewrite->rules = $rewrite_rules + $wp_rewrite->rules;
}
add_filter( 'generate_rewrite_rules', 'wtnerd_edition_specific_categories' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment