I have a plugin that creates a template file stored in the plugin's 'templates' folder. It also creates a new page using code similar to:
$template_file = plugin_dir_path( __FILE__ ) . '/templates/mytemplate.php' ;
$the_page = array(
'post_type' => 'page',
'post_title' => 'My New Page',
'post_content' => 'some text for the page content',
'post_status' => 'publish',
'post_author' => 1,
'post_slug' => 'my-new-page',
'page_template' => $template_file,
);
$the_page_id = wp_insert_post($the_page);
The template file is valid, and can be used manually. It is registered as an available template with the template_include filter. The code will create the page.
The created page doesn't use the page_template
value but uses the 'default' template from the theme.
The wp_insert_post
docs seem to indicate that the page_template is relative to the current theme folder, although I can't find that specifically. There is this comment to the wp_insert_post
function in the codex: https://developer.wordpress.org/reference/functions/wp_insert_post/#comment-3090 ) which states:
The post_template parameter should be described as well. It should be set with a full file name, such as ‘templatefilename.php’. This would appear to reference the template filename in the theme folder.
How do you specify a template file outside of the theme folder? Specifying the absolute path of the template file (as shown in the first code block) doesn't set the proper template when the page is created. Using just 'mytemplate.php' as the file name also doesn't work.
Added
I tried the answer from @abhick, and that didn't work. Additional info:
The template is created in the plugin folder, and the page_template value of wp_insert_post is set to the absolute location of that template (in the plugin folder). You can see the value in the post_meta for that post, but the template name in post/quickview is still set as default. The plugin template name is seen in the drop-down list.
But I can't get the plugin template's name to show in the template field in the post edit screen. And the plugin template, even though the full file is in the post_meta, is not used.
I can't use a 'dotted' filename as the template file (to get a path relative to the theme folder), as the validate_file function checks for directory traversal.
I could add the template to the theme, but that's not good practice, I'd think. And the user can change the template manually, but I want to avoid that.