<!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][7769] trunk/bp-core/bp-core-avatars.php: Improve default avatar handling in bp_core_fetch_avatar()</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/7769">7769</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2014-02-02 19:09:47 +0000 (Sun, 02 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Improve default avatar handling in bp_core_fetch_avatar()

Changes to Gravatar over the last few years have placed restrictions on the way
that a default gravatar (to be used as a fallback for when no actual Gravatar
is found) can be served to gravatar.com. In particular, Gravatar cannot cache
and serve default images that are not publicly available (as in dev
environments) or are only available over SSL.

Because BuddyPress's default behavior was to provide a local copy of the
mystery-man avatar, switching to Gravatar's hosted mystery-man solves these
problems for sites that are using the default mystery-man as a fallback image.

This changeset also reconfigures the way that the `BP_AVATAR_DEFAULT` constant
is respected, to ensure that it's possible to override the avatar fallback when
no_grav is set to true.

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

Props r-a-y</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 (7768 => 7769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/bp-core-avatars.php        2014-01-30 19:35:14 UTC (rev 7768)
+++ trunk/bp-core/bp-core-avatars.php   2014-02-02 19:09:47 UTC (rev 7769)
</span><span class="lines">@@ -38,12 +38,6 @@
</span><span class="cx">          }
</span><span class="cx">  }
</span><span class="cx"> 
</span><del>-       if ( !defined( 'BP_AVATAR_DEFAULT' ) )
-               define( 'BP_AVATAR_DEFAULT', $bp->plugin_url . 'bp-core/images/mystery-man.jpg' );
-
-       if ( !defined( 'BP_AVATAR_DEFAULT_THUMB' ) )
-               define( 'BP_AVATAR_DEFAULT_THUMB', $bp->plugin_url . 'bp-core/images/mystery-man-50.jpg' );
-
</del><span class="cx">   if ( ! defined( 'BP_SHOW_AVATARS' ) ) {
</span><span class="cx">          define( 'BP_SHOW_AVATARS', bp_get_option( 'show_avatars' ) );
</span><span class="cx">  }
</span><span class="lines">@@ -73,8 +67,8 @@
</span><span class="cx">  $bp->avatar->original_max_filesize = BP_AVATAR_ORIGINAL_MAX_FILESIZE;
</span><span class="cx"> 
</span><span class="cx">  // Defaults
</span><del>-       $bp->avatar->thumb->default = BP_AVATAR_DEFAULT_THUMB;
-       $bp->avatar->full->default  = BP_AVATAR_DEFAULT;
</del><ins>+        $bp->avatar->thumb->default = bp_core_avatar_default_thumb();
+       $bp->avatar->full->default  = bp_core_avatar_default();
</ins><span class="cx"> 
</span><span class="cx">  // These have to be set on page load in order to avoid infinite filter loops at runtime
</span><span class="cx">  $bp->avatar->upload_path = bp_core_avatar_upload_path();
</span><span class="lines">@@ -439,7 +433,7 @@
</span><span class="cx">          if ( empty( $bp->grav_default->{$object} ) ) {
</span><span class="cx">                  $default_grav = 'wavatar';
</span><span class="cx">          } else if ( 'mystery' == $bp->grav_default->{$object} ) {
</span><del>-                       $default_grav = apply_filters( 'bp_core_mysteryman_src', bp_core_avatar_default(), $grav_size );
</del><ins>+                        $default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $grav_size );
</ins><span class="cx">           } else {
</span><span class="cx">                  $default_grav = $bp->grav_default->{$object};
</span><span class="cx">          }
</span><span class="lines">@@ -471,7 +465,7 @@
</span><span class="cx"> 
</span><span class="cx">  // No avatar was found, and we've been told not to use a gravatar.
</span><span class="cx">  } else {
</span><del>-               $gravatar = apply_filters( "bp_core_default_avatar_$object", $bp->plugin_url . 'bp-core/images/mystery-man.jpg', $params );
</del><ins>+                $gravatar = apply_filters( "bp_core_default_avatar_$object", bp_core_avatar_default( 'local' ), $params );
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">  if ( true === $html ) {
</span><span class="lines">@@ -1116,19 +1110,66 @@
</span><span class="cx">  *
</span><span class="cx">  * @since BuddyPress (1.5.0)
</span><span class="cx">  *
</span><ins>+ * @param string $type 'local' if the fallback should be the locally-hosted
+ *        version of the mystery-man, 'gravatar' if the fallback should be
+ *        Gravatar's version. Default: 'gravatar'.
</ins><span class="cx">  * @return string The URL of the default avatar.
</span><span class="cx">  */
</span><del>-function bp_core_avatar_default() {
-       return apply_filters( 'bp_core_avatar_default', buddypress()->avatar->full->default );
</del><ins>+function bp_core_avatar_default( $type = 'gravatar' ) {
+       // Local override
+       if ( defined( 'BP_AVATAR_DEFAULT' ) ) {
+               $avatar = BP_AVATAR_DEFAULT;
+
+       // Use the local default image
+       } else if ( 'local' === $type ) {
+               $avatar = buddypress()->plugin_url . 'bp-core/images/mystery-man.jpg';
+
+       // Use Gravatar's mystery man as fallback
+       } else {
+               if ( is_ssl() ) {
+                       $host = 'https://secure.gravatar.com';
+               } else {
+                       $host = 'http://www.gravatar.com';
+               }
+
+               $avatar = $host . '/avatar/00000000000000000000000000000000?d=mm&amp;s=' . bp_core_avatar_full_width();
+       }
+
+       return apply_filters( 'bp_core_avatar_default', $avatar );
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><span class="cx">  * Get the URL of the 'thumb' default avatar.
</span><span class="cx">  *
</span><ins>+ * Uses Gravatar's mystery-man avatar, unless BP_AVATAR_DEFAULT_THUMB has been
+ * defined.
+ *
</ins><span class="cx">  * @since BuddyPress (1.5.0)
</span><span class="cx">  *
</span><ins>+ * @param string $type 'local' if the fallback should be the locally-hosted
+ *        version of the mystery-man, 'gravatar' if the fallback should be
+ *        Gravatar's version. Default: 'gravatar'.
</ins><span class="cx">  * @return string The URL of the default avatar thumb.
</span><span class="cx">  */
</span><del>-function bp_core_avatar_default_thumb() {
-       return apply_filters( 'bp_core_avatar_thumb', buddypress()->avatar->thumb->default );
</del><ins>+function bp_core_avatar_default_thumb( $type = 'gravatar' ) {
+       // Local override
+       if ( defined( 'BP_AVATAR_DEFAULT_THUMB' ) ) {
+               $avatar = BP_AVATAR_DEFAULT_THUMB;
+
+       // Use the local default image
+       } else if ( 'local' === $type ) {
+               $avatar = buddypress()->plugin_url . 'bp-core/images/mystery-man-50.jpg';
+
+       // Use Gravatar's mystery man as fallback
+       } else {
+               if ( is_ssl() ) {
+                       $host = 'https://secure.gravatar.com';
+               } else {
+                       $host = 'http://www.gravatar.com';
+               }
+
+               $avatar = $host . '/avatar/00000000000000000000000000000000?d=mm&amp;s=' . bp_core_avatar_thumb_width();
+       }
+
+       return apply_filters( 'bp_core_avatar_thumb', $avatar );
</ins><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>