<!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][10153] trunk/src/bp-core: Rely on the BP Theme Compat API to trigger the Cover Image feature</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" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/10153">10153</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/10153","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-09-29 22:12:48 +0000 (Tue, 29 Sep 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Rely on the BP Theme Compat API to trigger the Cover Image feature

BuddyPress Cover Images are first targeting themes using the BP Theme Compat API. We want to make sure Cover images will look awesome in most WordPress themes. We also want to make sure standalone BuddyPress themes (eg: BP Default) will have time to implement the feature peacefully.

The BP Theme Compat API now includes 3 new functions :
- `bp_set_theme_compat_feature()` to register the feature settings for targeted components (eg: xProfile, Groups..).
- `bp_get_theme_compat_feature()` to get the requested feature settings (eg: cover_image)
- `bp_register_theme_compat_default_features()` is automatically registering the feature for themes using the BP Theme Compat API and the BP Legacy template pack.

Props johnjamesjacoby, boone, djpaul, modemlooper, BuddyBoss

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpcorebpcoreactionsphp">trunk/src/bp-core/bp-core-actions.php</a></li>
<li><a href="#trunksrcbpcorebpcorethemecompatibilityphp">trunk/src/bp-core/bp-core-theme-compatibility.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpcorebpcoreactionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/bp-core-actions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/bp-core-actions.php     2015-09-29 22:03:53 UTC (rev 10152)
+++ trunk/src/bp-core/bp-core-actions.php       2015-09-29 22:12:48 UTC (rev 10153)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -93,9 +93,10 @@
</span><span class="cx" style="display: block; padding: 0 10px"> add_action( 'bp_template_redirect', 'bp_get_request',        10 );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Add the BuddyPress functions file.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Add the BuddyPress functions file and the Theme Compat Default features.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-add_action( 'bp_after_setup_theme', 'bp_load_theme_functions', 1 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+add_action( 'bp_after_setup_theme', 'bp_load_theme_functions',                    1 );
+add_action( 'bp_after_setup_theme', 'bp_register_theme_compat_default_features', 10 );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> // Load the admin.
</span><span class="cx" style="display: block; padding: 0 10px"> if ( is_admin() ) {
</span></span></pre></div>
<a id="trunksrcbpcorebpcorethemecompatibilityphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/bp-core-theme-compatibility.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/bp-core-theme-compatibility.php 2015-09-29 22:03:53 UTC (rev 10152)
+++ trunk/src/bp-core/bp-core-theme-compatibility.php   2015-09-29 22:12:48 UTC (rev 10153)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -436,6 +436,166 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Set a theme compat feature
+ *
+ * @since 2.4.0
+ *
+ * @param  string $theme_id the theme id (eg: legacy)
+ * @param  array  $feature  an associative array (eg: array( name => 'feature_name', 'settings' => array() ))
+ */
+function bp_set_theme_compat_feature( $theme_id, $feature = array() ) {
+       if ( empty( $theme_id ) || empty( $feature['name'] ) ) {
+               return;
+       }
+
+       // Get BuddyPress instance
+       $bp = buddypress();
+
+       // Get current theme compat theme
+       $theme_compat_theme = $bp->theme_compat->theme;
+
+       // Bail if the Theme Compat theme is not in use
+       if ( $theme_id !== bp_get_theme_compat_id() ) {
+               return;
+       }
+
+       $features = $theme_compat_theme->__get( 'features' );
+       if ( empty( $features ) ) {
+               $features = array();
+       }
+
+       // Bail if the feature is already registered or no settings were provided
+       if ( isset( $features[ $feature['name'] ] ) || empty( $feature['settings'] ) ) {
+               return;
+       }
+
+       // Add the feature
+       $features[ $feature['name'] ] = (object) $feature['settings'];
+
+       // The feature is attached to components
+       if ( isset( $features[ $feature['name'] ]->components ) ) {
+               // Set the feature for each concerned component
+               foreach ( (array) $features[ $feature['name'] ]->components as $component ) {
+                       // The xProfile component is specific
+                       if ( 'xprofile' === $component ) {
+                               $component = 'profile';
+                       }
+
+                       if ( isset( $bp->{$component} ) ) {
+                               if ( isset( $bp->{$component}->features ) ) {
+                                       $bp->{$component}->features[] = $feature['name'];
+                               } else {
+                                       $bp->{$component}->features = array( $feature['name'] );
+                               }
+                       }
+               }
+       }
+
+       // Finally update the theme compat features
+       $theme_compat_theme->__set( 'features', $features );
+}
+
+/**
+ * Get a theme compat feature
+ *
+ * @since 2.4.0
+ *
+ * @param  string $feature the feature (eg: cover_image)
+ * @return object          the feature settings.
+ */
+function bp_get_theme_compat_feature( $feature = '' ) {
+       // Get current theme compat theme
+       $theme_compat_theme = buddypress()->theme_compat->theme;
+
+       // Get features
+       $features = $theme_compat_theme->__get( 'features' );
+
+       if ( ! isset( $features[ $feature ] ) ) {
+               return false;
+       }
+
+       return $features[ $feature ];
+}
+
+/**
+ * Setup the theme's features
+ *
+ * Note: BP Legacy's buddypress-functions.php is not loaded in WP Administration
+ * as it's loaded using bp_locate_template(). That's why this function is here.
+ *
+ * @since 2.4.0
+ *
+ * @global $content_width the content width of the theme
+ */
+function bp_register_theme_compat_default_features() {
+       global $content_width;
+
+       // If the current theme doesn't need theme compat, bail at this point.
+       if ( ! bp_use_theme_compat_with_current_theme() ) {
+               return;
+       }
+
+       // Make sure BP Legacy is the Theme Compat in use.
+       if ( 'legacy' !== bp_get_theme_compat_id() ) {
+               return;
+       }
+
+       // Get the theme
+       $current_theme = wp_get_theme();
+       $theme_handle  = $current_theme->get_stylesheet();
+       $parent        = $current_theme->parent();
+
+       if ( $parent ) {
+               $theme_handle = $parent->get_stylesheet();
+       }
+
+       /**
+        * Since Companion stylesheets, the $content_width is smaller
+        * than the width used by BuddyPress, so we need to manually set the
+        * content width for the concerned themes.
+        *
+        * array( stylesheet => content width used by BuddyPress )
+        */
+       $bp_content_widths = array(
+               'twentyfifteen'  => 1300,
+               'twentyfourteen' => 955,
+               'twentythirteen' => 890,
+       );
+
+       // Default values
+       $bp_content_width = (int) $content_width;
+       $bp_handle        = 'bp-legacy-css';
+
+       // Specific to themes having companion stylesheets
+       if ( isset( $bp_content_widths[ $theme_handle ] ) ) {
+               $bp_content_width = $bp_content_widths[ $theme_handle ];
+               $bp_handle        = 'bp-' . $theme_handle;
+       }
+
+       if ( is_rtl() ) {
+               $bp_handle .= '-rtl';
+       }
+
+       $top_offset    = 150;
+       $avatar_height = apply_filters( 'bp_core_avatar_full_height', $top_offset );
+
+       if ( $avatar_height > $top_offset ) {
+               $top_offset = $avatar_height;
+       }
+
+       bp_set_theme_compat_feature( 'legacy', array(
+               'name'     => 'cover_image',
+               'settings' => array(
+                       'components'   => array( 'xprofile', 'groups' ),
+                       'width'        => $bp_content_width,
+                       'height'       => $top_offset + round( $avatar_height / 2 ),
+                       'callback'     => 'bp_legacy_theme_cover_image',
+                       'theme_handle' => $bp_handle,
+               ),
+       ) );
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Check whether a given template is the one that WP originally selected to display current page.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 1.7.0
</span></span></pre>
</div>
</div>

</body>
</html>