Title: WP_Rewrite::add_rule
Published: April 25, 2014
Last modified: May 20, 2026

---

# WP_Rewrite::add_rule( string $regex, string|array $query, string $after = 'bottom' )

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/wp_rewrite/add_rule/?output_format=md#description)
 * [Parameters](https://developer.wordpress.org/reference/classes/wp_rewrite/add_rule/?output_format=md#parameters)
 * [Source](https://developer.wordpress.org/reference/classes/wp_rewrite/add_rule/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/classes/wp_rewrite/add_rule/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_rewrite/add_rule/?output_format=md#changelog)

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

Adds a rewrite rule that transforms a URL structure to a set of query vars.

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

Any value in the $after parameter that isn’t ‘bottom’ will result in the rule being
placed at the top of the rewrite rules.

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/wp_rewrite/add_rule/?output_format=md#parameters)󠁿

 `$regex`stringrequired

Regular expression to match request against.

`$query`string|arrayrequired

The corresponding query vars for this rewrite rule.

`$after`stringoptional

Priority of the new rule. Accepts `'top'` or `'bottom'`. Default `'bottom'`.

Default:`'bottom'`

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

    ```php
    public function add_rule( $regex, $query, $after = 'bottom' ) {
    	if ( is_array( $query ) ) {
    		$external = false;
    		$query    = add_query_arg( $query, 'index.php' );
    	} else {
    		$index = ! str_contains( $query, '?' ) ? strlen( $query ) : strpos( $query, '?' );
    		$front = substr( $query, 0, $index );

    		$external = $front !== $this->index;
    	}

    	// "external" = it doesn't correspond to index.php.
    	if ( $external ) {
    		$this->add_external_rule( $regex, $query );
    	} else {
    		if ( 'bottom' === $after ) {
    			$this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) );
    		} else {
    			$this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) );
    		}
    	}
    }
    ```

[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/7.0/src/wp-includes/class-wp-rewrite.php#L1684)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-includes/class-wp-rewrite.php#L1684-L1705)

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

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

Adds a rewrite rule that doesn’t correspond to index.php.

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

Retrieves a modified URL query string.

  |

| Used by | Description | 
| [add_rewrite_rule()](https://developer.wordpress.org/reference/functions/add_rewrite_rule/)`wp-includes/rewrite.php` |

Adds a rewrite rule that transforms a URL structure to a set of query vars.

  |

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

| Version | Description | 
| [4.4.0](https://developer.wordpress.org/reference/since/4.4.0/) | Array support was added to the `$query` parameter. | 
| [2.1.0](https://developer.wordpress.org/reference/since/2.1.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%2Fadd_rule%2F)
before being able to contribute a note or feedback.