<!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>[BuddyPress][6964] trunk/bp-core/bp-core-avatars.php: Introduce bp_core_get_upload_dir().</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 { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { 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://buddypress.trac.wordpress.org/changeset/6964">6964</a></dd>
<dt>Author</dt> <dd>r-a-y</dd>
<dt>Date</dt> <dd>2013-04-30 01:06:41 +0000 (Tue, 30 Apr 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Introduce bp_core_get_upload_dir().

This function fetches data from the BP root blog's upload directory.

Handy for multisite instances because all uploads are made on the BP root
blog and we need to query the BP root blog for the upload directory data.

This ensures that we only need to use switch_to_blog() once to get what we
need.

Use this function in bp_core_avatar_upload_path() and bp_core_avatar_url().

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/4948">#4948</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpcorebpcoreavatarsphp">trunk/bp-core/bp-core-avatars.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpcorebpcoreavatarsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/bp-core-avatars.php (6963 => 6964)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/bp-core-avatars.php        2013-04-30 00:51:09 UTC (rev 6963)
+++ trunk/bp-core/bp-core-avatars.php   2013-04-30 01:06:41 UTC (rev 6964)
</span><span class="lines">@@ -783,52 +783,110 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><del>- * bp_core_avatar_upload_path()
</del><ins>+ * Fetches data from the BP root blog's upload directory.
</ins><span class="cx">  *
</span><del>- * Returns the absolute upload path for the WP installation
</del><ins>+ * Handy for multisite instances because all uploads are made on the BP root
+ * blog and we need to query the BP root blog for the upload directory data.
</ins><span class="cx">  *
</span><del>- * @uses wp_upload_dir To get upload directory info
- * @return string Absolute path to WP upload directory
</del><ins>+ * This function ensures that we only need to use {@link switch_to_blog()}
+ * once to get what we need.
+ *
+ * @since BuddyPress (1.8)
+ *
+ * @uses wp_upload_dir()
+ *
+ * @param string $type The variable we want to return from the $bp->avatars object.
+ *  Only 'upload_path' and 'url' are supported.
+ * @return string
</ins><span class="cx">  */
</span><del>-function bp_core_avatar_upload_path() {
</del><ins>+function bp_core_get_upload_dir( $type = 'upload_path' ) {
</ins><span class="cx">   $bp = buddypress();
</span><span class="cx"> 
</span><ins>+       switch ( $type ) {
+               case 'upload_path' :
+                       $constant = 'BP_AVATAR_UPLOAD_PATH';
+                       $key      = 'basedir';
+
+                       break;
+
+               case 'url' :
+                       $constant = 'BP_AVATAR_URL';
+                       $key      = 'baseurl';
+
+                       break;
+
+               default :
+                       return false;
+
+                       break;
+       }
+
</ins><span class="cx">   // See if the value has already been calculated and stashed in the $bp global
</span><del>-       if ( isset( $bp->avatar->upload_path ) ) {
-               $basedir = $bp->avatar->upload_path;
</del><ins>+        if ( isset( $bp->avatar->$type ) ) {
+               $retval = $bp->avatar->$type;
</ins><span class="cx">   } else {
</span><span class="cx">          // If this value has been set in a constant, just use that
</span><del>-               if ( defined( 'BP_AVATAR_UPLOAD_PATH' ) ) {
-                       $basedir = BP_AVATAR_UPLOAD_PATH;
</del><ins>+                if ( defined( $constant ) ) {
+                       $retval = constant( $constant );
</ins><span class="cx">           } else {
</span><del>-                       if ( !bp_is_root_blog() ) {
-                               // Switch dynamically in order to support BP_ENABLE_MULTIBLOG
-                               switch_to_blog( bp_get_root_blog_id() );
</del><ins>+
+                       // Use cached upload dir data if available
+                       if ( ! empty( $bp->avatar->upload_dir ) ) {
+                               $upload_dir = $bp->avatar->upload_dir;
+
+                       // No cache, so query for it
+                       } else {
+                               // We need to switch to the root blog on multisite installs
+                               if ( is_multisite() ) {
+                                       switch_to_blog( bp_get_root_blog_id() );
+                               }
+
+                               // Get upload directory information from current site
+                               $upload_dir = wp_upload_dir();
+
+                               // Will bail if not switched
+                               restore_current_blog();
+
+                               // Stash upload directory data for later use
+                               $bp->avatar->upload_dir = $upload_dir;
</ins><span class="cx">                   }
</span><span class="cx"> 
</span><del>-                       // Get upload directory information from current site
-                       $upload_dir = wp_upload_dir();
-
</del><span class="cx">                   // Directory does not exist and cannot be created
</span><del>-                       if ( !empty( $upload_dir['error'] ) ) {
-                               $basedir = '';
</del><ins>+                        if ( ! empty( $upload_dir['error'] ) ) {
+                               $retval = '';
</ins><span class="cx"> 
</span><span class="cx">                  } else {
</span><del>-                               $basedir = $upload_dir['basedir'];
</del><ins>+                                $retval = $upload_dir[$key];
+
+                               // If $key is 'baseurl', check to see if we're on SSL
+                               // Workaround for WP13941, WP15928, WP19037.
+                               if ( $key == 'baseurl' && is_ssl() ) {
+                                       $retval = str_replace( 'http://', 'https://', $retval );
+                               }
</ins><span class="cx">                   }
</span><span class="cx"> 
</span><del>-                       // Will bail if not switched
-                       restore_current_blog();
</del><span class="cx">           }
</span><span class="cx"> 
</span><span class="cx">          // Stash in $bp for later use
</span><del>-               $bp->avatar->upload_path = $basedir;
</del><ins>+                $bp->avatar->$type = $retval;
</ins><span class="cx">   }
</span><span class="cx"> 
</span><del>-       return apply_filters( 'bp_core_avatar_upload_path', $basedir );
</del><ins>+        return $retval;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * bp_core_avatar_upload_path()
+ *
+ * Returns the absolute upload path for the WP installation
+ *
+ * @uses wp_upload_dir To get upload directory info
+ * @return string Absolute path to WP upload directory
+ */
+function bp_core_avatar_upload_path() {
+       return apply_filters( 'bp_core_avatar_upload_path', bp_core_get_upload_dir() );
+}
+
+/**
</ins><span class="cx">  * bp_core_avatar_url()
</span><span class="cx">  *
</span><span class="cx">  * Returns the raw base URL for root site upload location
</span><span class="lines">@@ -837,42 +895,7 @@
</span><span class="cx">  * @return string Full URL to current upload location
</span><span class="cx">  */
</span><span class="cx"> function bp_core_avatar_url() {
</span><del>-       $bp = buddypress();
-
-       // See if the value has already been calculated and stashed in the $bp global
-       if ( isset( $bp->avatar->url ) ) {
-               $baseurl = $bp->avatar->url;
-
-       } else {
-               // If this value has been set in a constant, just use that
-               if ( defined( 'BP_AVATAR_URL' ) ) {
-                       $baseurl = BP_AVATAR_URL;
-               } else {
-                       // Get upload directory information from current site
-                       $upload_dir = wp_upload_dir();
-
-                       // Directory does not exist and cannot be created
-                       if ( !empty( $upload_dir['error'] ) ) {
-                               $baseurl = '';
-
-                       } else {
-                               $baseurl = $upload_dir['baseurl'];
-
-                               // If we're using https, update the protocol. Workaround for WP13941, WP15928, WP19037.
-                               if ( is_ssl() )
-                                       $baseurl = str_replace( 'http://', 'https://', $baseurl );
-
-                               // If multisite, and current blog does not match root blog, make adjustments
-                               if ( is_multisite() && bp_get_root_blog_id() != get_current_blog_id() )
-                                       $baseurl = trailingslashit( get_blog_option( bp_get_root_blog_id(), 'home' ) ) . get_blog_option( bp_get_root_blog_id(), 'upload_path' );
-                       }
-               }
-
-               // Stash in $bp for later use
-               $bp->avatar->url = $baseurl;
-       }
-
-       return apply_filters( 'bp_core_avatar_url', $baseurl );
</del><ins>+        return apply_filters( 'bp_core_avatar_url', bp_core_get_upload_dir( 'url' ) );
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span></span></pre>
</div>
</div>

</body>
</html>