Register Page Templates From a Folder Outside the Theme
Adds every PHP file in wp-content/page-templates/ to the page Template menu of classic themes, so custom layouts survive theme switches and updates.
Opens WPIDE on
Code
// Folder that holds the templates.
$wpide_template_dir = WP_CONTENT_DIR . '/page-templates';
$wpide_find_templates = function () use ( $wpide_template_dir ) {
static $found = null;
if ( null !== $found ) {
return $found;
}
$found = array();
foreach ( (array) glob( trailingslashit( $wpide_template_dir ) . '*.php' ) as $file ) {
$data = get_file_data( $file, array( 'name' => 'Template Name' ) );
if ( $data['name'] ) {
$found[ 'wpide/' . basename( $file ) ] = $data['name'];
}
}
return $found;
};
add_filter( 'theme_page_templates', function ( $templates ) use ( $wpide_find_templates ) {
return array_merge( $templates, $wpide_find_templates() );
} );
add_filter( 'template_include', function ( $template ) use ( $wpide_template_dir ) {
if ( ! is_page() ) {
return $template;
}
$chosen = get_page_template_slug( get_queried_object_id() );
if ( 0 !== strpos( (string) $chosen, 'wpide/' ) ) {
return $template;
}
$file = trailingslashit( $wpide_template_dir ) . basename( $chosen );
return is_readable( $file ) ? $file : $template;
}, 99 );
Notes
Each file needs a "Template Name: ..." header comment like a theme template; block themes use the Site Editor for templates instead.
How to add this snippet
- Install WPIDE on your WordPress site (it is free) and open Code Snippets.
- Use snippet above adds it from the library in one click. Or copy the code into a new snippet with the same code type.
- It is added inactive: review the code and settings, then switch it on.