Custom rewrite rule is not picked by WordPress

I am trying to create a custom Rewrite URL something like

function add_my_rule() {    
    global $wp; 
    $wp->add_query_var('state');   
    $wp->add_query_var('state_destination');
    add_rewrite_rule('destination/([0-9]+)/([^/]*)/page/([0-9]+)','index.php?pagename=destination&state=$matches[1]&state_destination=$matches[2]&paged=$matches[3]','top');
    add_rewrite_rule('destination/([0-9]+)/([^/]*)','index.php?pagename=destination&state=$matches[1]&state_destination=$matches[2]','top');
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'add_my_rule');

Idea is to rewrite all URL which have following pattern

Read More
www.abc.com/destination/state/state-destination

I have a custom template destination.php and i want all such URL’s to be handled there.I have done same in past and that is working fine but now it does not seems working at all as for the given URL

http://localhost/xxx/destination/himachal-pradesh/dalhousie

it always going to single.php and not to destination.php.I tried to flush the cache and even browser one but seems like either my rewrite Rule is not correct or there is some other issue.
Any help in this will help me to move ahead.

As an added information my current URL-Structure in WordPress is /%year%/%monthnum%/%postname%.html i am using WAMP Server with mode-rewrite enable.

Related posts

Leave a Reply

1 comment

  1. this is a nice little re-write class created by: Author Kyle E Gentile
    I found this a while back which works a treat in most plugins I’ve created…

    Save the first section of code in a file called: add_rewrite_rules.php

    <?php
    /*
    //Author Kyle E Gentile
    //To use this class you must first include the file.  
    //After including the file, you need to create an options array.  For example:
    $options = array(
        'query_vars' => array('var1', 'var2'),
        'rules' => array('(.+?)/(.+?)/(.+?)/?$' => 'index.php?pagename=$matches[1]&var1=$matches[2]&var2=$matches[3]')
    );
    //After creating our $option array, 
    //we will need to create a new instance of the class as below:
    $rewrite = new Add_rewrite_rules($options);
    //You must pass the options array, this way. (If you don't there could be problems) 
    //Then you can call the filters and action functions as below:
    add_action('wp_head', array(&$rewrite, 'flush_rules'));
    add_action( 'generate_rewrite_rules', array(&$rewrite, 'add_rewrite_rules') );
    add_filter( 'query_vars', array(&$rewrite, 'add_query_vars') );
    //That is it.
    */
    
    //prevent duplicate loading of the class if you are using this in multiply plugins
    if(!class_exists('add_rewrite_rules')){
    
        class Add_rewrite_rules{
    
            var $query_vars;
            var $rules;
    
            function __construct($options){
                $this->init($options);
            }
    
            function init($options){
                foreach($options as $key => $value){
                    $this->$key = $value;
                }
            }
    
            function rules_exist(){
                global $wp_rewrite;
    
                $has_rules = TRUE;
    
                foreach($this->rules as $key => $value){
                    if(!in_array($value, $wp_rewrite->rules)){
                        $has_rules = FALSE;
                    }   
                }
    
                return $has_rules;
            }
    
            //to be used add_action with the hook 'wp_head'
            //flushing rewrite rules is labor intense so we better test to see if our rules exist first
            //if the rules don't exist flush its like after a night of drinking  
            function flush_rules(){
                global $wp_rewrite;
    
                if(!$this->rules_exist()){
                    //echo "flushed"; // If want to see this in action uncomment this line and remove this text and you will see it flushed before your eyes
                    $wp_rewrite->flush_rules();
                }
            }
    
            //filter function to be used with add_filter() with the hook "query_vars"
            function add_query_vars($query_vars){
    
                foreach($this->query_vars as $var){
                    $query_vars[] = $var;
                }
    
                return $query_vars;
            }
    
            //to be used with a the add_action() with the hook "generate_rewrite_rules"
            function add_rewrite_rules(){
                global $wp_rewrite;
    
                $wp_rewrite->rules = $this->rules + $wp_rewrite->rules;
            }
    
        }
    
    }
    ?>
    

    Then include the file in your code to generate your new Re-Write rules..

    <?php
    //-------------------------------------------------
    //ADDING REWRITE RULES AND QUERY VARS
    //-------------------------------------------------
    include('add_rewrite_rules.php');
    $options = array(
        'query_vars' => array('state', 'state_destination'),
        'rules' => 
            array(
                '(.+?)/([^/]+)/([^/]+)/?$' => 'index.php?  pagename=$matches[1]&state=$matches[2]&state_destination=$matches[3]'
            )
    );
        $rewrite = new Add_rewrite_rules($options);
        add_action('wp_head', array(&$rewrite, 'flush_rules'));
        add_action('generate_rewrite_rules', array(&$rewrite, 'add_rewrite_rules') );
        add_filter('query_vars', array(&$rewrite, 'add_query_vars') );
       //-------------------------------------------------
       //ADDING REWRITE RULES AND QUERY VARS
       //-------------------------------------------------
       ?>
    

    that should be it, like I said I’ve used this a few times while building different plugins, I hope it works ok for you..

    Marty