WP_Theme Class Reference
The WP_Theme class encapsulates theme data and provides methods for accessing theme information, files, and configuration.
Class Overview
final class WP_Theme implements ArrayAccess {
// Properties
public bool $update = false;
// File Headers
private static array $file_headers = array(
'Name' => 'Theme Name',
'ThemeURI' => 'Theme URI',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI',
'Version' => 'Version',
'Template' => 'Template',
'Status' => 'Status',
'Tags' => 'Tags',
'TextDomain' => 'Text Domain',
'DomainPath' => 'Domain Path',
'RequiresWP' => 'Requires at least',
'RequiresPHP' => 'Requires PHP',
'UpdateURI' => 'Update URI',
);
}Constructor
public function __construct(
string $theme_dir,
string $theme_root,
WP_Theme|null $_child = null
)Parameters:
$theme_dir– Directory name of the theme within theme root.$theme_root– Absolute path to the theme root directory.$_child– For internal use: child theme passed for parent validation.
Example:
// Create theme object
$theme = new WP_Theme( 'twentytwentyfour', WP_CONTENT_DIR . '/themes' );
// Recommended: use wp_get_theme() instead
$theme = wp_get_theme( 'twentytwentyfour' );Getting Theme Headers
get()
Gets a raw, unformatted theme header value.
public function get( string $header ): string|array|falseAvailable Headers:
| Header | Description |
|---|---|
Name | Theme name |
ThemeURI | Theme homepage URL |
Description | Theme description |
Author | Author name |
AuthorURI | Author website |
Version | Theme version |
Template | Parent theme directory (child themes only) |
Status | Theme status (usually ‘publish’) |
Tags | Array of tags |
TextDomain | Translation text domain |
DomainPath | Path to translations directory |
RequiresWP | Minimum WordPress version |
RequiresPHP | Minimum PHP version |
UpdateURI | Custom update server URI |
Examples:
$theme = wp_get_theme();
// Get basic info
$name = $theme->get( 'Name' ); // 'My Theme'
$version = $theme->get( 'Version' ); // '1.0.0'
$author = $theme->get( 'Author' ); // 'Developer Name'
// Get requirements
$requires_wp = $theme->get( 'RequiresWP' ); // '6.0'
$requires_php = $theme->get( 'RequiresPHP' ); // '8.0'
// Get tags (returns array)
$tags = $theme->get( 'Tags' );
// array( 'blog', 'two-columns', 'responsive' )
// Returns false if header doesn't exist
$unknown = $theme->get( 'NonExistent' ); // falsedisplay()
Gets a theme header formatted and translated for display.
public function display(
string $header,
bool $markup = true,
bool $translate = true
): string|array|falseParameters:
$header– Header name.$markup– Whether to apply markup (links, formatting).$translate– Whether to translate the value.
Examples:
$theme = wp_get_theme();
// With markup and translation (default)
$author = $theme->display( 'Author' );
// Returns: '<a href="https://author.com">Author Name</a>'
// Without markup
$author = $theme->display( 'Author', false );
// Returns: 'Author Name'
// Tags with markup become comma-separated string
$tags = $theme->display( 'Tags' );
// Returns: 'Blog, Two Columns, Responsive'
// Tags without markup return array
$tags = $theme->display( 'Tags', false );
// Returns: array( 'Blog', 'Two Columns', 'Responsive' )Directory & Path Methods
get_stylesheet()
Gets the stylesheet directory name.
public function get_stylesheet(): stringFor child themes, this is the child theme directory. For parent themes, same as get_template().
$theme = wp_get_theme();
echo $theme->get_stylesheet(); // 'my-child-theme'get_template()
Gets the template directory name.
public function get_template(): stringFor child themes, returns the parent theme directory. For parent themes, same as get_stylesheet().
$theme = wp_get_theme();
echo $theme->get_template(); // 'parent-theme'get_stylesheet_directory()
Gets the absolute path to the stylesheet directory.
public function get_stylesheet_directory(): string$path = $theme->get_stylesheet_directory();
// /var/www/html/wp-content/themes/my-themeget_template_directory()
Gets the absolute path to the template directory.
public function get_template_directory(): string$path = $theme->get_template_directory();
// For child: /var/www/html/wp-content/themes/parent-theme
// For parent: /var/www/html/wp-content/themes/my-themeget_stylesheet_directory_uri()
Gets the URL to the stylesheet directory.
public function get_stylesheet_directory_uri(): string$uri = $theme->get_stylesheet_directory_uri();
// https://example.com/wp-content/themes/my-themeget_template_directory_uri()
Gets the URL to the template directory.
public function get_template_directory_uri(): stringget_theme_root()
Gets the absolute path to the theme root.
public function get_theme_root(): string$root = $theme->get_theme_root();
// /var/www/html/wp-content/themesget_theme_root_uri()
Gets the URL to the theme root.
public function get_theme_root_uri(): stringget_file_path()
Gets path to a file in the theme (checks child before parent).
public function get_file_path( string $file = '' ): string$theme = wp_get_theme();
// Get path to theme root
$path = $theme->get_file_path();
// Get path to specific file
$config = $theme->get_file_path( 'inc/config.php' );
// Checks child theme first, then parentTheme State Methods
exists()
Checks if the theme exists.
public function exists(): boolA theme with errors still "exists" unless the error is ‘theme_not_found’.
$theme = wp_get_theme( 'maybe-theme' );
if ( $theme->exists() ) {
echo 'Theme found!';
}errors()
Gets theme errors.
public function errors(): WP_Error|falseError Codes:
| Code | Description |
|---|---|
theme_not_found | Theme directory doesn’t exist |
theme_no_stylesheet | style.css missing |
theme_stylesheet_not_readable | style.css not readable |
theme_no_index | Missing index.php or templates/index.html |
theme_no_parent | Parent theme not found |
theme_parent_invalid | Invalid parent theme |
theme_child_invalid | Theme references itself as parent |
theme_paused | Theme paused due to fatal error |
theme_wp_incompatible | WordPress version too low |
theme_php_incompatible | PHP version too low |
theme_wp_php_incompatible | Both versions too low |
$theme = wp_get_theme( 'broken-theme' );
if ( $errors = $theme->errors() ) {
foreach ( $errors->get_error_codes() as $code ) {
echo "Error: $code - " . $errors->get_error_message( $code );
}
}parent()
Gets the parent theme object.
public function parent(): WP_Theme|false$theme = wp_get_theme();
if ( $parent = $theme->parent() ) {
echo 'Parent theme: ' . $parent->get( 'Name' );
} else {
echo 'This is not a child theme';
}is_block_theme()
Checks if this is a block-based theme.
public function is_block_theme(): bool$theme = wp_get_theme();
if ( $theme->is_block_theme() ) {
echo 'This is a block theme';
}A block theme requires templates/index.html or deprecated block-templates/index.html.
is_allowed()
Checks if theme is allowed (multisite).
public function is_allowed( string $check = 'both', int $blog_id = null ): boolParameters:
$check– ‘network’, ‘site’, or ‘both’$blog_id– Blog ID for site-level check
// On multisite
if ( $theme->is_allowed() ) {
echo 'Theme is allowed on this site';
}
if ( $theme->is_allowed( 'network' ) ) {
echo 'Theme is network-enabled';
}File & Template Methods
get_files()
Gets files in the theme directory.
public function get_files(
string|array|null $type = null,
int $depth = 0,
bool $search_parent = false
): arrayParameters:
$type– File extension(s) to find, or null for all.$depth– How deep to search (0 = flat, -1 = infinite).$search_parent– Include parent theme files.
Returns: Array keyed by relative path with absolute path values.
$theme = wp_get_theme();
// Get PHP files in root directory
$php_files = $theme->get_files( 'php' );
// Get all PHP files recursively
$all_php = $theme->get_files( 'php', -1 );
// Get CSS and JS files
$assets = $theme->get_files( array( 'css', 'js' ), -1 );
// Include parent theme files
$all_files = $theme->get_files( 'php', -1, true );
// Result structure:
// array(
// 'index.php' => '/path/to/theme/index.php',
// 'inc/functions.php' => '/path/to/theme/inc/functions.php',
// )get_post_templates()
Gets all post templates defined by the theme.
public function get_post_templates(): arrayReturns array keyed by post type, then by template file.
$templates = $theme->get_post_templates();
/*
array(
'page' => array(
'templates/full-width.php' => 'Full Width',
'templates/landing.php' => 'Landing Page',
),
'post' => array(
'templates/featured.php' => 'Featured Post',
),
)
*/get_page_templates()
Gets templates for a specific post type.
public function get_page_templates(
WP_Post|null $post = null,
string $post_type = 'page'
): array$page_templates = $theme->get_page_templates( null, 'page' );
$post_templates = $theme->get_page_templates( null, 'post' );get_screenshot()
Gets the theme screenshot.
public function get_screenshot( string $uri = 'uri' ): string|falseParameters:
$uri– ‘uri’ for absolute URL, ‘relative’ for relative path.
Supported formats: png, gif, jpg, jpeg, webp, avif
$screenshot = $theme->get_screenshot();
// https://example.com/wp-content/themes/my-theme/screenshot.png
$relative = $theme->get_screenshot( 'relative' );
// screenshot.pngBlock Theme Methods
get_block_template_folders()
Gets the block template directory names.
public function get_block_template_folders(): array$folders = $theme->get_block_template_folders();
/*
array(
'wp_template' => 'templates', // or 'block-templates' (deprecated)
'wp_template_part' => 'parts', // or 'block-template-parts' (deprecated)
)
*/get_block_patterns()
Gets block patterns from the theme’s patterns directory.
public function get_block_patterns(): array$patterns = $theme->get_block_patterns();
/*
array(
'hero.php' => array(
'title' => 'Hero Section',
'slug' => 'theme-slug/hero',
'categories' => array( 'featured' ),
'keywords' => array( 'hero', 'banner' ),
'blockTypes' => array( 'core/cover' ),
'postTypes' => array( 'page' ),
'viewportWidth' => 1200,
'inserter' => true,
),
)
*/Cache Methods
cache_delete()
Clears the theme cache.
public function cache_delete(): voidForces re-reading of theme data from disk on next access.
$theme = wp_get_theme();
$theme->cache_delete();delete_pattern_cache()
Clears the block pattern cache.
public function delete_pattern_cache(): voidStatic Methods
get_core_default_theme()
Gets the latest installed WordPress default theme.
public static function get_core_default_theme(): WP_Theme|false$default = WP_Theme::get_core_default_theme();
if ( $default ) {
echo 'Latest default: ' . $default->get( 'Name' );
}get_allowed()
Gets themes allowed for a site (multisite).
public static function get_allowed( int $blog_id = null ): array$allowed = WP_Theme::get_allowed();
// array( 'theme-slug' => true, 'another-theme' => true )get_allowed_on_network()
Gets themes allowed network-wide.
public static function get_allowed_on_network(): arrayget_allowed_on_site()
Gets themes allowed on a specific site.
public static function get_allowed_on_site( int $blog_id = null ): arraynetwork_enable_theme()
Enables theme(s) network-wide.
public static function network_enable_theme( string|array $stylesheets ): voidWP_Theme::network_enable_theme( 'twentytwentyfour' );
WP_Theme::network_enable_theme( array( 'theme-one', 'theme-two' ) );network_disable_theme()
Disables theme(s) network-wide.
public static function network_disable_theme( string|array $stylesheets ): voidsort_by_name()
Sorts themes array by name.
public static function sort_by_name( array &$themes ): void$themes = wp_get_themes();
WP_Theme::sort_by_name( $themes );ArrayAccess Interface
WP_Theme implements ArrayAccess for backward compatibility:
$theme = wp_get_theme();
// These work like get_themes() return format
echo $theme['Name']; // Theme name
echo $theme['Version']; // Version
echo $theme['Author']; // Author with link
echo $theme['Author Name']; // Author without link
echo $theme['Author URI']; // Author URI
echo $theme['Description']; // Description
echo $theme['Template']; // Template directory
echo $theme['Stylesheet']; // Stylesheet directory
echo $theme['Template Dir']; // Template directory path
echo $theme['Stylesheet Dir']; // Stylesheet directory path
echo $theme['Screenshot']; // Screenshot relative path
echo $theme['Tags']; // Tags array
echo $theme['Theme Root']; // Theme root path
echo $theme['Theme Root URI']; // Theme root URL
echo $theme['Parent Theme']; // Parent theme nameMagic Properties
These properties are available via __get():
$theme = wp_get_theme();
echo $theme->name; // Theme name
echo $theme->title; // Same as name
echo $theme->version; // Version
echo $theme->parent_theme; // Parent theme name
echo $theme->template_dir; // Template directory path
echo $theme->stylesheet_dir; // Stylesheet directory path
echo $theme->template; // Template directory name
echo $theme->stylesheet; // Stylesheet directory name
echo $theme->screenshot; // Screenshot relative path
echo $theme->description; // Description (translated)
echo $theme->author; // Author (translated)
echo $theme->tags; // Tags array
echo $theme->theme_root; // Theme root path
echo $theme->theme_root_uri; // Theme root URLDefault Themes
WordPress maintains a list of default themes:
private static $default_themes = array(
'classic' => 'WordPress Classic',
'default' => 'WordPress Default',
'twentyten' => 'Twenty Ten',
'twentyeleven' => 'Twenty Eleven',
'twentytwelve' => 'Twenty Twelve',
'twentythirteen' => 'Twenty Thirteen',
'twentyfourteen' => 'Twenty Fourteen',
'twentyfifteen' => 'Twenty Fifteen',
'twentysixteen' => 'Twenty Sixteen',
'twentyseventeen' => 'Twenty Seventeen',
'twentynineteen' => 'Twenty Nineteen',
'twentytwenty' => 'Twenty Twenty',
'twentytwentyone' => 'Twenty Twenty-One',
'twentytwentytwo' => 'Twenty Twenty-Two',
'twentytwentythree' => 'Twenty Twenty-Three',
'twentytwentyfour' => 'Twenty Twenty-Four',
'twentytwentyfive' => 'Twenty Twenty-Five',
);String Conversion
Converting to string returns the translated theme name:
$theme = wp_get_theme();
echo $theme; // Outputs: "My Theme Name"
echo (string) $theme; // SameComplete Usage Example
function analyze_theme( $stylesheet = '' ) {
$theme = wp_get_theme( $stylesheet );
if ( ! $theme->exists() ) {
return new WP_Error( 'theme_not_found', 'Theme does not exist' );
}
if ( $errors = $theme->errors() ) {
return $errors;
}
$info = array(
'name' => $theme->get( 'Name' ),
'version' => $theme->get( 'Version' ),
'author' => $theme->display( 'Author', false ),
'description' => $theme->get( 'Description' ),
'tags' => $theme->get( 'Tags' ),
'is_block' => $theme->is_block_theme(),
'is_child' => (bool) $theme->parent(),
'requires_wp' => $theme->get( 'RequiresWP' ),
'requires_php'=> $theme->get( 'RequiresPHP' ),
'screenshot' => $theme->get_screenshot(),
'directory' => $theme->get_stylesheet_directory(),
);
if ( $theme->parent() ) {
$info['parent'] = $theme->parent()->get( 'Name' );
}
if ( $theme->is_block_theme() ) {
$info['patterns'] = count( $theme->get_block_patterns() );
$info['template_folders'] = $theme->get_block_template_folders();
}
return $info;
}
// Usage
$info = analyze_theme( 'twentytwentyfour' );
print_r( $info );