<!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][7577] trunk/bp-blogs/bp-blogs-functions.php: Publish blog posts to the activity stream based on transition_post_status</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/7577">7577</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2013-11-15 21:31:46 +0000 (Fri, 15 Nov 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Publish blog posts to the activity stream based on transition_post_status

BP has historically had problems when posting certain kinds of blog posts to
the activity stream, such as improper bumping for post edits and incorrect
timestamps for scheduled posts. These problems stem from the fact that
bp_blogs_record_post has been hooked to the generic 'save_post'. Using
'transition_post_status' instead allows BP to prevent edit-bumps, while
allowing bp_blogs_record_post() to use post_date_gmt for activity timestamps
(thereby properly attributing scheduled posts).

See <a href="http://buddypress.trac.wordpress.org/ticket/3746">#3746</a>, <a href="http://buddypress.trac.wordpress.org/ticket/2546">#2546</a>.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpblogsbpblogsfunctionsphp">trunk/bp-blogs/bp-blogs-functions.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpblogsbpblogsfunctionsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-blogs/bp-blogs-functions.php (7576 => 7577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-blogs/bp-blogs-functions.php    2013-11-15 21:08:20 UTC (rev 7576)
+++ trunk/bp-blogs/bp-blogs-functions.php       2013-11-15 21:31:46 UTC (rev 7577)
</span><span class="lines">@@ -247,6 +247,37 @@
</span><span class="cx"> add_action( 'update_option_blogdescription', 'bp_blogs_update_option_blogdescription', 10, 2 );
</span><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * Detect a change in post status, and initiate an activity update if necessary.
+ *
+ * Posts get new activity updates when (a) they are being published, and (b)
+ * they have not already been published. This enables proper posting for
+ * regular posts as well as scheduled posts, while preventing post bumping.
+ *
+ * See #4090, #3746, #2546 for background.
+ *
+ * @since BuddyPress (1.9.0)
+ *
+ * @param string $new_status New status for the post.
+ * @param string $old_status Old status for the post.
+ * @param object $post Post data.
+ */
+function bp_blogs_catch_published_post( $new_status, $old_status, $post ) {
+
+       // Only record published posts
+       if ( 'publish' !== $new_status ) {
+               return;
+       }
+
+       // Don't record edits (publish -> publish)
+       if ( 'publish' === $old_status ) {
+               return;
+       }
+
+       return bp_blogs_record_post( $post->ID, $post );
+}
+add_action( 'transition_post_status', 'bp_blogs_catch_published_post', 10, 3 );
+
+/**
</ins><span class="cx">  * Record a new blog post in the BuddyPress activity stream.
</span><span class="cx">  *
</span><span class="cx">  * @param int $post_id ID of the post being recorded.
</span><span class="lines">@@ -326,7 +357,7 @@
</span><span class="cx">                          'type'              => 'new_blog_post',
</span><span class="cx">                          'item_id'           => $blog_id,
</span><span class="cx">                          'secondary_item_id' => $post_id,
</span><del>-                               'recorded_time'     => $post->post_modified_gmt
</del><ins>+                                'recorded_time'     => $post->post_date_gmt,
</ins><span class="cx">                   ));
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -338,7 +369,6 @@
</span><span class="cx"> 
</span><span class="cx">  do_action( 'bp_blogs_new_blog_post', $post_id, $post, $user_id );
</span><span class="cx"> }
</span><del>-add_action( 'save_post', 'bp_blogs_record_post', 10, 2 );
</del><span class="cx"> 
</span><span class="cx"> /**
</span><span class="cx">  * Record a new blog comment in the BuddyPress activity stream.
</span></span></pre>
</div>
</div>

</body>
</html>