I'm trying to add a rewrite rule to make this:


look like this:


I've looked everywhere in this site and others and it's very confusing because there are lots of different ways to do it. I've tried editing the functions.php file in my themes folder, adding this at the beginning of the file:

add_rewrite_rule('series/([^/]+)/?$', 'index.php?attachment_id=$matches[1]', 'top');

And the latest one I've tried:

add_filter( 'query_vars', 'wpa56345_query_vars' );

function wpa56345_query_vars( $query_vars ){
    $query_vars[] = 'attachment_id';
    return $query_vars;

add_action( 'init', 'wpa56345_rewrites' );

function wpa56345_rewrites(){
  • Your english seems as good as your coding instincts, kudos for that and for the good question, and welcome to WPSE :o)
    – brasofilo
    Jun 25, 2012 at 3:15

2 Answers 2


Place the code suggested below in functions.php of your desired theme, it worked for me with WP 3.4: http://matty.co.za/2009/11/custom-url-rewrites-in-wordpress/

  • Please add the important part of the answer from the link, that way even if the link expires in the future, your answer will still be useful.
    – Fayaz
    Mar 17, 2017 at 2:57

This seem to work for me:

// Add your query variable

add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $query_vars ) {
    array_push($query_vars, 'attachment_id');
    return $query_vars;

// Add your rule

add_filter( 'rewrite_rules_array', 'my_rewrite_rules_array' );
function my_rewrite_rules_array( $rules ) {
    $my_rules = array();
    $my_rules['series/(\d+)/?$'] = 'index.php?attachment_id=$matches[1]';
    return $my_rules + $rules;

// Flush the rules if your rule does not exist

add_action( 'wp_loaded', 'my_flush_rules' );
function my_flush_rules() {
    if (!$rules = get_option('rewrite_rules'))
        $rules = array();

    if (!isset($rules['series/(\d+)/?$'])) {
        global $wp_rewrite;

And also, if you want to debug rules, there's a useful snippet:

// Uncomment add_action to see what's happening

//add_action('wp', 'debug_rules');
function debug_rules() {
    global $wp, $wp_query, $wp_rewrite;
    echo $wp->matched_rule . ' | ' . $wp_rewrite->rules[$wp->matched_rule];

Hope it helps.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.