<!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][6770] trunk/bp-core: Improvements to automatic WP page mapping for BP directory components</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://buddypress.trac.wordpress.org/changeset/6770">6770</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2013-02-06 22:10:49 +0000 (Wed, 06 Feb 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Improvements to automatic WP page mapping for BP directory components

Since the wizard was removed, and Members and Activity were set as the default
components, BP has been creating directory pages for Members and Activity
automatically upon installation. This created a jarring disparity for the
Groups component, which also needs a top-level directory; when activated at a
later date, the user would be prompted to associate a page manually.

This changeset moves bp_updater_add_page_mappings() to the core component
(renaming it appropriately). This function is refactored to allow for existing
page mappings to be retained, as you'd want to do when activating new
components (rather than deleting existing mappings and mapped pages, as you'd
want during a fresh installation). Finally, the function is called when saving
the Components admin page, so that components requiring directory pages (like
Groups) get them created automatically upon activation.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpcoreadminbpcorecomponentsphp">trunk/bp-core/admin/bp-core-components.php</a></li>
<li><a href="#trunkbpcorebpcorefunctionsphp">trunk/bp-core/bp-core-functions.php</a></li>
<li><a href="#trunkbpcorebpcoreupdatephp">trunk/bp-core/bp-core-update.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpcoreadminbpcorecomponentsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/admin/bp-core-components.php (6769 => 6770)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/admin/bp-core-components.php        2013-02-06 21:36:32 UTC (rev 6769)
+++ trunk/bp-core/admin/bp-core-components.php        2013-02-06 22:10:49 UTC (rev 6770)
</span><span class="lines">@@ -300,7 +300,7 @@
</span><span class="cx">                 $bp-&gt;active_components = stripslashes_deep( $_POST['bp_components'] );
</span><span class="cx"> 
</span><span class="cx">                 bp_core_install( $bp-&gt;active_components );
</span><del>-
</del><ins>+                bp_core_add_page_mappings( $bp-&gt;active_components );
</ins><span class="cx">                 bp_update_option( 'bp-active-components', $bp-&gt;active_components );
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkbpcorebpcorefunctionsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/bp-core-functions.php (6769 => 6770)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/bp-core-functions.php        2013-02-06 21:36:32 UTC (rev 6769)
+++ trunk/bp-core/bp-core-functions.php        2013-02-06 22:10:49 UTC (rev 6770)
</span><span class="lines">@@ -175,6 +175,87 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * Add the pages for the component mapping. These are most often used by components with directories (e.g. groups, members).
+ *
+ * @param array $default_components Optional components to create pages for
+ * @param string $existing 'delete' if you want to delete existing page
+ *   mappings and replace with new ones. Otherwise existing page mappings
+ *   are kept, and the gaps filled in with new pages
+ * @since BuddyPress (1.7)
+ */
+function bp_core_add_page_mappings( $components, $existing = 'keep' ) {
+
+        // Make sure that the pages are created on the root blog no matter which Dashboard the setup is being run on
+        if ( ! bp_is_root_blog() )
+                switch_to_blog( bp_get_root_blog_id() );
+
+        $pages = bp_core_get_directory_page_ids();
+
+        // Delete any existing pages
+        if ( 'delete' == $existing ) {
+                foreach ( (array) $pages as $page_id ) {
+                        wp_delete_post( $page_id, true );
+                }
+
+                $pages = array();
+        }
+
+        $page_titles = array(
+                'activity' =&gt; _x( 'Activity', 'Page title for the Activity directory.', 'buddypress' ),
+                'groups'   =&gt; _x( 'Groups', 'Page title for the Groups directory.', 'buddypress' ),
+                'sites'    =&gt; _x( 'Sites', 'Page title for the Sites directory.', 'buddypress' ),
+                'activate' =&gt; _x( 'Activate', 'Page title for the user account activation screen.', 'buddypress' ),
+                'members'  =&gt; _x( 'Members', 'Page title for the Members directory.', 'buddypress' ),
+                'register' =&gt; _x( 'Register', 'Page title for the user registration screen.', 'buddypress' ),
+        );
+
+        $pages_to_create = array();
+        foreach ( array_keys( $components ) as $component_name ) {
+                if ( ! isset( $pages[ $component_name ] ) &amp;&amp; isset( $page_titles[ $component_name ] ) ) {
+                        $pages_to_create[ $component_name ] = $page_titles[ $component_name ];
+                }
+        }
+
+        // Register and Activate are not components, but need pages when
+        // registration is enabled
+        if ( bp_get_signup_allowed() ) {
+                foreach ( array( 'register', 'activate' ) as $slug ) {
+                        if ( ! isset( $pages[ $slug ] ) ) {
+                                $pages_to_create[ $slug ] = $page_titles[ $slug ];
+                        }
+                }
+        }
+
+        // No need for a Sites directory unless we're on multisite
+        if ( ! is_multisite() &amp;&amp; isset( $pages_to_create['sites'] ) ) {
+                unset( $pages_to_create['sites'] );
+        }
+
+        // Members must always have a page, no matter what
+        if ( ! isset( $pages['members'] ) &amp;&amp; ! isset( $pages_to_create['members'] ) ) {
+                $pages_to_create['members'] = $page_titles['members'];
+        }
+
+        // Create the pages
+        foreach ( $pages_to_create as $component_name =&gt; $page_name ) {
+                $pages[ $component_name ] = wp_insert_post( array(
+                        'comment_status' =&gt; 'closed',
+                        'ping_status'    =&gt; 'closed',
+                        'post_status'    =&gt; 'publish',
+                        'post_title'     =&gt; $page_name,
+                        'post_type'      =&gt; 'page',
+                ) );
+        }
+
+        // Save the page mapping
+        bp_update_option( 'bp-pages', $pages );
+
+        // If we had to switch_to_blog, go back to the original site.
+        if ( ! bp_is_root_blog() )
+                restore_current_blog();
+}
+
+/**
</ins><span class="cx">  * Creates a default component slug from a WP page root_slug
</span><span class="cx">  *
</span><span class="cx">  * Since 1.5, BP components get their root_slug (the slug used immediately
</span></span></pre></div>
<a id="trunkbpcorebpcoreupdatephp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/bp-core-update.php (6769 => 6770)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/bp-core-update.php        2013-02-06 21:36:32 UTC (rev 6769)
+++ trunk/bp-core/bp-core-update.php        2013-02-06 22:10:49 UTC (rev 6770)
</span><span class="lines">@@ -185,7 +185,7 @@
</span><span class="cx">                 // Apply schema and set Activity and XProfile components as active
</span><span class="cx">                 bp_core_install( $default_components );
</span><span class="cx">                 bp_update_option( 'bp-active-components', $default_components );
</span><del>-                bp_updater_add_page_mappings( $default_components );
</del><ins>+                bp_core_add_page_mappings( $default_components, 'delete' );
</ins><span class="cx"> 
</span><span class="cx">         // Upgrades
</span><span class="cx">         } else {
</span><span class="lines">@@ -196,7 +196,7 @@
</span><span class="cx">                 // 1.5
</span><span class="cx">                 if ( $raw_db_version &lt; 1801 ) {
</span><span class="cx">                         bp_update_to_1_5();
</span><del>-                        bp_updater_add_page_mappings( $default_components );
</del><ins>+                        bp_core_add_page_mappings( $default_components, 'delete' );
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 // 1.6
</span><span class="lines">@@ -248,61 +248,6 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><del>- * Add the pages for the component mapping. These are most often used by components with directories (e.g. groups, members).
- *
- * @param array $default_components Optional components to create pages for
- * @since BuddyPress (1.7)
- */
-function bp_updater_add_page_mappings( $default_components ) {
-
-        // Make sure that the pages are created on the root blog no matter which Dashboard the setup is being run on
-        if ( ! bp_is_root_blog() )
-                switch_to_blog( bp_get_root_blog_id() );
-
-        // Delete any existing pages
-        $pages = bp_core_get_directory_page_ids();
-        foreach ( (array) $pages as $page_id )
-                wp_delete_post( $page_id, true );
-
-        $pages = array();
-        foreach ( array_keys( $default_components ) as $component_name ) {
-                if ( $component_name == 'activity' ) {
-                        $pages[$component_name] = _x( 'Activity', 'Page title for the Activity directory.', 'buddypress' );
-
-                } elseif ( $component_name == 'groups') {
-                        $pages[$component_name] = _x( 'Groups', 'Page title for the Groups directory.', 'buddypress' );
-
-                // Blogs component only needs a directory page when multisite is enabled
-                } elseif ( $component_name == 'blogs' &amp;&amp; is_multisite() ) {
-                        $pages[$component_name] = _x( 'Sites', 'Page title for the Sites directory.', 'buddypress' );
-                }
-        }
-
-        // Mandatory components/pages
-        $pages['activate'] = _x( 'Activate', 'Page title for the user account activation screen.', 'buddypress' );
-        $pages['members']  = _x( 'Members',  'Page title for the Members directory.',              'buddypress' );
-        $pages['register'] = _x( 'Register', 'Page title for the user registration screen.',       'buddypress' );
-
-        // Create the pages
-        foreach ( $pages as $component_name =&gt; $page_name ) {
-                $pages[$component_name] = wp_insert_post( array(
-                        'comment_status' =&gt; 'closed',
-                        'ping_status'    =&gt; 'closed',
-                        'post_status'    =&gt; 'publish',
-                        'post_title'     =&gt; $page_name,
-                        'post_type'      =&gt; 'page',
-                ) );
-        }
-
-        // Save the page mapping
-        bp_update_option( 'bp-pages', $pages );
-
-        // If we had to switch_to_blog, go back to the original site.
-        if ( ! bp_is_root_blog() )
-                restore_current_blog();
-}
-
-/**
</del><span class="cx">  * Redirect user to BuddyPress's What's New page on activation
</span><span class="cx">  *
</span><span class="cx">  * @since BuddyPress (1.7)
</span></span></pre>
</div>
</div>

</body>
</html>