Wordpress - Create a page without adding a page in the Database

To wit, this technically isn't a 'page', however it's a way to surface content using mod_rewrite. The goal here is to add a URI segment of foobar that will trigger a custom query, then include the specified template file.

Add a rewrite rule:

add_action('init', 'foo_add_rewrite_rule');
function foo_add_rewrite_rule(){
    add_rewrite_rule('^foobar?','index.php?is_foobar_page=1&post_type=custom_post_type','top');
    //Customize this query string - keep is_foobar_page=1 intact
}

See the WP_Query documentation for more information about customizing the query string.

Register a new query var:

add_action('query_vars','foo_set_query_var');
function foo_set_query_var($vars) {
    array_push($vars, 'is_foobar_page');
    return $vars;
}

Force WP to select your page template:

add_filter('template_include', 'foo_include_template', 1000, 1);
function foo_include_template($template){
    if(get_query_var('is_foobar_page')){
        $new_template = WP_CONTENT_DIR.'/themes/your-theme/template-name.php';
        if(file_exists($new_template))
            $template = $new_template;
    }
    return $template;
}

Flush the rewrites by visiting Settings->Permalinks, then visit http://yourdomain.com/foobar


An additional remark to Brian Fegter's answer. if you want to flush the rewrites rules programmatically instead of visiting Settings->Permalinks, you can use flush_rewrite_rules().

However, don't put it on init hook, as the Wordpress Codex strongly recommands. You can put both flush_rewrite_rules() method and the foo_add_rewrite_rule() on register_activation_hook.

register_activation_hook( __FILE__, 'myplugin_flush_rewrites' );
function myplugin_flush_rewrites() {
add_rewrite_rule('^foobar?','index.php?is_foobar_page=1&post_type=custom_post_type','top');
flush_rewrite_rules();
}

Tags:

Pages