Title: WP_Rewrite::rewrite_rules
Published: April 25, 2014
Last modified: April 28, 2025

---

# WP_Rewrite::rewrite_rules(): string[]

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#description)
 * [Return](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#wp--skip-link--target)

Constructs rewrite matches and queries from permalink structure.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#description)󠁿

Runs the action [‘generate_rewrite_rules’](https://developer.wordpress.org/reference/hooks/generate_rewrite_rules/)
with the parameter that is an reference to the current [WP_Rewrite](https://developer.wordpress.org/reference/classes/wp_rewrite/)
instance to further manipulate the permalink structures and rewrite rules. Runs 
the [‘rewrite_rules_array’](https://developer.wordpress.org/reference/hooks/rewrite_rules_array/)
filter on the full rewrite rule array.

There are two ways to manipulate the rewrite rules, one by hooking into the [‘generate_rewrite_rules’](https://developer.wordpress.org/reference/hooks/generate_rewrite_rules/)
action and gaining full control of the object or just manipulating the rewrite rule
array before it is passed from the function.

## 󠀁[Return](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#return)󠁿

 string[] An associative array of matches and queries.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#source)󠁿

    ```php
    public function rewrite_rules() {
    	$rewrite = array();

    	if ( empty( $this->permalink_structure ) ) {
    		return $rewrite;
    	}

    	// robots.txt -- only if installed at the root.
    	$home_path      = parse_url( home_url() );
    	$robots_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'robots\.txt$' => $this->index . '?robots=1' ) : array();

    	// favicon.ico -- only if installed at the root.
    	$favicon_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'favicon\.ico$' => $this->index . '?favicon=1' ) : array();

    	// sitemap.xml -- only if installed at the root.
    	$sitemap_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'sitemap\.xml' => $this->index . '?sitemap=index' ) : array();

    	// Old feed and service files.
    	$deprecated_files = array(
    		'.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\.php$' => $this->index . '?feed=old',
    		'.*wp-app\.php(/.*)?$' => $this->index . '?error=403',
    	);

    	// Registration rules.
    	$registration_pages = array();
    	if ( is_multisite() && is_main_site() ) {
    		$registration_pages['.*wp-signup.php$']   = $this->index . '?signup=true';
    		$registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true';
    	}

    	// Deprecated.
    	$registration_pages['.*wp-register.php$'] = $this->index . '?register=true';

    	// Post rewrite rules.
    	$post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK );

    	/**
    	 * Filters rewrite rules used for "post" archives.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $post_rewrite Array of rewrite rules for posts, keyed by their regex pattern.
    	 */
    	$post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite );

    	// Date rewrite rules.
    	$date_rewrite = $this->generate_rewrite_rules( $this->get_date_permastruct(), EP_DATE );

    	/**
    	 * Filters rewrite rules used for date archives.
    	 *
    	 * Likely date archives would include `/yyyy/`, `/yyyy/mm/`, and `/yyyy/mm/dd/`.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $date_rewrite Array of rewrite rules for date archives, keyed by their regex pattern.
    	 */
    	$date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite );

    	// Root-level rewrite rules.
    	$root_rewrite = $this->generate_rewrite_rules( $this->root . '/', EP_ROOT );

    	/**
    	 * Filters rewrite rules used for root-level archives.
    	 *
    	 * Likely root-level archives would include pagination rules for the homepage
    	 * as well as site-wide post feeds (e.g. `/feed/`, and `/feed/atom/`).
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $root_rewrite Array of root-level rewrite rules, keyed by their regex pattern.
    	 */
    	$root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite );

    	// Comments rewrite rules.
    	$comments_rewrite = $this->generate_rewrite_rules( $this->root . $this->comments_base, EP_COMMENTS, false, true, true, false );

    	/**
    	 * Filters rewrite rules used for comment feed archives.
    	 *
    	 * Likely comments feed archives include `/comments/feed/` and `/comments/feed/atom/`.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $comments_rewrite Array of rewrite rules for the site-wide comments feeds, keyed by their regex pattern.
    	 */
    	$comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite );

    	// Search rewrite rules.
    	$search_structure = $this->get_search_permastruct();
    	$search_rewrite   = $this->generate_rewrite_rules( $search_structure, EP_SEARCH );

    	/**
    	 * Filters rewrite rules used for search archives.
    	 *
    	 * Likely search-related archives include `/search/search+query/` as well as
    	 * pagination and feed paths for a search.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $search_rewrite Array of rewrite rules for search queries, keyed by their regex pattern.
    	 */
    	$search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite );

    	// Author rewrite rules.
    	$author_rewrite = $this->generate_rewrite_rules( $this->get_author_permastruct(), EP_AUTHORS );

    	/**
    	 * Filters rewrite rules used for author archives.
    	 *
    	 * Likely author archives would include `/author/author-name/`, as well as
    	 * pagination and feed paths for author archives.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $author_rewrite Array of rewrite rules for author archives, keyed by their regex pattern.
    	 */
    	$author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite );

    	// Pages rewrite rules.
    	$page_rewrite = $this->page_rewrite_rules();

    	/**
    	 * Filters rewrite rules used for "page" post type archives.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $page_rewrite Array of rewrite rules for the "page" post type, keyed by their regex pattern.
    	 */
    	$page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite );

    	// Extra permastructs.
    	foreach ( $this->extra_permastructs as $permastructname => $struct ) {
    		if ( is_array( $struct ) ) {
    			if ( count( $struct ) === 2 ) {
    				$rules = $this->generate_rewrite_rules( $struct[0], $struct[1] );
    			} else {
    				$rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $struct['walk_dirs'], $struct['endpoints'] );
    			}
    		} else {
    			$rules = $this->generate_rewrite_rules( $struct );
    		}

    		/**
    		 * Filters rewrite rules used for individual permastructs.
    		 *
    		 * The dynamic portion of the hook name, `$permastructname`, refers
    		 * to the name of the registered permastruct.
    		 *
    		 * Possible hook names include:
    		 *
    		 *  - `category_rewrite_rules`
    		 *  - `post_format_rewrite_rules`
    		 *  - `post_tag_rewrite_rules`
    		 *
    		 * @since 3.1.0
    		 *
    		 * @param string[] $rules Array of rewrite rules generated for the current permastruct, keyed by their regex pattern.
    		 */
    		$rules = apply_filters( "{$permastructname}_rewrite_rules", $rules );

    		if ( 'post_tag' === $permastructname ) {

    			/**
    			 * Filters rewrite rules used specifically for Tags.
    			 *
    			 * @since 2.3.0
    			 * @deprecated 3.1.0 Use 'post_tag_rewrite_rules' instead.
    			 *
    			 * @param string[] $rules Array of rewrite rules generated for tags, keyed by their regex pattern.
    			 */
    			$rules = apply_filters_deprecated( 'tag_rewrite_rules', array( $rules ), '3.1.0', 'post_tag_rewrite_rules' );
    		}

    		$this->extra_rules_top = array_merge( $this->extra_rules_top, $rules );
    	}

    	// Put them together.
    	if ( $this->use_verbose_page_rules ) {
    		$this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $sitemap_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $page_rewrite, $post_rewrite, $this->extra_rules );
    	} else {
    		$this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $sitemap_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules );
    	}

    	/**
    	 * Fires after the rewrite rules are generated.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param WP_Rewrite $wp_rewrite Current WP_Rewrite instance (passed by reference).
    	 */
    	do_action_ref_array( 'generate_rewrite_rules', array( &$this ) );

    	/**
    	 * Filters the full set of generated rewrite rules.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string[] $rules The compiled array of rewrite rules, keyed by their regex pattern.
    	 */
    	$this->rules = apply_filters( 'rewrite_rules_array', $this->rules );

    	return $this->rules;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-wp-rewrite.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-wp-rewrite.php#L1276)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-rewrite.php#L1276-L1479)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#hooks)󠁿

 [apply_filters( ‘author_rewrite_rules’, string[] $author_rewrite )](https://developer.wordpress.org/reference/hooks/author_rewrite_rules/)

Filters rewrite rules used for author archives.

 [apply_filters( ‘comments_rewrite_rules’, string[] $comments_rewrite )](https://developer.wordpress.org/reference/hooks/comments_rewrite_rules/)

Filters rewrite rules used for comment feed archives.

 [apply_filters( ‘date_rewrite_rules’, string[] $date_rewrite )](https://developer.wordpress.org/reference/hooks/date_rewrite_rules/)

Filters rewrite rules used for date archives.

 [do_action_ref_array( ‘generate_rewrite_rules’, WP_Rewrite $wp_rewrite )](https://developer.wordpress.org/reference/hooks/generate_rewrite_rules/)

Fires after the rewrite rules are generated.

 [apply_filters( ‘page_rewrite_rules’, string[] $page_rewrite )](https://developer.wordpress.org/reference/hooks/page_rewrite_rules/)

Filters rewrite rules used for “page” post type archives.

 [apply_filters( ‘post_rewrite_rules’, string[] $post_rewrite )](https://developer.wordpress.org/reference/hooks/post_rewrite_rules/)

Filters rewrite rules used for “post” archives.

 [apply_filters( ‘rewrite_rules_array’, string[] $rules )](https://developer.wordpress.org/reference/hooks/rewrite_rules_array/)

Filters the full set of generated rewrite rules.

 [apply_filters( ‘root_rewrite_rules’, string[] $root_rewrite )](https://developer.wordpress.org/reference/hooks/root_rewrite_rules/)

Filters rewrite rules used for root-level archives.

 [apply_filters( ‘search_rewrite_rules’, string[] $search_rewrite )](https://developer.wordpress.org/reference/hooks/search_rewrite_rules/)

Filters rewrite rules used for search archives.

 [apply_filters_deprecated( ‘tag_rewrite_rules’, string[] $rules )](https://developer.wordpress.org/reference/hooks/tag_rewrite_rules/)

Filters rewrite rules used specifically for Tags.

 [apply_filters( “{$permastructname}_rewrite_rules”, string[] $rules )](https://developer.wordpress.org/reference/hooks/permastructname_rewrite_rules/)

Filters rewrite rules used for individual permastructs.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#related)󠁿

| Uses | Description | 
| [apply_filters_deprecated()](https://developer.wordpress.org/reference/functions/apply_filters_deprecated/)`wp-includes/plugin.php` |

Fires functions attached to a deprecated filter hook.

  | 
| [is_main_site()](https://developer.wordpress.org/reference/functions/is_main_site/)`wp-includes/functions.php` |

Determines whether a site is the main site of the current network.

  | 
| [do_action_ref_array()](https://developer.wordpress.org/reference/functions/do_action_ref_array/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook, specifying arguments in an array.

  | 
| [WP_Rewrite::generate_rewrite_rules()](https://developer.wordpress.org/reference/classes/wp_rewrite/generate_rewrite_rules/)`wp-includes/class-wp-rewrite.php` |

Generates rewrite rules from a permalink structure.

  | 
| [WP_Rewrite::get_date_permastruct()](https://developer.wordpress.org/reference/classes/wp_rewrite/get_date_permastruct/)`wp-includes/class-wp-rewrite.php` |

Retrieves date permalink structure, with year, month, and day.

  | 
| [WP_Rewrite::get_search_permastruct()](https://developer.wordpress.org/reference/classes/wp_rewrite/get_search_permastruct/)`wp-includes/class-wp-rewrite.php` |

Retrieves the search permalink structure.

  | 
| [WP_Rewrite::get_author_permastruct()](https://developer.wordpress.org/reference/classes/wp_rewrite/get_author_permastruct/)`wp-includes/class-wp-rewrite.php` |

Retrieves the author permalink structure.

  | 
| [WP_Rewrite::page_rewrite_rules()](https://developer.wordpress.org/reference/classes/wp_rewrite/page_rewrite_rules/)`wp-includes/class-wp-rewrite.php` |

Retrieves all of the rewrite rules for pages.

  | 
| [is_multisite()](https://developer.wordpress.org/reference/functions/is_multisite/)`wp-includes/load.php` |

Determines whether Multisite is enabled.

  | 
| [home_url()](https://developer.wordpress.org/reference/functions/home_url/)`wp-includes/link-template.php` |

Retrieves the URL for the current site where the front end is accessible.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  |

[Show 6 more](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#)

| Used by | Description | 
| [WP_Rewrite::refresh_rewrite_rules()](https://developer.wordpress.org/reference/classes/wp_rewrite/refresh_rewrite_rules/)`wp-includes/class-wp-rewrite.php` |

Refreshes the rewrite rules, saving the fresh value to the database.

  | 
| [WP_Rewrite::mod_rewrite_rules()](https://developer.wordpress.org/reference/classes/wp_rewrite/mod_rewrite_rules/)`wp-includes/class-wp-rewrite.php` |

Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/WP_Rewrite/rewrite_rules/?output_format=md#changelog)󠁿

| Version | Description | 
| [1.5.0](https://developer.wordpress.org/reference/since/1.5.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_rewrite%2Frewrite_rules%2F)
before being able to contribute a note or feedback.