After a long search finally i found a working solution. I am posting here in case someone face the similar issue, it would be helpful. Here is my working code:
add_action('template_redirect', array($this, 'zip_template'));
add_filter( 'rewrite_rules_array', array($this, 'zip_rule') );
add_filter( 'query_vars', array( $this, 'zip_query_vars' ) );
add_action( 'wp_loaded', array( $this, 'flush_rules' ) );
/**
* Rewrite rule
**/
public function zip_rule($rules ) {
$newrules = array();
$newrules['zip-backup/([^&]+)/([^&]+)'] = 'index.php?backup=$matches[1]&key=$matches[2]';
return $newrules + $rules;
}
/**
* query parameters
**/
public function zip_query_vars($vars) {
$vars[] = 'backup';
$vars[] = 'key';
return $vars;
}
/**
* Flush rules
**/
public function flush_rules(){
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['zip-backup/([^&]+)/([^&]+)'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
/**
* Callback template
**/
public function zip_template() {
if(get_query_var('backup')) {
add_filter('template_include', function() {
return PLUGIN_DIR_PATH . 'zip-backup.php';
});
}
}