wp_get_themes( array $args = array() ): WP_Theme[]

Returns an array of WP_Theme objects based on the arguments.

Description

Despite advances over get_themes() , this function is quite expensive, and grows linearly with additional themes. Stick to wp_get_theme() if possible.

Parameters

$argsarrayoptional
The search arguments.
  • errors mixed
    True to return themes with errors, false to return themes without errors, null to return all themes.
    Default false.
  • allowed mixed
    (Multisite) True to return only allowed themes for a site.
    False to return only disallowed themes for a site.
    'site' to return only site-allowed themes.
    'network' to return only network-allowed themes.
    Null to return all themes. Default null.
  • blog_id int
    (Multisite) The blog ID used to calculate which themes are allowed. Default 0, synonymous for the current blog.

Default:array()

Return

WP_Theme[] Array of WP_Theme objects.

Source

function wp_get_themes( $args = array() ) {
	global $wp_theme_directories;

	$defaults = array(
		'errors'  => false,
		'allowed' => null,
		'blog_id' => 0,
	);
	$args     = wp_parse_args( $args, $defaults );

	$theme_directories = search_theme_directories();

	if ( is_array( $wp_theme_directories ) && count( $wp_theme_directories ) > 1 ) {
		/*
		 * Make sure the active theme wins out, in case search_theme_directories() picks the wrong
		 * one in the case of a conflict. (Normally, last registered theme root wins.)
		 */
		$current_theme = get_stylesheet();
		if ( isset( $theme_directories[ $current_theme ] ) ) {
			$root_of_current_theme = get_raw_theme_root( $current_theme );
			if ( ! in_array( $root_of_current_theme, $wp_theme_directories, true ) ) {
				$root_of_current_theme = WP_CONTENT_DIR . $root_of_current_theme;
			}
			$theme_directories[ $current_theme ]['theme_root'] = $root_of_current_theme;
		}
	}

	if ( empty( $theme_directories ) ) {
		return array();
	}

	if ( is_multisite() && null !== $args['allowed'] ) {
		$allowed = $args['allowed'];
		if ( 'network' === $allowed ) {
			$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_network() );
		} elseif ( 'site' === $allowed ) {
			$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_site( $args['blog_id'] ) );
		} elseif ( $allowed ) {
			$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );
		} else {
			$theme_directories = array_diff_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );
		}
	}

	$themes         = array();
	static $_themes = array();

	foreach ( $theme_directories as $theme => $theme_root ) {
		if ( isset( $_themes[ $theme_root['theme_root'] . '/' . $theme ] ) ) {
			$themes[ $theme ] = $_themes[ $theme_root['theme_root'] . '/' . $theme ];
		} else {
			$themes[ $theme ] = new WP_Theme( $theme, $theme_root['theme_root'] );

			$_themes[ $theme_root['theme_root'] . '/' . $theme ] = $themes[ $theme ];
		}
	}

	if ( null !== $args['errors'] ) {
		foreach ( $themes as $theme => $wp_theme ) {
			if ( $wp_theme->errors() != $args['errors'] ) {
				unset( $themes[ $theme ] );
			}
		}
	}

	return $themes;
}

Changelog

VersionDescription
3.4.0Introduced.

User Contributed Notes

  1. Skip to note 2 content

    Example:

    <?php
    $all_themes = wp_get_themes();
    
    print_r($all_themes);

    The result will be:

    ["twentyseventeen"]=>
      object(WP_Theme)#1365 (12) {
        ["update"]=>
        bool(false)
        ["theme_root":"WP_Theme":private]=>
        string(59) "/path/to/site/wp-content/themes"
        ["headers":"WP_Theme":private]=>
        array(11) {
          ["Name"]=>
          string(16) "Twenty Seventeen"
          ["ThemeURI"]=>
          string(45) "https://wordpress.org/themes/twentyseventeen/&quot;
          ["Description"]=>
          string(450) "Twenty Seventeen brings your site to life with header video and immersive featured images. With a focus on business sites, it features multiple sections on the front page as well as widgets, navigation and social menus, a logo, and more. Personalize its asymmetrical grid with a custom color scheme and showcase your multimedia content with post formats. Our default theme for 2017 works great in many languages, for any abilities, and on any device."
          ["Author"]=>
          string(18) "the WordPress team"
          ["AuthorURI"]=>
          string(22) "https://wordpress.org/&quot;
          ["Version"]=>
          string(3) "1.3"
          ["Template"]=>
          string(0) ""
          ["Status"]=>
          string(0) ""
          ["Tags"]=>
          string(281) "one-column, two-columns, right-sidebar, flexible-header, accessibility-ready, custom-colors, custom-header, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, post-formats, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready"
          ["TextDomain"]=>
          string(15) "twentyseventeen"
          ["DomainPath"]=>
          string(0) ""
        }
        ["headers_sanitized":"WP_Theme":private]=>
        NULL
        ["name_translated":"WP_Theme":private]=>
        NULL
        ["errors":"WP_Theme":private]=>
        NULL
        ["stylesheet":"WP_Theme":private]=>
        string(15) "twentyseventeen"
        ["template":"WP_Theme":private]=>
        string(15) "twentyseventeen"
        ["parent":"WP_Theme":private]=>
        NULL
        ["theme_root_uri":"WP_Theme":private]=>
        NULL
        ["textdomain_loaded":"WP_Theme":private]=>
        NULL
        ["cache_hash":"WP_Theme":private]=>
        string(32) ""
      }

You must log in before being able to contribute a note or feedback.