search_theme_directories() │ WP 2.9.0
Знаходить усі зареєстровані директорії тем з каталогу themes.
Працює на основі глобальної змінної $wp_theme_directories .
Повертає
Массив|false
. Масив даних папок тем.
Використання
search_theme_directories( $force );
-
$force
(логічний) -
Ставимо true, якщо необхідно запустити нове сканування директорій.
Типово: false
Приклади
#1 Отримаємо дані папок всіх тем
$theme_dirs = search_theme_directories();
print_r ($ theme_dirs);
/* Виведе:
Array
(
[ShoppingTheme] => Array
(
[theme_file] => ShoppingTheme/style.css
[theme_root] => C:/sites/example.com/www/wp-content/themes
)
[cara] => Array
(
[theme_file] => cara/style.css
[theme_root] => C:/sites/example.com/www/wp-content/themes
)
[stargazer] => Array
(
[theme_file] => stargazer/style.css
[theme_root] => C:/sites/example.com/www/wp-content/themes
)
[twentyeleven] => Array
(
[theme_file] => twentyeleven/style.css
[theme_root] => C:/sites/example.com/www/wp-content/themes
)
[twentyfourteen] => Array
(
[theme_file] => twentyfourteen/style.css
[theme_root] => C:/sites/example.com/www/wp-content/themes
)
)
*/
нотатки
- Global. Масив. $wp_theme_directories
список змін
Код search_theme_directories() search theme directories WP 6.0.2
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 the directory. Default false.
* @param string $context class або 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, themes there є $sub_dirs.
$sub_dirs = @ scandir( $theme_root . '/' . $dir );
if (! $sub_dirs) {
trigger_error( "$theme_root/$dir не 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',
'theme_root' => $theme_root,
);
$found_theme = true;
}
// Never mind the above, it's just a theme missing a style.css.
// Return it; WP_Theme буде кинути error.
if ( ! $found_theme ) {
$found_themes[ $dir ] = array(
'theme_file' => $dir . '/style.css',
'theme_root' => $theme_root,
);
}
}
}
}
asort($ found_themes);
$theme_roots = array();
$relative_theme_roots = array_flip( $relative_theme_roots );
foreach ( $found_themes as $theme_dir => $theme_data ) {
$theme_roots[ $theme_dir ] = $relative_theme_roots[ $theme_data['theme_root'] ]; // Convert absolute to relative.
}
if ( get_site_transient( 'theme_roots' ) != $theme_roots ) {
set_site_transient( 'theme_roots', $theme_roots, $cache_expiration);
}
return $found_themes;
}
Зв’язані функції