Skip to:
Content

BuddyPress.org

Ticket #5272: bp-blogs-functions.php

File bp-blogs-functions.php, 35.1 KB (added by lenasterg, 11 years ago)

bp-blogs-functions.php file with suggested changes

Line 
1<?php
2
3/**
4 * Blogs component functions.
5 *
6 * @package BuddyPress
7 * @subpackage BlogsFunctions
8 */
9// Exit if accessed directly
10if (!defined('ABSPATH'))
11    exit;
12
13/**
14 * Check whether the $bp global lists an activity directory page.
15 *
16 * @since BuddyPress (1.5.0)
17 *
18 * @global BuddyPress $bp The one true BuddyPress instance.
19 *
20 * @return bool True if set, false if empty.
21 */
22function bp_blogs_has_directory() {
23    global $bp;
24
25    return (bool) !empty($bp->pages->blogs->id);
26}
27
28/**
29 * Retrieve a set of blogs
30 *
31 * @see BP_Blogs_Blog::get() for a description of arguments and return value.
32 *
33 * @param array $args {
34 *     Arguments are listed here with their default values. For more
35 *     information about the arguments, see {@link BP_Blogs_Blog::get()}.
36 *     @type string $type Default: 'active'.
37 *     @type int|bool $user_id Default: false.
38 *     @type string|bool $search_terms Default: false.
39 *     @type int $per_page Default: 20.
40 *     @type int $page Default: 1.
41 *     @type boolean $show_hidden Default: false.
42 * }
43 * @return array See {@link BP_Blogs_Blog::get()}.
44 * @return type
45 * @version 2, stergatu, added show_hidden
46 */
47function bp_blogs_get_blogs($args = '') {
48
49    $defaults = array(
50        'type' => 'active', // active, alphabetical, newest, or random
51        'user_id' => false, // Pass a user_id to limit to only blogs that this user has privilages higher than subscriber on
52        'search_terms' => false, // Limit to blogs that match these search terms
53        'per_page' => 20, // The number of results to return per page
54        'page' => 1, // The page to return if limiting per page
55        'show_hidden' => false
56    );
57
58    $params = wp_parse_args($args, $defaults);
59    extract($params, EXTR_SKIP);
60
61    $args_n = array('type' => $type, 'per_page' => $per_page, 'page' => $page, 'user_id' => $user_id, 'search_terms' => $search_terms, 'show_hidden' => $show_hidden);
62
63    return apply_filters('bp_blogs_get_blogs', BP_Blogs_Blog::get($args_n), $params);
64}
65
66/**
67 * Populate the BP blogs table with existing blogs.
68 *
69 * @global object $bp BuddyPress global settings
70 * @global object $wpdb WordPress database object
71 * @uses get_users()
72 * @uses bp_blogs_record_blog()
73 */
74function bp_blogs_record_existing_blogs() {
75    global $bp, $wpdb;
76
77    // Truncate user blogs table and re-record.
78    $wpdb->query("TRUNCATE TABLE {$bp->blogs->table_name}");
79
80    if (is_multisite()) {
81        $blog_ids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM {$wpdb->base_prefix}blogs WHERE mature = 0 AND spam = 0 AND deleted = 0 AND site_id = %d", $wpdb->siteid));
82    } else {
83        $blog_ids = 1;
84    }
85
86    if (!empty($blog_ids)) {
87        foreach ((array) $blog_ids as $blog_id) {
88            $users = get_users(array('blog_id' => $blog_id, 'fields' => 'ID'));
89            $subscribers = get_users(array('blog_id' => $blog_id, 'fields' => 'ID', 'role' => 'subscriber'));
90
91            if (!empty($users)) {
92                foreach ((array) $users as $user) {
93                    // Don't record blogs for subscribers
94                    if (!in_array($user, $subscribers)) {
95                        bp_blogs_record_blog($blog_id, $user, true);
96                    }
97                }
98            }
99        }
100    }
101}
102
103/**
104 * Check whether a given blog should be recorded in activity streams.
105 *
106 * If $user_id is provided, you can restrict site from being recordable
107 * only to particular users.
108 *
109 * @since BuddyPress (1.7.0)
110 *
111 * @uses apply_filters()
112 *
113 * @param int $blog_id ID of the blog being checked.
114 * @param int $user_id Optional. ID of the user for whom access is being checked.
115 * @return bool True if blog is recordable, otherwise false.
116 */
117function bp_blogs_is_blog_recordable($blog_id, $user_id = 0) {
118
119    $recordable_globally = apply_filters('bp_blogs_is_blog_recordable', true, $blog_id);
120
121    if (!empty($user_id)) {
122        $recordable_for_user = apply_filters('bp_blogs_is_blog_recordable_for_user', $recordable_globally, $blog_id, $user_id);
123    } else {
124        $recordable_for_user = $recordable_globally;
125    }
126
127    if (!empty($recordable_for_user)) {
128        return true;
129    }
130
131    return $recordable_globally;
132}
133
134/**
135 * Check whether a given blog should be tracked by the Blogs component.
136 *
137 * If $user_id is provided, the developer can restrict site from
138 * being trackable only to particular users.
139 *
140 * @since BuddyPress (1.7.0)
141 *
142 * @uses bp_blogs_is_blog_recordable
143 * @uses apply_filters()
144 *
145 * @param int $blog_id ID of the blog being checked.
146 * @param int $user_id Optional. ID of the user for whom access is being checked.
147 * @return bool True if blog is trackable, otherwise false.
148 */
149function bp_blogs_is_blog_trackable($blog_id, $user_id = 0) {
150
151    $trackable_globally = apply_filters('bp_blogs_is_blog_trackable', bp_blogs_is_blog_recordable($blog_id, $user_id), $blog_id);
152
153    if (!empty($user_id)) {
154        $trackable_for_user = apply_filters('bp_blogs_is_blog_trackable_for_user', $trackable_globally, $blog_id, $user_id);
155    } else {
156        $trackable_for_user = $trackable_globally;
157    }
158
159    if (!empty($trackable_for_user)) {
160        return $trackable_for_user;
161    }
162
163    return $trackable_globally;
164}
165
166/**
167 * Make BuddyPress aware of a new site so that it can track its activity.
168 *
169 * @since BuddyPress (1.0.0)
170 *
171 * @uses BP_Blogs_Blog
172 *
173 * @param int $blog_id ID of the blog being recorded.
174 * @param int $user_id ID of the user for whom the blog is being recorded.
175 * @param bool $no_activity Optional. Whether to skip recording an activity
176 *        item about this blog creation. Default: false.
177 * @return bool|null Returns false on failure.
178 */
179function bp_blogs_record_blog($blog_id, $user_id, $no_activity = false) {
180
181    if (empty($user_id))
182        $user_id = bp_loggedin_user_id();
183
184    // If blog is not recordable, do not record the activity.
185    if (!bp_blogs_is_blog_recordable($blog_id, $user_id))
186        return false;
187
188    $name = get_blog_option($blog_id, 'blogname');
189    $description = get_blog_option($blog_id, 'blogdescription');
190
191    if (empty($name))
192        return false;
193
194    $recorded_blog = new BP_Blogs_Blog;
195    $recorded_blog->user_id = $user_id;
196    $recorded_blog->blog_id = $blog_id;
197    $recorded_blog_id = $recorded_blog->save();
198    $is_recorded = !empty($recorded_blog_id) ? true : false;
199
200    bp_blogs_update_blogmeta($recorded_blog->blog_id, 'name', $name);
201    bp_blogs_update_blogmeta($recorded_blog->blog_id, 'description', $description);
202    bp_blogs_update_blogmeta($recorded_blog->blog_id, 'last_activity', bp_core_current_time());
203
204    $is_private = !empty($_POST['blog_public']) && (int) $_POST['blog_public'] ? false : true;
205    $is_private = !apply_filters('bp_is_new_blog_public', !$is_private);
206
207    // Only record this activity if the blog is public
208    if (!$is_private && !$no_activity && bp_blogs_is_blog_trackable($blog_id, $user_id)) {
209
210        // Record this in activity streams
211        bp_blogs_record_activity(array(
212            'user_id' => $recorded_blog->user_id,
213            'action' => apply_filters('bp_blogs_activity_created_blog_action', sprintf(__('%s created the site %s', 'buddypress'), bp_core_get_userlink($recorded_blog->user_id), '<a href="' . get_home_url($recorded_blog->blog_id) . '">' . esc_attr($name) . '</a>'), $recorded_blog, $name, $description),
214            'primary_link' => apply_filters('bp_blogs_activity_created_blog_primary_link', get_home_url($recorded_blog->blog_id), $recorded_blog->blog_id),
215            'type' => 'new_blog',
216            'item_id' => $recorded_blog->blog_id
217        ));
218    }
219
220    do_action_ref_array('bp_blogs_new_blog', array(&$recorded_blog, $is_private, $is_recorded));
221}
222
223add_action('wpmu_new_blog', 'bp_blogs_record_blog', 10, 2);
224
225/**
226 * Update blog name in BuddyPress blogmeta table.
227 *
228 * @global object $wpdb DB Layer.
229 *
230 * @param string $oldvalue Value before save. Passed by do_action() but
231 *        unused here.
232 * @param string $newvalue Value to change meta to.
233 */
234function bp_blogs_update_option_blogname($oldvalue, $newvalue) {
235    global $wpdb;
236
237    bp_blogs_update_blogmeta($wpdb->blogid, 'name', $newvalue);
238}
239
240add_action('update_option_blogname', 'bp_blogs_update_option_blogname', 10, 2);
241
242/**
243 * Update blog description in BuddyPress blogmeta table
244 *
245 * @global object $wpdb DB Layer.
246 *
247 * @param string $oldvalue Value before save. Passed by do_action() but
248 *        unused here.
249 * @param string $newvalue Value to change meta to.
250 */
251function bp_blogs_update_option_blogdescription($oldvalue, $newvalue) {
252    global $wpdb;
253
254    bp_blogs_update_blogmeta($wpdb->blogid, 'description', $newvalue);
255}
256
257add_action('update_option_blogdescription', 'bp_blogs_update_option_blogdescription', 10, 2);
258
259/**
260 * Detect a change in post status, and initiate an activity update if necessary.
261 *
262 * Posts get new activity updates when (a) they are being published, and (b)
263 * they have not already been published. This enables proper posting for
264 * regular posts as well as scheduled posts, while preventing post bumping.
265 *
266 * See #4090, #3746, #2546 for background.
267 *
268 * @since BuddyPress (1.9.0)
269 *
270 * @param string $new_status New status for the post.
271 * @param string $old_status Old status for the post.
272 * @param object $post Post data.
273 */
274function bp_blogs_catch_published_post($new_status, $old_status, $post) {
275
276    // Only record published posts
277    if ('publish' !== $new_status) {
278        return;
279    }
280
281    // Don't record edits (publish -> publish)
282    if ('publish' === $old_status) {
283        return;
284    }
285
286    return bp_blogs_record_post($post->ID, $post);
287}
288
289add_action('transition_post_status', 'bp_blogs_catch_published_post', 10, 3);
290
291/**
292 * Record a new blog post in the BuddyPress activity stream.
293 *
294 * @param int $post_id ID of the post being recorded.
295 * @param object $post The WP post object passed to the 'save_post' action.
296 * @param int $user_id Optional. The user to whom the activity item will be
297 *        associated. Defaults to the post_author.
298 * @return bool|null Returns false on failure.
299 */
300function bp_blogs_record_post($post_id, $post, $user_id = 0) {
301    global $bp, $wpdb;
302
303    $post_id = (int) $post_id;
304    $blog_id = (int) $wpdb->blogid;
305
306    // If blog is not trackable, do not record the activity.
307    if (!bp_blogs_is_blog_trackable($blog_id, $user_id))
308        return false;
309
310    if (!$user_id)
311        $user_id = (int) $post->post_author;
312
313    // Stop infinite loops with WordPress MU Sitewide Tags.
314    // That plugin changed the way its settings were stored at some point. Thus the dual check.
315    if (!empty($bp->site_options['sitewide_tags_blog'])) {
316        $st_options = maybe_unserialize($bp->site_options['sitewide_tags_blog']);
317        $tags_blog_id = isset($st_options['tags_blog_id']) ? $st_options['tags_blog_id'] : 0;
318    } else {
319        $tags_blog_id = isset($bp->site_options['tags_blog_id']) ? $bp->site_options['tags_blog_id'] : 0;
320    }
321
322    if ((int) $blog_id == $tags_blog_id && apply_filters('bp_blogs_block_sitewide_tags_activity', true))
323        return false;
324
325    // Don't record this if it's not a post
326    if (!in_array($post->post_type, apply_filters('bp_blogs_record_post_post_types', array('post'))))
327        return false;
328
329    $is_blog_public = apply_filters('bp_is_blog_public', (int) get_blog_option($blog_id, 'blog_public'));
330
331    if ('publish' == $post->post_status && empty($post->post_password)) {
332        if ($is_blog_public || !is_multisite()) {
333
334            // Record this in activity streams
335            $post_permalink = add_query_arg(
336                    'p', $post_id, trailingslashit(get_home_url($blog_id))
337            );
338
339            if (is_multisite())
340                $activity_action = sprintf(__('%1$s wrote a new post, %2$s, on the site %3$s', 'buddypress'), bp_core_get_userlink((int) $post->post_author), '<a href="' . $post_permalink . '">' . $post->post_title . '</a>', '<a href="' . get_blog_option($blog_id, 'home') . '">' . get_blog_option($blog_id, 'blogname') . '</a>');
341            else
342                $activity_action = sprintf(__('%1$s wrote a new post, %2$s', 'buddypress'), bp_core_get_userlink((int) $post->post_author), '<a href="' . $post_permalink . '">' . $post->post_title . '</a>');
343
344            // Make sure there's not an existing entry for this post (prevent bumping)
345            if (bp_is_active('activity')) {
346                $existing = bp_activity_get(array(
347                    'filter' => array(
348                        'action' => 'new_blog_post',
349                        'primary_id' => $blog_id,
350                        'secondary_id' => $post_id,
351                    )
352                ));
353
354                if (!empty($existing['activities'])) {
355                    return;
356                }
357            }
358
359            $activity_content = $post->post_content;
360
361            bp_blogs_record_activity(array(
362                'user_id' => (int) $post->post_author,
363                'action' => apply_filters('bp_blogs_activity_new_post_action', $activity_action, $post, $post_permalink),
364                'content' => apply_filters('bp_blogs_activity_new_post_content', $activity_content, $post, $post_permalink),
365                'primary_link' => apply_filters('bp_blogs_activity_new_post_primary_link', $post_permalink, $post_id),
366                'type' => 'new_blog_post',
367                'item_id' => $blog_id,
368                'secondary_item_id' => $post_id,
369                'recorded_time' => $post->post_date_gmt,
370            ));
371        }
372
373        // Update the blogs last activity
374        bp_blogs_update_blogmeta($blog_id, 'last_activity', bp_core_current_time());
375    } else {
376        bp_blogs_remove_post($post_id, $blog_id, $user_id);
377    }
378
379    do_action('bp_blogs_new_blog_post', $post_id, $post, $user_id);
380}
381
382/**
383 * Record a new blog comment in the BuddyPress activity stream.
384 *
385 * Only posts the item if blog is public and post is not password-protected.
386 *
387 * @param int $comment_id ID of the comment being recorded.
388 * @param bool|string $is_approved Optional. The $is_approved value passed to
389 *        the 'comment_post' action. Default: true.
390 * @return bool|object Returns false on failure, the comment object on success.
391 */
392function bp_blogs_record_comment($comment_id, $is_approved = true) {
393    // Get the users comment
394    $recorded_comment = get_comment($comment_id);
395
396    // Don't record activity if the comment hasn't been approved
397    if (empty($is_approved))
398        return false;
399
400    // Don't record activity if no email address has been included
401    if (empty($recorded_comment->comment_author_email))
402        return false;
403
404    // Don't record activity if the comment has already been marked as spam
405    if ('spam' === $is_approved)
406        return false;
407
408    // Get the user by the comment author email.
409    $user = get_user_by('email', $recorded_comment->comment_author_email);
410
411    // If user isn't registered, don't record activity
412    if (empty($user))
413        return false;
414
415    // Get the user_id
416    $user_id = (int) $user->ID;
417
418    // Get blog and post data
419    $blog_id = get_current_blog_id();
420
421    // If blog is not trackable, do not record the activity.
422    if (!bp_blogs_is_blog_trackable($blog_id, $user_id))
423        return false;
424
425    $recorded_comment->post = get_post($recorded_comment->comment_post_ID);
426
427    if (empty($recorded_comment->post) || is_wp_error($recorded_comment->post))
428        return false;
429
430    // If this is a password protected post, don't record the comment
431    if (!empty($recorded_comment->post->post_password))
432        return false;
433
434    // Don't record activity if the comment's associated post isn't a WordPress Post
435    if (!in_array($recorded_comment->post->post_type, apply_filters('bp_blogs_record_comment_post_types', array('post'))))
436        return false;
437
438    $is_blog_public = apply_filters('bp_is_blog_public', (int) get_blog_option($blog_id, 'blog_public'));
439
440    // If blog is public allow activity to be posted
441    if ($is_blog_public) {
442
443        // Get activity related links
444        $post_permalink = get_permalink($recorded_comment->comment_post_ID);
445        $comment_link = get_comment_link($recorded_comment->comment_ID);
446
447        // Prepare to record in activity streams
448        if (is_multisite())
449            $activity_action = sprintf(__('%1$s commented on the post, %2$s, on the site %3$s', 'buddypress'), bp_core_get_userlink($user_id), '<a href="' . $post_permalink . '">' . apply_filters('the_title', $recorded_comment->post->post_title) . '</a>', '<a href="' . get_blog_option($blog_id, 'home') . '">' . get_blog_option($blog_id, 'blogname') . '</a>');
450        else
451            $activity_action = sprintf(__('%1$s commented on the post, %2$s', 'buddypress'), bp_core_get_userlink($user_id), '<a href="' . $post_permalink . '">' . apply_filters('the_title', $recorded_comment->post->post_title) . '</a>');
452
453        $activity_content = $recorded_comment->comment_content;
454
455        // Record in activity streams
456        bp_blogs_record_activity(array(
457            'user_id' => $user_id,
458            'action' => apply_filters_ref_array('bp_blogs_activity_new_comment_action', array($activity_action, &$recorded_comment, $comment_link)),
459            'content' => apply_filters_ref_array('bp_blogs_activity_new_comment_content', array($activity_content, &$recorded_comment, $comment_link)),
460            'primary_link' => apply_filters_ref_array('bp_blogs_activity_new_comment_primary_link', array($comment_link, &$recorded_comment)),
461            'type' => 'new_blog_comment',
462            'item_id' => $blog_id,
463            'secondary_item_id' => $comment_id,
464            'recorded_time' => $recorded_comment->comment_date_gmt
465        ));
466
467        // Update the blogs last active date
468        bp_blogs_update_blogmeta($blog_id, 'last_activity', bp_core_current_time());
469    }
470
471    return $recorded_comment;
472}
473
474add_action('comment_post', 'bp_blogs_record_comment', 10, 2);
475add_action('edit_comment', 'bp_blogs_record_comment', 10);
476
477/**
478 * Record a user's association with a blog.
479 *
480 * This function is hooked to several WordPress actions where blog roles are
481 * set/changed ('add_user_to_blog', 'profile_update', 'user_register'). It
482 * parses the changes, and records them as necessary in the BP blog tracker.
483 *
484 * BuddyPress does not track blogs for Subscribers.
485 *
486 * @param int $user_id The ID of the user.
487 * @param string|bool $role The WP role being assigned to the user
488 *        ('subscriber', 'contributor', 'author', 'editor', 'administrator', or
489 *        a custom role). Defaults to false.
490 * @param int $blog_id Default: the current blog ID.
491 * @return bool|null False on failure.
492 */
493function bp_blogs_add_user_to_blog($user_id, $role = false, $blog_id = 0) {
494    global $wpdb;
495
496    if (empty($blog_id)) {
497        $blog_id = isset($wpdb->blogid) ? $wpdb->blogid : bp_get_root_blog_id();
498    }
499
500    if (empty($role)) {
501        $key = $wpdb->get_blog_prefix($blog_id) . 'capabilities';
502
503        $roles = bp_get_user_meta($user_id, $key, true);
504
505        if (is_array($roles))
506            $role = array_search(1, $roles);
507        else
508            return false;
509    }
510
511    if ($role != 'subscriber')
512        bp_blogs_record_blog($blog_id, $user_id, true);
513}
514
515add_action('add_user_to_blog', 'bp_blogs_add_user_to_blog', 10, 3);
516add_action('profile_update', 'bp_blogs_add_user_to_blog');
517add_action('user_register', 'bp_blogs_add_user_to_blog');
518
519/**
520 * Remove a blog-user pair from BP's blog tracker.
521 *
522 * @param int $user_id ID of the user whose blog is being removed.
523 * @param int $blog_id Optional. ID of the blog being removed. Default: current blog ID.
524 */
525function bp_blogs_remove_user_from_blog($user_id, $blog_id = 0) {
526    global $wpdb;
527
528    if (empty($blog_id))
529        $blog_id = $wpdb->blogid;
530
531    bp_blogs_remove_blog_for_user($user_id, $blog_id);
532}
533
534add_action('remove_user_from_blog', 'bp_blogs_remove_user_from_blog', 10, 2);
535
536/**
537 * Rehook WP's maybe_add_existing_user_to_blog with a later priority
538 *
539 * WordPress catches add-user-to-blog requests at init:10. In some cases, this
540 * can precede BP's Blogs component. This function bumps the priority of the
541 * core function, so that we can be sure that the Blogs component is loaded
542 * first. See http://buddypress.trac.wordpress.org/ticket/3916.
543 *
544 * @since BuddyPress (1.6)
545 * @access private
546 */
547function bp_blogs_maybe_add_user_to_blog() {
548    if (!is_multisite())
549        return;
550
551    remove_action('init', 'maybe_add_existing_user_to_blog');
552    add_action('init', 'maybe_add_existing_user_to_blog', 20);
553}
554
555add_action('init', 'bp_blogs_maybe_add_user_to_blog', 1);
556
557/**
558 * Remove the "blog created" item from the BP blogs tracker and activity stream.
559 *
560 * @param int $blog_id ID of the blog being removed.
561 */
562function bp_blogs_remove_blog($blog_id) {
563    global $bp;
564
565    $blog_id = (int) $blog_id;
566    do_action('bp_blogs_before_remove_blog', $blog_id);
567
568    BP_Blogs_Blog::delete_blog_for_all($blog_id);
569
570    // Delete activity stream item
571    bp_blogs_delete_activity(array('item_id' => $blog_id, 'component' => $bp->blogs->id, 'type' => 'new_blog'));
572
573    do_action('bp_blogs_remove_blog', $blog_id);
574}
575
576add_action('delete_blog', 'bp_blogs_remove_blog');
577
578/**
579 * Remove a blog from the tracker for a specific user.
580 *
581 * @param int $user_id ID of the user for whom the blog is being removed.
582 * @param int $blog_id ID of the blog being removed.
583 */
584function bp_blogs_remove_blog_for_user($user_id, $blog_id) {
585    global $bp;
586
587    $blog_id = (int) $blog_id;
588    $user_id = (int) $user_id;
589
590    do_action('bp_blogs_before_remove_blog_for_user', $blog_id, $user_id);
591
592    BP_Blogs_Blog::delete_blog_for_user($blog_id, $user_id);
593
594    // Delete activity stream item
595    bp_blogs_delete_activity(array(
596        'item_id' => $blog_id,
597        'component' => $bp->blogs->id,
598        'type' => 'new_blog'
599    ));
600
601    do_action('bp_blogs_remove_blog_for_user', $blog_id, $user_id);
602}
603
604add_action('remove_user_from_blog', 'bp_blogs_remove_blog_for_user', 10, 2);
605
606/**
607 * Remove a blog post activity item from the activity stream.
608 *
609 * @param int $post_id ID of the post to be removed.
610 * @param int $blog_id Optional. Defaults to current blog ID.
611 * @param int $user_id Optional. Defaults to the logged-in user ID. This param
612 *        is currently unused in the function (but is passed to hooks).
613 */
614function bp_blogs_remove_post($post_id, $blog_id = 0, $user_id = 0) {
615    global $wpdb, $bp;
616
617    if (empty($wpdb->blogid))
618        return false;
619
620    $post_id = (int) $post_id;
621
622    if (!$blog_id)
623        $blog_id = (int) $wpdb->blogid;
624
625    if (!$user_id)
626        $user_id = bp_loggedin_user_id();
627
628    do_action('bp_blogs_before_remove_post', $blog_id, $post_id, $user_id);
629
630    // Delete activity stream item
631    bp_blogs_delete_activity(array('item_id' => $blog_id, 'secondary_item_id' => $post_id, 'component' => $bp->blogs->id, 'type' => 'new_blog_post'));
632
633    do_action('bp_blogs_remove_post', $blog_id, $post_id, $user_id);
634}
635
636add_action('delete_post', 'bp_blogs_remove_post');
637
638/**
639 * Remove a blog comment activity item from the activity stream.
640 *
641 * @param int $comment_id ID of the comment to be removed.
642 */
643function bp_blogs_remove_comment($comment_id) {
644    global $wpdb;
645
646    // Delete activity stream item
647    bp_blogs_delete_activity(array('item_id' => $wpdb->blogid, 'secondary_item_id' => $comment_id, 'type' => 'new_blog_comment'));
648
649    do_action('bp_blogs_remove_comment', $wpdb->blogid, $comment_id, bp_loggedin_user_id());
650}
651
652add_action('delete_comment', 'bp_blogs_remove_comment');
653
654/**
655 * When a blog comment status transition occurs, update the relevant activity's status.
656 *
657 * @since BuddyPress (1.6.0)
658 *
659 * @global object $bp BuddyPress global settings.
660 *
661 * @param string $new_status New comment status.
662 * @param string $old_status Previous comment status.
663 * @param object $comment Comment data.
664 */
665function bp_blogs_transition_activity_status($new_status, $old_status, $comment) {
666    global $bp;
667
668    // Check the Activity component is active
669    if (!bp_is_active('activity'))
670        return;
671
672    /**
673     * Activity currently doesn't have any concept of a trash, or an unapproved/approved state.
674     *
675     * If a blog comment transitions to a "delete" or "hold" status, delete the activity item.
676     * If a blog comment transitions to trashed, or spammed, mark the activity as spam.
677     * If a blog comment transitions to approved (and the activity exists), mark the activity as ham.
678     * Otherwise, record the comment into the activity stream.
679     */
680    // This clause was moved in from bp_blogs_remove_comment() in BuddyPress 1.6. It handles delete/hold.
681    if (in_array($new_status, array('delete', 'hold')))
682        return bp_blogs_remove_comment($comment->comment_ID);
683
684    // These clauses handle trash, spam, and un-spams.
685    elseif (in_array($new_status, array('trash', 'spam')))
686        $action = 'spam_activity';
687    elseif ('approved' == $new_status)
688        $action = 'ham_activity';
689
690    // Get the activity
691    $activity_id = bp_activity_get_activity_id(array('component' => $bp->blogs->id, 'item_id' => get_current_blog_id(), 'secondary_item_id' => $comment->comment_ID, 'type' => 'new_blog_comment',));
692
693    // Check activity item exists
694    if (!$activity_id) {
695
696        // If no activity exists, but the comment has been approved, record it into the activity table.
697        if ('approved' == $new_status)
698            return bp_blogs_record_comment($comment->comment_ID, true);
699
700        return;
701    }
702
703    // Create an activity object
704    $activity = new BP_Activity_Activity($activity_id);
705    if (empty($activity->component))
706        return;
707
708    // Spam/ham the activity if it's not already in that state
709    if ('spam_activity' == $action && !$activity->is_spam) {
710        bp_activity_mark_as_spam($activity);
711    } elseif ('ham_activity' == $action) {
712        bp_activity_mark_as_ham($activity);
713    }
714
715    // Add "new_blog_comment" to the whitelisted activity types, so that the activity's Akismet history is generated
716    $comment_akismet_history = create_function('$t', '$t[] = "new_blog_comment"; return $t;');
717    add_filter('bp_akismet_get_activity_types', $comment_akismet_history);
718
719    // Save the updated activity
720    $activity->save();
721
722    // Remove the "new_blog_comment" activity type whitelist so we don't break anything
723    remove_filter('bp_akismet_get_activity_types', $comment_akismet_history);
724}
725
726add_action('transition_comment_status', 'bp_blogs_transition_activity_status', 10, 3);
727
728/**
729 * Get the total number of blogs being tracked by BuddyPress.
730 *
731 * @return int $count Total blog count.
732 */
733function bp_blogs_total_blogs() {
734    if (!$count = wp_cache_get('bp_total_blogs', 'bp')) {
735        $blogs = BP_Blogs_Blog::get_all();
736        $count = $blogs['total'];
737        wp_cache_set('bp_total_blogs', $count, 'bp');
738    }
739    return $count;
740}
741
742/**
743 * Get the total number of blogs being tracked by BP for a specific user.
744 *
745 * @param int $user_id ID of the user being queried. Default: on a user page,
746 *        the displayed user. Otherwise, the logged-in user.
747 * @param bool $show_hidden
748 * @return int $count Total blog count for the user.
749 * @version 2, stergatu added show_hidden
750 */
751function bp_blogs_total_blogs_for_user($user_id = 0, $show_hidden = false) {
752
753    if (empty($user_id))
754        $user_id = ( bp_displayed_user_id() ) ? bp_displayed_user_id() : bp_loggedin_user_id();
755
756    if (!$count = wp_cache_get('bp_total_blogs_for_user_' . $user_id, 'bp')) {
757        $count = BP_Blogs_Blog::total_blog_count_for_user($user_id, $show_hidden);
758        wp_cache_set('bp_total_blogs_for_user_' . $user_id, $count, 'bp');
759    }
760
761    return $count;
762}
763
764/**
765 * Remove the all data related to a given blog from the BP blogs tracker and activity stream.
766 *
767 * @param int $blog_id The ID of the blog to expunge.
768 */
769function bp_blogs_remove_data_for_blog($blog_id) {
770    global $bp;
771
772    do_action('bp_blogs_before_remove_data_for_blog', $blog_id);
773
774    // If this is regular blog, delete all data for that blog.
775    BP_Blogs_Blog::delete_blog_for_all($blog_id);
776
777    // Delete activity stream item
778    bp_blogs_delete_activity(array('item_id' => $blog_id, 'component' => $bp->blogs->id, 'type' => false));
779
780    do_action('bp_blogs_remove_data_for_blog', $blog_id);
781}
782
783add_action('delete_blog', 'bp_blogs_remove_data_for_blog', 1);
784
785/**
786 * Get all of a user's blogs, as tracked by BuddyPress.
787 *
788 * @see BP_Blogs_Blog::get_blogs_for_user() for a description of parameters
789 *      and return values.
790 *
791 * @param int $user_id See {@BP_Blogs_Blog::get_blogs_for_user()}.
792 * @param bool $show_hidden See {@BP_Blogs_Blog::get_blogs_for_user()}.
793 * @return array See {@BP_Blogs_Blog::get_blogs_for_user()}.
794 */
795function bp_blogs_get_blogs_for_user($user_id, $show_hidden = false) {
796    return BP_Blogs_Blog::get_blogs_for_user($user_id, $show_hidden);
797}
798
799/**
800 * Retrieve a list of all blogs.
801 *
802 * @see BP_Blogs_Blog::get_all() for a description of parameters and return values.
803 *
804 * @param int $per_page See {@BP_Blogs_Blog::get_all()}.
805 * @param int $page See {@BP_Blogs_Blog::get_all()}.
806 * @return array See {@BP_Blogs_Blog::get_all()}.
807 * @version 2 stergatu, add $show_hidden, change $limit to $per_page
808 */
809function bp_blogs_get_all_blogs($per_page = null, $page = null, $show_hidden = false) {
810    return BP_Blogs_Blog::get_all($per_page, $page, $show_hidden);
811}
812
813/**
814 * Retrieve a random list of blogs.
815 *
816 * @see BP_Blogs_Blog::get() for a description of parameters and return values.
817 *
818 * @param int $per_page See {@BP_Blogs_Blog::get()}.
819 * @param int $page See {@BP_Blogs_Blog::get()}.
820 * @return array See {@BP_Blogs_Blog::get()}.
821 * @version 2 stergatu  change $limit to $per_page add the way get is called
822 */
823function bp_blogs_get_random_blogs($per_page = null, $page = null) {
824    $args = array('type' => 'random', 'per_page' => $per_page, 'page' => $page);
825    return BP_Blogs_Blog::get($args);
826}
827
828/**
829 * Check whether a given blog is hidden.
830 *
831 * @see BP_Blogs_Blog::is_hidden() for a description of parameters and return values.
832 *
833 * @param int $blog_id See {@BP_Blogs_Blog::is_hidden()}.
834 * @return bool See {@BP_Blogs_Blog::is_hidden()}.
835 */
836function bp_blogs_is_blog_hidden($blog_id) {
837    return BP_Blogs_Blog::is_hidden($blog_id);
838}
839
840/* * *****************************************************************************
841 * Blog meta functions
842 *
843 * These functions are used to store specific blogmeta in one global table,
844 * rather than in each blog's options table. Significantly speeds up global blog
845 * queries. By default each blog's name, description and last updated time are
846 * stored and synced here.
847 */
848
849/**
850 * Delete a metadta from the DB for a blog.
851 *
852 * @global object $wpdb WordPress database access object.
853 * @global object $bp BuddyPress global settings.
854 *
855 * @param int $blog_id ID of the blog whose metadata is being deleted.
856 * @param string $meta_key Optional. The key of the metadata being deleted. If
857 *        omitted, all BP metadata associated with the blog will be deleted.
858 * @param string $meta_value Optional. If present, the metadata will only be
859 *        deleted if the meta_value matches this parameter.
860 * @return bool True on success, false on failure.
861 */
862function bp_blogs_delete_blogmeta($blog_id, $meta_key = false, $meta_value = false) {
863    global $wpdb, $bp;
864
865    if (!is_numeric($blog_id))
866        return false;
867
868    $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
869
870    if (is_array($meta_value) || is_object($meta_value))
871        $meta_value = serialize($meta_value);
872
873    $meta_value = trim($meta_value);
874
875    if (!$meta_key)
876        $wpdb->query($wpdb->prepare("DELETE FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d", $blog_id));
877    else if ($meta_value)
878        $wpdb->query($wpdb->prepare("DELETE FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d AND meta_key = %s AND meta_value = %s", $blog_id, $meta_key, $meta_value));
879    else
880        $wpdb->query($wpdb->prepare("DELETE FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d AND meta_key = %s", $blog_id, $meta_key));
881
882    wp_cache_delete('bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, 'bp');
883
884    return true;
885}
886
887/**
888 * Get metadata for a given blog.
889 *
890 * @since BuddyPress (1.2.0)
891 *
892 * @global object $wpdb WordPress database access object.
893 * @global object $bp BuddyPress global settings.
894 *
895 * @param int $blog_id ID of the blog whose metadata is being requested.
896 * @param string $meta_key Optional. If present, only the metadata matching
897 *        that meta key will be returned. Otherwise, all metadata for the
898 *        blog will be fetched.
899 * @return mixed The meta value(s) being requested.
900 */
901function bp_blogs_get_blogmeta($blog_id, $meta_key = '') {
902    global $wpdb, $bp;
903
904    $blog_id = (int) $blog_id;
905
906    if (!$blog_id)
907        return false;
908
909    if (!empty($meta_key)) {
910        $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
911
912        if (!$metas = wp_cache_get('bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, 'bp')) {
913            $metas = $wpdb->get_col($wpdb->prepare("SELECT meta_value FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d AND meta_key = %s", $blog_id, $meta_key));
914            wp_cache_set('bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, $metas, 'bp');
915        }
916    } else {
917        $metas = $wpdb->get_col($wpdb->prepare("SELECT meta_value FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d", $blog_id));
918    }
919
920    if (empty($metas)) {
921        if (empty($meta_key))
922            return array();
923        else
924            return '';
925    }
926
927    $metas = array_map('maybe_unserialize', (array) $metas);
928
929    if (1 == count($metas))
930        return $metas[0];
931    else
932        return $metas;
933}
934
935/**
936 * Update a piece of blog meta.
937 *
938 * @global object $wpdb WordPress database access object.
939 * @global object $bp BuddyPress global settings.
940 *
941 * @param int $blog_id ID of the blog whose metadata is being updated.
942 * @param string $meta_key Key of the metadata being updated.
943 * @param mixed $meta_value Value to be set.
944 * @return bool True on success, false on failure.
945 */
946function bp_blogs_update_blogmeta($blog_id, $meta_key, $meta_value) {
947    global $wpdb, $bp;
948
949    if (!is_numeric($blog_id))
950        return false;
951
952    $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
953
954    if (is_string($meta_value))
955        $meta_value = stripslashes(esc_sql($meta_value));
956
957    $meta_value = maybe_serialize($meta_value);
958
959    if (empty($meta_value))
960        return bp_blogs_delete_blogmeta($blog_id, $meta_key);
961
962    $cur = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d AND meta_key = %s", $blog_id, $meta_key));
963
964    if (!$cur)
965        $wpdb->query($wpdb->prepare("INSERT INTO {$bp->blogs->table_name_blogmeta} ( blog_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", $blog_id, $meta_key, $meta_value));
966    else if ($cur->meta_value != $meta_value)
967        $wpdb->query($wpdb->prepare("UPDATE {$bp->blogs->table_name_blogmeta} SET meta_value = %s WHERE blog_id = %d AND meta_key = %s", $meta_value, $blog_id, $meta_key));
968    else
969        return false;
970
971    wp_cache_set('bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, $meta_value, 'bp');
972
973    return true;
974}
975
976/**
977 * Remove all blog associations for a given user.
978 *
979 * @param int $user_id ID whose blog data should be removed.
980 * @return bool|null Returns false on failure.
981 */
982function bp_blogs_remove_data($user_id) {
983    if (!is_multisite())
984        return false;
985
986    do_action('bp_blogs_before_remove_data', $user_id);
987
988    // If this is regular blog, delete all data for that blog.
989    BP_Blogs_Blog::delete_blogs_for_user($user_id);
990
991    do_action('bp_blogs_remove_data', $user_id);
992}
993
994add_action('wpmu_delete_user', 'bp_blogs_remove_data');
995add_action('delete_user', 'bp_blogs_remove_data');
996add_action('bp_make_spam_user', 'bp_blogs_remove_data');