I modified some code from an old blog post to do this, and allow for query-strings to be attached to the file as well.
Original credit goes to amberpanther.com, and it turns out they made a plug-in out of this, too.
//create the shortcode [include] that accepts a filepath and query string
//this function was modified from a post on www.amberpanther.com you can find it at the link below:
//http://www.amberpanther.com/knowledge-base/using-the-wordpress-shortcode-api-to-include-an-external-file-in-the-post-content/
//BEGIN amberpanther.com code
function include_file($atts) {
//if filepath was specified
extract(
shortcode_atts(
array(
'filepath' => 'NULL'
), $atts
)
);
//BEGIN modified portion of code to accept query strings
//check for query string of variables after file path
if(strpos($filepath,"?")) {
$query_string_pos = strpos($filepath,"?");
//create global variable for query string so we can access it in our included files if we need it
//also parse it out from the clean file name which we will store in a new variable for including
global $query_string;
$query_string = substr($filepath,$query_string_pos + 1);
$clean_file_path = substr($filepath,0,$query_string_pos);
//if there isn't a query string
} else {
$clean_file_path = $filepath;
}
//END modified portion of code
//check if the filepath was specified and if the file exists
if ($filepath != 'NULL' && file_exists(get_stylesheet_directory_uri() . "/" . $clean_file_path)){
//turn on output buffering to capture script output
ob_start();
//include the specified file
include(TEMPLATEPATH.$clean_file_path);
//assign the file output to $content variable and clean buffer
$content = ob_get_clean();
//return the $content
//return is important for the output to appear at the correct position
//in the content
return $content;
}
}
//register the Shortcode handler
add_shortcode('include', 'include_file');
//END amberpanther.com code
//shortcode with sample query string:
//[include filepath="/get-posts.php?format=grid&taxonomy=testing&term=stuff&posttype=work"]
I set mine to pull from the stylesheet uri (so it will work with child themes and such), but you could adjust that code easily to pull from anywhere (including plug-in directories), or remove it altogether and just use the full path when including the file. You could even add a conditional with a trigger character at the beginning that tells it to use a specific path based on what the first character of the file name is, like using a "#" for the template directory, etc.
I use it to pull in a file called get-posts.php that lives in my template directory and formats the output of various posts based on a series of parameters provided in the query string. It saves me from needing special templates because I can include the file, send it a format and it will output the posts with the markup I've specified in the get-posts.php file.
It also allows clients to pull custom post types into actual blog-posts in specific formats and is quite handy.
Let me know if you need clarification on anything.