First of all - plug-ins are for generating content, themes are for displaying it. So really, a plug-in shouldn't do this. But there are grey areas - for example in an 'events' related plug-in, it would be desirable to display dates, venue etc - things that a WordPress theme wouldn't normally display.
I would suggest
- making the plug-in templates over-rideable with templates of the same name in the theme/child theme.
- Being able to 'turn off' plug-in forcing of the template.
To alter the template being used you can use the template_include filter. This is an example for taxonomy templates, but a similar process is possible for custom post types.
add_filter('template_include', 'wpse50201_set_template');
function wpse50201_set_template( $template ){
//Add option for plug-in to turn this off? If so just return $template
//Check if the taxonomy is being viewed
//Suggested: check also if the current template is 'suitable'
if( is_tax('event-venue') && !wpse50201_is_template($template)
$template = plugin_dir_url(__FILE__ ).'templates/taxonomy-event-venue.php';
return $template;
}
Note it assumes that the plug-in templates are in a template sub-folder relative to current director.
Logic
This simply checks that the 'event-venue' taxonomy is being viewed. If not it will use the original template.
The wpse50201_template function will check if the template WordPress has picked from the theme/child-theme is called taxonomy-event-venue.php or taxonomy-event-venue-{term-slug}.php. If it is - the original template will be used.
This allows users of your plug to copy them into their theme and edit them, and the plug-in will prioritise the theme/child-theme templates. Only if it can't find them does it fall back to the plug-in templates.
function wpse50201_is_template( $template_path ){
//Get template name
$template = basename($template_path);
//Check if template is taxonomy-event-venue.php
//Check if template is taxonomy-event-venue-{term-slug}.php
if( 1 == preg_match('/^taxonomy-event-venue((-(\S*))?).php/',$template) )
return true;
return false;
}
I've used this method in a plug-in - you can see a working example of the above here.