Skip to:
Content

BuddyPress.org

source: tags/1.2.9/bp-blogs.php

Last change on this file was 4609, checked in by johnjamesjacoby, 11 years ago

Tag 1.2.9 (externals still to do)

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-php
File size: 28.1 KB
Line 
1<?php
2
3define ( 'BP_BLOGS_DB_VERSION', '2015' );
4
5/* Define the slug for the component */
6if ( !defined( 'BP_BLOGS_SLUG' ) )
7        define ( 'BP_BLOGS_SLUG', 'blogs' );
8
9require ( BP_PLUGIN_DIR . '/bp-blogs/bp-blogs-classes.php' );
10require ( BP_PLUGIN_DIR . '/bp-blogs/bp-blogs-templatetags.php' );
11
12/* Include the sitewide blog posts widget if this is a multisite installation */
13if ( bp_core_is_multisite() )
14        require ( BP_PLUGIN_DIR . '/bp-blogs/bp-blogs-widgets.php' );
15
16function bp_blogs_install() {
17        global $wpdb, $bp;
18
19        if ( !empty($wpdb->charset) )
20                $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
21
22        $sql[] = "CREATE TABLE {$bp->blogs->table_name} (
23                                id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
24                                user_id bigint(20) NOT NULL,
25                                blog_id bigint(20) NOT NULL,
26                                KEY user_id (user_id),
27                                KEY blog_id (blog_id)
28                         ) {$charset_collate};";
29
30        $sql[] = "CREATE TABLE {$bp->blogs->table_name_blogmeta} (
31                                id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
32                                blog_id bigint(20) NOT NULL,
33                                meta_key varchar(255) DEFAULT NULL,
34                                meta_value longtext DEFAULT NULL,
35                                KEY blog_id (blog_id),
36                                KEY meta_key (meta_key)
37                     ) {$charset_collate};";
38
39
40        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
41
42        dbDelta($sql);
43
44        // On first installation - record all existing blogs in the system.
45        if ( !(int)get_site_option('bp-blogs-first-install') && bp_core_is_multisite() ) {
46                bp_blogs_record_existing_blogs();
47                add_site_option( 'bp-blogs-first-install', 1 );
48        }
49
50        update_site_option( 'bp-blogs-db-version', BP_BLOGS_DB_VERSION );
51}
52
53function bp_blogs_check_installed() {
54        global $wpdb, $bp, $userdata;
55
56        /* Only create the bp-blogs tables if this is a multisite install */
57        if ( is_super_admin() && bp_core_is_multisite() ) {
58                /* Need to check db tables exist, activate hook no-worky in mu-plugins folder. */
59                if ( get_site_option( 'bp-blogs-db-version' ) < BP_BLOGS_DB_VERSION )
60                        bp_blogs_install();
61        }
62}
63add_action( is_multisite() ? 'network_admin_menu' : 'admin_menu', 'bp_blogs_check_installed' );
64
65function bp_blogs_setup_globals() {
66        global $bp, $wpdb;
67
68        /* For internal identification */
69        $bp->blogs->id = 'blogs';
70
71        $bp->blogs->slug = BP_BLOGS_SLUG;
72
73        $bp->blogs->table_name          = $bp->table_prefix . 'bp_user_blogs';
74        $bp->blogs->table_name_blogmeta = $bp->table_prefix . 'bp_user_blogs_blogmeta';
75
76        $bp->blogs->format_notification_function = 'bp_blogs_format_notifications';
77
78        /* Register this in the active components array */
79        $bp->active_components[$bp->blogs->slug] = $bp->blogs->id;
80
81        do_action( 'bp_blogs_setup_globals' );
82}
83add_action( 'bp_setup_globals', 'bp_blogs_setup_globals' );
84
85function bp_blogs_setup_root_component() {
86        /* Register 'blogs' as a root component */
87        bp_core_add_root_component( BP_BLOGS_SLUG );
88}
89add_action( 'bp_setup_root_components', 'bp_blogs_setup_root_component' );
90
91/**
92 * bp_blogs_setup_nav()
93 *
94 * Adds "Blog" to the navigation arrays for the current and logged in user.
95 *
96 * @package BuddyPress Blogs
97 * @global $bp The global BuddyPress settings variable created in bp_core_setup_globals()
98 * @uses bp_is_my_profile() Checks to see if the current user being viewed is the logged in user
99 */
100function bp_blogs_setup_nav() {
101        global $bp;
102
103        /* Blog/post/comment menus should not appear on single WordPress setups. Although comments
104           and posts made by users will still show on their activity stream .*/
105        if ( !bp_core_is_multisite() )
106                return false;
107
108        /* Add 'Blogs' to the main navigation */
109        bp_core_new_nav_item( array( 'name' => sprintf( __( 'Blogs <span>(%d)</span>', 'buddypress' ), bp_blogs_total_blogs_for_user() ), 'slug' => $bp->blogs->slug, 'position' => 30, 'screen_function' => 'bp_blogs_screen_my_blogs', 'default_subnav_slug' => 'my-blogs', 'item_css_id' => $bp->blogs->id ) );
110
111        $blogs_link = $bp->loggedin_user->domain . $bp->blogs->slug . '/';
112
113        /* Set up the component options navigation for Blog */
114        if ( 'blogs' == $bp->current_component ) {
115                if ( bp_is_my_profile() ) {
116                        if ( function_exists('xprofile_setup_nav') ) {
117                                $bp->bp_options_title = __('My Blogs', 'buddypress');
118                        }
119                } else {
120                        /* If we are not viewing the logged in user, set up the current users avatar and name */
121                        $bp->bp_options_avatar = bp_core_fetch_avatar( array( 'item_id' => $bp->displayed_user->id, 'type' => 'thumb' ) );
122                        $bp->bp_options_title = $bp->displayed_user->fullname;
123                }
124        }
125
126        do_action( 'bp_blogs_setup_nav' );
127}
128add_action( 'bp_setup_nav', 'bp_blogs_setup_nav' );
129
130function bp_blogs_directory_blogs_setup() {
131        global $bp;
132
133        if ( bp_core_is_multisite() && $bp->current_component == $bp->blogs->slug && empty( $bp->current_action ) ) {
134                $bp->is_directory = true;
135
136                do_action( 'bp_blogs_directory_blogs_setup' );
137                bp_core_load_template( apply_filters( 'bp_blogs_template_directory_blogs_setup', 'blogs/index' ) );
138        }
139}
140add_action( 'wp', 'bp_blogs_directory_blogs_setup', 2 );
141
142
143/********************************************************************************
144 * Screen Functions
145 *
146 * Screen functions are the controllers of BuddyPress. They will execute when their
147 * specific URL is caught. They will first save or manipulate data using business
148 * functions, then pass on the user to a template file.
149 */
150
151function bp_blogs_screen_my_blogs() {
152        global $bp;
153
154        if ( !bp_core_is_multisite() )
155                return false;
156
157        do_action( 'bp_blogs_screen_my_blogs' );
158        bp_core_load_template( apply_filters( 'bp_blogs_template_my_blogs', 'members/single/home' ) );
159}
160
161function bp_blogs_screen_create_a_blog() {
162        global $bp;
163
164        if ( !bp_core_is_multisite() || $bp->current_component != $bp->blogs->slug || 'create' != $bp->current_action )
165                return false;
166
167        if ( !is_user_logged_in() || !bp_blog_signup_enabled() )
168                return false;
169
170        do_action( 'bp_blogs_screen_create_a_blog' );
171        bp_core_load_template( apply_filters( 'bp_blogs_template_create_a_blog', 'blogs/create' ) );
172}
173/* The create screen is not attached to a nav item, so we need to attach it to an action */
174add_action( 'wp', 'bp_blogs_screen_create_a_blog', 3 );
175
176
177/********************************************************************************
178 * Activity & Notification Functions
179 *
180 * These functions handle the recording, deleting and formatting of activity and
181 * notifications for the user and for this specific component.
182 */
183
184function bp_blogs_register_activity_actions() {
185        global $bp;
186
187        if ( !function_exists( 'bp_activity_set_action' ) )
188                return false;
189
190        bp_activity_set_action( $bp->blogs->id, 'new_blog', __( 'New blog created', 'buddypress' ) );
191        bp_activity_set_action( $bp->blogs->id, 'new_blog_post', __( 'New blog post published', 'buddypress' ) );
192        bp_activity_set_action( $bp->blogs->id, 'new_blog_comment', __( 'New blog post comment posted', 'buddypress' ) );
193
194        do_action( 'bp_blogs_register_activity_actions' );
195}
196add_action( 'bp_register_activity_actions', 'bp_blogs_register_activity_actions' );
197
198function bp_blogs_record_activity( $args = '' ) {
199        global $bp;
200
201        if ( !function_exists( 'bp_activity_add' ) )
202                return false;
203
204        /* Because blog, comment, and blog post code execution happens before anything else
205           we may need to manually instantiate the activity component globals */
206        if ( !$bp->activity && function_exists('bp_activity_setup_globals') )
207                bp_activity_setup_globals();
208
209        $defaults = array(
210                'user_id' => $bp->loggedin_user->id,
211                'action' => '',
212                'content' => '',
213                'primary_link' => '',
214                'component' => $bp->blogs->id,
215                'type' => false,
216                'item_id' => false,
217                'secondary_item_id' => false,
218                'recorded_time' => bp_core_current_time(),
219                'hide_sitewide' => false
220        );
221
222        $r = wp_parse_args( $args, $defaults );
223        extract( $r, EXTR_SKIP );
224
225        /* Remove large images and replace them with just one image thumbnail */
226        if ( function_exists( 'bp_activity_thumbnail_content_images' ) && !empty( $content ) )
227                $content = bp_activity_thumbnail_content_images( $content );
228
229        if ( !empty( $action ) )
230                $action = apply_filters( 'bp_blogs_record_activity_action', $action );
231
232        if ( !empty( $content ) )
233                $content = apply_filters( 'bp_blogs_record_activity_content', bp_create_excerpt( $content ), $content );
234
235        /* Check for an existing entry and update if one exists. */
236        $id = bp_activity_get_activity_id( array(
237                'user_id' => $user_id,
238                'component' => $component,
239                'type' => $type,
240                'item_id' => $item_id,
241                'secondary_item_id' => $secondary_item_id
242        ) );
243
244        return bp_activity_add( array( 'id' => $id, 'user_id' => $user_id, 'action' => $action, 'content' => $content, 'primary_link' => $primary_link, 'component' => $component, 'type' => $type, 'item_id' => $item_id, 'secondary_item_id' => $secondary_item_id, 'recorded_time' => $recorded_time, 'hide_sitewide' => $hide_sitewide ) );
245}
246
247function bp_blogs_delete_activity( $args = true ) {
248        global $bp;
249
250        if ( function_exists('bp_activity_delete_by_item_id') ) {
251                $defaults = array(
252                        'item_id' => false,
253                        'component' => $bp->blogs->id,
254                        'type' => false,
255                        'user_id' => false,
256                        'secondary_item_id' => false
257                );
258
259                $params = wp_parse_args( $args, $defaults );
260                extract( $params, EXTR_SKIP );
261
262                bp_activity_delete_by_item_id( array(
263                        'item_id' => $item_id,
264                        'component' => $component,
265                        'type' => $type,
266                        'user_id' => $user_id,
267                        'secondary_item_id' => $secondary_item_id
268                ) );
269        }
270}
271
272/********************************************************************************
273 * Business Functions
274 *
275 * Business functions are where all the magic happens in BuddyPress. They will
276 * handle the actual saving or manipulation of information. Usually they will
277 * hand off to a database class for data access, then return
278 * true or false on success or failure.
279 */
280
281function bp_blogs_get_blogs( $args = '' ) {
282        global $bp;
283
284        $defaults = array(
285                'type' => 'active', // active, alphabetical, newest, or random.
286                'user_id' => false, // Pass a user_id to limit to only blogs that this user has privilages higher than subscriber on.
287                'search_terms' => false, // Limit to blogs that match these search terms
288
289                'per_page' => 20, // The number of results to return per page
290                'page' => 1, // The page to return if limiting per page
291        );
292
293        $params = wp_parse_args( $args, $defaults );
294        extract( $params, EXTR_SKIP );
295
296        return apply_filters( 'bp_blogs_get_blogs', BP_Blogs_Blog::get( $type, $per_page, $page, $user_id, $search_terms ), &$params );
297}
298
299function bp_blogs_record_existing_blogs() {
300        global $bp, $wpdb;
301
302        /* Truncate user blogs table and re-record. */
303        $wpdb->query( "TRUNCATE TABLE {$bp->blogs->table_name}" );
304
305        $blog_ids = $wpdb->get_col( $wpdb->prepare( "SELECT blog_id FROM {$wpdb->base_prefix}blogs WHERE mature = 0 AND spam = 0 AND deleted = 0" ) );
306
307        if ( $blog_ids ) {
308                foreach( (array)$blog_ids as $blog_id ) {
309                        $users = get_users_of_blog( $blog_id );
310
311                        if ( $users ) {
312                                foreach ( (array)$users as $user ) {
313                                        $role = unserialize( $user->meta_value );
314
315                                        if ( !isset( $role['subscriber'] ) )
316                                                bp_blogs_record_blog( $blog_id, $user->user_id, true );
317                                }
318                        }
319                }
320        }
321}
322
323/**
324 * Makes BuddyPress aware of a new site so that it can track its activity.
325 *
326 * @global object $bp BuddyPress global settings
327 * @param int $blog_id
328 * @param int $user_id
329 * @param $bool $no_activity ; optional.
330 * @since 1.0
331 * @uses BP_Blogs_Blog
332 */
333function bp_blogs_record_blog( $blog_id, $user_id, $no_activity = false ) {
334        global $bp;
335
336        if ( !$user_id )
337                $user_id = $bp->loggedin_user->id;
338
339        $name = get_blog_option( $blog_id, 'blogname' );
340        $description = get_blog_option( $blog_id, 'blogdescription' );
341
342        if ( empty( $name ) )
343                return false;
344
345        $recorded_blog = new BP_Blogs_Blog;
346        $recorded_blog->user_id = $user_id;
347        $recorded_blog->blog_id = $blog_id;
348
349        $recorded_blog_id = $recorded_blog->save();
350
351        bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'name', $name );
352        bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'description', $description );
353        bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'last_activity', bp_core_current_time() );
354
355        // Only record this activity if the blog is public
356        if ( (int)$_POST['blog_public'] && !$no_activity ) {
357                // Record this in activity streams
358                bp_blogs_record_activity( array(
359                        'user_id'      => $recorded_blog->user_id,
360                        'action'       => apply_filters( 'bp_blogs_activity_created_blog_action', sprintf( __( '%s created the blog %s', 'buddypress'), bp_core_get_userlink( $recorded_blog->user_id ), '<a href="' . get_site_url( $recorded_blog->blog_id ) . '">' . esc_attr( $name ) . '</a>' ), &$recorded_blog, $name, $description ),
361                        'primary_link' => apply_filters( 'bp_blogs_activity_created_blog_primary_link', get_site_url( $recorded_blog->blog_id ), $recorded_blog->blog_id ),
362                        'type'         => 'new_blog',
363                        'item_id'      => $recorded_blog->blog_id
364                ) );
365        }
366
367        do_action( 'bp_blogs_new_blog', &$recorded_blog, $is_private, $is_recorded );
368}
369add_action( 'wpmu_new_blog', 'bp_blogs_record_blog', 10, 2 );
370
371/**
372 * bp_blogs_update_option_blogname()
373 *
374 * Updates blogname in BuddyPress blogmeta table
375 *
376 * @global object $wpdb DB Layer
377 * @param string $oldvalue Value before save (not used)
378 * @param string $newvalue Value to change meta to
379 */
380function bp_blogs_update_option_blogname( $oldvalue, $newvalue ) {
381        global $wpdb;
382        bp_blogs_update_blogmeta( $wpdb->blogid, 'name', $newvalue );
383}
384add_action( 'update_option_blogname', 'bp_blogs_update_option_blogname', 10, 2 );
385
386/**
387 * bp_blogs_update_option_blogdescription()
388 *
389 * Updates blogdescription in BuddyPress blogmeta table
390 *
391 * @global object $wpdb DB Layer
392 * @param string $oldvalue Value before save (not used)
393 * @param string $newvalue Value to change meta to
394 */
395function bp_blogs_update_option_blogdescription( $oldvalue, $newvalue ) {
396        global $wpdb;
397        bp_blogs_update_blogmeta( $wpdb->blogid, 'description', $newvalue );
398}
399add_action( 'update_option_blogdescription', 'bp_blogs_update_option_blogdescription', 10, 2 );
400
401function bp_blogs_record_post( $post_id, $post, $user_id = false ) {
402        global $bp, $wpdb;
403
404        $post_id = (int)$post_id;
405        $blog_id = (int)$wpdb->blogid;
406
407        if ( !$user_id )
408                $user_id = (int)$post->post_author;
409
410        // This is to stop infinite loops with Donncha's sitewide tags plugin
411        if ( (int)$blog_id == (int)$bp->site_options['tags_blog_id'] )
412                return false;
413
414        // Don't record this if it's not a post
415        if ( 'post' != $post->post_type )
416                return false;
417
418        if ( 'publish' == $post->post_status && empty( $post->post_password ) ) {
419                if ( (int)get_blog_option( $blog_id, 'blog_public' ) || !bp_core_is_multisite() ) {
420                        // Record this in activity streams
421                        $post_permalink   = get_permalink( $post_id );
422                        $activity_action  = sprintf( __( '%s wrote a new blog post: %s', 'buddypress' ), bp_core_get_userlink( (int)$post->post_author ), '<a href="' . $post_permalink . '">' . $post->post_title . '</a>' );
423                        $activity_content = $post->post_content;
424
425                        bp_blogs_record_activity( array(
426                                'user_id'            => (int)$post->post_author,
427                                'action'            => apply_filters( 'bp_blogs_activity_new_post_action', $activity_action, &$post, $post_permalink ),
428                                'content'           => apply_filters( 'bp_blogs_activity_new_post_content', $activity_content, &$post, $post_permalink ),
429                                'primary_link'      => apply_filters( 'bp_blogs_activity_new_post_primary_link', $post_permalink, $post_id ),
430                                'type'              => 'new_blog_post',
431                                'item_id'           => $blog_id,
432                                'secondary_item_id' => $post_id,
433                                'recorded_time'     => $post->post_date_gmt
434                        ));
435                }
436
437                // Update the blogs last activity
438                bp_blogs_update_blogmeta( $blog_id, 'last_activity', bp_core_current_time() );
439        } else {
440                bp_blogs_remove_post( $post_id, $blog_id );
441        }
442
443        do_action( 'bp_blogs_new_blog_post', $post_id, $post, $user_id );
444}
445add_action( 'save_post', 'bp_blogs_record_post', 10, 2 );
446
447/**
448 * bp_blogs_record_comment()
449 *
450 * Record blog comment activity. Checks if blog is public and post is not
451 * password protected.
452 *
453 * @global object $wpdb
454 * @global $bp $bp
455 * @param int $comment_id
456 * @param bool $is_approved
457 * @return mixed
458 */
459
460function bp_blogs_record_comment( $comment_id, $is_approved = true ) {
461        global $wpdb, $bp;
462
463        // Get the users comment
464        $recorded_comment = get_comment( $comment_id );
465
466        // Don't record activity if the comment hasn't been approved
467        if ( empty( $is_approved ) )
468                return false;
469
470        // Don't record activity if no email address has been included
471        if ( empty( $recorded_comment->comment_author_email ) )
472                return false;
473       
474        // Get the user_id from the comment author email.
475        $user = get_user_by_email( $recorded_comment->comment_author_email );
476        $user_id = (int)$user->ID;
477
478        // If there's no registered user id, don't record activity
479        if ( empty( $user_id ) )
480                return false;
481
482        // Get blog and post data
483        $blog_id = (int)$wpdb->blogid;
484        $recorded_comment->post = get_post( $recorded_comment->comment_post_ID );
485
486        // If this is a password protected post, don't record the comment
487        if ( !empty( $recorded_comment->post->post_password ) )
488                return false;
489
490        // If blog is public allow activity to be posted
491        if ( get_blog_option( $blog_id, 'blog_public' ) ) {
492
493                // Get activity related links
494                $post_permalink = get_permalink( $recorded_comment->comment_post_ID );
495                $comment_link   = htmlspecialchars( get_comment_link( $recorded_comment->comment_ID ) );
496
497                // Prepare to record in activity streams
498                $activity_action        = sprintf( __( '%s commented on the blog post %s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>' );
499                $activity_content       = $recorded_comment->comment_content;
500
501                // Record in activity streams
502                bp_blogs_record_activity( array(
503                        'user_id'           => $user_id,
504                        'action'            => apply_filters( 'bp_blogs_activity_new_comment_action', $activity_action, &$recorded_comment, $comment_link ),
505                        'content'           => apply_filters( 'bp_blogs_activity_new_comment_content', $activity_content, &$recorded_comment, $comment_link ),
506                        'primary_link'      => apply_filters( 'bp_blogs_activity_new_comment_primary_link', $comment_link, &$recorded_comment ),
507                        'type'              => 'new_blog_comment',
508                        'item_id'           => $blog_id,
509                        'secondary_item_id' => $comment_id,
510                        'recorded_time'     => $recorded_comment->comment_date_gmt
511                ) );
512
513                // Update the blogs last active date
514                bp_blogs_update_blogmeta( $blog_id, 'last_activity', bp_core_current_time() );
515        }
516
517        return $recorded_comment;
518}
519add_action( 'comment_post', 'bp_blogs_record_comment', 10, 2 );
520//add_action( 'edit_comment', 'bp_blogs_record_comment', 10 );
521
522function bp_blogs_manage_comment( $comment_id, $comment_status ) {
523        if ( 'spam' == $comment_status || 'hold' == $comment_status || 'delete' == $comment_status || 'trash' == $comment_status )
524                return bp_blogs_remove_comment( $comment_id );
525
526        return bp_blogs_record_comment( $comment_id, true );
527}
528add_action( 'wp_set_comment_status', 'bp_blogs_manage_comment', 10, 2 );
529
530function bp_blogs_add_user_to_blog( $user_id, $role, $blog_id = false ) {
531        global $current_blog;
532
533        if ( empty( $blog_id ) )
534                $blog_id = $current_blog->blog_id;
535
536        if ( $role != 'subscriber' )
537                bp_blogs_record_blog( $blog_id, $user_id, true );
538}
539add_action( 'add_user_to_blog', 'bp_blogs_add_user_to_blog', 10, 3 );
540
541function bp_blogs_remove_user_from_blog( $user_id, $blog_id = false ) {
542        global $current_blog;
543
544        if ( empty( $blog_id ) )
545                $blog_id = $current_blog->blog_id;
546
547        bp_blogs_remove_blog_for_user( $user_id, $blog_id );
548}
549add_action( 'remove_user_from_blog', 'bp_blogs_remove_user_from_blog', 10, 2 );
550
551function bp_blogs_remove_blog( $blog_id ) {
552        global $bp;
553
554        $blog_id = (int)$blog_id;
555
556        BP_Blogs_Blog::delete_blog_for_all( $blog_id );
557
558        // Delete activity stream item
559        bp_blogs_delete_activity( array( 'item_id' => $blog_id, 'component' => $bp->blogs->slug, 'type' => 'new_blog' ) );
560
561        do_action( 'bp_blogs_remove_blog', $blog_id );
562}
563add_action( 'delete_blog', 'bp_blogs_remove_blog' );
564
565function bp_blogs_remove_blog_for_user( $user_id, $blog_id ) {
566        global $current_user;
567
568        $blog_id = (int)$blog_id;
569        $user_id = (int)$user_id;
570
571        BP_Blogs_Blog::delete_blog_for_user( $blog_id, $user_id );
572
573        // Delete activity stream item
574        bp_blogs_delete_activity( array( 'item_id' => $blog_id, 'component' => $bp->blogs->slug, 'type' => 'new_blog' ) );
575
576        do_action( 'bp_blogs_remove_blog_for_user', $blog_id, $user_id );
577}
578add_action( 'remove_user_from_blog', 'bp_blogs_remove_blog_for_user', 10, 2 );
579
580function bp_blogs_remove_post( $post_id, $blog_id = false ) {
581        global $current_blog, $bp;
582
583        $post_id = (int)$post_id;
584
585        if ( !$blog_id )
586                $blog_id = (int)$current_blog->blog_id;
587
588        // Delete activity stream item
589        bp_blogs_delete_activity( array( 'item_id' => $blog_id, 'secondary_item_id' => $post_id, 'component' => $bp->blogs->slug, 'type' => 'new_blog_post' ) );
590
591        do_action( 'bp_blogs_remove_post', $blog_id, $post_id, $post->user_id );
592}
593add_action( 'delete_post', 'bp_blogs_remove_post' );
594
595function bp_blogs_remove_comment( $comment_id ) {
596        global $wpdb, $bp;
597
598        // Delete activity stream item
599        bp_blogs_delete_activity( array( 'item_id' => $wpdb->blogid , 'secondary_item_id' => $comment_id, 'type' => 'new_blog_comment' ) );
600
601        do_action( 'bp_blogs_remove_comment', $blog_id, $comment_id, $bp->loggedin_user->id );
602}
603add_action( 'delete_comment', 'bp_blogs_remove_comment' );
604
605function bp_blogs_total_blogs() {
606        if ( !$count = wp_cache_get( 'bp_total_blogs', 'bp' ) ) {
607                $blogs = BP_Blogs_Blog::get_all();
608                $count = $blogs['total'];
609                wp_cache_set( 'bp_total_blogs', $count, 'bp' );
610        }
611        return $count;
612}
613
614function bp_blogs_total_blogs_for_user( $user_id = false ) {
615        global $bp;
616
617        if ( !$user_id )
618                $user_id = ( $bp->displayed_user->id ) ? $bp->displayed_user->id : $bp->loggedin_user->id;
619
620        if ( !$count = wp_cache_get( 'bp_total_blogs_for_user_' . $user_id, 'bp' ) ) {
621                $count = BP_Blogs_Blog::total_blog_count_for_user( $user_id );
622                wp_cache_set( 'bp_total_blogs_for_user_' . $user_id, $count, 'bp' );
623        }
624
625        return $count;
626}
627
628function bp_blogs_remove_data_for_blog( $blog_id ) {
629        global $bp;
630
631        /* If this is regular blog, delete all data for that blog. */
632        BP_Blogs_Blog::delete_blog_for_all( $blog_id );
633
634        // Delete activity stream item
635        bp_blogs_delete_activity( array( 'item_id' => $blog_id, 'component' => $bp->blogs->slug, 'type' => false ) );
636
637        do_action( 'bp_blogs_remove_data_for_blog', $blog_id );
638}
639add_action( 'delete_blog', 'bp_blogs_remove_data_for_blog', 1 );
640
641function bp_blogs_get_blogs_for_user( $user_id, $show_hidden = false ) {
642        return BP_Blogs_Blog::get_blogs_for_user( $user_id, $show_hidden );
643}
644
645function bp_blogs_get_all_blogs( $limit = null, $page = null ) {
646        return BP_Blogs_Blog::get_all( $limit, $page );
647}
648
649function bp_blogs_get_random_blogs( $limit = null, $page = null ) {
650        return BP_Blogs_Blog::get( 'random', $limit, $page );
651}
652
653function bp_blogs_is_blog_hidden( $blog_id ) {
654        return BP_Blogs_Blog::is_hidden( $blog_id );
655}
656
657function bp_blogs_redirect_to_random_blog() {
658        global $bp, $wpdb;
659
660        if ( $bp->current_component == $bp->blogs->slug && isset( $_GET['random-blog'] ) ) {
661                $blog = bp_blogs_get_random_blogs( 1, 1 );
662
663                bp_core_redirect( get_site_url( $blog['blogs'][0]->blog_id ) );
664        }
665}
666add_action( 'wp', 'bp_blogs_redirect_to_random_blog', 6 );
667
668
669//
670// Blog meta functions
671// These functions are used to store specific blogmeta in one global table, rather than in each
672// blog's options table. Significantly speeds up global blog queries.
673// By default each blog's name, description and last updated time are stored and synced here.
674//
675
676function bp_blogs_delete_blogmeta( $blog_id, $meta_key = false, $meta_value = false ) {
677        global $wpdb, $bp;
678
679        if ( !is_numeric( $blog_id ) || !bp_core_is_multisite() )
680                return false;
681
682        $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
683
684        if ( is_array($meta_value) || is_object($meta_value) )
685                $meta_value = serialize($meta_value);
686
687        $meta_value = trim( $meta_value );
688
689        if ( !$meta_key ) {
690                $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d", $blog_id ) );
691        } else if ( $meta_value ) {
692                $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 ) );
693        } else {
694                $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d AND meta_key = %s", $blog_id, $meta_key ) );
695        }
696
697        wp_cache_delete( 'bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, 'bp' );
698
699        return true;
700}
701
702function bp_blogs_get_blogmeta( $blog_id, $meta_key = '') {
703        global $wpdb, $bp;
704
705        $blog_id = (int) $blog_id;
706
707        if ( !$blog_id || !bp_core_is_multisite() )
708                return false;
709
710        if ( !empty($meta_key) ) {
711                $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
712
713                if ( !$metas = wp_cache_get( 'bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, 'bp' ) ) {
714                        $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 ) );
715                        wp_cache_set( 'bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, $metas, 'bp' );
716                }
717        } else {
718                $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM {$bp->blogs->table_name_blogmeta} WHERE blog_id = %d", $blog_id) );
719        }
720
721        if ( empty($metas) ) {
722                if ( empty($meta_key) )
723                        return array();
724                else
725                        return '';
726        }
727
728        $metas = array_map('maybe_unserialize', (array)$metas);
729
730        if ( 1 == count($metas) )
731                return $metas[0];
732        else
733                return $metas;
734}
735
736function bp_blogs_update_blogmeta( $blog_id, $meta_key, $meta_value ) {
737        global $wpdb, $bp;
738
739        if ( !is_numeric( $blog_id ) || !bp_core_is_multisite() )
740                return false;
741
742        $meta_key = preg_replace( '|[^a-z0-9_]|i', '', $meta_key );
743
744        if ( is_string($meta_value) )
745                $meta_value = stripslashes($wpdb->escape($meta_value));
746
747        $meta_value = maybe_serialize($meta_value);
748
749        if (empty($meta_value)) {
750                return bp_blogs_delete_blogmeta( $blog_id, $meta_key );
751        }
752
753        $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 ) );
754
755        if ( !$cur ) {
756                $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 ) );
757        } else if ( $cur->meta_value != $meta_value ) {
758                $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 ) );
759        } else {
760                return false;
761        }
762
763        wp_cache_set( 'bp_blogs_blogmeta_' . $blog_id . '_' . $meta_key, $metas, 'bp' );
764
765        return true;
766}
767
768function bp_blogs_remove_data( $user_id ) {
769        if ( !bp_core_is_multisite() )
770                return false;
771
772        /* If this is regular blog, delete all data for that blog. */
773        BP_Blogs_Blog::delete_blogs_for_user( $user_id );
774
775        do_action( 'bp_blogs_remove_data', $user_id );
776}
777add_action( 'wpmu_delete_user', 'bp_blogs_remove_data' );
778add_action( 'delete_user', 'bp_blogs_remove_data' );
779add_action( 'make_spam_user', 'bp_blogs_remove_data' );
780
781
782/********************************************************************************
783 * Caching
784 *
785 * Caching functions handle the clearing of cached objects and pages on specific
786 * actions throughout BuddyPress.
787 */
788
789function bp_blogs_clear_blog_object_cache( $blog_id, $user_id ) {
790        wp_cache_delete( 'bp_blogs_of_user_' . $user_id, 'bp' );
791        wp_cache_delete( 'bp_blogs_for_user_' . $user_id, 'bp' );
792        wp_cache_delete( 'bp_total_blogs_for_user_' . $user_id, 'bp' );
793
794        /* Clear the sitewide activity cache */
795        wp_cache_delete( 'sitewide_activity', 'bp' );
796}
797
798function bp_blogs_format_clear_blog_cache( $recorded_blog_obj ) {
799        bp_blogs_clear_blog_object_cache( false, $recorded_blog_obj->user_id );
800
801        /* Clear the sitewide activity cache */
802        wp_cache_delete( 'sitewide_activity', 'bp' );
803        wp_cache_delete( 'bp_total_blogs', 'bp' );
804}
805
806// List actions to clear object caches on
807add_action( 'bp_blogs_remove_blog_for_user', 'bp_blogs_clear_blog_object_cache', 10, 2 );
808add_action( 'bp_blogs_new_blog', 'bp_blogs_format_clear_blog_cache', 10, 2 );
809
810// List actions to clear super cached pages on, if super cache is installed
811add_action( 'bp_blogs_remove_data_for_blog', 'bp_core_clear_cache' );
812add_action( 'bp_blogs_remove_comment', 'bp_core_clear_cache' );
813add_action( 'bp_blogs_remove_post', 'bp_core_clear_cache' );
814add_action( 'bp_blogs_remove_blog_for_user', 'bp_core_clear_cache' );
815add_action( 'bp_blogs_remove_blog', 'bp_core_clear_cache' );
816add_action( 'bp_blogs_new_blog_comment', 'bp_core_clear_cache' );
817add_action( 'bp_blogs_new_blog_post', 'bp_core_clear_cache' );
818add_action( 'bp_blogs_new_blog', 'bp_core_clear_cache' );
819add_action( 'bp_blogs_remove_data', 'bp_core_clear_cache' );
820
821?>
Note: See TracBrowser for help on using the repository browser.