Always return an absolute path in get_raw_theme_root() and get_theme_roots().

These functions were changed in [15641] to avoid any calculations when only one theme directory is registered. However, the short-circuit ended up being relative to WP_CONTENT_DIR, rather than absolute. This broke situations where theme roots are outside the content directory (technically allowed), and made return values inconsistent, as when multiple roots were registered, absolute paths were always returned.

fixes #17597. see #20103. see #14911.



git-svn-id: http://svn.automattic.com/wordpress/trunk@20001 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
nacin 2012-02-28 01:28:56 +00:00
parent d910c26182
commit 08e57bfca5
1 changed files with 19 additions and 23 deletions

View File

@ -475,7 +475,7 @@ function get_theme_roots() {
global $wp_theme_directories;
if ( count($wp_theme_directories) <= 1 )
return '/themes';
return get_theme_root();
$theme_roots = get_site_transient( 'theme_roots' );
if ( false === $theme_roots ) {
@ -547,21 +547,18 @@ function get_current_theme() {
* @param string $directory Either the full filesystem path to a theme folder or a folder within WP_CONTENT_DIR
* @return bool
*/
function register_theme_directory( $directory) {
function register_theme_directory( $directory ) {
global $wp_theme_directories;
/* If this folder does not exist, return and do not register */
if ( !file_exists( $directory ) )
/* Try prepending as the theme directory could be relative to the content directory */
$registered_directory = WP_CONTENT_DIR . '/' . $directory;
else
$registered_directory = $directory;
if ( ! file_exists( $directory ) ) {
// Try prepending as the theme directory could be relative to the content directory
$directory = WP_CONTENT_DIR . '/' . $directory;
// If this directory does not exist, return and do not register
if ( ! file_exists( $directory ) )
return false;
}
/* If this folder does not exist, return and do not register */
if ( !file_exists( $registered_directory ) )
return false;
$wp_theme_directories[] = $registered_directory;
$wp_theme_directories[] = $directory;
return true;
}
@ -660,14 +657,10 @@ function search_theme_directories() {
* @return string Theme path.
*/
function get_theme_root( $stylesheet_or_template = false ) {
if ( $stylesheet_or_template ) {
if ( $theme_root = get_raw_theme_root($stylesheet_or_template) )
$theme_root = WP_CONTENT_DIR . $theme_root;
else
$theme_root = WP_CONTENT_DIR . '/themes';
} else {
if ( $stylesheet_or_template && $theme_root = get_raw_theme_root( $stylesheet_or_template ) )
$theme_root = $theme_root;
else
$theme_root = WP_CONTENT_DIR . '/themes';
}
return apply_filters( 'theme_root', $theme_root );
}
@ -685,7 +678,7 @@ function get_theme_root( $stylesheet_or_template = false ) {
function get_theme_root_uri( $stylesheet_or_template = false ) {
if ( $stylesheet_or_template ) {
if ( $theme_root = get_raw_theme_root($stylesheet_or_template) )
$theme_root_uri = content_url( $theme_root );
$theme_root_uri = content_url( str_replace( WP_CONTENT_DIR, '', $theme_root ) );
else
$theme_root_uri = content_url( 'themes' );
} else {
@ -696,10 +689,13 @@ function get_theme_root_uri( $stylesheet_or_template = false ) {
}
/**
* Get the raw theme root relative to the content directory with no filters applied.
* Get the raw theme root with no filters applied.
*
* @since 3.1.0
*
* Before 3.4.0, this incorrectly returned a path relative to the content directory ("/themes") when
* only one theme directory was registered. Absolute paths are now always returned.
*
* @param string $stylesheet_or_template The stylesheet or template name of the theme
* @return string Theme root
*/
@ -707,7 +703,7 @@ function get_raw_theme_root( $stylesheet_or_template, $no_cache = false ) {
global $wp_theme_directories;
if ( count($wp_theme_directories) <= 1 )
return '/themes';
return WP_CONTENT_DIR . '/themes';
$theme_root = false;