WP_Rewrite Class
Core class implementing the WordPress rewrite component API. Handles permalink structures, rewrite rules, and URL pattern matching.
class WP_Rewrite {
// ...
}Overview
The WP_Rewrite class:
- Writes mod_rewrite rules to
.htaccess(Apache) orweb.config(IIS) - Parses requests to set up the WordPress Query
- Acts as a front controller alongside the
WPclass - Allows adding custom URL patterns via hooks and methods
Global Instance:
global $wp_rewrite;Properties
Permalink Structure Properties
$permalink_structure
public string $permalink_structureThe permalink structure for posts. Read from get_option('permalink_structure').
Examples:
/%postname%//%year%/%monthnum%/%postname%/- Empty string for plain permalinks
$use_trailing_slashes
public bool $use_trailing_slashesWhether to add trailing slashes to URLs. Determined by whether $permalink_structure ends with /.
$front
public string $frontThe static portion of the post permalink structure before the first %tag%.
Examples:
- Permalink
/blog/%postname%/→ front is/blog/ - Permalink
/%postname%/→ front is/
$root
public string $root = ''The prefix for all permalink structures. Empty for mod_rewrite, index.php/ for PATHINFO permalinks.
$index
public string $index = 'index.php'The name of the index file which is the entry point to all requests.
Base Properties
$author_base
public string $author_base = 'author'Base for author permalink structure (example.com/author/username).
$search_base
public string $search_base = 'search'Base for search permalink structure (example.com/search/query).
$comments_base
public string $comments_base = 'comments'Base for comments permalink.
$pagination_base
public string $pagination_base = 'page'Base for pagination (example.com/page/2).
Since: 3.1.0
$comments_pagination_base
public string $comments_pagination_base = 'comment-page'Base for comments pagination (example.com/post/comment-page-2).
Since: 4.2.0
$feed_base
public string $feed_base = 'feed'Base for feed URLs (example.com/feed/rss2).
Structure Properties
$author_structure
public string $author_structurePermalink structure for author archives. Built as $front . $author_base . '/%author%'.
$date_structure
public string $date_structurePermalink structure for date archives. Typically %year%/%monthnum%/%day%.
$page_structure
public string $page_structurePermalink structure for pages. Built as $root . '%pagename%'.
$search_structure
public string $search_structurePermalink structure for searches. Built as $root . $search_base . '/%search%'.
$feed_structure
public string $feed_structureFeed request permalink structure.
$comment_feed_structure
public string $comment_feed_structureComments feed permalink structure.
Rewrite Tag Properties
$rewritecode
public string[] $rewritecode = array(
'%year%',
'%monthnum%',
'%day%',
'%hour%',
'%minute%',
'%second%',
'%postname%',
'%post_id%',
'%author%',
'%pagename%',
'%search%',
)Rewrite tags that can be used in permalink structures.
$rewritereplace
public string[] $rewritereplace = array(
'([0-9]{4})',
'([0-9]{1,2})',
'([0-9]{1,2})',
'([0-9]{1,2})',
'([0-9]{1,2})',
'([0-9]{1,2})',
'([^/]+)',
'([0-9]+)',
'([^/]+)',
'([^/]+?)',
'(.+)',
)Regular expressions substituted for rewrite tags. Parallel array to $rewritecode.
$queryreplace
public string[] $queryreplace = array(
'year=',
'monthnum=',
'day=',
'hour=',
'minute=',
'second=',
'name=',
'p=',
'author_name=',
'pagename=',
's=',
)Query variables that rewrite tags map to. Parallel array to $rewritecode.
Rules Properties
$rules
public string[] $rulesCompiled rewrite rules to match against requests. Keys are regex patterns, values are query strings.
$extra_rules
public string[] $extra_rules = array()Additional rules added externally (at bottom priority) via add_rewrite_rule().
$extra_rules_top
public string[] $extra_rules_top = array()Additional rules that belong at the beginning (top priority) via add_rewrite_rule($regex, $query, 'top').
Since: 2.3.0
$non_wp_rules
public string[] $non_wp_rules = array()Rules that don’t redirect to WordPress’s index.php. Written directly to .htaccess via add_external_rule().
$extra_permastructs
public array[] $extra_permastructs = array()Extra permalink structures added via add_permastruct(). Used for custom post types and taxonomies.
$endpoints
public array[] $endpointsEndpoints (like /trackback/) added via add_rewrite_endpoint().
Configuration Properties
$matches
public string $matches = ''Variable name for regex matches in the rewritten query. When set, references become $matches[N] instead of $N.
$feeds
public string[] $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' )Supported default feed types.
$use_verbose_rules
public bool $use_verbose_rules = falseWhether to write every mod_rewrite rule to .htaccess. Off by default to keep the file small.
$use_verbose_page_rules
public bool $use_verbose_page_rules = trueWhether post permalinks could be confused with page permalinks. Set to true when permalink structure starts with %postname%, %category%, %tag%, or %author%.
Since: 2.5.0
Methods
Permalink Detection Methods
using_permalinks()
public function using_permalinks(): boolDetermines whether permalinks are being used.
Returns: true if $permalink_structure is not empty.
global $wp_rewrite;
if ( $wp_rewrite->using_permalinks() ) {
// Pretty permalinks enabled
}using_index_permalinks()
public function using_index_permalinks(): boolDetermines whether PATHINFO permalinks are in use (index.php is in the URL).
Returns: true if permalinks enabled AND index.php is in the structure.
// Check for PATHINFO/index permalinks
if ( $wp_rewrite->using_index_permalinks() ) {
// URLs like /index.php/post-name/
}using_mod_rewrite_permalinks()
public function using_mod_rewrite_permalinks(): boolDetermines whether mod_rewrite permalinks are in use (index.php NOT in URL).
Returns: true if using permalinks AND NOT using index permalinks.
if ( $wp_rewrite->using_mod_rewrite_permalinks() ) {
// Clean URLs like /post-name/
}Structure Retrieval Methods
get_date_permastruct()
public function get_date_permastruct(): string|falseRetrieves the date permalink structure with year, month, and day.
Returns: Date permalink structure or false if no permalinks.
Supports three date formats:
%year%/%monthnum%/%day%(default)%day%/%monthnum%/%year%%monthnum%/%day%/%year%
get_year_permastruct()
public function get_year_permastruct(): string|falseRetrieves the year-only permalink structure.
Returns: Year structure (e.g., /%year%/) or false.
get_month_permastruct()
public function get_month_permastruct(): string|falseRetrieves the year/month permalink structure.
Returns: Month structure (e.g., /%year%/%monthnum%/) or false.
get_day_permastruct()
public function get_day_permastruct(): string|falseRetrieves the full date permalink structure. Same as get_date_permastruct().
Returns: Day structure or false.
get_author_permastruct()
public function get_author_permastruct(): string|falseRetrieves the author permalink structure.
Returns: Author structure (e.g., /author/%author%) or false.
get_search_permastruct()
public function get_search_permastruct(): string|falseRetrieves the search permalink structure.
Returns: Search structure (e.g., /search/%search%) or false.
get_page_permastruct()
public function get_page_permastruct(): string|falseRetrieves the page permalink structure.
Returns: Page structure (e.g., %pagename%) or false.
get_feed_permastruct()
public function get_feed_permastruct(): string|falseRetrieves the feed permalink structure.
Returns: Feed structure (e.g., /feed/%feed%) or false.
get_comment_feed_permastruct()
public function get_comment_feed_permastruct(): string|falseRetrieves the comment feed permalink structure.
Returns: Comment feed structure or false.
get_category_permastruct()
public function get_category_permastruct(): string|falseRetrieves the category permalink structure.
Returns: Category structure or false.
get_tag_permastruct()
public function get_tag_permastruct(): string|falseRetrieves the tag permalink structure.
Returns: Tag structure or false.
Since: 2.3.0
get_extra_permastruct()
public function get_extra_permastruct( string $name ): string|falseRetrieves an extra permalink structure by name.
Parameters:
$name– Permalink structure name (e.g., ‘category’, ‘post_tag’, or custom)
Returns: Permalink structure string or false.
$struct = $wp_rewrite->get_extra_permastruct( 'product' );Since: 2.5.0
Rewrite Tag Methods
add_rewrite_tag()
public function add_rewrite_tag( string $tag, string $regex, string $query )Adds or updates a rewrite tag.
Parameters:
$tag– Name of the rewrite tag (e.g.,%postname%)$regex– Regular expression to match$query– Query string parameter (must end with=)
$wp_rewrite->add_rewrite_tag( '%product%', '([^/]+)', 'product=' );remove_rewrite_tag()
public function remove_rewrite_tag( string $tag )Removes an existing rewrite tag.
Parameters:
$tag– Name of the rewrite tag to remove
Since: 4.5.0
Rule Generation Methods
generate_rewrite_rules()
public function generate_rewrite_rules(
string $permalink_structure,
int $ep_mask = EP_NONE,
bool $paged = true,
bool $feed = true,
bool $forcomments = false,
bool $walk_dirs = true,
bool $endpoints = true
): string[]Generates rewrite rules from a permalink structure.
Parameters:
$permalink_structure– The permalink structure$ep_mask– Endpoint mask (EP_* constants)$paged– Add pagination rules$feed– Add feed rules$forcomments– Make feeds comment feeds$walk_dirs– Build rules for each directory level$endpoints– Apply endpoints to generated rules
Returns: Array of rewrite rules keyed by regex pattern.
$rules = $wp_rewrite->generate_rewrite_rules(
'/products/%product%/',
EP_PERMALINK,
true,
true,
false,
true,
true
);generate_rewrite_rule()
public function generate_rewrite_rule( string $permalink_structure, bool $walk_dirs = false ): arrayShorthand for generate_rewrite_rules() with minimal options.
Parameters:
$permalink_structure– The permalink structure$walk_dirs– Whether to walk directories
Returns: Array of rewrite rules.
rewrite_rules()
public function rewrite_rules(): string[]Constructs all rewrite rules from permalink structures. Called during rule regeneration.
Returns: Associative array of regex patterns to query strings.
Fires:
generate_rewrite_rulesactionrewrite_rules_arrayfilter
wp_rewrite_rules()
public function wp_rewrite_rules(): string[]Retrieves cached rewrite rules from the database, regenerating if needed.
Returns: Array of rewrite rules keyed by regex pattern.
$rules = $wp_rewrite->wp_rewrite_rules();
foreach ( $rules as $pattern => $query ) {
echo "$pattern => $queryn";
}page_rewrite_rules()
public function page_rewrite_rules(): string[]Retrieves all rewrite rules for pages.
Returns: Page rewrite rules array.
Rule Addition Methods
add_rule()
public function add_rule( string $regex, string|array $query, string $after = 'bottom' )Adds a rewrite rule.
Parameters:
$regex– Regular expression to match$query– Query string or array of query vars$after– Priority: ‘top’ or ‘bottom’
$wp_rewrite->add_rule(
'^custom/([^/]+)/?$',
'index.php?custom=$matches[1]',
'top'
);Since: 2.1.0 (array support in 4.4.0)
add_external_rule()
public function add_external_rule( string $regex, string $query )Adds a rewrite rule that doesn’t correspond to index.php.
Parameters:
$regex– Regular expression to match$query– External destination
// Redirect to external script
$wp_rewrite->add_external_rule( '^api/v1/(.*)$', 'api/handler.php?route=$1' );add_endpoint()
public function add_endpoint( string $name, int $places, string|bool $query_var = true )Adds an endpoint.
Parameters:
$name– Endpoint name$places– Endpoint mask (EP_* constants)$query_var– Query variable name, orfalseto skip registration
Since: 2.1.0 (query_var support in 3.9.0/4.3.0)
add_permastruct()
public function add_permastruct( string $name, string $struct, array $args = array() )Adds a new permalink structure.
Parameters:
$name– Name for the permastruct$struct– Permalink structure$args– Options array (with_front, ep_mask, paged, feed, forcomments, walk_dirs, endpoints)
Since: 2.5.0
remove_permastruct()
public function remove_permastruct( string $name )Removes a permalink structure.
Parameters:
$name– Name of the permastruct to remove
Since: 4.5.0
Server Configuration Methods
mod_rewrite_rules()
public function mod_rewrite_rules(): stringRetrieves mod_rewrite-formatted rules for .htaccess.
Returns: Apache mod_rewrite rules string.
Filters: mod_rewrite_rules
iis7_url_rewrite_rules()
public function iis7_url_rewrite_rules( bool $add_parent_tags = false ): stringRetrieves IIS7 URL Rewrite formatted rules for web.config.
Parameters:
$add_parent_tags– Whether to wrap rules in parent XML tags
Returns: IIS7 rewrite rules string.
Filters: iis7_url_rewrite_rules
Since: 2.8.0
Flush and Initialization Methods
flush_rules()
public function flush_rules( bool $hard = true )Removes and recreates rewrite rules.
Parameters:
$hard– Update.htaccess/web.config(true) or just database (false)
Filters: flush_rewrite_rules_hard
Since: 2.0.1
init()
public function init()Sets up the object’s properties from options. Called automatically by constructor and after option changes.
set_permalink_structure()
public function set_permalink_structure( string $permalink_structure )Sets the main permalink structure for the site.
Parameters:
$permalink_structure– New permalink structure
Fires: permalink_structure_changed action
set_category_base()
public function set_category_base( string $category_base )Sets the category base for category permalinks.
Parameters:
$category_base– Category permalink base
set_tag_base()
public function set_tag_base( string $tag_base )Sets the tag base for tag permalinks.
Parameters:
$tag_base– Tag permalink base
Since: 2.3.0
Utility Methods
preg_index()
public function preg_index( int $number ): stringCreates match index strings for use in preg_* functions.
Parameters:
$number– Index number
Returns: Match reference like $1 or $matches[1]
$index = $wp_rewrite->preg_index( 2 ); // Returns '$2' or '$matches[2]'page_uri_index()
public function page_uri_index(): arrayRetrieves all pages and attachments for page URIs.
Returns: Array with two elements:
- Page URIs (uri => ID)
- Page attachment URIs (uri => ID)
Since: 2.5.0
Constructor
__construct()
public function __construct()Constructor. Calls init() to run setup.
Since: 1.5.0
Usage Examples
Check Permalink Configuration
global $wp_rewrite;
// Get current structure
$structure = $wp_rewrite->permalink_structure;
// Check permalink type
if ( ! $wp_rewrite->using_permalinks() ) {
echo 'Plain permalinks (query strings)';
} elseif ( $wp_rewrite->using_index_permalinks() ) {
echo 'PATHINFO permalinks (/index.php/...)';
} else {
echo 'mod_rewrite permalinks (clean URLs)';
}Inspect Rewrite Rules
global $wp_rewrite;
$rules = $wp_rewrite->wp_rewrite_rules();
foreach ( $rules as $pattern => $query ) {
printf( "Pattern: %snQuery: %snn", $pattern, $query );
}Add Custom Permastruct
global $wp_rewrite;
// Add structure for products
$wp_rewrite->add_permastruct( 'product', 'shop/%product%', array(
'with_front' => false,
'ep_mask' => EP_PERMALINK,
'paged' => false,
'feed' => true,
));
// Flush rules (only on activation!)
$wp_rewrite->flush_rules();Generate Rules for Custom Structure
global $wp_rewrite;
$rules = $wp_rewrite->generate_rewrite_rules(
'/events/%year%/%monthnum%/%event%/',
EP_PERMALINK,
true, // paged
true, // feed
false, // forcomments
true, // walk_dirs
true // endpoints
);
// Merge with extra_rules_top for priority
$wp_rewrite->extra_rules_top = array_merge( $wp_rewrite->extra_rules_top, $rules );