To add custom template in page attributes template section you have to first add your template to dropdown and load it in template_include
hook when current page has selected it as current template.
/**
* Add "Custom" template to page attirbute template section.
*/
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {
// Add custom template named template-custom.php to select dropdown
$post_templates['template-custom.php'] = __('Custom');
return $post_templates;
}
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
/**
* Check if current page has our custom template. Try to load
* template from theme directory and if not exist load it
* from root plugin directory.
*/
function wpse_288589_load_plugin_template( $template ) {
if( get_page_template_slug() === 'template-custom.php' ) {
if ( $theme_file = locate_template( array( 'template-custom.php' ) ) ) {
$template = $theme_file;
} else {
$template = plugin_dir_path( __FILE__ ) . 'template-custom.php';
}
}
if($template == '') {
throw new \Exception('No template found');
}
return $template;
}
add_filter( 'template_include', 'wpse_288589_load_plugin_template' );
theme_page_templates
hook is available for page
post type. If you want to add custom template to other post type you must replace page
with your custom post type name e.g. event
post type hook will have a name theme_event_templates
.