<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[20001] trunk/wp-includes/theme.php: Always return an absolute path in get_raw_theme_root() and get_theme_roots().</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg > ul, #logmsg > ol { margin-left: 0; margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://core.trac.wordpress.org/changeset/20001">20001</a></dd>
<dt>Author</dt> <dd>nacin</dd>
<dt>Date</dt> <dd>2012-02-28 01:28:56 +0000 (Tue, 28 Feb 2012)</dd>
</dl>

<h3>Log Message</h3>
<pre>Always return an absolute path in get_raw_theme_root() and get_theme_roots().

These functions were changed in <a href="http://core.trac.wordpress.org/changeset/15641">[15641]</a> 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 <a href="http://core.trac.wordpress.org/ticket/17597">#17597</a>. see <a href="http://core.trac.wordpress.org/ticket/20103">#20103</a>. see <a href="http://core.trac.wordpress.org/ticket/14911">#14911</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpincludesthemephp">trunk/wp-includes/theme.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpincludesthemephp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/theme.php (20000 => 20001)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/theme.php        2012-02-27 19:46:52 UTC (rev 20000)
+++ trunk/wp-includes/theme.php        2012-02-28 01:28:56 UTC (rev 20001)
</span><span class="lines">@@ -475,7 +475,7 @@
</span><span class="cx">         global $wp_theme_directories;
</span><span class="cx"> 
</span><span class="cx">         if ( count($wp_theme_directories) &lt;= 1 )
</span><del>-                return '/themes';
</del><ins>+                return get_theme_root();
</ins><span class="cx"> 
</span><span class="cx">         $theme_roots = get_site_transient( 'theme_roots' );
</span><span class="cx">         if ( false === $theme_roots ) {
</span><span class="lines">@@ -547,22 +547,19 @@
</span><span class="cx">  * @param string $directory Either the full filesystem path to a theme folder or a folder within WP_CONTENT_DIR
</span><span class="cx">  * @return bool
</span><span class="cx">  */
</span><del>-function register_theme_directory( $directory) {
</del><ins>+function register_theme_directory( $directory ) {
</ins><span class="cx">         global $wp_theme_directories;
</span><span class="cx"> 
</span><del>-        /* 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;
</del><ins>+        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;
+        }
</ins><span class="cx"> 
</span><del>-        /* If this folder does not exist, return and do not register */
-        if ( !file_exists( $registered_directory ) )
-                return false;
</del><ins>+        $wp_theme_directories[] = $directory;
</ins><span class="cx"> 
</span><del>-        $wp_theme_directories[] = $registered_directory;
-
</del><span class="cx">         return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -660,14 +657,10 @@
</span><span class="cx">  * @return string Theme path.
</span><span class="cx">  */
</span><span class="cx"> function get_theme_root( $stylesheet_or_template = false ) {
</span><del>-        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 {
</del><ins>+        if ( $stylesheet_or_template &amp;&amp; $theme_root = get_raw_theme_root( $stylesheet_or_template ) )
+                $theme_root = $theme_root;
+        else
</ins><span class="cx">                 $theme_root = WP_CONTENT_DIR . '/themes';
</span><del>-        }
</del><span class="cx"> 
</span><span class="cx">         return apply_filters( 'theme_root', $theme_root );
</span><span class="cx"> }
</span><span class="lines">@@ -685,7 +678,7 @@
</span><span class="cx"> function get_theme_root_uri( $stylesheet_or_template = false ) {
</span><span class="cx">         if ( $stylesheet_or_template ) {
</span><span class="cx">                 if ( $theme_root = get_raw_theme_root($stylesheet_or_template) )
</span><del>-                        $theme_root_uri = content_url( $theme_root );
</del><ins>+                        $theme_root_uri = content_url( str_replace( WP_CONTENT_DIR, '', $theme_root ) );
</ins><span class="cx">                 else
</span><span class="cx">                         $theme_root_uri = content_url( 'themes' );
</span><span class="cx">         } else {
</span><span class="lines">@@ -696,10 +689,13 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><del>- * Get the raw theme root relative to the content directory with no filters applied.
</del><ins>+ * Get the raw theme root with no filters applied.
</ins><span class="cx">  *
</span><span class="cx">  * @since 3.1.0
</span><span class="cx">  *
</span><ins>+ * Before 3.4.0, this incorrectly returned a path relative to the content directory (&quot;/themes&quot;) when
+ * only one theme directory was registered. Absolute paths are now always returned.
+ *
</ins><span class="cx">  * @param string $stylesheet_or_template The stylesheet or template name of the theme
</span><span class="cx">  * @return string Theme root
</span><span class="cx">  */
</span><span class="lines">@@ -707,7 +703,7 @@
</span><span class="cx">         global $wp_theme_directories;
</span><span class="cx"> 
</span><span class="cx">         if ( count($wp_theme_directories) &lt;= 1 )
</span><del>-                return '/themes';
</del><ins>+                return WP_CONTENT_DIR . '/themes';
</ins><span class="cx"> 
</span><span class="cx">         $theme_root = false;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>