search_theme_directories() – Searches all registered theme directories for complete and valid themes.

You appear to be a bot. Output may be restricted

Description

Searches all registered theme directories for complete and valid themes.

Usage

$array|false = search_theme_directories( $force );

Parameters

$force
( bool ) optional – Optional. Whether to force a new directory scan. Default false.

Returns

array|false Valid themes found on success, false on failure.

Source

File name: wordpress/wp-includes/theme.php
Lines:

1 to 100 of 131
function search_theme_directories( $force = false ) {
  global $wp_theme_directories;
  static $found_themes = null;

  if ( empty( $wp_theme_directories ) ) {
    return false;
  }

  if ( ! $force && isset( $found_themes ) ) {
    return $found_themes;
  }

  $found_themes = array();

  $wp_theme_directories = (array) $wp_theme_directories;
  $relative_theme_roots = array();

  /*
	 * Set up maybe-relative, maybe-absolute array of theme directories.
	 * We always want to return absolute, but we need to cache relative
	 * to use in get_theme_root().
	 */
  foreach ( $wp_theme_directories as $theme_root ) {
    if ( 0 === strpos( $theme_root, WP_CONTENT_DIR ) ) {
      $relative_theme_roots[ str_replace( WP_CONTENT_DIR, '', $theme_root ) ] = $theme_root;
    } else {
      $relative_theme_roots[ $theme_root ] = $theme_root;
    }
  }

  
/**
 * Filters whether to get the cache of the registered theme directories.
 *
 * @since 3.4.0
 *
 * @param bool   $cache_expiration Whether to get the cache of the theme directories. Default false.
 * @param string $context          The class or function name calling the filter.
 */
  $cache_expiration = apply_filters( 'wp_cache_themes_persistently', false, 'search_theme_directories' );

  if ( $cache_expiration ) {
    $cached_roots = get_site_transient( 'theme_roots' );
    if ( is_array( $cached_roots ) ) {
      foreach ( $cached_roots as $theme_dir => $theme_root ) {
        // A cached theme root is no longer around, so skip it.
        if ( ! isset( $relative_theme_roots[ $theme_root ] ) ) {
          continue;
        }
        $found_themes[ $theme_dir ] = array(
          'theme_file' => $theme_dir . '/style.css',
          'theme_root' => $relative_theme_roots[ $theme_root ], // Convert relative to absolute.
        );
      }
      return $found_themes;
    }
    if ( ! is_int( $cache_expiration ) ) {
      $cache_expiration = 30 * MINUTE_IN_SECONDS;
    }
  } else {
    $cache_expiration = 30 * MINUTE_IN_SECONDS;
  }

  /* Loop the registered theme directories and extract all themes */
  foreach ( $wp_theme_directories as $theme_root ) {

    // Start with directories in the root of the active theme directory.
    $dirs = @ scandir( $theme_root );
    if ( ! $dirs ) {
      trigger_error( "$theme_root is not readable", E_USER_NOTICE );
      continue;
    }
    foreach ( $dirs as $dir ) {
      if ( ! is_dir( $theme_root . '/' . $dir ) || '.' === $dir[0] || 'CVS' === $dir ) {
        continue;
      }
      if ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) {
        // wp-content/themes/a-single-theme
        // wp-content/themes is $theme_root, a-single-theme is $dir.
        $found_themes[ $dir ] = array(
          'theme_file' => $dir . '/style.css',
          'theme_root' => $theme_root,
        );
      } else {
        $found_theme = false;
        // wp-content/themes/a-folder-of-themes/*
        // wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs.
        $sub_dirs = @ scandir( $theme_root . '/' . $dir );
        if ( ! $sub_dirs ) {
          trigger_error( "$theme_root/$dir is not readable", E_USER_NOTICE );
          continue;
        }
        foreach ( $sub_dirs as $sub_dir ) {
          if ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) || '.' === $dir[0] || 'CVS' === $dir ) {
            continue;
          }
          if ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) ) {
            continue;
          }
          $found_themes[ $dir . '/' . $sub_dir ] = array(
            'theme_file' => $dir . '/' . $sub_dir . '/style.css',
 

 View on GitHub View on Trac