Common single page template options

It sounds like you want users to be able alter the structure of the single.php format without much WordPress know-how (perhaps it’s for clients?).

You could create an options page for this, and allow the user to select the structure they prefer.

In your functions.php or a plugin, you use a hook to call a function when WordPress loads a page. This function then uses is_single() to check that if it is a single page is required, you would then get WordPress to check to see which of the single templates has been selected and then change the template being called up (which is by default single.php if it exists). Instead it could call up single-normal.php, single-tab.php, etc (or just single.php). You would then create each of these for the various format.

For example:

add_filter('template_include', 'template_switch');
function template_switch( $template ){
    if( is_single()) {
    switch (get_option('single-template')){
            case 'tab':
            $template = locate_template( 'single-tab.php');
            break;

            case 'list':
            $template = locate_template( 'single-list.php');
            break;

            case 'normal':
            $template = locate_template( 'single-normal.php');
            break;
        }  
    }
    return $template;
}

The single-normal.php is perhaps superfluous, you could use single.php. Also you would need to add an options page, and register the ‘single-template‘ option with WordPress. For details see Codex’s Options Reference and creating options pages.

Obviously you would have to create the files ‘single-normal.php‘, ‘single-tab.php‘ etc.

Edit: Or, rather than using the switch statement, you could be really clever and (if an option has been selected) simply call up the template: 'single-'.$option.'php', where $option is the return of the get_option('single-template'). This means you can always add more template-styles by creating the appropriate page, and updating the available options and the above code can remain unchanged 😀

Hope this helps!