Skip to:
Content

bbPress.org

Ticket #2020: 2020.diff

File 2020.diff, 151.7 KB (added by jmdodd, 9 years ago)

File re-org, index.php added.

  • includes/core/actions.php

     
    306306        if ( !empty( $bp->maintenance_mode ) || !defined( 'BP_VERSION' ) ) return;
    307307
    308308        // Include the BuddyPress Component
    309         require( bbpress()->includes_dir . 'extend/buddypress.php' );
     309        require( bbpress()->includes_dir . 'extend/buddypress/core.php' );
    310310
    311311        // Instantiate BuddyPress for bbPress
    312312        bbpress()->extend->buddypress = new BBP_BuddyPress();
  • includes/extend/buddypress/activity.php

     
     1<?php
     2
     3/**
     4 * bbPress BuddyPress Activity Class
     5 *
     6 * @package bbPress
     7 * @subpackage BuddyPress
     8 */
     9
     10// Exit if accessed directly
     11if ( !defined( 'ABSPATH' ) ) exit;
     12
     13if ( !class_exists( 'BBP_BuddyPress_Activity' ) ) :
     14/**
     15 * Loads BuddyPress Activity extension
     16 *
     17 * @since bbPress (r3395)
     18 *
     19 * @package bbPress
     20 * @subpackage BuddyPress
     21 */
     22class BBP_BuddyPress_Activity {
     23
     24        /** Variables *************************************************************/
     25
     26        /**
     27         * The name of the BuddyPress component, used in activity streams
     28         *
     29         * @var string
     30         */
     31        private $component = '';
     32
     33        /**
     34         * Forum Create Activty Action
     35         *
     36         * @var string
     37         */
     38        private $forum_create = '';
     39
     40        /**
     41         * Topic Create Activty Action
     42         *
     43         * @var string
     44         */
     45        private $topic_create = '';
     46
     47        /**
     48         * Topic Close Activty Action
     49         *
     50         * @var string
     51         */
     52        private $topic_close = '';
     53
     54        /**
     55         * Topic Edit Activty Action
     56         *
     57         * @var string
     58         */
     59        private $topic_edit = '';
     60
     61        /**
     62         * Topic Open Activty Action
     63         *
     64         * @var string
     65         */
     66        private $topic_open = '';
     67
     68        /**
     69         * Reply Create Activty Action
     70         *
     71         * @var string
     72         */
     73        private $reply_create = '';
     74
     75        /**
     76         * Reply Edit Activty Action
     77         *
     78         * @var string
     79         */
     80        private $reply_edit = '';
     81
     82        /** Setup Methods *********************************************************/
     83
     84        /**
     85         * The bbPress BuddyPress Activity loader
     86         *
     87         * @since bbPress (r3395)
     88         */
     89        public function __construct() {
     90                $this->setup_globals();
     91                $this->setup_actions();
     92                $this->setup_filters();
     93                $this->fully_loaded();
     94        }
     95
     96        /**
     97         * Extension variables
     98         *
     99         * @since bbPress (r3395)
     100         * @access private
     101         * @uses apply_filters() Calls various filters
     102         */
     103        private function setup_globals() {
     104
     105                // The name of the BuddyPress component, used in activity streams
     106                $this->component = 'bbpress';
     107
     108                // Forums
     109                $this->forum_create = 'bbp_forum_create';
     110
     111                // Topics
     112                $this->topic_create = 'bbp_topic_create';
     113                $this->topic_edit   = 'bbp_topic_edit';
     114                $this->topic_close  = 'bbp_topic_close';
     115                $this->topic_open   = 'bbp_topic_open';
     116
     117                // Replies
     118                $this->reply_create = 'bbp_reply_create';
     119                $this->reply_edit   = 'bbp_reply_edit';
     120        }
     121
     122        /**
     123         * Setup the actions
     124         *
     125         * @since bbPress (r3395)
     126         * @access private
     127         * @uses add_filter() To add various filters
     128         * @uses add_action() To add various actions
     129         */
     130        private function setup_actions() {
     131
     132                /** Activity **********************************************************/
     133
     134                // Bail if activity is not active
     135                if ( bp_is_active( 'activity' ) ) {
     136
     137                        // Register the activity stream actions
     138                        add_action( 'bp_register_activity_actions',      array( $this, 'register_activity_actions' )        );
     139
     140                        // Hook into topic and reply creation
     141                        add_action( 'bbp_new_topic',                     array( $this, 'topic_create'              ), 10, 4 );
     142                        add_action( 'bbp_new_reply',                     array( $this, 'reply_create'              ), 10, 5 );
     143
     144                        // Hook into topic and reply status changes
     145                        add_action( 'wp_insert_post',                    array( $this, 'topic_update'              ), 10, 2 );
     146                        add_action( 'wp_insert_post',                    array( $this, 'reply_update'              ), 10, 2 );
     147
     148                        // Hook into topic and reply deletion
     149                        add_action( 'bbp_delete_topic',                  array( $this, 'topic_delete'              ), 10, 1 );
     150                        add_action( 'bbp_delete_reply',                  array( $this, 'reply_delete'              ), 10, 1 );
     151
     152                        // Append forum filters in site wide activity streams
     153                        add_action( 'bp_activity_filter_options',        array( $this, 'activity_filter_options'   ), 10    );
     154
     155                        // Append forum filters in single member activity streams
     156                        add_action( 'bp_member_activity_filter_options', array( $this, 'activity_filter_options'   ), 10    );
     157
     158                        // Append forum filters in single group activity streams
     159                        add_action( 'bp_group_activity_filter_options',  array( $this, 'activity_filter_options'   ), 10    );
     160                }
     161
     162                /** Favorites *********************************************************/
     163
     164                // Move handler to 'bp_actions' - BuddyPress bypasses template_loader
     165                remove_action( 'template_redirect', 'bbp_favorites_handler', 1 );
     166                add_action(    'bp_actions',        'bbp_favorites_handler', 1 );
     167
     168                /** Subscriptions *****************************************************/
     169
     170                // Move handler to 'bp_actions' - BuddyPress bypasses template_loader
     171                remove_action( 'template_redirect', 'bbp_subscriptions_handler', 1 );
     172                add_action(    'bp_actions',        'bbp_subscriptions_handler', 1 );
     173        }
     174
     175        /**
     176         * Setup the filters
     177         *
     178         * @since bbPress (r3395)
     179         * @access private
     180         * @uses add_filter() To add various filters
     181         * @uses add_action() To add various actions
     182         */
     183        private function setup_filters() {
     184
     185                /** Activity **********************************************************/
     186
     187                // Obey BuddyPress commenting rules
     188                add_filter( 'bp_activity_can_comment',   array( $this, 'activity_can_comment'   )        );
     189
     190                // Link directly to the topic or reply
     191                add_filter( 'bp_activity_get_permalink', array( $this, 'activity_get_permalink' ), 10, 2 );
     192
     193                /** Profiles **********************************************************/
     194
     195                // Override bbPress user profile URL with BuddyPress profile URL
     196                add_filter( 'bbp_pre_get_user_profile_url',    array( $this, 'user_profile_url'            )        );
     197                add_filter( 'bbp_get_favorites_permalink',     array( $this, 'get_favorites_permalink'     ), 10, 2 );
     198                add_filter( 'bbp_get_subscriptions_permalink', array( $this, 'get_subscriptions_permalink' ), 10, 2 );
     199
     200                /** Mentions **********************************************************/
     201
     202                // Only link mentions if activity component is active
     203                if ( bp_is_active( 'activity' ) ) {
     204
     205                        // Convert mentions into links on create
     206                        add_filter( 'bbp_new_topic_pre_content',  'bp_activity_at_name_filter' );
     207                        add_filter( 'bbp_new_reply_pre_content',  'bp_activity_at_name_filter' );
     208
     209                        // Convert mentions into links on edit
     210                        add_filter( 'bbp_edit_topic_pre_content', 'bp_activity_at_name_filter' );
     211                        add_filter( 'bbp_edit_reply_pre_content', 'bp_activity_at_name_filter' );
     212                }
     213
     214                // Revert links into text on edit
     215                add_filter( 'bbp_get_form_topic_content', array( $this, 'strip_mentions_on_edit' ) );
     216                add_filter( 'bbp_get_form_reply_content', array( $this, 'strip_mentions_on_edit' ) );
     217        }
     218
     219        /**
     220         * Allow the variables, actions, and filters to be modified by third party
     221         * plugins and themes.
     222         *
     223         * @since bbPress (r3902)
     224         */
     225        private function fully_loaded() {
     226                do_action_ref_array( 'bbp_buddypress_activity_loaded', array( $this ) );
     227        }
     228
     229        /** Methods ***************************************************************/
     230
     231        /**
     232         * Strip out BuddyPress activity at-name HTML on topic/reply edit
     233         *
     234         * Copied from bp_forums_strip_mentions_on_post_edit() in case forums
     235         * component is not active or is not loaded in yet.
     236         *
     237         * @since bbPress (r3475)
     238         * @param type $content Optional
     239         * @uses bp_get_root_domain()
     240         * @uses bp_get_members_root_slug()
     241         * @return string
     242         */
     243        public function strip_mentions_on_edit( $content = '' ) {
     244
     245                // Backwards compat for members root slug
     246                if ( function_exists( 'bp_get_members_root_slug' ) ) {
     247                        $members_root = bp_get_members_root_slug();
     248                } elseif ( defined( 'BP_MEMBERS_SLUG' ) ) {
     249                        $members_root = BP_MEMBERS_SLUG;
     250                } else {
     251                        $members_root = 'members';
     252                }
     253
     254                $pattern = "|<a href=&#039;" . bp_get_root_domain() . "/" . $members_root . "/[A-Za-z0-9-_\.]+/&#039; rel=&#039;nofollow&#039;>(@[A-Za-z0-9-_\.@]+)</a>|";
     255                $content = preg_replace( $pattern, "$1", htmlspecialchars_decode( $content ) );
     256
     257                return $content;
     258        }
     259
     260        /**
     261         * Register our activity actions with BuddyPress
     262         *
     263         * @since bbPress (r3395)
     264         * @uses bp_activity_set_action()
     265         */
     266        public function register_activity_actions() {
     267                bp_activity_set_action( $this->component, $this->topic_create, __( 'New topic created', 'bbpress' ) );
     268                bp_activity_set_action( $this->component, $this->reply_create, __( 'New reply created', 'bbpress' ) );
     269        }
     270
     271        /**
     272         * Wrapper for recoding bbPress actions to the BuddyPress activity stream
     273         *
     274         * @since bbPress (r3395)
     275         * @param type $args Array of arguments for bp_activity_add()
     276         * @uses bbp_get_current_user_id()
     277         * @uses bp_core_current_time()
     278         * @uses bbp_parse_args()
     279         * @uses aplly_filters()
     280         * @uses bp_activity_add()
     281         * @return type Activity ID if successful, false if not
     282         */
     283        private function record_activity( $args = '' ) {
     284
     285                // Default activity args
     286                $defaults = array (
     287                        'id'                => null,
     288                        'user_id'           => bbp_get_current_user_id(),
     289                        'type'              => '',
     290                        'action'            => '',
     291                        'item_id'           => '',
     292                        'secondary_item_id' => '',
     293                        'content'           => '',
     294                        'primary_link'      => '',
     295                        'component'         => $this->component,
     296                        'recorded_time'     => bp_core_current_time(),
     297                        'hide_sitewide'     => false
     298                );
     299                $activity = bbp_parse_args( $args, $defaults, 'record_activity' );
     300
     301                // Add the activity
     302                return bp_activity_add( $activity );
     303        }
     304
     305        /**
     306         * Wrapper for deleting bbPress actions from BuddyPress activity stream
     307         *
     308         * @since bbPress (r3395)
     309         * @param type $args Array of arguments for bp_activity_add()
     310         * @uses bbp_get_current_user_id()
     311         * @uses bp_core_current_time()
     312         * @uses bbp_parse_args()
     313         * @uses aplly_filters()
     314         * @uses bp_activity_add()
     315         * @return type Activity ID if successful, false if not
     316         */
     317        public function delete_activity( $args = '' ) {
     318
     319                // Default activity args
     320                $defaults = array(
     321                        'item_id'           => false,
     322                        'component'         => $this->component,
     323                        'type'              => false,
     324                        'user_id'           => false,
     325                        'secondary_item_id' => false
     326                );
     327                $activity = bbp_parse_args( $args, $defaults, 'delete_activity' );
     328
     329                // Delete the activity
     330                bp_activity_delete_by_item_id( $activity );
     331        }
     332
     333        /**
     334         * Check for an existing activity stream entry for a given post_id
     335         *
     336         * @param int $post_id ID of the topic or reply
     337         * @uses get_post_meta()
     338         * @uses bp_activity_get_specific()
     339         * @return int if an activity id is verified, false if not
     340         */
     341        private static function get_activity_id( $post_id = 0 ) {
     342
     343                // Try to get the activity ID of the post
     344                $activity_id = (int) get_post_meta( $post_id, '_bbp_activity_id', true );
     345
     346                // Bail if no activity ID is in post meta
     347                if ( empty( $activity_id ) )
     348                        return null;
     349
     350                // Get the activity stream item, bail if it doesn't exist
     351                $existing = bp_activity_get_specific( array( 'activity_ids' => $activity_id, 'show_hidden' => true, 'spam' => 'all', ) );
     352                if ( empty( $existing['total'] ) || ( 1 != $existing['total'] ) )
     353                        return null;
     354
     355                // Return the activity ID since we've verified the connection
     356                return $activity_id;
     357        }
     358
     359        /**
     360         * Maybe disable activity stream comments on select actions
     361         *
     362         * @since bbPress (r3399)
     363         * @global BP_Activity_Template $activities_template
     364         * @param boolean $can_comment
     365         * @uses bp_get_activity_action_name()
     366         * @return boolean
     367         */
     368        public function activity_can_comment( $can_comment = true ) {
     369                global $activities_template;
     370
     371                // Already forced off, so comply
     372                if ( false === $can_comment )
     373                        return $can_comment;
     374
     375                // Check if blog & forum activity stream commenting is off
     376                if ( ( false === $activities_template->disable_blogforum_replies ) || (int) $activities_template->disable_blogforum_replies ) {
     377
     378                        // Get the current action name
     379                        $action_name = bp_get_activity_action_name();
     380
     381                        // Setup the array of possibly disabled actions
     382                        $disabled_actions = array(
     383                                $this->topic_create,
     384                                $this->reply_create
     385                        );
     386
     387                        // Check if this activity stream action is disabled
     388                        if ( in_array( $action_name, $disabled_actions ) ) {
     389                                $can_comment = false;
     390                        }
     391                }
     392
     393                return $can_comment;
     394        }
     395
     396        /**
     397         * Maybe link directly to topics and replies in activity stream entries
     398         *
     399         * @since bbPress (r3399)
     400         * @param string $link
     401         * @param mixed $activity_object
     402         * @return string The link to the activity stream item
     403         */
     404        public function activity_get_permalink( $link = '', $activity_object = false ) {
     405
     406                // Setup the array of actions to link directly to
     407                $disabled_actions = array(
     408                        $this->topic_create,
     409                        $this->reply_create
     410                );
     411
     412                // Check if this activity stream action is directly linked
     413                if ( in_array( $activity_object->type, $disabled_actions ) ) {
     414                        $link = $activity_object->primary_link;
     415                }
     416
     417                return $link;
     418        }
     419
     420        /**
     421         * Append forum options to activity filter select box
     422         *
     423         * @since bbPress (r3653)
     424         */
     425        function activity_filter_options() {
     426        ?>
     427
     428                <option value="<?php echo $this->topic_create; ?>"><?php _e( 'Topics',  'bbpress' ); ?></option>
     429                <option value="<?php echo $this->reply_create; ?>"><?php _e( 'Replies', 'bbpress' ); ?></option>
     430
     431        <?php
     432        }
     433
     434        /**
     435         * Override bbPress profile URL with BuddyPress profile URL
     436         *
     437         * @since bbPress (r3401)
     438         * @param string $url
     439         * @param int $user_id
     440         * @param string $user_nicename
     441         * @return string
     442         */
     443        public function user_profile_url( $user_id ) {
     444
     445                // Define local variable(s)
     446                $profile_url = '';
     447
     448                // Special handling for forum component
     449                if ( bp_is_current_component( 'forums' ) ) {
     450
     451                        // Empty action or 'topics' action
     452                        if ( !bp_current_action() || bp_is_current_action( 'topics' ) ) {
     453                                $profile_url = bp_core_get_user_domain( $user_id ) . 'forums/topics';
     454
     455                        // Empty action or 'topics' action
     456                        } elseif ( bp_is_current_action( 'replies' ) ) {
     457                                $profile_url = bp_core_get_user_domain( $user_id ) . 'forums/replies';
     458
     459                        // 'favorites' action
     460                        } elseif ( bbp_is_favorites_active() && bp_is_current_action( 'favorites' ) ) {
     461                                $profile_url = $this->get_favorites_permalink( '', $user_id );
     462
     463                        // 'subscriptions' action
     464                        } elseif ( bbp_is_subscriptions_active() && bp_is_current_action( 'subscriptions' ) ) {
     465                                $profile_url = $this->get_subscriptions_permalink( '', $user_id );
     466                        }
     467
     468                // Not in users' forums area
     469                } else {
     470                        $profile_url = bp_core_get_user_domain( $user_id );
     471                }
     472
     473                return trailingslashit( $profile_url );
     474        }
     475
     476        /**
     477         * Override bbPress favorites URL with BuddyPress profile URL
     478         *
     479         * @since bbPress (r3721)
     480         * @param string $url
     481         * @param int $user_id
     482         * @return string
     483         */
     484        public function get_favorites_permalink( $url, $user_id ) {
     485                $url = trailingslashit( bp_core_get_user_domain( $user_id ) . 'forums/favorites' );
     486                return $url;
     487        }
     488
     489        /**
     490         * Override bbPress subscriptions URL with BuddyPress profile URL
     491         *
     492         * @since bbPress (r3721)
     493         * @param string $url
     494         * @param int $user_id
     495         * @return string
     496         */
     497        public function get_subscriptions_permalink( $url, $user_id ) {
     498                $url = trailingslashit( bp_core_get_user_domain( $user_id ) . 'forums/subscriptions' );
     499                return $url;
     500        }
     501
     502        /** Topics ****************************************************************/
     503
     504        /**
     505         * Record an activity stream entry when a topic is created or updated
     506         *
     507         * @since bbPress (r3395)
     508         * @param int $topic_id
     509         * @param int $forum_id
     510         * @param array $anonymous_data
     511         * @param int $topic_author_id
     512         * @uses bbp_get_topic_id()
     513         * @uses bbp_get_forum_id()
     514         * @uses bbp_get_user_profile_link()
     515         * @uses bbp_get_topic_permalink()
     516         * @uses bbp_get_topic_title()
     517         * @uses bbp_get_topic_content()
     518         * @uses bbp_get_forum_permalink()
     519         * @uses bbp_get_forum_title()
     520         * @uses bp_create_excerpt()
     521         * @uses apply_filters()
     522         * @return Bail early if topic is by anonymous user
     523         */
     524        public function topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id ) {
     525
     526                // Bail early if topic is by anonymous user
     527                if ( !empty( $anonymous_data ) )
     528                        return;
     529
     530                // Bail if site is private
     531                if ( !bbp_is_site_public() )
     532                        return;
     533
     534                // Validate activity data
     535                $user_id  = $topic_author_id;
     536                $topic_id = bbp_get_topic_id( $topic_id );
     537                $forum_id = bbp_get_forum_id( $forum_id );
     538
     539                // Bail if user is not active
     540                if ( bbp_is_user_inactive( $user_id ) )
     541                        return;
     542
     543                // Bail if topic is not published
     544                if ( !bbp_is_topic_published( $topic_id ) )
     545                        return;
     546
     547                // Bail if forum is not public
     548                if ( !bbp_is_forum_public( $forum_id, false ) )
     549                        return;
     550
     551                // User link for topic author
     552                $user_link  = bbp_get_user_profile_link( $user_id  );
     553
     554                // Topic
     555                $topic_permalink = bbp_get_topic_permalink( $topic_id );
     556                $topic_title     = bbp_get_topic_title    ( $topic_id );
     557                $topic_content   = bbp_get_topic_content  ( $topic_id );
     558                $topic_link      = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>';
     559
     560                // Forum
     561                $forum_permalink = bbp_get_forum_permalink( $forum_id );
     562                $forum_title     = bbp_get_forum_title    ( $forum_id );
     563                $forum_link      = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>';
     564
     565                // Activity action & text
     566                $activity_text    = sprintf( __( '%1$s started the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link    );
     567                $activity_action  = apply_filters( 'bbp_activity_topic_create',                $activity_text, $user_id,   $topic_id,   $forum_id      );
     568                $activity_content = apply_filters( 'bbp_activity_topic_create_excerpt',        bp_create_excerpt( $topic_content ),     $topic_content );
     569
     570                // Compile the activity stream results
     571                $activity = array(
     572                        'id'                => $this->get_activity_id( $topic_id ),
     573                        'user_id'           => $user_id,
     574                        'action'            => $activity_action,
     575                        'content'           => $activity_content,
     576                        'primary_link'      => $topic_permalink,
     577                        'type'              => $this->topic_create,
     578                        'item_id'           => $topic_id,
     579                        'secondary_item_id' => $forum_id,
     580                        'recorded_time'     => get_post_time( 'Y-m-d H:i:s', true, $topic_id ),
     581                );
     582
     583                // Record the activity
     584                $activity_id = $this->record_activity( $activity );
     585
     586                // Add the activity entry ID as a meta value to the topic
     587                if ( !empty( $activity_id ) ) {
     588                        update_post_meta( $topic_id, '_bbp_activity_id', $activity_id );
     589                }
     590        }
     591
     592        /**
     593         * Delete the activity stream entry when a topic is spammed, trashed, or deleted
     594         *
     595         * @param int $topic_id
     596         * @uses bp_activity_delete()
     597         */
     598        public function topic_delete( $topic_id ) {
     599
     600                // Get activity ID, bail if it doesn't exist
     601                if ( $activity_id = $this->get_activity_id( $topic_id ) )
     602                        return bp_activity_delete( array( 'id' => $activity_id ) );
     603
     604                return false;           
     605        }
     606
     607        /**
     608         * Update the activity stream entry when a topic status changes
     609         *
     610         * @param int $post_id
     611         * @param obj $post
     612         * @uses get_post_type()
     613         * @uses bbp_get_topic_post_type()
     614         * @uses bbp_get_topic_id()
     615         * @uses bbp_is_topic_anonymous()
     616         * @uses bbp_get_public_status_id()
     617         * @uses bbp_get_closed_status_id()
     618         * @uses bbp_get_topic_forum_id()
     619         * @uses bbp_get_topic_author_id()
     620         * @return Bail early if not a topic, or topic is by anonymous user
     621         */
     622        public function topic_update( $topic_id, $post ) {
     623
     624                // Bail early if not a topic
     625                if ( get_post_type( $post ) != bbp_get_topic_post_type() )
     626                        return;
     627
     628                $topic_id = bbp_get_topic_id( $topic_id );
     629
     630                // Bail early if topic is by anonymous user
     631                if ( bbp_is_topic_anonymous( $topic_id ) )
     632                        return;
     633
     634                $anonymous_data = array();
     635
     636                // Action based on new status
     637                if ( in_array( $post->post_status, array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ) ) {
     638
     639                        // Validate topic data
     640                        $forum_id        = bbp_get_topic_forum_id( $topic_id );
     641                        $topic_author_id = bbp_get_topic_author_id( $topic_id );
     642
     643                        $this->topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id );
     644                } else {
     645                        $this->topic_delete( $topic_id );
     646                }
     647        }
     648
     649        /** Replies ***************************************************************/
     650
     651        /**
     652         * Record an activity stream entry when a reply is created
     653         *
     654         * @since bbPress (r3395)
     655         * @param int $topic_id
     656         * @param int $forum_id
     657         * @param array $anonymous_data
     658         * @param int $topic_author_id
     659         * @uses bbp_get_reply_id()
     660         * @uses bbp_get_topic_id()
     661         * @uses bbp_get_forum_id()
     662         * @uses bbp_get_user_profile_link()
     663         * @uses bbp_get_reply_url()
     664         * @uses bbp_get_reply_content()
     665         * @uses bbp_get_topic_permalink()
     666         * @uses bbp_get_topic_title()
     667         * @uses bbp_get_forum_permalink()
     668         * @uses bbp_get_forum_title()
     669         * @uses bp_create_excerpt()
     670         * @uses apply_filters()
     671         * @return Bail early if topic is by anonywous user
     672         */
     673        public function reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id ) {
     674
     675                // Do not log activity of anonymous users
     676                if ( !empty( $anonymous_data ) )
     677                        return;
     678
     679                // Bail if site is private
     680                if ( !bbp_is_site_public() )
     681                        return;
     682
     683                // Validate activity data
     684                $user_id  = $reply_author_id;
     685                $reply_id = bbp_get_reply_id( $reply_id );
     686                $topic_id = bbp_get_topic_id( $topic_id );
     687                $forum_id = bbp_get_forum_id( $forum_id );
     688
     689                // Bail if user is not active
     690                if ( bbp_is_user_inactive( $user_id ) )
     691                        return;
     692
     693                // Bail if reply is not published
     694                if ( !bbp_is_reply_published( $reply_id ) )
     695                        return;
     696
     697                // Bail if forum is not public
     698                if ( !bbp_is_forum_public( $forum_id, false ) )
     699                        return;
     700
     701                // Setup links for activity stream
     702                $user_link  = bbp_get_user_profile_link( $user_id  );
     703
     704                // Reply
     705                $reply_url     = bbp_get_reply_url    ( $reply_id );
     706                $reply_content = bbp_get_reply_content( $reply_id );
     707
     708                // Topic
     709                $topic_permalink = bbp_get_topic_permalink( $topic_id );
     710                $topic_title     = bbp_get_topic_title    ( $topic_id );
     711                $topic_link      = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>';
     712
     713                // Forum
     714                $forum_permalink = bbp_get_forum_permalink( $forum_id );
     715                $forum_title     = bbp_get_forum_title    ( $forum_id );
     716                $forum_link      = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>';
     717
     718                // Activity action & text
     719                $activity_text    = sprintf( __( '%1$s replied to the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link    );
     720                $activity_action  = apply_filters( 'bbp_activity_reply_create',         $activity_text, $user_id,   $reply_id,   $topic_id      );
     721                $activity_content = apply_filters( 'bbp_activity_reply_create_excerpt', bp_create_excerpt( $reply_content ),     $reply_content );
     722
     723                // Compile the activity stream results
     724                $activity = array(
     725                        'id'                => $this->get_activity_id( $reply_id ),
     726                        'user_id'           => $user_id,
     727                        'action'            => $activity_action,
     728                        'content'           => $activity_content,
     729                        'primary_link'      => $reply_url,
     730                        'type'              => $this->reply_create,
     731                        'item_id'           => $reply_id,
     732                        'secondary_item_id' => $topic_id,
     733                        'recorded_time'     => get_post_time( 'Y-m-d H:i:s', true, $reply_id ),
     734                );
     735
     736                // Record the activity
     737                $activity_id = $this->record_activity( $activity );
     738
     739                // Add the activity entry ID as a meta value to the reply
     740                if ( !empty( $activity_id ) ) {
     741                        update_post_meta( $reply_id, '_bbp_activity_id', $activity_id );
     742                }
     743        }
     744
     745        /**
     746         * Delete the activity stream entry when a reply is spammed, trashed, or deleted
     747         *
     748         * @param int $reply_id
     749         * @uses get_post_meta()
     750         * @uses bp_activity_delete()
     751         */
     752        public function reply_delete( $reply_id ) {
     753
     754                // Get activity ID, bail if it doesn't exist
     755                if ( $activity_id = $this->get_activity_id( $reply_id ) )
     756                        return bp_activity_delete( array( 'id' => $activity_id ) );
     757
     758                return false;           
     759        }
     760
     761        /**
     762         * Update the activity stream entry when a reply status changes
     763         *
     764         * @param int $post_id
     765         * @param obj $post
     766         * @uses get_post_type()
     767         * @uses bbp_get_reply_post_type()
     768         * @uses bbp_get_reply_id()
     769         * @uses bbp_is_reply_anonymous()
     770         * @uses bbp_get_public_status_id()
     771         * @uses bbp_get_closed_status_id()
     772         * @uses bbp_get_reply_topic_id()
     773         * @uses bbp_get_reply_forum_id()
     774         * @uses bbp_get_reply_author_id()
     775         * @return Bail early if not a reply, or reply is by anonymous user
     776         */
     777        public function reply_update( $reply_id, $post ) {
     778
     779                // Bail early if not a reply
     780                if ( get_post_type( $post ) != bbp_get_reply_post_type() )
     781                        return;
     782
     783                $reply_id = bbp_get_reply_id( $reply_id );
     784
     785                // Bail early if reply is by anonymous user
     786                if ( bbp_is_reply_anonymous( $reply_id ) )
     787                        return;
     788
     789                $anonymous_data = array();
     790
     791                // Action based on new status
     792                if ( $post->post_status == bbp_get_public_status_id() ) {
     793
     794                        // Validate reply data
     795                        $topic_id        = bbp_get_reply_topic_id( $reply_id );
     796                        $forum_id        = bbp_get_reply_forum_id( $reply_id );
     797                        $reply_author_id = bbp_get_reply_author_id( $reply_id );
     798
     799                        $this->reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id );
     800                } else {
     801                        $this->reply_delete( $reply_id );
     802                }
     803        }
     804}
     805endif;
  • includes/extend/buddypress/component.php

     
     1<?php
     2
     3/**
     4 * bbPress BuddyPress Component Class
     5 *
     6 * @package bbPress
     7 * @subpackage BuddyPress
     8 */
     9
     10// Exit if accessed directly
     11if ( !defined( 'ABSPATH' ) ) exit;
     12
     13if ( !class_exists( 'BBP_Forums_Component' ) ) :
     14/**
     15 * Loads Forums Component
     16 *
     17 * @since bbPress (r3552)
     18 *
     19 * @package bbPress
     20 * @subpackage BuddyPress
     21 */
     22class BBP_Forums_Component extends BP_Component {
     23
     24        /**
     25         * Start the forums component creation process
     26         *
     27         * @since bbPress (r3552)
     28         */
     29        public function __construct() {
     30                parent::start(
     31                        'forums',
     32                        __( 'Forums', 'bbpress' ),
     33                        BP_PLUGIN_DIR
     34                );
     35                $this->setup_globals();
     36                $this->setup_nav();
     37        }
     38
     39        /**
     40         * Setup globals
     41         *
     42         * The BP_FORUMS_SLUG constant is deprecated, and only used here for
     43         * backwards compatibility.
     44         *
     45         * @since bbPress (r3552)
     46         * @global BuddyPress $bp
     47         */
     48        public function setup_globals() {
     49                global $bp;
     50
     51                // Define the parent forum ID
     52                if ( !defined( 'BP_FORUMS_PARENT_FORUM_ID' ) )
     53                        define( 'BP_FORUMS_PARENT_FORUM_ID', 1 );
     54
     55                // Define a slug, if necessary
     56                if ( !defined( 'BP_FORUMS_SLUG' ) )
     57                        define( 'BP_FORUMS_SLUG', $this->id );
     58
     59                // All globals for messaging component.
     60                $globals = array(
     61                        'path'                  => BP_PLUGIN_DIR,
     62                        'slug'                  => BP_FORUMS_SLUG,
     63                        'root_slug'             => isset( $bp->pages->forums->slug ) ? $bp->pages->forums->slug : BP_FORUMS_SLUG,
     64                        'has_directory'         => false,
     65                        'notification_callback' => 'messages_format_notifications',
     66                        'search_string'         => __( 'Search Forums...', 'bbpress' ),
     67                );
     68
     69                parent::setup_globals( $globals );
     70        }
     71
     72        /**
     73         * Setup BuddyBar navigation
     74         *
     75         * @since bbPress (r3552)
     76         */
     77        public function setup_nav() {
     78
     79                // Stop if there is no user displayed or logged in
     80                if ( !is_user_logged_in() && !bp_displayed_user_id() )
     81                        return;
     82
     83                // Define local variable(s)
     84                $sub_nav     = array();
     85                $user_domain = '';
     86
     87                // Add 'Forums' to the main navigation
     88                $main_nav = array(
     89                        'name'                => __( 'Forums', 'bbpress' ),
     90                        'slug'                => $this->slug,
     91                        'position'            => 80,
     92                        'screen_function'     => 'bbp_member_forums_screen_topics',
     93                        'default_subnav_slug' => 'topics',
     94                        'item_css_id'         => $this->id
     95                );
     96
     97                // Determine user to use
     98                if ( bp_displayed_user_id() )
     99                        $user_domain = bp_displayed_user_domain();
     100                elseif ( bp_loggedin_user_domain() )
     101                        $user_domain = bp_loggedin_user_domain();
     102                else
     103                        return;
     104
     105                // User link
     106                $forums_link = trailingslashit( $user_domain . $this->slug );
     107
     108                // Topics started
     109                $sub_nav[] = array(
     110                        'name'            => __( 'Topics Started', 'bbpress' ),
     111                        'slug'            => 'topics',
     112                        'parent_url'      => $forums_link,
     113                        'parent_slug'     => $this->slug,
     114                        'screen_function' => 'bbp_member_forums_screen_topics',
     115                        'position'        => 20,
     116                        'item_css_id'     => 'topics'
     117                );
     118
     119                // Replies to topics
     120                $sub_nav[] = array(
     121                        'name'            => __( 'Topics Replied To', 'bbpress' ),
     122                        'slug'            => 'replies',
     123                        'parent_url'      => $forums_link,
     124                        'parent_slug'     => $this->slug,
     125                        'screen_function' => 'bbp_member_forums_screen_replies',
     126                        'position'        => 40,
     127                        'item_css_id'     => 'replies'
     128                );
     129
     130                // Favorite topics
     131                $sub_nav[] = array(
     132                        'name'            => __( 'Favorites', 'bbpress' ),
     133                        'slug'            => 'favorites',
     134                        'parent_url'      => $forums_link,
     135                        'parent_slug'     => $this->slug,
     136                        'screen_function' => 'bbp_member_forums_screen_favorites',
     137                        'position'        => 60,
     138                        'item_css_id'     => 'favorites'
     139                );
     140
     141                // Subscribed topics (my profile only)
     142                if ( bp_is_my_profile() ) {
     143                        $sub_nav[] = array(
     144                                'name'            => __( 'Subscriptions', 'bbpress' ),
     145                                'slug'            => 'subscriptions',
     146                                'parent_url'      => $forums_link,
     147                                'parent_slug'     => $this->slug,
     148                                'screen_function' => 'bbp_member_forums_screen_subscriptions',
     149                                'position'        => 60,
     150                                'item_css_id'     => 'subscriptions'
     151                        );
     152                }
     153
     154                parent::setup_nav( $main_nav, $sub_nav );
     155        }
     156
     157        /**
     158         * Set up the admin bar
     159         *
     160         * @since bbPress (r3552)
     161         * @global BuddyPress $bp
     162         */
     163        public function setup_admin_bar() {
     164                global $bp;
     165
     166                // Prevent debug notices
     167                $wp_admin_nav = array();
     168
     169                // Menus for logged in user
     170                if ( is_user_logged_in() ) {
     171
     172                        // Setup the logged in user variables
     173                        $user_domain = bp_loggedin_user_domain();
     174                        $forums_link = trailingslashit( $user_domain . $this->slug );
     175
     176                        // Add the "My Account" sub menus
     177                        $wp_admin_nav[] = array(
     178                                'parent' => $bp->my_account_menu_id,
     179                                'id'     => 'my-account-' . $this->id,
     180                                'title'  => __( 'Forums', 'bbpress' ),
     181                                'href'   => trailingslashit( $forums_link )
     182                        );
     183
     184                        // Topics
     185                        $wp_admin_nav[] = array(
     186                                'parent' => 'my-account-' . $this->id,
     187                                'id'     => 'my-account-' . $this->id . '-topics',
     188                                'title'  => __( 'Topics Started', 'bbpress' ),
     189                                'href'   => trailingslashit( $forums_link . 'topics' )
     190                        );
     191
     192                        // Replies
     193                        $wp_admin_nav[] = array(
     194                                'parent' => 'my-account-' . $this->id,
     195                                'id'     => 'my-account-' . $this->id . '-replies',
     196                                'title'  => __( 'Topics Replied To', 'bbpress' ),
     197                                'href'   => trailingslashit( $forums_link . 'replies' )
     198                        );
     199
     200                        // Favorites
     201                        $wp_admin_nav[] = array(
     202                                'parent' => 'my-account-' . $this->id,
     203                                'id'     => 'my-account-' . $this->id . '-favorites',
     204                                'title'  => __( 'Favorite Topics', 'bbpress' ),
     205                                'href'   => trailingslashit( $forums_link . 'favorites' )
     206                        );
     207
     208                        // Subscriptions
     209                        $wp_admin_nav[] = array(
     210                                'parent' => 'my-account-' . $this->id,
     211                                'id'     => 'my-account-' . $this->id . '-subscriptions',
     212                                'title'  => __( 'Subscribed Topics', 'bbpress' ),
     213                                'href'   => trailingslashit( $forums_link . 'subscriptions' )
     214                        );
     215                }
     216
     217                parent::setup_admin_bar( $wp_admin_nav );
     218        }
     219
     220        /**
     221         * Sets up the title for pages and <title>
     222         *
     223         * @since bbPress (r3552)
     224         *
     225         * @global BuddyPress $bp
     226         */
     227        public function setup_title() {
     228                global $bp;
     229
     230                // Adjust title based on view
     231                if ( bp_is_forums_component() ) {
     232                        if ( bp_is_my_profile() ) {
     233                                $bp->bp_options_title = __( 'Forums', 'bbpress' );
     234                        } else {
     235                                $bp->bp_options_avatar = bp_core_fetch_avatar( array(
     236                                        'item_id' => $bp->displayed_user->id,
     237                                        'type'    => 'thumb'
     238                                ) );
     239                                $bp->bp_options_title = $bp->displayed_user->fullname;
     240                        }
     241                }
     242
     243                parent::setup_title();
     244        }
     245}
     246endif;
  • includes/extend/buddypress/core.php

     
     1<?php
     2
     3/**
     4 * Main bbPress BuddyPress Class
     5 *
     6 * @package bbPress
     7 * @subpackage BuddyPress
     8 * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed
     9 */
     10
     11// Exit if accessed directly
     12if ( !defined( 'ABSPATH' ) ) exit;
     13
     14if ( !class_exists( 'BBP_BuddyPress' ) ) :
     15/**
     16 * Loads BuddyPress extension
     17 *
     18 * @since bbPress (r3395)
     19 *
     20 * @package bbPress
     21 * @subpackage BuddyPress
     22 */
     23class BBP_BuddyPress {
     24
     25        /** Slugs *****************************************************************/
     26
     27        /**
     28         * Forums slug
     29         *
     30         * @var string
     31         */
     32        private $forums_slug = '';
     33
     34        /**
     35         * Topic slug
     36         *
     37         * @var string
     38         */
     39        private $topic_slug = '';
     40
     41        /**
     42         * Reply slug
     43         *
     44         * @var string
     45         */
     46        private $reply_slug = '';
     47
     48        /** Setup Methods *********************************************************/
     49
     50        /**
     51         * The main bbPress BuddyPress loader
     52         *
     53         * @since bbPress (r3395)
     54         */
     55        public function __construct() {
     56                $this->includes();
     57                $this->setup_components();
     58                $this->setup_globals();
     59                $this->setup_actions();
     60                $this->setup_filters();
     61                $this->fully_loaded();
     62        }
     63
     64        /**
     65         * Include BuddyPress classes and functions
     66         */
     67        public function includes() {
     68                require( bbpress()->includes_dir . 'extend/buddypress/activity.php' );      // BuddyPress Activity Extension class
     69                require( bbpress()->includes_dir . 'extend/buddypress/group.php' );         // BuddyPress Group Extension class
     70                require( bbpress()->includes_dir . 'extend/buddypress/component.php' );     // BuddyPress Component Extension class
     71                require( bbpress()->includes_dir . 'extend/buddypress/functions.php' );     // Helper BuddyPress functions
     72        }
     73
     74        /**
     75         * Instantiate classes for integration
     76         */
     77        public function setup_components() {
     78                bbpress()->extend->activity = new BBP_BuddyPress_Activity;
     79        }
     80
     81        /**
     82         * Extension variables
     83         *
     84         * @since bbPress (r3395)
     85         * @access private
     86         * @uses apply_filters() Calls various filters
     87         */
     88        private function setup_globals() {
     89
     90                // Forum slugs, as used in BuddyPress
     91                $this->forums_slug  = 'forums';
     92                $this->topic_slug   = 'topic';
     93                $this->reply_slug   = 'reply';
     94        }
     95
     96        /**
     97         * Setup the actions
     98         *
     99         * @since bbPress (r3395)
     100         * @access private
     101         * @uses add_filter() To add various filters
     102         * @uses add_action() To add various actions
     103         */
     104        private function setup_actions() {
     105                // Canonical redirects for normal URLs
     106                add_action( 'template_redirect', array( $this, 'redirect_canonical' ) );
     107        }
     108
     109        /**
     110         * Setup the filters
     111         *
     112         * @since bbPress (r3395)
     113         * @access private
     114         * @uses add_filter() To add various filters
     115         * @uses add_action() To add various actions
     116         */
     117        private function setup_filters() {
     118
     119                // Map forum/topic/replys permalinks to their groups
     120                add_filter( 'bbp_get_forum_permalink', array( $this, 'map_forum_permalink_to_group' ), 10, 2 );
     121                add_filter( 'bbp_get_topic_permalink', array( $this, 'map_topic_permalink_to_group' ), 10, 2 );
     122                add_filter( 'bbp_get_reply_permalink', array( $this, 'map_reply_permalink_to_group' ), 10, 2 );
     123
     124                // Map reply edit links to their groups
     125                add_filter( 'bbp_get_reply_edit_url',  array( $this, 'map_reply_edit_url_to_group'  ), 10, 2 );
     126
     127                // Map assorted template function permalinks
     128                add_filter( 'post_link',               array( $this, 'post_link'                    ), 10, 2 );
     129                add_filter( 'page_link',               array( $this, 'page_link'                    ), 10, 2 );
     130                add_filter( 'post_type_link',          array( $this, 'post_type_link'               ), 10, 2 );
     131
     132                // Group forum pagination
     133                add_filter( 'bbp_topic_pagination',   array( $this, 'topic_pagination'   ) );
     134                add_filter( 'bbp_replies_pagination', array( $this, 'replies_pagination' ) );
     135        }
     136
     137        /**
     138         * Allow the variables, actions, and filters to be modified by third party
     139         * plugins and themes.
     140         *
     141         * @since bbPress (r3902)
     142         */
     143        private function fully_loaded() {
     144                do_action_ref_array( 'bbp_buddypress_loaded', array( $this ) );
     145        }
     146
     147        /** Permalink Mappers *****************************************************/
     148
     149        /**
     150         * Maybe map a bbPress forum/topic/reply permalink to the corresponding group
     151         *
     152         * @param int $post_id
     153         * @uses get_post()
     154         * @uses bbp_is_reply()
     155         * @uses bbp_get_reply_topic_id()
     156         * @uses bbp_get_reply_forum_id()
     157         * @uses bbp_is_topic()
     158         * @uses bbp_get_topic_forum_id()
     159         * @uses bbp_is_forum()
     160         * @uses get_post_field()
     161         * @uses bbp_get_forum_group_ids()
     162         * @uses groups_get_group()
     163         * @uses bp_get_group_admin_permalink()
     164         * @uses bp_get_group_permalink()
     165         * @return Bail early if not a group forum post
     166         * @return string
     167         */
     168        private function maybe_map_permalink_to_group( $post_id = 0, $url = false ) {
     169
     170                switch ( get_post_type( $post_id ) ) {
     171
     172                        // Reply
     173                        case bbp_get_reply_post_type() :
     174                                $topic_id = bbp_get_reply_topic_id( $post_id );
     175                                $forum_id = bbp_get_reply_forum_id( $post_id );
     176                                $url_end  = trailingslashit( $this->reply_slug ) . get_post_field( 'post_name', $post_id );
     177                                break;
     178
     179                        // Topic
     180                        case bbp_get_topic_post_type() :
     181                                $topic_id = $post_id;
     182                                $forum_id = bbp_get_topic_forum_id( $post_id );
     183                                $url_end  = trailingslashit( $this->topic_slug ) . get_post_field( 'post_name', $post_id );
     184                                break;
     185
     186                        // Forum
     187                        case bbp_get_forum_post_type() :
     188                                $forum_id = $post_id;
     189                                $url_end  = get_post_field( 'post_name', $post_id );
     190                                break;
     191
     192                        // Unknown
     193                        default :
     194                                return $url;
     195                                break;
     196                }
     197               
     198                // Get group ID's for this forum
     199                $group_ids = bbp_get_forum_group_ids( $forum_id );
     200
     201                // Bail if the post isn't associated with a group
     202                if ( empty( $group_ids ) )
     203                        return $url;
     204
     205                // @todo Multiple group forums/forum groups
     206                $group_id = $group_ids[0];
     207                $group    = groups_get_group( array( 'group_id' => $group_id ) );
     208
     209                if ( bp_is_group_admin_screen( $this->forums_slug ) ) {
     210                        $group_permalink = trailingslashit( bp_get_group_admin_permalink( $group ) );
     211                } else {
     212                        $group_permalink = trailingslashit( bp_get_group_permalink( $group ) );
     213                }
     214
     215                return trailingslashit( trailingslashit( $group_permalink . $this->forums_slug ) . $url_end );
     216        }
     217
     218        /**
     219         * Map a forum permalink to its corresponding group
     220         *
     221         * @since bbPress (r3802)
     222         * @param string $url
     223         * @param int $forum_id
     224         * @uses maybe_map_permalink_to_group()
     225         * @return string
     226         */
     227        public function map_forum_permalink_to_group( $url, $forum_id ) {
     228                return $this->maybe_map_permalink_to_group( $forum_id, $url );
     229        }
     230
     231        /**
     232         * Map a topic permalink to its group forum
     233         *
     234         * @since bbPress (r3802)
     235         * @param string $url
     236         * @param int $topic_id
     237         * @uses maybe_map_permalink_to_group()
     238         * @return string
     239         */
     240        public function map_topic_permalink_to_group( $url, $topic_id ) {
     241                return $this->maybe_map_permalink_to_group( $topic_id, $url );
     242        }
     243
     244        /**
     245         * Map a reply permalink to its group forum
     246         *
     247         * @since bbPress (r3802)
     248         * @param string $url
     249         * @param int $reply_id
     250         * @uses maybe_map_permalink_to_group()
     251         * @return string
     252         */
     253        public function map_reply_permalink_to_group( $url, $reply_id ) {
     254                return $this->maybe_map_permalink_to_group( bbp_get_reply_topic_id( $reply_id ), $url );
     255        }
     256
     257        /**
     258         * Map a reply edit link to its group forum
     259         *
     260         * @param string $url
     261         * @param int $reply_id
     262         * @uses maybe_map_permalink_to_group()
     263         * @return string
     264         */
     265        public function map_reply_edit_url_to_group( $url, $reply_id ) {
     266                $new = $this->maybe_map_permalink_to_group( $reply_id );
     267
     268                if ( empty( $new ) )
     269                        return $url;
     270
     271                return trailingslashit( $new ) . bbpress()->edit_id  . '/';
     272        }
     273
     274        /**
     275         * Map a post link to its group forum
     276         *
     277         * @param string $url
     278         * @param obj $post
     279         * @param boolean $leavename
     280         * @uses maybe_map_permalink_to_group()
     281         * @return string
     282         */
     283        public function post_link( $url, $post ) {
     284                return $this->maybe_map_permalink_to_group( $post->ID, $url );
     285        }
     286
     287        /**
     288         * Map a page link to its group forum
     289         *
     290         * @param string $url
     291         * @param int $post_id
     292         * @param $sample
     293         * @uses maybe_map_permalink_to_group()
     294         * @return string
     295         */
     296        public function page_link( $url, $post_id ) {
     297                return $this->maybe_map_permalink_to_group( $post_id, $url );
     298        }
     299
     300        /**
     301         * Map a custom post type link to its group forum
     302         *
     303         * @param string $url
     304         * @param obj $post
     305         * @param $leavename
     306         * @param $sample
     307         * @uses maybe_map_permalink_to_group()
     308         * @return string
     309         */
     310        public function post_type_link( $url, $post ) {
     311                return $this->maybe_map_permalink_to_group( $post->ID, $url );
     312        }
     313
     314        /**
     315         * Fix pagination of topics on forum view
     316         *
     317         * @param array $args
     318         * @global $wp_rewrite
     319         * @uses bbp_get_forum_id()
     320         * @uses maybe_map_permalink_to_group
     321         * @return array
     322         */
     323        public function topic_pagination( $args ) {
     324                $new = $this->maybe_map_permalink_to_group( bbp_get_forum_id() );
     325
     326                if ( empty( $new ) )
     327                        return $args;
     328
     329                global $wp_rewrite;
     330
     331                $args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/';
     332
     333                return $args;
     334        }
     335
     336        /**
     337         * Fix pagination of replies on topic view
     338         *
     339         * @param array $args
     340         * @global $wp_rewrite
     341         * @uses bbp_get_topic_id()
     342         * @uses maybe_map_permalink_to_group
     343         * @return array
     344         */
     345        public function replies_pagination( $args ) {
     346                $new = $this->maybe_map_permalink_to_group( bbp_get_topic_id() );
     347                if ( empty( $new ) )
     348                        return $args;
     349
     350                global $wp_rewrite;
     351
     352                $args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/';
     353
     354                return $args;
     355        }
     356
     357        /**
     358         * Ensure that forum content associated with a BuddyPress group can only be
     359         * viewed via the group URL.
     360         *
     361         * @since bbPress (r3802)
     362         */
     363        function redirect_canonical() {
     364
     365                // Viewing a single forum
     366                if ( bbp_is_single_forum() ) {
     367                        $forum_id  = get_the_ID();
     368                        $group_ids = bbp_get_forum_group_ids( $forum_id );
     369
     370                // Viewing a single topic
     371                } elseif ( bbp_is_single_topic() ) {
     372                        $topic_id  = get_the_ID();
     373                        $slug      = get_post_field( 'post_name', $topic_id );
     374                        $forum_id  = bbp_get_topic_forum_id( $topic_id );
     375                        $group_ids = bbp_get_forum_group_ids( $forum_id );
     376
     377                // Not a forum or topic
     378                } else {
     379                        return;
     380                }
     381
     382                // Bail if not a group forum
     383                if ( empty( $group_ids ) )
     384                        return;
     385
     386                // Use the first group ID
     387                $group_id        = $group_ids[0];
     388                $group           = groups_get_group( array( 'group_id' => $group_id ) );
     389                $group_link  = trailingslashit( bp_get_group_permalink( $group ) );
     390                $redirect_to = trailingslashit( $group_link . $this->forums_slug );
     391
     392                // Add topic slug to URL
     393                if ( bbp_is_single_topic() ) {
     394                        $redirect_to  = trailingslashit( $redirect_to . $this->topic_slug . '/' . $slug );
     395                }
     396
     397                bp_core_redirect( $redirect_to );
     398        }
     399}
     400endif;
     401
     402/**
     403 * Creates the Forums component in BuddyPress
     404 *
     405 * @since bbPress (r3653)
     406 *
     407 * @global type $bp
     408 * @return If bbPress is not active
     409 */
     410function bbp_setup_buddypress_component() {
     411        global $bp;
     412
     413        // Bail if no BuddyPress
     414        if ( !empty( $bp->maintenance_mode ) || !defined( 'BP_VERSION' ) ) return;
     415
     416        // Bail if BuddyPress Forums are already active
     417        if ( bp_is_active( 'forums' ) && bp_forums_is_installed_correctly() ) return;
     418
     419        // Create the new BuddyPress Forums component
     420        $bp->forums = new BBP_Forums_Component();
     421
     422        // Register the group extension only if groups are active
     423        if ( bbp_is_group_forums_active() && bp_is_active( 'groups' ) ) {
     424                bp_register_group_extension( 'BBP_Forums_Group_Extension' );
     425        }
     426}
  • includes/extend/buddypress/functions.php

     
     1<?php
     2
     3/**
     4 * Main bbPress BuddyPress Class
     5 *
     6 * @package bbPress
     7 * @subpackage BuddyPress
     8 * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed
     9 */
     10
     11// Exit if accessed directly
     12if ( !defined( 'ABSPATH' ) ) exit;
     13
     14/** BuddyPress Helpers ********************************************************/
     15
     16/**
     17 * Filter the current bbPress user ID with the current BuddyPress user ID
     18 *
     19 * @since bbPress (r3552)
     20 *
     21 * @global BuddyPress $bp
     22 * @param int $user_id
     23 * @param bool $displayed_user_fallback
     24 * @param bool $current_user_fallback
     25 * @return int User ID
     26 */
     27function bbp_filter_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
     28
     29        // Define local variable
     30        $bbp_user_id = 0;
     31
     32        // Get possible user ID's
     33        $did = bp_displayed_user_id();
     34        $lid = bp_loggedin_user_id();
     35
     36        // Easy empty checking
     37        if ( !empty( $user_id ) && is_numeric( $user_id ) )
     38                $bbp_user_id = $user_id;
     39
     40        // Currently viewing or editing a user
     41        elseif ( ( true == $displayed_user_fallback ) && !empty( $did ) )
     42                $bbp_user_id = $did;
     43
     44        // Maybe fallback on the current_user ID
     45        elseif ( ( true == $current_user_fallback ) && !empty( $lid ) )
     46                $bbp_user_id = $lid;
     47
     48        return $bbp_user_id;
     49}
     50add_filter( 'bbp_get_user_id', 'bbp_filter_user_id', 10, 3 );
     51
     52/**
     53 * Filter the bbPress is_single_user function with BuddyPress eqivalent
     54 *
     55 * @since bbPress (r3552)
     56 *
     57 * @param bool $is Optional. Default false
     58 * @return bool True if viewing single user, false if not
     59 */
     60function bbp_filter_is_single_user( $is = false ) {
     61        if ( !empty( $is ) )
     62                return $is;
     63
     64        return bp_is_user();
     65}
     66add_filter( 'bbp_is_single_user', 'bbp_filter_is_single_user', 10, 1 );
     67
     68/**
     69 * Filter the bbPress is_user_home function with BuddyPress eqivalent
     70 *
     71 * @since bbPress (r3552)
     72 *
     73 * @param bool $is Optional. Default false
     74 * @return bool True if viewing single user, false if not
     75 */
     76function bbp_filter_is_user_home( $is = false ) {
     77        if ( !empty( $is ) )
     78                return $is;
     79
     80        return bp_is_my_profile();
     81}
     82add_filter( 'bbp_is_user_home', 'bbp_filter_is_user_home', 10, 1 );
     83
     84/** BuddyPress Screens ********************************************************/
     85
     86/**
     87 * Hook bbPress topics template into plugins template
     88 *
     89 * @since bbPress (r3552)
     90 *
     91 * @uses add_action() To add the content hook
     92 * @uses bp_core_load_template() To load the plugins template
     93 */
     94function bbp_member_forums_screen_topics() {
     95        add_action( 'bp_template_content', 'bbp_member_forums_topics_content' );
     96        bp_core_load_template( apply_filters( 'bbp_member_forums_screen_topics', 'members/single/plugins' ) );
     97}
     98
     99/**
     100 * Hook bbPress replies template into plugins template
     101 *
     102 * @since bbPress (r3552)
     103 *
     104 * @uses add_action() To add the content hook
     105 * @uses bp_core_load_template() To load the plugins template
     106 */
     107function bbp_member_forums_screen_replies() {
     108        add_action( 'bp_template_content', 'bbp_member_forums_replies_content' );
     109        bp_core_load_template( apply_filters( 'bbp_member_forums_screen_replies', 'members/single/plugins' ) );
     110}
     111
     112/**
     113 * Hook bbPress favorites template into plugins template
     114 *
     115 * @since bbPress (r3552)
     116 *
     117 * @uses add_action() To add the content hook
     118 * @uses bp_core_load_template() To load the plugins template
     119 */
     120function bbp_member_forums_screen_favorites() {
     121        add_action( 'bp_template_content', 'bbp_member_forums_favorites_content' );
     122        bp_core_load_template( apply_filters( 'bbp_member_forums_screen_favorites', 'members/single/plugins' ) );
     123}
     124
     125/**
     126 * Hook bbPress subscriptions template into plugins template
     127 *
     128 * @since bbPress (r3552)
     129 *
     130 * @uses add_action() To add the content hook
     131 * @uses bp_core_load_template() To load the plugins template
     132 */
     133function bbp_member_forums_screen_subscriptions() {
     134        add_action( 'bp_template_content', 'bbp_member_forums_subscriptions_content' );
     135        bp_core_load_template( apply_filters( 'bbp_member_forums_screen_subscriptions', 'members/single/plugins' ) );
     136}
     137
     138/** BuddyPress Templates ******************************************************/
     139
     140/**
     141 * Get the topics created template part
     142 *
     143 * @since bbPress (r3552)
     144 *
     145 * @uses bbp_get_template_part()s
     146 */
     147function bbp_member_forums_topics_content() {
     148?>
     149
     150        <div id="bbpress-forums">
     151
     152                <?php bbp_get_template_part( 'user', 'topics-created' ); ?>
     153
     154        </div>
     155
     156<?php
     157}
     158
     159/**
     160 * Get the topics replied to template part
     161 *
     162 * @since bbPress (r3552)
     163 *
     164 * @uses bbp_get_template_part()
     165 */
     166function bbp_member_forums_replies_content() {
     167?>
     168
     169        <div id="bbpress-forums">
     170
     171                <?php bbp_get_template_part( 'user', 'topics-replied-to' ); ?>
     172
     173        </div>
     174
     175<?php
     176}
     177
     178/**
     179 * Get the topics favorited template part
     180 *
     181 * @since bbPress (r3552)
     182 *
     183 * @uses bbp_get_template_part()
     184 */
     185function bbp_member_forums_favorites_content() {
     186?>
     187
     188        <div id="bbpress-forums">
     189
     190                <?php bbp_get_template_part( 'user', 'favorites' ); ?>
     191
     192        </div>
     193
     194<?php
     195}
     196
     197/**
     198 * Get the topics subscribed template part
     199 *
     200 * @since bbPress (r3552)
     201 *
     202 * @uses bbp_get_template_part()
     203 */
     204function bbp_member_forums_subscriptions_content() {
     205?>
     206
     207        <div id="bbpress-forums">
     208
     209                <?php bbp_get_template_part( 'user', 'subscriptions' ); ?>
     210
     211        </div>
     212
     213<?php
     214}
     215
     216/** Forum/Group Sync **********************************************************/
     217
     218/**
     219 * These functions are used to keep the many-to-many relationships between
     220 * groups and forums synchronized. Each forum and group stores ponters to each
     221 * other in their respective meta. This way if a group or forum is deleted
     222 * their associattions can be updated without much effort.
     223 */
     224
     225/**
     226 * Get forum ID's for a group
     227 *
     228 * @param type $group_id
     229 * @since bbPress (r3653)
     230 */
     231function bbp_get_group_forum_ids( $group_id = 0 ) {
     232
     233        // Assume no forums
     234        $forum_ids = array();
     235
     236        // Use current group if none is set
     237        if ( empty( $group_id ) )
     238                $group_id = bp_get_current_group_id();
     239
     240        // Get the forums
     241        if ( !empty( $group_id ) )
     242                $forum_ids = groups_get_groupmeta( $group_id, 'forum_id' );
     243
     244        // Make sure result is an array
     245        if ( !is_array( $forum_ids ) )
     246                $forum_ids = (array) $forum_ids;
     247
     248        // Trim out any empty array items
     249        $forum_ids = array_filter( $forum_ids );
     250
     251        return (array) apply_filters( 'bbp_get_group_forum_ids', $forum_ids, $group_id );
     252}
     253
     254/**
     255 * Get group ID's for a forum
     256 *
     257 * @param type $forum_id
     258 * @since bbPress (r3653)
     259 */
     260function bbp_get_forum_group_ids( $forum_id = 0 ) {
     261
     262        // Assume no forums
     263        $group_ids = array();
     264
     265        // Use current group if none is set
     266        if ( empty( $forum_id ) )
     267                $forum_id = bbp_get_forum_id();
     268
     269        // Get the forums
     270        if ( !empty( $forum_id ) )
     271                $group_ids = get_post_meta( $forum_id, '_bbp_group_ids', true );
     272
     273        // Make sure result is an array
     274        if ( !is_array( $group_ids ) )
     275                $group_ids = (array) $group_ids;
     276
     277        // Trim out any empty array items
     278        $group_ids = array_filter( $group_ids );
     279
     280        return (array) apply_filters( 'bbp_get_forum_group_ids', $group_ids, $forum_id );
     281}
     282
     283/**
     284 * Get forum ID's for a group
     285 *
     286 * @param type $group_id
     287 * @since bbPress (r3653)
     288 */
     289function bbp_update_group_forum_ids( $group_id = 0, $forum_ids = array() ) {
     290
     291        // Use current group if none is set
     292        if ( empty( $group_id ) )
     293                $group_id = bp_get_current_group_id();
     294
     295        // Trim out any empties
     296        $forum_ids = array_filter( $forum_ids );
     297
     298        // Get the forums
     299        return groups_update_groupmeta( $group_id, 'forum_id', $forum_ids );
     300}
     301
     302/**
     303 * Update group ID's for a forum
     304 *
     305 * @param type $forum_id
     306 * @since bbPress (r3653)
     307 */
     308function bbp_update_forum_group_ids( $forum_id = 0, $group_ids = array() ) {
     309        $forum_id = bbp_get_forum_id( $forum_id );
     310
     311        // Trim out any empties
     312        $group_ids = array_filter( $group_ids );
     313
     314        // Get the forums
     315        return update_post_meta( $forum_id, '_bbp_group_ids', $group_ids );
     316}
     317
     318/**
     319 * Add a group to a forum
     320 *
     321 * @param type $group_id
     322 * @since bbPress (r3653)
     323 */
     324function bbp_add_group_id_to_forum( $forum_id = 0, $group_id = 0 ) {
     325
     326        // Validate forum_id
     327        $forum_id = bbp_get_forum_id( $forum_id );
     328
     329        // Use current group if none is set
     330        if ( empty( $group_id ) )
     331                $group_id = bp_get_current_group_id();
     332
     333        // Get current group IDs
     334        $group_ids = bbp_get_forum_group_ids( $forum_id );
     335
     336        // Maybe update the groups forums
     337        if ( !in_array( $group_id, $group_ids ) ) {
     338                $group_ids[] = $group_id;
     339                return bbp_update_forum_group_ids( $forum_id, $group_ids );
     340        }
     341}
     342
     343/**
     344 * Remove a forum from a group
     345 *
     346 * @param type $group_id
     347 * @since bbPress (r3653)
     348 */
     349function bbp_add_forum_id_to_group( $group_id = 0, $forum_id = 0 ) {
     350
     351        // Validate forum_id
     352        $forum_id = bbp_get_forum_id( $forum_id );
     353
     354        // Use current group if none is set
     355        if ( empty( $group_id ) )
     356                $group_id = bp_get_current_group_id();
     357
     358        // Get current group IDs
     359        $forum_ids = bbp_get_group_forum_ids( $group_id );
     360
     361        // Maybe update the groups forums
     362        if ( !in_array( $forum_id, $forum_ids ) ) {
     363                $forum_ids[] = $forum_id;
     364                return bbp_update_group_forum_ids( $group_id, $forum_ids );
     365        }
     366}
     367
     368/**
     369 * Remove a group from a forum
     370 *
     371 * @param type $group_id
     372 * @since bbPress (r3653)
     373 */
     374function bbp_remove_group_id_from_forum( $forum_id = 0, $group_id = 0 ) {
     375
     376        // Validate forum_id
     377        $forum_id = bbp_get_forum_id( $forum_id );
     378
     379        // Use current group if none is set
     380        if ( empty( $group_id ) )
     381                $group_id = bp_get_current_group_id();
     382
     383        // Get current group IDs
     384        $group_ids = bbp_get_forum_group_ids( $forum_id );
     385
     386        // Maybe update the groups forums
     387        if ( in_array( $group_id, $group_ids ) ) {
     388                unset( $group_ids[$group_id] );
     389                return bbp_update_forum_group_ids( $forum_id, $group_ids );
     390        }
     391}
     392
     393/**
     394 * Remove a forum from a group
     395 *
     396 * @param type $group_id
     397 * @since bbPress (r3653)
     398 */
     399function bbp_remove_forum_id_from_group( $group_id = 0, $forum_id = 0 ) {
     400
     401        // Validate forum_id
     402        $forum_id = bbp_get_forum_id( $forum_id );
     403
     404        // Use current group if none is set
     405        if ( empty( $group_id ) )
     406                $group_id = bp_get_current_group_id();
     407
     408        // Get current group IDs
     409        $forum_ids = bbp_get_group_forum_ids( $group_id );
     410
     411        // Maybe update the groups forums
     412        if ( in_array( $forum_id, $forum_ids ) ) {
     413                unset( $forum_ids[$forum_id] );
     414                return bbp_update_group_forum_ids( $group_id, $forum_ids );
     415        }
     416}
     417
     418/**
     419 * Remove a group from aall forums
     420 *
     421 * @param type $group_id
     422 * @since bbPress (r3653)
     423 */
     424function bbp_remove_group_id_from_all_forums( $group_id = 0 ) {
     425
     426        // Use current group if none is set
     427        if ( empty( $group_id ) )
     428                $group_id = bp_get_current_group_id();
     429
     430        // Get current group IDs
     431        $forum_ids = bbp_get_group_forum_ids( $group_id );
     432
     433        // Loop through forums and remove this group from each one
     434        foreach( (array) $forum_ids as $forum_id ) {
     435                bbp_remove_group_id_from_forum( $group_id, $forum_id );
     436        }
     437}
     438
     439/**
     440 * Remove a forum from all groups
     441 *
     442 * @param type $forum_id
     443 * @since bbPress (r3653)
     444 */
     445function bbp_remove_forum_id_from_all_groups( $forum_id = 0 ) {
     446
     447        // Validate
     448        $forum_id  = bbp_get_forum_id( $forum_id );
     449        $group_ids = bbp_get_forum_group_ids( $forum_id );
     450
     451        // Loop through groups and remove this forum from each one
     452        foreach( (array) $group_ids as $group_id ) {
     453                bbp_remove_forum_id_from_group( $forum_id, $group_id );
     454        }
     455}
  • includes/extend/buddypress/group.php

     
     1<?php
     2
     3/**
     4 * bbPress BuddyPress Group Extension Class
     5 *
     6 * @package bbPress
     7 * @subpackage BuddyPress
     8 * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed
     9 */
     10
     11// Exit if accessed directly
     12if ( !defined( 'ABSPATH' ) ) exit;
     13
     14if ( !class_exists( 'BBP_Forums_Group_Extension' ) && class_exists( 'BP_Group_Extension' ) ) :
     15/**
     16 * Loads Group Extension for Forums Component
     17 *
     18 * @since bbPress (r3552)
     19 *
     20 * @package bbPress
     21 * @subpackage BuddyPress
     22 * @todo Everything
     23 */
     24class BBP_Forums_Group_Extension extends BP_Group_Extension {
     25
     26        /**
     27         * Setup bbPress group extension variables
     28         *
     29         * @since bbPress (r3552)
     30         */
     31        public function __construct() {
     32
     33                // Name and slug
     34                $this->name          = bbp_get_forum_archive_title();
     35                $this->nav_item_name = bbp_get_forum_archive_title();
     36                $this->slug          = 'forums';
     37                $this->topic_slug    = 'topic';
     38                $this->reply_slug    = 'reply';
     39
     40                // Forum component is visible @todo configure?
     41                $this->visibility = 'public';
     42
     43                // Set positions towards end
     44                $this->create_step_position = 15;
     45                $this->nav_item_position    = 10;
     46
     47                // Allow create step and show in nav
     48                $this->enable_create_step   = true;
     49                $this->enable_nav_item      = true;
     50                $this->enable_edit_item     = true;
     51
     52                // I forget what these do
     53                $this->display_hook         = 'bp_template_content';
     54                $this->template_file        = 'groups/single/plugins';
     55
     56                // Add handlers to bp_actions
     57                add_action( 'bp_actions', 'bbp_new_forum_handler'  );
     58                add_action( 'bp_actions', 'bbp_new_topic_handler'  );
     59                add_action( 'bp_actions', 'bbp_new_reply_handler'  );
     60                add_action( 'bp_actions', 'bbp_edit_forum_handler' );
     61                add_action( 'bp_actions', 'bbp_edit_topic_handler' );
     62                add_action( 'bp_actions', 'bbp_edit_reply_handler' );
     63
     64                // Tweak the redirect field
     65                add_filter( 'bbp_new_topic_redirect_to', array( $this, 'new_topic_redirect_to' ), 10, 3 );
     66                add_filter( 'bbp_new_reply_redirect_to', array( $this, 'new_reply_redirect_to' ), 10, 3 );
     67        }
     68
     69        /**
     70         * The primary display function for group forums
     71         */
     72        public function display() {
     73
     74                // Prevent Topic Parent from appearing
     75                add_action( 'bbp_theme_before_topic_form_forum', array( $this, 'ob_start'     ) );
     76                add_action( 'bbp_theme_after_topic_form_forum',  array( $this, 'ob_end_clean' ) );
     77                add_action( 'bbp_theme_after_topic_form_forum',  array( $this, 'topic_parent' ) );
     78
     79                // Prevent Forum Parent from appearing
     80                add_action( 'bbp_theme_before_forum_form_parent', array( $this, 'ob_start'     ) );
     81                add_action( 'bbp_theme_after_forum_form_parent',  array( $this, 'ob_end_clean' ) );
     82                add_action( 'bbp_theme_after_forum_form_parent',  array( $this, 'forum_parent' ) );
     83
     84                // Hide breadcrumb
     85                add_filter( 'bbp_no_breadcrumb', '__return_true' );
     86
     87                $this->display_forums( 0 );
     88        }
     89
     90        /** Edit ******************************************************************/
     91
     92        /**
     93         * Show forums and new forum form when editing a group
     94         *
     95         * @since bbPress (r3563)
     96         * @uses bbp_get_template_part()
     97         */
     98        public function edit_screen() {
     99
     100                $checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( bp_get_current_group_id(), 'forum_id' ); ?>
     101
     102                <h4><?php _e( 'Enable Group Forum', 'bbpress' ); ?></h4>
     103
     104                <p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
     105
     106                <div class="checkbox">
     107                        <label><input type="checkbox" name="bbp-create-group-forum" id="bbp-create-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
     108                </div>
     109
     110                <p class="description"><?php _e( 'Saying no will not delete existing forum content.', 'bbpress' ); ?></p>
     111
     112                <input type="submit" value="<?php esc_attr_e( 'Save Settings', 'bbpress' ); ?>" />
     113
     114                <?php
     115
     116                // Verify intent
     117                wp_nonce_field( 'groups_edit_save_' . $this->slug );
     118        }
     119
     120        /**
     121         * Save the Group Forum data on edit
     122         *
     123         * @since bbPress (r3465)
     124         * @uses bbp_new_forum_handler() To check for forum creation
     125         * @uses bbp_edit_forum_handler() To check for forum edit
     126         */
     127        public function edit_screen_save() {
     128
     129                // Bail if not a POST action
     130                if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
     131                        return;
     132
     133                // Bail if action is empty
     134                if ( empty( $_POST['action'] ) )
     135                        return;
     136
     137                check_admin_referer( 'groups_edit_save_' . $this->slug );
     138
     139                $edit_forum   = !empty( $_POST['bbp-edit-group-forum'] ) ? true : false;
     140                $forum_id     = 0;
     141                $forum_ids    = bbp_get_group_forum_ids( bp_get_current_group_id() );
     142                if ( !empty( $forum_ids ) )
     143                        $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
     144
     145                // Update forum active
     146                groups_update_groupmeta( bp_get_current_group_id(), '_bbp_forum_enabled_' . $forum_id, $edit_forum );
     147        }
     148
     149        /** Create ****************************************************************/
     150
     151        /**
     152         * Show forums and new forum form when creating a group
     153         *
     154         * @since bbPress (r3465)
     155         */
     156        public function create_screen() {
     157
     158                // Bail if not looking at this screen
     159                if ( !bp_is_group_creation_step( $this->slug ) )
     160                        return false;
     161
     162                $checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( bp_get_new_group_id(), 'forum_id' ); ?>
     163
     164                <h4><?php _e( 'Group Forum', 'bbpress' ); ?></h4>
     165
     166                <p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
     167
     168                <div class="checkbox">
     169                        <label><input type="checkbox" name="bbp-create-group-forum" id="bbp-create-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
     170                </div>
     171
     172                <?php
     173
     174                // Verify intent
     175                wp_nonce_field( 'groups_create_save_' . $this->slug );
     176        }
     177
     178        /**
     179         * Save the Group Forum data on create
     180         *
     181         * @since bbPress (r3465)
     182         */
     183        public function create_screen_save() {
     184
     185                check_admin_referer( 'groups_create_save_' . $this->slug );
     186
     187                $create_forum = !empty( $_POST['bbp-create-group-forum'] ) ? true : false;
     188                $forum_id     = 0;
     189                $forum_ids    = bbp_get_group_forum_ids( bp_get_new_group_id() );
     190                if ( !empty( $forum_ids ) )
     191                        $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
     192
     193                // Create a forum, or not
     194                switch ( $create_forum ) {
     195                        case true  :
     196
     197                                // Bail if initial content was already created
     198                                if ( !empty( $forum_id ) )
     199                                        return;
     200
     201                                // Set the default forum status
     202                                switch ( bp_get_new_group_status() ) {
     203                                        case 'hidden'  :
     204                                                $status = bbp_get_hidden_status_id();
     205                                                break;
     206                                        case 'private' :
     207                                                $status = bbp_get_private_status_id();
     208                                                break;
     209                                        case 'public'  :
     210                                        default        :
     211                                                $status = bbp_get_public_status_id();
     212                                                break;
     213                                }
     214
     215                                // Create the initial forum
     216                                $forum_id = bbp_insert_forum( array(
     217                                        'post_parent'  => bbp_get_group_forums_root_id(),
     218                                        'post_title'   => bp_get_new_group_name(),
     219                                        'post_content' => bp_get_new_group_description(),
     220                                        'post_status'  => $status
     221                                ) );
     222
     223                                // Run the BP-specific functions for new groups
     224                                $this->new_forum( array( 'forum_id' => $forum_id ) );
     225
     226                                // Update forum active
     227                                groups_update_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id, true );
     228
     229                                break;
     230                        case false :
     231
     232                                // Forum was created but is now being undone
     233                                if ( !empty( $forum_id ) ) {
     234                                        wp_delete_post( $forum_id, true );
     235                                        groups_delete_groupmeta( bp_get_new_group_id(), 'forum_id' );
     236                                        groups_delete_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id );
     237                                }
     238
     239                                break;
     240                }
     241        }
     242
     243        /**
     244         * Used to start an output buffer
     245         */
     246        public function ob_start() {
     247                ob_start();
     248        }
     249
     250        /**
     251         * Used to end an output buffer
     252         */
     253        public function ob_end_clean() {
     254                ob_end_clean();
     255        }
     256
     257        /**
     258         * Creating a group forum or category (including root for group)
     259         *
     260         * @since bbPress (r3653)
     261         * @param type $forum_args
     262         * @uses bbp_get_forum_id()
     263         * @uses bp_get_current_group_id()
     264         * @uses bbp_add_forum_id_to_group()
     265         * @uses bbp_add_group_id_to_forum()
     266         * @return if no forum_id is available
     267         */
     268        public function new_forum( $forum_args = array() ) {
     269
     270                // Bail if no forum_id was passed
     271                if ( empty( $forum_args['forum_id'] ) )
     272                        return;
     273
     274                // Validate forum_id
     275                $forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
     276                $group_id = bp_get_current_group_id();
     277
     278                bbp_add_forum_id_to_group( $group_id, $forum_id );
     279                bbp_add_group_id_to_forum( $forum_id, $group_id );
     280        }
     281
     282        /**
     283         * Removing a group forum or category (including root for group)
     284         *
     285         * @since bbPress (r3653)
     286         * @param type $forum_args
     287         * @uses bbp_get_forum_id()
     288         * @uses bp_get_current_group_id()
     289         * @uses bbp_add_forum_id_to_group()
     290         * @uses bbp_add_group_id_to_forum()
     291         * @return if no forum_id is available
     292         */
     293        public function remove_forum( $forum_args = array() ) {
     294
     295                // Bail if no forum_id was passed
     296                if ( empty( $forum_args['forum_id'] ) )
     297                        return;
     298
     299                // Validate forum_id
     300                $forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
     301                $group_id = bp_get_current_group_id();
     302
     303                bbp_remove_forum_id_from_group( $group_id, $forum_id );
     304                bbp_remove_group_id_from_forum( $forum_id, $group_id );
     305        }
     306
     307        /** Display Methods *******************************************************/
     308
     309        /**
     310         * Output the forums for a group in the edit screens
     311         *
     312         * @since bbPress (r3653)
     313         * @uses bp_get_current_group_id()
     314         * @uses bbp_get_group_forum_ids()
     315         * @uses bbp_has_forums()
     316         * @uses bbp_get_template_part()
     317         */
     318        public function display_forums( $offset = 0 ) {
     319                $bbp = bbpress();
     320
     321                // Forum data
     322                $forum_ids  = bbp_get_group_forum_ids( bp_get_current_group_id() );
     323                $forum_args = array( 'post__in' => $forum_ids, 'post_parent' => null );
     324
     325                // Unset global queries
     326                $bbp->forum_query = new stdClass;
     327                $bbp->topic_query = new stdClass;
     328                $bbp->reply_query = new stdClass;
     329
     330                // Unset global ID's
     331                $bbp->current_forum_id     = 0;
     332                $bbp->current_topic_id     = 0;
     333                $bbp->current_reply_id     = 0;
     334                $bbp->current_topic_tag_id = 0;
     335
     336                // Reset the post data
     337                wp_reset_postdata();
     338
     339                // Allow admins special views
     340                $post_status = array( bbp_get_closed_status_id(), bbp_get_public_status_id() );
     341                if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() )
     342                        $post_status = array_merge( $post_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id() ) ); ?>
     343
     344                <div id="bbpress-forums">
     345
     346                        <?php
     347
     348                        // Looking at the group forum root
     349                        if ( !bp_action_variable( $offset ) ) :
     350
     351                                // Query forums and show them if they exist
     352                                if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) :
     353
     354                                        // Only one forum found
     355                                        if ( 1 == $bbp->forum_query->post_count ) :
     356
     357                                                // Get forum data
     358                                                $forum_slug = bp_action_variable( $offset );
     359                                                $forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
     360                                                $forums     = get_posts( $forum_args );
     361
     362                                                bbp_the_forum();
     363
     364                                                // Forum exists
     365                                                if ( !empty( $forums ) ) :
     366                                                        $forum = $forums[0];
     367
     368                                                        // Set up forum data
     369                                                        $forum_id = bbpress()->current_forum_id = $forum->ID;
     370                                                        bbp_set_query_name( 'bbp_single_forum' ); ?>
     371
     372                                                        <h3><?php bbp_forum_title(); ?></h3>
     373
     374                                                        <?php bbp_get_template_part( 'content', 'single-forum' ); ?>
     375
     376                                                <?php else : ?>
     377
     378                                                        <?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
     379
     380                                                        <?php bbp_get_template_part( 'form',       'topic'     ); ?>
     381
     382                                                <?php endif;
     383
     384                                        // More than 1 forum found or group forum admin screen
     385                                        elseif ( 1 < $bbp->forum_query->post_count ) : ?>
     386
     387                                                <h3><?php _e( 'Forums', 'bbpress' ); ?></h3>
     388
     389                                                <?php bbp_get_template_part( 'loop', 'forums' ); ?>
     390
     391                                                <h3><?php _e( 'Topics', 'bbpress' ); ?></h3>
     392
     393                                                <?php if ( bbp_has_topics( array( 'post_parent__in' => $forum_ids ) ) ) : ?>
     394
     395                                                        <?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
     396
     397                                                        <?php bbp_get_template_part( 'loop',       'topics'    ); ?>
     398
     399                                                        <?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
     400
     401                                                        <?php bbp_get_template_part( 'form',       'topic'     ); ?>
     402
     403                                                <?php else : ?>
     404
     405                                                        <?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
     406
     407                                                        <?php bbp_get_template_part( 'form',       'topic'     ); ?>
     408
     409                                                <?php endif;
     410
     411                                        // No forums found
     412                                        else : ?>
     413
     414                                                <div id="message" class="info">
     415                                                        <p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
     416                                                </div>
     417
     418                                        <?php endif;
     419
     420                                // No forums found
     421                                else : ?>
     422
     423                                        <div id="message" class="info">
     424                                                <p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
     425                                        </div>
     426
     427                                <?php endif;
     428
     429                        // Single forum
     430                        elseif ( ( bp_action_variable( $offset ) != $this->slug ) && ( bp_action_variable( $offset ) != $this->topic_slug ) && ( bp_action_variable( $offset ) != $this->reply_slug ) ) :
     431
     432                                // Get forum data
     433                                $forum_slug = bp_action_variable( $offset );
     434                                $forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
     435                                $forums     = get_posts( $forum_args );
     436
     437                                // Forum exists
     438                                if ( !empty( $forums ) ) :
     439                                        $forum = $forums[0];
     440
     441                                        // Set up forum data
     442                                        $forum_id = bbpress()->current_forum_id = $forum->ID;
     443
     444                                        // Reset necessary forum_query attributes for forums loop to function
     445                                        $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
     446                                        $bbp->forum_query->in_the_loop             = true;
     447                                        $bbp->forum_query->post                    = get_post( $forum_id );
     448
     449                                        // Forum edit
     450                                        if ( bp_action_variable( $offset + 1 ) == $bbp->edit_id ) :
     451                                                global $wp_query, $post;
     452
     453                                                $wp_query->bbp_is_edit       = true;
     454                                                $wp_query->bbp_is_forum_edit = true;
     455                                                $post                        = $forum;
     456
     457                                                bbp_set_query_name( 'bbp_forum_form' );
     458
     459                                                bbp_get_template_part( 'form', 'forum' );
     460
     461                                        else :
     462                                                bbp_set_query_name( 'bbp_single_forum' ); ?>
     463
     464                                                <h3><?php bbp_forum_title(); ?></h3>
     465
     466                                                <?php bbp_get_template_part( 'content', 'single-forum' );
     467
     468                                        endif;
     469
     470                                else :
     471                                        bbp_get_template_part( 'feedback', 'no-topics' );
     472                                        bbp_get_template_part( 'form',     'topic'     );
     473
     474                                endif;
     475
     476                        // Single topic
     477                        elseif ( bp_action_variable( $offset ) == $this->topic_slug ) :
     478
     479                                // Get topic data
     480                                $topic_slug = bp_action_variable( $offset + 1 );
     481                                $topic_args = array( 'name' => $topic_slug, 'post_type' => bbp_get_topic_post_type(), 'post_status' => $post_status );
     482                                $topics     = get_posts( $topic_args );
     483
     484                                // Topic exists
     485                                if ( !empty( $topics ) ) :
     486                                        $topic = $topics[0];
     487
     488                                        // Set up topic data
     489                                        $topic_id = bbpress()->current_topic_id = $topic->ID;
     490                                        $forum_id = bbp_get_topic_forum_id( $topic_id );
     491
     492                                        // Reset necessary forum_query attributes for topics loop to function
     493                                        $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
     494                                        $bbp->forum_query->in_the_loop             = true;
     495                                        $bbp->forum_query->post                    = get_post( $forum_id );
     496
     497                                        // Reset necessary topic_query attributes for topics loop to function
     498                                        $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
     499                                        $bbp->topic_query->in_the_loop             = true;
     500                                        $bbp->topic_query->post                    = $topic;
     501
     502                                        // Topic edit
     503                                        if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
     504                                                global $wp_query, $post;
     505                                                $wp_query->bbp_is_edit       = true;
     506                                                $wp_query->bbp_is_topic_edit = true;
     507                                                $post                        = $topic;
     508
     509                                                // Merge
     510                                                if ( !empty( $_GET['action'] ) && 'merge' == $_GET['action'] ) :
     511                                                        bbp_set_query_name( 'bbp_topic_merge' );
     512
     513                                                        bbp_get_template_part( 'form', 'topic-merge' );
     514
     515                                                // Split
     516                                                elseif ( !empty( $_GET['action'] ) && 'split' == $_GET['action'] ) :
     517                                                        bbp_set_query_name( 'bbp_topic_split' );
     518
     519                                                        bbp_get_template_part( 'form', 'topic-split' );
     520
     521                                                // Edit
     522                                                else :
     523                                                        bbp_set_query_name( 'bbp_topic_form' );
     524                                                        bbp_get_template_part( 'form', 'topic' );
     525
     526                                                endif;
     527
     528                                        // Single Topic
     529                                        else:
     530
     531                                                bbp_set_query_name( 'bbp_single_topic' ); ?>
     532
     533                                                <h3><?php bbp_topic_title(); ?></h3>
     534
     535                                                <?php bbp_get_template_part( 'content', 'single-topic' );
     536
     537                                        endif;
     538
     539                                // No Topics
     540                                else :
     541                                        bbp_get_template_part( 'feedback', 'no-topics'   );
     542                                        bbp_get_template_part( 'form',     'topic'       );
     543
     544                                endif;
     545
     546                        // Single reply
     547                        elseif ( bp_action_variable( $offset ) == $this->reply_slug ) :
     548
     549                                // Get reply data
     550                                $reply_slug = bp_action_variable( $offset + 1 );
     551                                $reply_args = array( 'name' => $reply_slug, 'post_type' => bbp_get_reply_post_type() );
     552                                $replies    = get_posts( $reply_args );
     553
     554                                if ( empty( $replies ) )
     555                                        return;
     556
     557                                // Get the first reply
     558                                $reply = $replies[0];
     559
     560                                // Set up reply data
     561                                $reply_id = bbpress()->current_reply_id = $reply->ID;
     562                                $topic_id = bbp_get_reply_topic_id( $reply_id );
     563                                $forum_id = bbp_get_reply_forum_id( $reply_id );
     564
     565                                // Reset necessary forum_query attributes for reply to function
     566                                $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
     567                                $bbp->forum_query->in_the_loop             = true;
     568                                $bbp->forum_query->post                    = get_post( $forum_id );
     569
     570                                // Reset necessary topic_query attributes for reply to function
     571                                $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
     572                                $bbp->topic_query->in_the_loop             = true;
     573                                $bbp->topic_query->post                    = get_post( $topic_id );
     574
     575                                // Reset necessary reply_query attributes for reply to function
     576                                $bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type();
     577                                $bbp->reply_query->in_the_loop             = true;
     578                                $bbp->reply_query->post                    = $reply;
     579
     580                                if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
     581                                        global $wp_query, $post;
     582
     583                                        $wp_query->bbp_is_edit       = true;
     584                                        $wp_query->bbp_is_reply_edit = true;
     585                                        $post                        = $reply;
     586
     587                                        bbp_set_query_name( 'bbp_reply_form' );
     588                                        bbp_get_template_part( 'form', 'reply' );
     589
     590                                endif;
     591
     592                        endif; ?>
     593
     594                </div>
     595
     596                <?php
     597        }
     598
     599        /**
     600         * Add forum row action HTML when viewing group forum admin
     601         *
     602         * @since bbPress (r3653)
     603         * @uses bp_is_item_admin()
     604         * @uses bbp_get_forum_id()
     605         */
     606        public function forum_row_actions() {
     607
     608                // Only admins can take actions on forums
     609                if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() ) : ?>
     610
     611                <div class="row-actions">
     612
     613                        <?php echo 'Edit | View | Trash'; ?>
     614
     615                </div>
     616
     617                <?php endif;
     618        }
     619
     620        /**
     621         * Add topic row action HTML when viewing group forum admin
     622         *
     623         * @since bbPress (r3653)
     624         * @uses bp_is_item_admin()
     625         * @uses bbp_get_forum_id()
     626         */
     627        public function topic_row_actions() {
     628
     629                // Only admins can take actions on forums
     630                if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() ) : ?>
     631
     632                <div class="row-actions">
     633
     634                        <?php echo 'Edit | View | Trash | Close | Stick (To Front) | Spam'; ?>
     635
     636                </div>
     637
     638                <?php endif;
     639        }
     640
     641        /** Redirect Helpers ******************************************************/
     642
     643        /**
     644         * Redirect to the group forum screen
     645         *
     646         * @since bbPress (r3653)
     647         * @param str $redirect_url
     648         * @param str $redirect_to
     649         */
     650        public function new_topic_redirect_to( $redirect_url = '', $redirect_to = '', $topic_id = 0 ) {
     651                if ( bp_is_group() ) {
     652                        $topic        = bbp_get_topic( $topic_id );
     653                        $topic_hash   = '#post-' . $topic_id;
     654                        $redirect_url = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name ) . $topic_hash;
     655                }
     656
     657                return $redirect_url;
     658        }
     659
     660        /**
     661         * Redirect to the group forum screen
     662         *
     663         * @since bbPress (r3653)
     664         */
     665        public function new_reply_redirect_to( $redirect_url = '', $redirect_to = '', $reply_id = 0 ) {
     666                global $wp_rewrite;
     667
     668                if ( bp_is_group() ) {
     669                        $topic_id       = bbp_get_reply_topic_id( $reply_id );
     670                        $topic          = bbp_get_topic( $topic_id );
     671                        $reply_position = bbp_get_reply_position( $reply_id, $topic_id );
     672                        $reply_page     = ceil( (int) $reply_position / (int) bbp_get_replies_per_page() );
     673                        $reply_hash     = '#post-' . $reply_id;
     674                        $topic_url      = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name );
     675
     676                        // Don't include pagination if on first page
     677                        if ( 1 >= $reply_page ) {
     678                                $redirect_url = trailingslashit( $topic_url ) . $reply_hash;
     679
     680                        // Include pagination
     681                        } else {
     682                                $redirect_url = trailingslashit( $topic_url ) . trailingslashit( $wp_rewrite->pagination_base ) . trailingslashit( $reply_page ) . $reply_hash;
     683                        }
     684
     685                        // Add topic view query arg back to end if it is set
     686                        if ( bbp_get_view_all() ) {
     687                                $redirect_url = bbp_add_view_all( $redirect_url );
     688                        }
     689                }
     690
     691                return $redirect_url;
     692        }
     693
     694        /**
     695         * Redirect to the group admin forum edit screen
     696         *
     697         * @since bbPress (r3653)
     698         * @uses groups_get_current_group()
     699         * @uses bp_is_group_admin_screen()
     700         * @uses trailingslashit()
     701         * @uses bp_get_root_domain()
     702         * @uses bp_get_groups_root_slug()
     703         */
     704        public function edit_redirect_to( $redirect_url = '' ) {
     705
     706                // Get the current group, if there is one
     707                $group = groups_get_current_group();
     708
     709                // If this is a group of any kind, empty out the redirect URL
     710                if ( bp_is_group_admin_screen( $this->slug ) )
     711                        $redirect_url = trailingslashit( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/' . $group->slug . '/admin/' . $this->slug );
     712
     713                return $redirect_url;
     714        }
     715
     716        /** Form Helpers **********************************************************/
     717
     718        public function forum_parent() {
     719        ?>
     720
     721                <input type="hidden" name="bbp_forum_parent_id" id="bbp_forum_parent_id" value="<?php bbp_group_forums_root_id(); ?>" />
     722
     723        <?php
     724        }
     725
     726        public function topic_parent() {
     727
     728                $forum_ids = bbp_get_group_forum_ids( bp_get_current_group_id() ); ?>
     729
     730                <p>
     731                        <label for="bbp_forum_id"><?php _e( 'Forum:', 'bbpress' ); ?></label><br />
     732                        <?php bbp_dropdown( array( 'include' => $forum_ids, 'selected' => bbp_get_form_topic_forum() ) ); ?>
     733                </p>
     734
     735        <?php
     736        }
     737}
     738endif;
  • includes/extend/buddypress/index.php

     
     1<?php
     2
     3/**
     4 * Do not modify the files in this folder.
     5 */
  • includes/extend/buddypress.php

     
    1 <?php
    2 
    3 /**
    4  * Main bbPress BuddyPress Class
    5  *
    6  * @package bbPress
    7  * @subpackage BuddyPress
    8  * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed
    9  */
    10 
    11 // Exit if accessed directly
    12 if ( !defined( 'ABSPATH' ) ) exit;
    13 
    14 if ( !class_exists( 'BBP_BuddyPress' ) ) :
    15 /**
    16  * Loads BuddyPress extension
    17  *
    18  * @since bbPress (r3395)
    19  *
    20  * @package bbPress
    21  * @subpackage BuddyPress
    22  */
    23 class BBP_BuddyPress {
    24 
    25         /** Variables *************************************************************/
    26 
    27         /**
    28          * The name of the BuddyPress component, used in activity streams
    29          *
    30          * @var string
    31          */
    32         private $component = '';
    33 
    34         /**
    35          * Forum Create Activty Action
    36          *
    37          * @var string
    38          */
    39         private $forum_create = '';
    40 
    41         /**
    42          * Topic Create Activty Action
    43          *
    44          * @var string
    45          */
    46         private $topic_create = '';
    47 
    48         /**
    49          * Topic Close Activty Action
    50          *
    51          * @var string
    52          */
    53         private $topic_close = '';
    54 
    55         /**
    56          * Topic Edit Activty Action
    57          *
    58          * @var string
    59          */
    60         private $topic_edit = '';
    61 
    62         /**
    63          * Topic Open Activty Action
    64          *
    65          * @var string
    66          */
    67         private $topic_open = '';
    68 
    69         /**
    70          * Reply Create Activty Action
    71          *
    72          * @var string
    73          */
    74         private $reply_create = '';
    75 
    76         /**
    77          * Reply Edit Activty Action
    78          *
    79          * @var string
    80          */
    81         private $reply_edit = '';
    82 
    83         /** Slugs *****************************************************************/
    84 
    85         /**
    86          * Forums slug
    87          *
    88          * @var string
    89          */
    90         private $forums_slug = '';
    91 
    92         /**
    93          * Topic slug
    94          *
    95          * @var string
    96          */
    97         private $topic_slug = '';
    98 
    99         /**
    100          * Reply slug
    101          *
    102          * @var string
    103          */
    104         private $reply_slug = '';
    105 
    106         /** Setup Methods *********************************************************/
    107 
    108         /**
    109          * The main bbPress BuddyPress loader
    110          *
    111          * @since bbPress (r3395)
    112          */
    113         public function __construct() {
    114                 $this->setup_globals();
    115                 $this->setup_actions();
    116                 $this->setup_filters();
    117                 $this->fully_loaded();
    118         }
    119 
    120         /**
    121          * Extension variables
    122          *
    123          * @since bbPress (r3395)
    124          * @access private
    125          * @uses apply_filters() Calls various filters
    126          */
    127         private function setup_globals() {
    128 
    129                 // The name of the BuddyPress component, used in activity streams
    130                 $this->component = 'bbpress';
    131 
    132                 // Forums
    133                 $this->forum_create = 'bbp_forum_create';
    134 
    135                 // Topics
    136                 $this->topic_create = 'bbp_topic_create';
    137                 $this->topic_edit   = 'bbp_topic_edit';
    138                 $this->topic_close  = 'bbp_topic_close';
    139                 $this->topic_open   = 'bbp_topic_open';
    140 
    141                 // Replies
    142                 $this->reply_create = 'bbp_reply_create';
    143                 $this->reply_edit   = 'bbp_reply_edit';
    144 
    145                 // Forum slugs, as used in BuddyPress
    146                 $this->forums_slug  = 'forums';
    147                 $this->topic_slug   = 'topic';
    148                 $this->reply_slug   = 'reply';
    149         }
    150 
    151         /**
    152          * Setup the actions
    153          *
    154          * @since bbPress (r3395)
    155          * @access private
    156          * @uses add_filter() To add various filters
    157          * @uses add_action() To add various actions
    158          */
    159         private function setup_actions() {
    160 
    161                 /** Activity **********************************************************/
    162 
    163                 // Bail if activity is not active
    164                 if ( bp_is_active( 'activity' ) ) {
    165 
    166                         // Register the activity stream actions
    167                         add_action( 'bp_register_activity_actions',      array( $this, 'register_activity_actions' )        );
    168 
    169                         // Hook into topic and reply creation
    170                         add_action( 'bbp_new_topic',                     array( $this, 'topic_create'              ), 10, 4 );
    171                         add_action( 'bbp_new_reply',                     array( $this, 'reply_create'              ), 10, 5 );
    172 
    173                         // Hook into topic and reply status changes
    174                         add_action( 'wp_insert_post',                    array( $this, 'topic_update'              ), 10, 2 );
    175                         add_action( 'wp_insert_post',                    array( $this, 'reply_update'              ), 10, 2 );
    176 
    177                         // Hook into topic and reply deletion
    178                         add_action( 'bbp_delete_topic',                  array( $this, 'topic_delete'              ), 10, 1 );
    179                         add_action( 'bbp_delete_reply',                  array( $this, 'reply_delete'              ), 10, 1 );
    180 
    181                         // Append forum filters in site wide activity streams
    182                         add_action( 'bp_activity_filter_options',        array( $this, 'activity_filter_options'   ), 10    );
    183 
    184                         // Append forum filters in single member activity streams
    185                         add_action( 'bp_member_activity_filter_options', array( $this, 'activity_filter_options'   ), 10    );
    186 
    187                         // Append forum filters in single group activity streams
    188                         add_action( 'bp_group_activity_filter_options',  array( $this, 'activity_filter_options'   ), 10    );
    189                 }
    190 
    191                 /** Favorites *********************************************************/
    192 
    193                 // Move handler to 'bp_actions' - BuddyPress bypasses template_loader
    194                 remove_action( 'template_redirect', 'bbp_favorites_handler', 1 );
    195                 add_action(    'bp_actions',        'bbp_favorites_handler', 1 );
    196 
    197                 /** Subscriptions *****************************************************/
    198 
    199                 // Move handler to 'bp_actions' - BuddyPress bypasses template_loader
    200                 remove_action( 'template_redirect', 'bbp_subscriptions_handler', 1 );
    201                 add_action(    'bp_actions',        'bbp_subscriptions_handler', 1 );
    202         }
    203 
    204         /**
    205          * Setup the filters
    206          *
    207          * @since bbPress (r3395)
    208          * @access private
    209          * @uses add_filter() To add various filters
    210          * @uses add_action() To add various actions
    211          */
    212         private function setup_filters() {
    213 
    214                 /** Activity **********************************************************/
    215 
    216                 // Obey BuddyPress commenting rules
    217                 add_filter( 'bp_activity_can_comment',   array( $this, 'activity_can_comment'   )        );
    218 
    219                 // Link directly to the topic or reply
    220                 add_filter( 'bp_activity_get_permalink', array( $this, 'activity_get_permalink' ), 10, 2 );
    221 
    222                 /** Profiles **********************************************************/
    223 
    224                 // Override bbPress user profile URL with BuddyPress profile URL
    225                 add_filter( 'bbp_pre_get_user_profile_url',    array( $this, 'user_profile_url'            )        );
    226                 add_filter( 'bbp_get_favorites_permalink',     array( $this, 'get_favorites_permalink'     ), 10, 2 );
    227                 add_filter( 'bbp_get_subscriptions_permalink', array( $this, 'get_subscriptions_permalink' ), 10, 2 );
    228 
    229                 /** Links and pagination **********************************************/
    230 
    231                 // Map forum/topic/replys permalinks to their groups
    232                 add_filter( 'bbp_get_forum_permalink', array( $this, 'map_forum_permalink_to_group' ), 10, 2 );
    233                 add_filter( 'bbp_get_topic_permalink', array( $this, 'map_topic_permalink_to_group' ), 10, 2 );
    234                 add_filter( 'bbp_get_reply_permalink', array( $this, 'map_reply_permalink_to_group' ), 10, 2 );
    235 
    236                 // Map reply edit links to their groups
    237                 add_filter( 'bbp_get_reply_edit_url',  array( $this, 'map_reply_edit_url_to_group'  ), 10, 2 );
    238 
    239                 // Map assorted template function permalinks
    240                 add_filter( 'post_link',               array( $this, 'post_link'                    ), 10, 2 );
    241                 add_filter( 'page_link',               array( $this, 'page_link'                    ), 10, 2 );
    242                 add_filter( 'post_type_link',          array( $this, 'post_type_link'               ), 10, 2 );
    243 
    244                 // Canonical redirects for normal URLs
    245                 add_action( 'template_redirect', array( $this, 'redirect_canonical' ) );
    246 
    247                 // Group forum pagination
    248                 add_filter( 'bbp_topic_pagination',   array( $this, 'topic_pagination'   ) );
    249                 add_filter( 'bbp_replies_pagination', array( $this, 'replies_pagination' ) );
    250 
    251                 /** Mentions **********************************************************/
    252 
    253                 // Only link mentions if activity component is active
    254                 if ( bp_is_active( 'activity' ) ) {
    255 
    256                         // Convert mentions into links on create
    257                         add_filter( 'bbp_new_topic_pre_content',  'bp_activity_at_name_filter' );
    258                         add_filter( 'bbp_new_reply_pre_content',  'bp_activity_at_name_filter' );
    259 
    260                         // Convert mentions into links on edit
    261                         add_filter( 'bbp_edit_topic_pre_content', 'bp_activity_at_name_filter' );
    262                         add_filter( 'bbp_edit_reply_pre_content', 'bp_activity_at_name_filter' );
    263                 }
    264 
    265                 // Revert links into text on edit
    266                 add_filter( 'bbp_get_form_topic_content', array( $this, 'strip_mentions_on_edit' ) );
    267                 add_filter( 'bbp_get_form_reply_content', array( $this, 'strip_mentions_on_edit' ) );
    268         }
    269 
    270         /**
    271          * Allow the variables, actions, and filters to be modified by third party
    272          * plugins and themes.
    273          *
    274          * @since bbPress (r3902)
    275          */
    276         private function fully_loaded() {
    277                 do_action_ref_array( 'bbp_buddypress_loaded', array( $this ) );
    278         }
    279 
    280         /** Methods ***************************************************************/
    281 
    282         /**
    283          * Strip out BuddyPress activity at-name HTML on topic/reply edit
    284          *
    285          * Copied from bp_forums_strip_mentions_on_post_edit() in case forums
    286          * component is not active or is not loaded in yet.
    287          *
    288          * @since bbPress (r3475)
    289          * @param type $content Optional
    290          * @uses bp_get_root_domain()
    291          * @uses bp_get_members_root_slug()
    292          * @return string
    293          */
    294         public function strip_mentions_on_edit( $content = '' ) {
    295 
    296                 // Backwards compat for members root slug
    297                 if ( function_exists( 'bp_get_members_root_slug' ) ) {
    298                         $members_root = bp_get_members_root_slug();
    299                 } elseif ( defined( 'BP_MEMBERS_SLUG' ) ) {
    300                         $members_root = BP_MEMBERS_SLUG;
    301                 } else {
    302                         $members_root = 'members';
    303                 }
    304 
    305                 $pattern = "|<a href=&#039;" . bp_get_root_domain() . "/" . $members_root . "/[A-Za-z0-9-_\.]+/&#039; rel=&#039;nofollow&#039;>(@[A-Za-z0-9-_\.@]+)</a>|";
    306                 $content = preg_replace( $pattern, "$1", htmlspecialchars_decode( $content ) );
    307 
    308                 return $content;
    309         }
    310 
    311         /**
    312          * Register our activity actions with BuddyPress
    313          *
    314          * @since bbPress (r3395)
    315          * @uses bp_activity_set_action()
    316          */
    317         public function register_activity_actions() {
    318                 bp_activity_set_action( $this->component, $this->topic_create, __( 'New topic created', 'bbpress' ) );
    319                 bp_activity_set_action( $this->component, $this->reply_create, __( 'New reply created', 'bbpress' ) );
    320         }
    321 
    322         /**
    323          * Wrapper for recoding bbPress actions to the BuddyPress activity stream
    324          *
    325          * @since bbPress (r3395)
    326          * @param type $args Array of arguments for bp_activity_add()
    327          * @uses bbp_get_current_user_id()
    328          * @uses bp_core_current_time()
    329          * @uses bbp_parse_args()
    330          * @uses aplly_filters()
    331          * @uses bp_activity_add()
    332          * @return type Activity ID if successful, false if not
    333          */
    334         private function record_activity( $args = '' ) {
    335 
    336                 // Default activity args
    337                 $defaults = array (
    338                         'id'                => null,
    339                         'user_id'           => bbp_get_current_user_id(),
    340                         'type'              => '',
    341                         'action'            => '',
    342                         'item_id'           => '',
    343                         'secondary_item_id' => '',
    344                         'content'           => '',
    345                         'primary_link'      => '',
    346                         'component'         => $this->component,
    347                         'recorded_time'     => bp_core_current_time(),
    348                         'hide_sitewide'     => false
    349                 );
    350                 $activity = bbp_parse_args( $args, $defaults, 'record_activity' );
    351 
    352                 // Add the activity
    353                 return bp_activity_add( $activity );
    354         }
    355 
    356         /**
    357          * Wrapper for deleting bbPress actions from BuddyPress activity stream
    358          *
    359          * @since bbPress (r3395)
    360          * @param type $args Array of arguments for bp_activity_add()
    361          * @uses bbp_get_current_user_id()
    362          * @uses bp_core_current_time()
    363          * @uses bbp_parse_args()
    364          * @uses aplly_filters()
    365          * @uses bp_activity_add()
    366          * @return type Activity ID if successful, false if not
    367          */
    368         public function delete_activity( $args = '' ) {
    369 
    370                 // Default activity args
    371                 $defaults = array(
    372                         'item_id'           => false,
    373                         'component'         => $this->component,
    374                         'type'              => false,
    375                         'user_id'           => false,
    376                         'secondary_item_id' => false
    377                 );
    378                 $activity = bbp_parse_args( $args, $defaults, 'delete_activity' );
    379 
    380                 // Delete the activity
    381                 bp_activity_delete_by_item_id( $activity );
    382         }
    383 
    384         /**
    385          * Check for an existing activity stream entry for a given post_id
    386          *
    387          * @param int $post_id ID of the topic or reply
    388          * @uses get_post_meta()
    389          * @uses bp_activity_get_specific()
    390          * @return int if an activity id is verified, false if not
    391          */
    392         private static function get_activity_id( $post_id = 0 ) {
    393 
    394                 // Try to get the activity ID of the post
    395                 $activity_id = (int) get_post_meta( $post_id, '_bbp_activity_id', true );
    396 
    397                 // Bail if no activity ID is in post meta
    398                 if ( empty( $activity_id ) )
    399                         return null;
    400 
    401                 // Get the activity stream item, bail if it doesn't exist
    402                 $existing = bp_activity_get_specific( array( 'activity_ids' => $activity_id, 'show_hidden' => true, 'spam' => 'all', ) );
    403                 if ( empty( $existing['total'] ) || ( 1 != $existing['total'] ) )
    404                         return null;
    405 
    406                 // Return the activity ID since we've verified the connection
    407                 return $activity_id;
    408         }
    409 
    410         /**
    411          * Maybe disable activity stream comments on select actions
    412          *
    413          * @since bbPress (r3399)
    414          * @global BP_Activity_Template $activities_template
    415          * @param boolean $can_comment
    416          * @uses bp_get_activity_action_name()
    417          * @return boolean
    418          */
    419         public function activity_can_comment( $can_comment = true ) {
    420                 global $activities_template;
    421 
    422                 // Already forced off, so comply
    423                 if ( false === $can_comment )
    424                         return $can_comment;
    425 
    426                 // Check if blog & forum activity stream commenting is off
    427                 if ( ( false === $activities_template->disable_blogforum_replies ) || (int) $activities_template->disable_blogforum_replies ) {
    428 
    429                         // Get the current action name
    430                         $action_name = bp_get_activity_action_name();
    431 
    432                         // Setup the array of possibly disabled actions
    433                         $disabled_actions = array(
    434                                 $this->topic_create,
    435                                 $this->reply_create
    436                         );
    437 
    438                         // Check if this activity stream action is disabled
    439                         if ( in_array( $action_name, $disabled_actions ) ) {
    440                                 $can_comment = false;
    441                         }
    442                 }
    443 
    444                 return $can_comment;
    445         }
    446 
    447         /**
    448          * Maybe link directly to topics and replies in activity stream entries
    449          *
    450          * @since bbPress (r3399)
    451          * @param string $link
    452          * @param mixed $activity_object
    453          * @return string The link to the activity stream item
    454          */
    455         public function activity_get_permalink( $link = '', $activity_object = false ) {
    456 
    457                 // Setup the array of actions to link directly to
    458                 $disabled_actions = array(
    459                         $this->topic_create,
    460                         $this->reply_create
    461                 );
    462 
    463                 // Check if this activity stream action is directly linked
    464                 if ( in_array( $activity_object->type, $disabled_actions ) ) {
    465                         $link = $activity_object->primary_link;
    466                 }
    467 
    468                 return $link;
    469         }
    470 
    471         /**
    472          * Append forum options to activity filter select box
    473          *
    474          * @since bbPress (r3653)
    475          */
    476         function activity_filter_options() {
    477         ?>
    478 
    479                 <option value="<?php echo $this->topic_create; ?>"><?php _e( 'Topics',  'bbpress' ); ?></option>
    480                 <option value="<?php echo $this->reply_create; ?>"><?php _e( 'Replies', 'bbpress' ); ?></option>
    481 
    482         <?php
    483         }
    484 
    485         /**
    486          * Override bbPress profile URL with BuddyPress profile URL
    487          *
    488          * @since bbPress (r3401)
    489          * @param string $url
    490          * @param int $user_id
    491          * @param string $user_nicename
    492          * @return string
    493          */
    494         public function user_profile_url( $user_id ) {
    495 
    496                 // Define local variable(s)
    497                 $profile_url = '';
    498 
    499                 // Special handling for forum component
    500                 if ( bp_is_current_component( 'forums' ) ) {
    501 
    502                         // Empty action or 'topics' action
    503                         if ( !bp_current_action() || bp_is_current_action( 'topics' ) ) {
    504                                 $profile_url = bp_core_get_user_domain( $user_id ) . 'forums/topics';
    505 
    506                         // Empty action or 'topics' action
    507                         } elseif ( bp_is_current_action( 'replies' ) ) {
    508                                 $profile_url = bp_core_get_user_domain( $user_id ) . 'forums/replies';
    509 
    510                         // 'favorites' action
    511                         } elseif ( bbp_is_favorites_active() && bp_is_current_action( 'favorites' ) ) {
    512                                 $profile_url = $this->get_favorites_permalink( '', $user_id );
    513 
    514                         // 'subscriptions' action
    515                         } elseif ( bbp_is_subscriptions_active() && bp_is_current_action( 'subscriptions' ) ) {
    516                                 $profile_url = $this->get_subscriptions_permalink( '', $user_id );
    517                         }
    518 
    519                 // Not in users' forums area
    520                 } else {
    521                         $profile_url = bp_core_get_user_domain( $user_id );
    522                 }
    523 
    524                 return trailingslashit( $profile_url );
    525         }
    526 
    527         /**
    528          * Override bbPress favorites URL with BuddyPress profile URL
    529          *
    530          * @since bbPress (r3721)
    531          * @param string $url
    532          * @param int $user_id
    533          * @return string
    534          */
    535         public function get_favorites_permalink( $url, $user_id ) {
    536                 $url = trailingslashit( bp_core_get_user_domain( $user_id ) . 'forums/favorites' );
    537                 return $url;
    538         }
    539 
    540         /**
    541          * Override bbPress subscriptions URL with BuddyPress profile URL
    542          *
    543          * @since bbPress (r3721)
    544          * @param string $url
    545          * @param int $user_id
    546          * @return string
    547          */
    548         public function get_subscriptions_permalink( $url, $user_id ) {
    549                 $url = trailingslashit( bp_core_get_user_domain( $user_id ) . 'forums/subscriptions' );
    550                 return $url;
    551         }
    552 
    553         /** Topics ****************************************************************/
    554 
    555         /**
    556          * Record an activity stream entry when a topic is created or updated
    557          *
    558          * @since bbPress (r3395)
    559          * @param int $topic_id
    560          * @param int $forum_id
    561          * @param array $anonymous_data
    562          * @param int $topic_author_id
    563          * @uses bbp_get_topic_id()
    564          * @uses bbp_get_forum_id()
    565          * @uses bbp_get_user_profile_link()
    566          * @uses bbp_get_topic_permalink()
    567          * @uses bbp_get_topic_title()
    568          * @uses bbp_get_topic_content()
    569          * @uses bbp_get_forum_permalink()
    570          * @uses bbp_get_forum_title()
    571          * @uses bp_create_excerpt()
    572          * @uses apply_filters()
    573          * @return Bail early if topic is by anonymous user
    574          */
    575         public function topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id ) {
    576 
    577                 // Bail early if topic is by anonymous user
    578                 if ( !empty( $anonymous_data ) )
    579                         return;
    580 
    581                 // Bail if site is private
    582                 if ( !bbp_is_site_public() )
    583                         return;
    584 
    585                 // Validate activity data
    586                 $user_id  = $topic_author_id;
    587                 $topic_id = bbp_get_topic_id( $topic_id );
    588                 $forum_id = bbp_get_forum_id( $forum_id );
    589 
    590                 // Bail if user is not active
    591                 if ( bbp_is_user_inactive( $user_id ) )
    592                         return;
    593 
    594                 // Bail if topic is not published
    595                 if ( !bbp_is_topic_published( $topic_id ) )
    596                         return;
    597 
    598                 // Bail if forum is not public
    599                 if ( !bbp_is_forum_public( $forum_id, false ) )
    600                         return;
    601 
    602                 // User link for topic author
    603                 $user_link  = bbp_get_user_profile_link( $user_id  );
    604 
    605                 // Topic
    606                 $topic_permalink = bbp_get_topic_permalink( $topic_id );
    607                 $topic_title     = bbp_get_topic_title    ( $topic_id );
    608                 $topic_content   = bbp_get_topic_content  ( $topic_id );
    609                 $topic_link      = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>';
    610 
    611                 // Forum
    612                 $forum_permalink = bbp_get_forum_permalink( $forum_id );
    613                 $forum_title     = bbp_get_forum_title    ( $forum_id );
    614                 $forum_link      = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>';
    615 
    616                 // Activity action & text
    617                 $activity_text    = sprintf( __( '%1$s started the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link    );
    618                 $activity_action  = apply_filters( 'bbp_activity_topic_create',                $activity_text, $user_id,   $topic_id,   $forum_id      );
    619                 $activity_content = apply_filters( 'bbp_activity_topic_create_excerpt',        bp_create_excerpt( $topic_content ),     $topic_content );
    620 
    621                 // Compile the activity stream results
    622                 $activity = array(
    623                         'id'                => $this->get_activity_id( $topic_id ),
    624                         'user_id'           => $user_id,
    625                         'action'            => $activity_action,
    626                         'content'           => $activity_content,
    627                         'primary_link'      => $topic_permalink,
    628                         'type'              => $this->topic_create,
    629                         'item_id'           => $topic_id,
    630                         'secondary_item_id' => $forum_id,
    631                         'recorded_time'     => get_post_time( 'Y-m-d H:i:s', true, $topic_id ),
    632                 );
    633 
    634                 // Record the activity
    635                 $activity_id = $this->record_activity( $activity );
    636 
    637                 // Add the activity entry ID as a meta value to the topic
    638                 if ( !empty( $activity_id ) ) {
    639                         update_post_meta( $topic_id, '_bbp_activity_id', $activity_id );
    640                 }
    641         }
    642 
    643         /**
    644          * Delete the activity stream entry when a topic is spammed, trashed, or deleted
    645          *
    646          * @param int $topic_id
    647          * @uses bp_activity_delete()
    648          */
    649         public function topic_delete( $topic_id ) {
    650 
    651                 // Get activity ID, bail if it doesn't exist
    652                 if ( $activity_id = $this->get_activity_id( $topic_id ) )
    653                         return bp_activity_delete( array( 'id' => $activity_id ) );
    654 
    655                 return false;           
    656         }
    657 
    658         /**
    659          * Update the activity stream entry when a topic status changes
    660          *
    661          * @param int $post_id
    662          * @param obj $post
    663          * @uses get_post_type()
    664          * @uses bbp_get_topic_post_type()
    665          * @uses bbp_get_topic_id()
    666          * @uses bbp_is_topic_anonymous()
    667          * @uses bbp_get_public_status_id()
    668          * @uses bbp_get_closed_status_id()
    669          * @uses bbp_get_topic_forum_id()
    670          * @uses bbp_get_topic_author_id()
    671          * @return Bail early if not a topic, or topic is by anonymous user
    672          */
    673         public function topic_update( $topic_id, $post ) {
    674 
    675                 // Bail early if not a topic
    676                 if ( get_post_type( $post ) != bbp_get_topic_post_type() )
    677                         return;
    678 
    679                 $topic_id = bbp_get_topic_id( $topic_id );
    680 
    681                 // Bail early if topic is by anonymous user
    682                 if ( bbp_is_topic_anonymous( $topic_id ) )
    683                         return;
    684 
    685                 $anonymous_data = array();
    686 
    687                 // Action based on new status
    688                 if ( in_array( $post->post_status, array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ) ) {
    689 
    690                         // Validate topic data
    691                         $forum_id        = bbp_get_topic_forum_id( $topic_id );
    692                         $topic_author_id = bbp_get_topic_author_id( $topic_id );
    693 
    694                         $this->topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id );
    695                 } else {
    696                         $this->topic_delete( $topic_id );
    697                 }
    698         }
    699 
    700         /** Replies ***************************************************************/
    701 
    702         /**
    703          * Record an activity stream entry when a reply is created
    704          *
    705          * @since bbPress (r3395)
    706          * @param int $topic_id
    707          * @param int $forum_id
    708          * @param array $anonymous_data
    709          * @param int $topic_author_id
    710          * @uses bbp_get_reply_id()
    711          * @uses bbp_get_topic_id()
    712          * @uses bbp_get_forum_id()
    713          * @uses bbp_get_user_profile_link()
    714          * @uses bbp_get_reply_url()
    715          * @uses bbp_get_reply_content()
    716          * @uses bbp_get_topic_permalink()
    717          * @uses bbp_get_topic_title()
    718          * @uses bbp_get_forum_permalink()
    719          * @uses bbp_get_forum_title()
    720          * @uses bp_create_excerpt()
    721          * @uses apply_filters()
    722          * @return Bail early if topic is by anonywous user
    723          */
    724         public function reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id ) {
    725 
    726                 // Do not log activity of anonymous users
    727                 if ( !empty( $anonymous_data ) )
    728                         return;
    729 
    730                 // Bail if site is private
    731                 if ( !bbp_is_site_public() )
    732                         return;
    733 
    734                 // Validate activity data
    735                 $user_id  = $reply_author_id;
    736                 $reply_id = bbp_get_reply_id( $reply_id );
    737                 $topic_id = bbp_get_topic_id( $topic_id );
    738                 $forum_id = bbp_get_forum_id( $forum_id );
    739 
    740                 // Bail if user is not active
    741                 if ( bbp_is_user_inactive( $user_id ) )
    742                         return;
    743 
    744                 // Bail if reply is not published
    745                 if ( !bbp_is_reply_published( $reply_id ) )
    746                         return;
    747 
    748                 // Bail if forum is not public
    749                 if ( !bbp_is_forum_public( $forum_id, false ) )
    750                         return;
    751 
    752                 // Setup links for activity stream
    753                 $user_link  = bbp_get_user_profile_link( $user_id  );
    754 
    755                 // Reply
    756                 $reply_url     = bbp_get_reply_url    ( $reply_id );
    757                 $reply_content = bbp_get_reply_content( $reply_id );
    758 
    759                 // Topic
    760                 $topic_permalink = bbp_get_topic_permalink( $topic_id );
    761                 $topic_title     = bbp_get_topic_title    ( $topic_id );
    762                 $topic_link      = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>';
    763 
    764                 // Forum
    765                 $forum_permalink = bbp_get_forum_permalink( $forum_id );
    766                 $forum_title     = bbp_get_forum_title    ( $forum_id );
    767                 $forum_link      = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>';
    768 
    769                 // Activity action & text
    770                 $activity_text    = sprintf( __( '%1$s replied to the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link    );
    771                 $activity_action  = apply_filters( 'bbp_activity_reply_create',         $activity_text, $user_id,   $reply_id,   $topic_id      );
    772                 $activity_content = apply_filters( 'bbp_activity_reply_create_excerpt', bp_create_excerpt( $reply_content ),     $reply_content );
    773 
    774                 // Compile the activity stream results
    775                 $activity = array(
    776                         'id'                => $this->get_activity_id( $reply_id ),
    777                         'user_id'           => $user_id,
    778                         'action'            => $activity_action,
    779                         'content'           => $activity_content,
    780                         'primary_link'      => $reply_url,
    781                         'type'              => $this->reply_create,
    782                         'item_id'           => $reply_id,
    783                         'secondary_item_id' => $topic_id,
    784                         'recorded_time'     => get_post_time( 'Y-m-d H:i:s', true, $reply_id ),
    785                 );
    786 
    787                 // Record the activity
    788                 $activity_id = $this->record_activity( $activity );
    789 
    790                 // Add the activity entry ID as a meta value to the reply
    791                 if ( !empty( $activity_id ) ) {
    792                         update_post_meta( $reply_id, '_bbp_activity_id', $activity_id );
    793                 }
    794         }
    795 
    796         /**
    797          * Delete the activity stream entry when a reply is spammed, trashed, or deleted
    798          *
    799          * @param int $reply_id
    800          * @uses get_post_meta()
    801          * @uses bp_activity_delete()
    802          */
    803         public function reply_delete( $reply_id ) {
    804 
    805                 // Get activity ID, bail if it doesn't exist
    806                 if ( $activity_id = $this->get_activity_id( $reply_id ) )
    807                         return bp_activity_delete( array( 'id' => $activity_id ) );
    808 
    809                 return false;           
    810         }
    811 
    812         /**
    813          * Update the activity stream entry when a reply status changes
    814          *
    815          * @param int $post_id
    816          * @param obj $post
    817          * @uses get_post_type()
    818          * @uses bbp_get_reply_post_type()
    819          * @uses bbp_get_reply_id()
    820          * @uses bbp_is_reply_anonymous()
    821          * @uses bbp_get_public_status_id()
    822          * @uses bbp_get_closed_status_id()
    823          * @uses bbp_get_reply_topic_id()
    824          * @uses bbp_get_reply_forum_id()
    825          * @uses bbp_get_reply_author_id()
    826          * @return Bail early if not a reply, or reply is by anonymous user
    827          */
    828         public function reply_update( $reply_id, $post ) {
    829 
    830                 // Bail early if not a reply
    831                 if ( get_post_type( $post ) != bbp_get_reply_post_type() )
    832                         return;
    833 
    834                 $reply_id = bbp_get_reply_id( $reply_id );
    835 
    836                 // Bail early if reply is by anonymous user
    837                 if ( bbp_is_reply_anonymous( $reply_id ) )
    838                         return;
    839 
    840                 $anonymous_data = array();
    841 
    842                 // Action based on new status
    843                 if ( $post->post_status == bbp_get_public_status_id() ) {
    844 
    845                         // Validate reply data
    846                         $topic_id        = bbp_get_reply_topic_id( $reply_id );
    847                         $forum_id        = bbp_get_reply_forum_id( $reply_id );
    848                         $reply_author_id = bbp_get_reply_author_id( $reply_id );
    849 
    850                         $this->reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id );
    851                 } else {
    852                         $this->reply_delete( $reply_id );
    853                 }
    854         }
    855 
    856         /** Permalink Mappers *****************************************************/
    857 
    858         /**
    859          * Maybe map a bbPress forum/topic/reply permalink to the corresponding group
    860          *
    861          * @param int $post_id
    862          * @uses get_post()
    863          * @uses bbp_is_reply()
    864          * @uses bbp_get_reply_topic_id()
    865          * @uses bbp_get_reply_forum_id()
    866          * @uses bbp_is_topic()
    867          * @uses bbp_get_topic_forum_id()
    868          * @uses bbp_is_forum()
    869          * @uses get_post_field()
    870          * @uses bbp_get_forum_group_ids()
    871          * @uses groups_get_group()
    872          * @uses bp_get_group_admin_permalink()
    873          * @uses bp_get_group_permalink()
    874          * @return Bail early if not a group forum post
    875          * @return string
    876          */
    877         private function maybe_map_permalink_to_group( $post_id = 0, $url = false ) {
    878 
    879                 switch ( get_post_type( $post_id ) ) {
    880 
    881                         // Reply
    882                         case bbp_get_reply_post_type() :
    883                                 $topic_id = bbp_get_reply_topic_id( $post_id );
    884                                 $forum_id = bbp_get_reply_forum_id( $post_id );
    885                                 $url_end  = trailingslashit( $this->reply_slug ) . get_post_field( 'post_name', $post_id );
    886                                 break;
    887 
    888                         // Topic
    889                         case bbp_get_topic_post_type() :
    890                                 $topic_id = $post_id;
    891                                 $forum_id = bbp_get_topic_forum_id( $post_id );
    892                                 $url_end  = trailingslashit( $this->topic_slug ) . get_post_field( 'post_name', $post_id );
    893                                 break;
    894 
    895                         // Forum
    896                         case bbp_get_forum_post_type() :
    897                                 $forum_id = $post_id;
    898                                 $url_end  = get_post_field( 'post_name', $post_id );
    899                                 break;
    900 
    901                         // Unknown
    902                         default :
    903                                 return $url;
    904                                 break;
    905                 }
    906                
    907                 // Get group ID's for this forum
    908                 $group_ids = bbp_get_forum_group_ids( $forum_id );
    909 
    910                 // Bail if the post isn't associated with a group
    911                 if ( empty( $group_ids ) )
    912                         return $url;
    913 
    914                 // @todo Multiple group forums/forum groups
    915                 $group_id = $group_ids[0];
    916                 $group    = groups_get_group( array( 'group_id' => $group_id ) );
    917 
    918                 if ( bp_is_group_admin_screen( $this->forums_slug ) ) {
    919                         $group_permalink = trailingslashit( bp_get_group_admin_permalink( $group ) );
    920                 } else {
    921                         $group_permalink = trailingslashit( bp_get_group_permalink( $group ) );
    922                 }
    923 
    924                 return trailingslashit( trailingslashit( $group_permalink . $this->forums_slug ) . $url_end );
    925         }
    926 
    927         /**
    928          * Map a forum permalink to its corresponding group
    929          *
    930          * @since bbPress (r3802)
    931          * @param string $url
    932          * @param int $forum_id
    933          * @uses maybe_map_permalink_to_group()
    934          * @return string
    935          */
    936         public function map_forum_permalink_to_group( $url, $forum_id ) {
    937                 return $this->maybe_map_permalink_to_group( $forum_id, $url );
    938         }
    939 
    940         /**
    941          * Map a topic permalink to its group forum
    942          *
    943          * @since bbPress (r3802)
    944          * @param string $url
    945          * @param int $topic_id
    946          * @uses maybe_map_permalink_to_group()
    947          * @return string
    948          */
    949         public function map_topic_permalink_to_group( $url, $topic_id ) {
    950                 return $this->maybe_map_permalink_to_group( $topic_id, $url );
    951         }
    952 
    953         /**
    954          * Map a reply permalink to its group forum
    955          *
    956          * @since bbPress (r3802)
    957          * @param string $url
    958          * @param int $reply_id
    959          * @uses maybe_map_permalink_to_group()
    960          * @return string
    961          */
    962         public function map_reply_permalink_to_group( $url, $reply_id ) {
    963                 return $this->maybe_map_permalink_to_group( bbp_get_reply_topic_id( $reply_id ), $url );
    964         }
    965 
    966         /**
    967          * Map a reply edit link to its group forum
    968          *
    969          * @param string $url
    970          * @param int $reply_id
    971          * @uses maybe_map_permalink_to_group()
    972          * @return string
    973          */
    974         public function map_reply_edit_url_to_group( $url, $reply_id ) {
    975                 $new = $this->maybe_map_permalink_to_group( $reply_id );
    976 
    977                 if ( empty( $new ) )
    978                         return $url;
    979 
    980                 return trailingslashit( $new ) . bbpress()->edit_id  . '/';
    981         }
    982 
    983         /**
    984          * Map a post link to its group forum
    985          *
    986          * @param string $url
    987          * @param obj $post
    988          * @param boolean $leavename
    989          * @uses maybe_map_permalink_to_group()
    990          * @return string
    991          */
    992         public function post_link( $url, $post ) {
    993                 return $this->maybe_map_permalink_to_group( $post->ID, $url );
    994         }
    995 
    996         /**
    997          * Map a page link to its group forum
    998          *
    999          * @param string $url
    1000          * @param int $post_id
    1001          * @param $sample
    1002          * @uses maybe_map_permalink_to_group()
    1003          * @return string
    1004          */
    1005         public function page_link( $url, $post_id ) {
    1006                 return $this->maybe_map_permalink_to_group( $post_id, $url );
    1007         }
    1008 
    1009         /**
    1010          * Map a custom post type link to its group forum
    1011          *
    1012          * @param string $url
    1013          * @param obj $post
    1014          * @param $leavename
    1015          * @param $sample
    1016          * @uses maybe_map_permalink_to_group()
    1017          * @return string
    1018          */
    1019         public function post_type_link( $url, $post ) {
    1020                 return $this->maybe_map_permalink_to_group( $post->ID, $url );
    1021         }
    1022 
    1023         /**
    1024          * Fix pagination of topics on forum view
    1025          *
    1026          * @param array $args
    1027          * @global $wp_rewrite
    1028          * @uses bbp_get_forum_id()
    1029          * @uses maybe_map_permalink_to_group
    1030          * @return array
    1031          */
    1032         public function topic_pagination( $args ) {
    1033                 $new = $this->maybe_map_permalink_to_group( bbp_get_forum_id() );
    1034 
    1035                 if ( empty( $new ) )
    1036                         return $args;
    1037 
    1038                 global $wp_rewrite;
    1039 
    1040                 $args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/';
    1041 
    1042                 return $args;
    1043         }
    1044 
    1045         /**
    1046          * Fix pagination of replies on topic view
    1047          *
    1048          * @param array $args
    1049          * @global $wp_rewrite
    1050          * @uses bbp_get_topic_id()
    1051          * @uses maybe_map_permalink_to_group
    1052          * @return array
    1053          */
    1054         public function replies_pagination( $args ) {
    1055                 $new = $this->maybe_map_permalink_to_group( bbp_get_topic_id() );
    1056                 if ( empty( $new ) )
    1057                         return $args;
    1058 
    1059                 global $wp_rewrite;
    1060 
    1061                 $args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/';
    1062 
    1063                 return $args;
    1064         }
    1065 
    1066         /**
    1067          * Ensure that forum content associated with a BuddyPress group can only be
    1068          * viewed via the group URL.
    1069          *
    1070          * @since bbPress (r3802)
    1071          */
    1072         function redirect_canonical() {
    1073 
    1074                 // Viewing a single forum
    1075                 if ( bbp_is_single_forum() ) {
    1076                         $forum_id  = get_the_ID();
    1077                         $group_ids = bbp_get_forum_group_ids( $forum_id );
    1078 
    1079                 // Viewing a single topic
    1080                 } elseif ( bbp_is_single_topic() ) {
    1081                         $topic_id  = get_the_ID();
    1082                         $slug      = get_post_field( 'post_name', $topic_id );
    1083                         $forum_id  = bbp_get_topic_forum_id( $topic_id );
    1084                         $group_ids = bbp_get_forum_group_ids( $forum_id );
    1085 
    1086                 // Not a forum or topic
    1087                 } else {
    1088                         return;
    1089                 }
    1090 
    1091                 // Bail if not a group forum
    1092                 if ( empty( $group_ids ) )
    1093                         return;
    1094 
    1095                 // Use the first group ID
    1096                 $group_id        = $group_ids[0];
    1097                 $group           = groups_get_group( array( 'group_id' => $group_id ) );
    1098                 $group_link  = trailingslashit( bp_get_group_permalink( $group ) );
    1099                 $redirect_to = trailingslashit( $group_link . $this->forums_slug );
    1100 
    1101                 // Add topic slug to URL
    1102                 if ( bbp_is_single_topic() ) {
    1103                         $redirect_to  = trailingslashit( $redirect_to . $this->topic_slug . '/' . $slug );
    1104                 }
    1105 
    1106                 bp_core_redirect( $redirect_to );
    1107         }
    1108 }
    1109 endif;
    1110 
    1111 
    1112 if ( !class_exists( 'BBP_Forums_Component' ) ) :
    1113 /**
    1114  * Loads Forums Component
    1115  *
    1116  * @since bbPress (r3552)
    1117  *
    1118  * @package bbPress
    1119  * @subpackage BuddyPress
    1120  */
    1121 class BBP_Forums_Component extends BP_Component {
    1122 
    1123         /**
    1124          * Start the forums component creation process
    1125          *
    1126          * @since bbPress (r3552)
    1127          */
    1128         public function __construct() {
    1129                 parent::start(
    1130                         'forums',
    1131                         __( 'Forums', 'bbpress' ),
    1132                         BP_PLUGIN_DIR
    1133                 );
    1134                 $this->setup_globals();
    1135                 $this->setup_nav();
    1136         }
    1137 
    1138         /**
    1139          * Setup globals
    1140          *
    1141          * The BP_FORUMS_SLUG constant is deprecated, and only used here for
    1142          * backwards compatibility.
    1143          *
    1144          * @since bbPress (r3552)
    1145          * @global BuddyPress $bp
    1146          */
    1147         public function setup_globals() {
    1148                 global $bp;
    1149 
    1150                 // Define the parent forum ID
    1151                 if ( !defined( 'BP_FORUMS_PARENT_FORUM_ID' ) )
    1152                         define( 'BP_FORUMS_PARENT_FORUM_ID', 1 );
    1153 
    1154                 // Define a slug, if necessary
    1155                 if ( !defined( 'BP_FORUMS_SLUG' ) )
    1156                         define( 'BP_FORUMS_SLUG', $this->id );
    1157 
    1158                 // All globals for messaging component.
    1159                 $globals = array(
    1160                         'path'                  => BP_PLUGIN_DIR,
    1161                         'slug'                  => BP_FORUMS_SLUG,
    1162                         'root_slug'             => isset( $bp->pages->forums->slug ) ? $bp->pages->forums->slug : BP_FORUMS_SLUG,
    1163                         'has_directory'         => false,
    1164                         'notification_callback' => 'messages_format_notifications',
    1165                         'search_string'         => __( 'Search Forums...', 'bbpress' ),
    1166                 );
    1167 
    1168                 parent::setup_globals( $globals );
    1169         }
    1170 
    1171         /**
    1172          * Setup BuddyBar navigation
    1173          *
    1174          * @since bbPress (r3552)
    1175          */
    1176         public function setup_nav() {
    1177 
    1178                 // Stop if there is no user displayed or logged in
    1179                 if ( !is_user_logged_in() && !bp_displayed_user_id() )
    1180                         return;
    1181 
    1182                 // Define local variable(s)
    1183                 $sub_nav     = array();
    1184                 $user_domain = '';
    1185 
    1186                 // Add 'Forums' to the main navigation
    1187                 $main_nav = array(
    1188                         'name'                => __( 'Forums', 'bbpress' ),
    1189                         'slug'                => $this->slug,
    1190                         'position'            => 80,
    1191                         'screen_function'     => 'bbp_member_forums_screen_topics',
    1192                         'default_subnav_slug' => 'topics',
    1193                         'item_css_id'         => $this->id
    1194                 );
    1195 
    1196                 // Determine user to use
    1197                 if ( bp_displayed_user_id() )
    1198                         $user_domain = bp_displayed_user_domain();
    1199                 elseif ( bp_loggedin_user_domain() )
    1200                         $user_domain = bp_loggedin_user_domain();
    1201                 else
    1202                         return;
    1203 
    1204                 // User link
    1205                 $forums_link = trailingslashit( $user_domain . $this->slug );
    1206 
    1207                 // Topics started
    1208                 $sub_nav[] = array(
    1209                         'name'            => __( 'Topics Started', 'bbpress' ),
    1210                         'slug'            => 'topics',
    1211                         'parent_url'      => $forums_link,
    1212                         'parent_slug'     => $this->slug,
    1213                         'screen_function' => 'bbp_member_forums_screen_topics',
    1214                         'position'        => 20,
    1215                         'item_css_id'     => 'topics'
    1216                 );
    1217 
    1218                 // Replies to topics
    1219                 $sub_nav[] = array(
    1220                         'name'            => __( 'Topics Replied To', 'bbpress' ),
    1221                         'slug'            => 'replies',
    1222                         'parent_url'      => $forums_link,
    1223                         'parent_slug'     => $this->slug,
    1224                         'screen_function' => 'bbp_member_forums_screen_replies',
    1225                         'position'        => 40,
    1226                         'item_css_id'     => 'replies'
    1227                 );
    1228 
    1229                 // Favorite topics
    1230                 $sub_nav[] = array(
    1231                         'name'            => __( 'Favorites', 'bbpress' ),
    1232                         'slug'            => 'favorites',
    1233                         'parent_url'      => $forums_link,
    1234                         'parent_slug'     => $this->slug,
    1235                         'screen_function' => 'bbp_member_forums_screen_favorites',
    1236                         'position'        => 60,
    1237                         'item_css_id'     => 'favorites'
    1238                 );
    1239 
    1240                 // Subscribed topics (my profile only)
    1241                 if ( bp_is_my_profile() ) {
    1242                         $sub_nav[] = array(
    1243                                 'name'            => __( 'Subscriptions', 'bbpress' ),
    1244                                 'slug'            => 'subscriptions',
    1245                                 'parent_url'      => $forums_link,
    1246                                 'parent_slug'     => $this->slug,
    1247                                 'screen_function' => 'bbp_member_forums_screen_subscriptions',
    1248                                 'position'        => 60,
    1249                                 'item_css_id'     => 'subscriptions'
    1250                         );
    1251                 }
    1252 
    1253                 parent::setup_nav( $main_nav, $sub_nav );
    1254         }
    1255 
    1256         /**
    1257          * Set up the admin bar
    1258          *
    1259          * @since bbPress (r3552)
    1260          * @global BuddyPress $bp
    1261          */
    1262         public function setup_admin_bar() {
    1263                 global $bp;
    1264 
    1265                 // Prevent debug notices
    1266                 $wp_admin_nav = array();
    1267 
    1268                 // Menus for logged in user
    1269                 if ( is_user_logged_in() ) {
    1270 
    1271                         // Setup the logged in user variables
    1272                         $user_domain = bp_loggedin_user_domain();
    1273                         $forums_link = trailingslashit( $user_domain . $this->slug );
    1274 
    1275                         // Add the "My Account" sub menus
    1276                         $wp_admin_nav[] = array(
    1277                                 'parent' => $bp->my_account_menu_id,
    1278                                 'id'     => 'my-account-' . $this->id,
    1279                                 'title'  => __( 'Forums', 'bbpress' ),
    1280                                 'href'   => trailingslashit( $forums_link )
    1281                         );
    1282 
    1283                         // Topics
    1284                         $wp_admin_nav[] = array(
    1285                                 'parent' => 'my-account-' . $this->id,
    1286                                 'id'     => 'my-account-' . $this->id . '-topics',
    1287                                 'title'  => __( 'Topics Started', 'bbpress' ),
    1288                                 'href'   => trailingslashit( $forums_link . 'topics' )
    1289                         );
    1290 
    1291                         // Replies
    1292                         $wp_admin_nav[] = array(
    1293                                 'parent' => 'my-account-' . $this->id,
    1294                                 'id'     => 'my-account-' . $this->id . '-replies',
    1295                                 'title'  => __( 'Topics Replied To', 'bbpress' ),
    1296                                 'href'   => trailingslashit( $forums_link . 'replies' )
    1297                         );
    1298 
    1299                         // Favorites
    1300                         $wp_admin_nav[] = array(
    1301                                 'parent' => 'my-account-' . $this->id,
    1302                                 'id'     => 'my-account-' . $this->id . '-favorites',
    1303                                 'title'  => __( 'Favorite Topics', 'bbpress' ),
    1304                                 'href'   => trailingslashit( $forums_link . 'favorites' )
    1305                         );
    1306 
    1307                         // Subscriptions
    1308                         $wp_admin_nav[] = array(
    1309                                 'parent' => 'my-account-' . $this->id,
    1310                                 'id'     => 'my-account-' . $this->id . '-subscriptions',
    1311                                 'title'  => __( 'Subscribed Topics', 'bbpress' ),
    1312                                 'href'   => trailingslashit( $forums_link . 'subscriptions' )
    1313                         );
    1314                 }
    1315 
    1316                 parent::setup_admin_bar( $wp_admin_nav );
    1317         }
    1318 
    1319         /**
    1320          * Sets up the title for pages and <title>
    1321          *
    1322          * @since bbPress (r3552)
    1323          *
    1324          * @global BuddyPress $bp
    1325          */
    1326         public function setup_title() {
    1327                 global $bp;
    1328 
    1329                 // Adjust title based on view
    1330                 if ( bp_is_forums_component() ) {
    1331                         if ( bp_is_my_profile() ) {
    1332                                 $bp->bp_options_title = __( 'Forums', 'bbpress' );
    1333                         } else {
    1334                                 $bp->bp_options_avatar = bp_core_fetch_avatar( array(
    1335                                         'item_id' => $bp->displayed_user->id,
    1336                                         'type'    => 'thumb'
    1337                                 ) );
    1338                                 $bp->bp_options_title = $bp->displayed_user->fullname;
    1339                         }
    1340                 }
    1341 
    1342                 parent::setup_title();
    1343         }
    1344 }
    1345 endif;
    1346 
    1347 if ( !class_exists( 'BBP_Forums_Group_Extension' ) && class_exists( 'BP_Group_Extension' ) ) :
    1348 /**
    1349  * Loads Group Extension for Forums Component
    1350  *
    1351  * @since bbPress (r3552)
    1352  *
    1353  * @package bbPress
    1354  * @subpackage BuddyPress
    1355  * @todo Everything
    1356  */
    1357 class BBP_Forums_Group_Extension extends BP_Group_Extension {
    1358 
    1359         /**
    1360          * Setup bbPress group extension variables
    1361          *
    1362          * @since bbPress (r3552)
    1363          */
    1364         public function __construct() {
    1365 
    1366                 // Name and slug
    1367                 $this->name          = bbp_get_forum_archive_title();
    1368                 $this->nav_item_name = bbp_get_forum_archive_title();
    1369                 $this->slug          = 'forums';
    1370                 $this->topic_slug    = 'topic';
    1371                 $this->reply_slug    = 'reply';
    1372 
    1373                 // Forum component is visible @todo configure?
    1374                 $this->visibility = 'public';
    1375 
    1376                 // Set positions towards end
    1377                 $this->create_step_position = 15;
    1378                 $this->nav_item_position    = 10;
    1379 
    1380                 // Allow create step and show in nav
    1381                 $this->enable_create_step   = true;
    1382                 $this->enable_nav_item      = true;
    1383                 $this->enable_edit_item     = true;
    1384 
    1385                 // I forget what these do
    1386                 $this->display_hook         = 'bp_template_content';
    1387                 $this->template_file        = 'groups/single/plugins';
    1388 
    1389                 // Add handlers to bp_actions
    1390                 add_action( 'bp_actions', 'bbp_new_forum_handler'  );
    1391                 add_action( 'bp_actions', 'bbp_new_topic_handler'  );
    1392                 add_action( 'bp_actions', 'bbp_new_reply_handler'  );
    1393                 add_action( 'bp_actions', 'bbp_edit_forum_handler' );
    1394                 add_action( 'bp_actions', 'bbp_edit_topic_handler' );
    1395                 add_action( 'bp_actions', 'bbp_edit_reply_handler' );
    1396 
    1397                 // Tweak the redirect field
    1398                 add_filter( 'bbp_new_topic_redirect_to', array( $this, 'new_topic_redirect_to' ), 10, 3 );
    1399                 add_filter( 'bbp_new_reply_redirect_to', array( $this, 'new_reply_redirect_to' ), 10, 3 );
    1400         }
    1401 
    1402         /**
    1403          * The primary display function for group forums
    1404          */
    1405         public function display() {
    1406 
    1407                 // Prevent Topic Parent from appearing
    1408                 add_action( 'bbp_theme_before_topic_form_forum', array( $this, 'ob_start'     ) );
    1409                 add_action( 'bbp_theme_after_topic_form_forum',  array( $this, 'ob_end_clean' ) );
    1410                 add_action( 'bbp_theme_after_topic_form_forum',  array( $this, 'topic_parent' ) );
    1411 
    1412                 // Prevent Forum Parent from appearing
    1413                 add_action( 'bbp_theme_before_forum_form_parent', array( $this, 'ob_start'     ) );
    1414                 add_action( 'bbp_theme_after_forum_form_parent',  array( $this, 'ob_end_clean' ) );
    1415                 add_action( 'bbp_theme_after_forum_form_parent',  array( $this, 'forum_parent' ) );
    1416 
    1417                 // Hide breadcrumb
    1418                 add_filter( 'bbp_no_breadcrumb', '__return_true' );
    1419 
    1420                 $this->display_forums( 0 );
    1421         }
    1422 
    1423         /** Edit ******************************************************************/
    1424 
    1425         /**
    1426          * Show forums and new forum form when editing a group
    1427          *
    1428          * @since bbPress (r3563)
    1429          * @uses bbp_get_template_part()
    1430          */
    1431         public function edit_screen() {
    1432 
    1433                 $checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( bp_get_current_group_id(), 'forum_id' ); ?>
    1434 
    1435                 <h4><?php _e( 'Enable Group Forum', 'bbpress' ); ?></h4>
    1436 
    1437                 <p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
    1438 
    1439                 <div class="checkbox">
    1440                         <label><input type="checkbox" name="bbp-create-group-forum" id="bbp-create-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
    1441                 </div>
    1442 
    1443                 <p class="description"><?php _e( 'Saying no will not delete existing forum content.', 'bbpress' ); ?></p>
    1444 
    1445                 <input type="submit" value="<?php esc_attr_e( 'Save Settings', 'bbpress' ); ?>" />
    1446 
    1447                 <?php
    1448 
    1449                 // Verify intent
    1450                 wp_nonce_field( 'groups_edit_save_' . $this->slug );
    1451         }
    1452 
    1453         /**
    1454          * Save the Group Forum data on edit
    1455          *
    1456          * @since bbPress (r3465)
    1457          * @uses bbp_new_forum_handler() To check for forum creation
    1458          * @uses bbp_edit_forum_handler() To check for forum edit
    1459          */
    1460         public function edit_screen_save() {
    1461 
    1462                 // Bail if not a POST action
    1463                 if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
    1464                         return;
    1465 
    1466                 // Bail if action is empty
    1467                 if ( empty( $_POST['action'] ) )
    1468                         return;
    1469 
    1470                 check_admin_referer( 'groups_edit_save_' . $this->slug );
    1471 
    1472                 $edit_forum   = !empty( $_POST['bbp-edit-group-forum'] ) ? true : false;
    1473                 $forum_id     = 0;
    1474                 $forum_ids    = bbp_get_group_forum_ids( bp_get_current_group_id() );
    1475                 if ( !empty( $forum_ids ) )
    1476                         $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
    1477 
    1478                 // Update forum active
    1479                 groups_update_groupmeta( bp_get_current_group_id(), '_bbp_forum_enabled_' . $forum_id, $edit_forum );
    1480         }
    1481 
    1482         /** Create ****************************************************************/
    1483 
    1484         /**
    1485          * Show forums and new forum form when creating a group
    1486          *
    1487          * @since bbPress (r3465)
    1488          */
    1489         public function create_screen() {
    1490 
    1491                 // Bail if not looking at this screen
    1492                 if ( !bp_is_group_creation_step( $this->slug ) )
    1493                         return false;
    1494 
    1495                 $checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( bp_get_new_group_id(), 'forum_id' ); ?>
    1496 
    1497                 <h4><?php _e( 'Group Forum', 'bbpress' ); ?></h4>
    1498 
    1499                 <p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
    1500 
    1501                 <div class="checkbox">
    1502                         <label><input type="checkbox" name="bbp-create-group-forum" id="bbp-create-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
    1503                 </div>
    1504 
    1505                 <?php
    1506 
    1507                 // Verify intent
    1508                 wp_nonce_field( 'groups_create_save_' . $this->slug );
    1509         }
    1510 
    1511         /**
    1512          * Save the Group Forum data on create
    1513          *
    1514          * @since bbPress (r3465)
    1515          */
    1516         public function create_screen_save() {
    1517 
    1518                 check_admin_referer( 'groups_create_save_' . $this->slug );
    1519 
    1520                 $create_forum = !empty( $_POST['bbp-create-group-forum'] ) ? true : false;
    1521                 $forum_id     = 0;
    1522                 $forum_ids    = bbp_get_group_forum_ids( bp_get_new_group_id() );
    1523                 if ( !empty( $forum_ids ) )
    1524                         $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
    1525 
    1526                 // Create a forum, or not
    1527                 switch ( $create_forum ) {
    1528                         case true  :
    1529 
    1530                                 // Bail if initial content was already created
    1531                                 if ( !empty( $forum_id ) )
    1532                                         return;
    1533 
    1534                                 // Set the default forum status
    1535                                 switch ( bp_get_new_group_status() ) {
    1536                                         case 'hidden'  :
    1537                                                 $status = bbp_get_hidden_status_id();
    1538                                                 break;
    1539                                         case 'private' :
    1540                                                 $status = bbp_get_private_status_id();
    1541                                                 break;
    1542                                         case 'public'  :
    1543                                         default        :
    1544                                                 $status = bbp_get_public_status_id();
    1545                                                 break;
    1546                                 }
    1547 
    1548                                 // Create the initial forum
    1549                                 $forum_id = bbp_insert_forum( array(
    1550                                         'post_parent'  => bbp_get_group_forums_root_id(),
    1551                                         'post_title'   => bp_get_new_group_name(),
    1552                                         'post_content' => bp_get_new_group_description(),
    1553                                         'post_status'  => $status
    1554                                 ) );
    1555 
    1556                                 // Run the BP-specific functions for new groups
    1557                                 $this->new_forum( array( 'forum_id' => $forum_id ) );
    1558 
    1559                                 // Update forum active
    1560                                 groups_update_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id, true );
    1561 
    1562                                 break;
    1563                         case false :
    1564 
    1565                                 // Forum was created but is now being undone
    1566                                 if ( !empty( $forum_id ) ) {
    1567                                         wp_delete_post( $forum_id, true );
    1568                                         groups_delete_groupmeta( bp_get_new_group_id(), 'forum_id' );
    1569                                         groups_delete_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id );
    1570                                 }
    1571 
    1572                                 break;
    1573                 }
    1574         }
    1575 
    1576         /**
    1577          * Used to start an output buffer
    1578          */
    1579         public function ob_start() {
    1580                 ob_start();
    1581         }
    1582 
    1583         /**
    1584          * Used to end an output buffer
    1585          */
    1586         public function ob_end_clean() {
    1587                 ob_end_clean();
    1588         }
    1589 
    1590         /**
    1591          * Creating a group forum or category (including root for group)
    1592          *
    1593          * @since bbPress (r3653)
    1594          * @param type $forum_args
    1595          * @uses bbp_get_forum_id()
    1596          * @uses bp_get_current_group_id()
    1597          * @uses bbp_add_forum_id_to_group()
    1598          * @uses bbp_add_group_id_to_forum()
    1599          * @return if no forum_id is available
    1600          */
    1601         public function new_forum( $forum_args = array() ) {
    1602 
    1603                 // Bail if no forum_id was passed
    1604                 if ( empty( $forum_args['forum_id'] ) )
    1605                         return;
    1606 
    1607                 // Validate forum_id
    1608                 $forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
    1609                 $group_id = bp_get_current_group_id();
    1610 
    1611                 bbp_add_forum_id_to_group( $group_id, $forum_id );
    1612                 bbp_add_group_id_to_forum( $forum_id, $group_id );
    1613         }
    1614 
    1615         /**
    1616          * Removing a group forum or category (including root for group)
    1617          *
    1618          * @since bbPress (r3653)
    1619          * @param type $forum_args
    1620          * @uses bbp_get_forum_id()
    1621          * @uses bp_get_current_group_id()
    1622          * @uses bbp_add_forum_id_to_group()
    1623          * @uses bbp_add_group_id_to_forum()
    1624          * @return if no forum_id is available
    1625          */
    1626         public function remove_forum( $forum_args = array() ) {
    1627 
    1628                 // Bail if no forum_id was passed
    1629                 if ( empty( $forum_args['forum_id'] ) )
    1630                         return;
    1631 
    1632                 // Validate forum_id
    1633                 $forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
    1634                 $group_id = bp_get_current_group_id();
    1635 
    1636                 bbp_remove_forum_id_from_group( $group_id, $forum_id );
    1637                 bbp_remove_group_id_from_forum( $forum_id, $group_id );
    1638         }
    1639 
    1640         /** Display Methods *******************************************************/
    1641 
    1642         /**
    1643          * Output the forums for a group in the edit screens
    1644          *
    1645          * @since bbPress (r3653)
    1646          * @uses bp_get_current_group_id()
    1647          * @uses bbp_get_group_forum_ids()
    1648          * @uses bbp_has_forums()
    1649          * @uses bbp_get_template_part()
    1650          */
    1651         public function display_forums( $offset = 0 ) {
    1652                 $bbp = bbpress();
    1653 
    1654                 // Forum data
    1655                 $forum_ids  = bbp_get_group_forum_ids( bp_get_current_group_id() );
    1656                 $forum_args = array( 'post__in' => $forum_ids, 'post_parent' => null );
    1657 
    1658                 // Unset global queries
    1659                 $bbp->forum_query = new stdClass;
    1660                 $bbp->topic_query = new stdClass;
    1661                 $bbp->reply_query = new stdClass;
    1662 
    1663                 // Unset global ID's
    1664                 $bbp->current_forum_id     = 0;
    1665                 $bbp->current_topic_id     = 0;
    1666                 $bbp->current_reply_id     = 0;
    1667                 $bbp->current_topic_tag_id = 0;
    1668 
    1669                 // Reset the post data
    1670                 wp_reset_postdata();
    1671 
    1672                 // Allow admins special views
    1673                 $post_status = array( bbp_get_closed_status_id(), bbp_get_public_status_id() );
    1674                 if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() )
    1675                         $post_status = array_merge( $post_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id() ) ); ?>
    1676 
    1677                 <div id="bbpress-forums">
    1678 
    1679                         <?php
    1680 
    1681                         // Looking at the group forum root
    1682                         if ( !bp_action_variable( $offset ) ) :
    1683 
    1684                                 // Query forums and show them if they exist
    1685                                 if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) :
    1686 
    1687                                         // Only one forum found
    1688                                         if ( 1 == $bbp->forum_query->post_count ) :
    1689 
    1690                                                 // Get forum data
    1691                                                 $forum_slug = bp_action_variable( $offset );
    1692                                                 $forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
    1693                                                 $forums     = get_posts( $forum_args );
    1694 
    1695                                                 bbp_the_forum();
    1696 
    1697                                                 // Forum exists
    1698                                                 if ( !empty( $forums ) ) :
    1699                                                         $forum = $forums[0];
    1700 
    1701                                                         // Set up forum data
    1702                                                         $forum_id = bbpress()->current_forum_id = $forum->ID;
    1703                                                         bbp_set_query_name( 'bbp_single_forum' ); ?>
    1704 
    1705                                                         <h3><?php bbp_forum_title(); ?></h3>
    1706 
    1707                                                         <?php bbp_get_template_part( 'content', 'single-forum' ); ?>
    1708 
    1709                                                 <?php else : ?>
    1710 
    1711                                                         <?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
    1712 
    1713                                                         <?php bbp_get_template_part( 'form',       'topic'     ); ?>
    1714 
    1715                                                 <?php endif;
    1716 
    1717                                         // More than 1 forum found or group forum admin screen
    1718                                         elseif ( 1 < $bbp->forum_query->post_count ) : ?>
    1719 
    1720                                                 <h3><?php _e( 'Forums', 'bbpress' ); ?></h3>
    1721 
    1722                                                 <?php bbp_get_template_part( 'loop', 'forums' ); ?>
    1723 
    1724                                                 <h3><?php _e( 'Topics', 'bbpress' ); ?></h3>
    1725 
    1726                                                 <?php if ( bbp_has_topics( array( 'post_parent__in' => $forum_ids ) ) ) : ?>
    1727 
    1728                                                         <?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
    1729 
    1730                                                         <?php bbp_get_template_part( 'loop',       'topics'    ); ?>
    1731 
    1732                                                         <?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
    1733 
    1734                                                         <?php bbp_get_template_part( 'form',       'topic'     ); ?>
    1735 
    1736                                                 <?php else : ?>
    1737 
    1738                                                         <?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
    1739 
    1740                                                         <?php bbp_get_template_part( 'form',       'topic'     ); ?>
    1741 
    1742                                                 <?php endif;
    1743 
    1744                                         // No forums found
    1745                                         else : ?>
    1746 
    1747                                                 <div id="message" class="info">
    1748                                                         <p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
    1749                                                 </div>
    1750 
    1751                                         <?php endif;
    1752 
    1753                                 // No forums found
    1754                                 else : ?>
    1755 
    1756                                         <div id="message" class="info">
    1757                                                 <p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
    1758                                         </div>
    1759 
    1760                                 <?php endif;
    1761 
    1762                         // Single forum
    1763                         elseif ( ( bp_action_variable( $offset ) != $this->slug ) && ( bp_action_variable( $offset ) != $this->topic_slug ) && ( bp_action_variable( $offset ) != $this->reply_slug ) ) :
    1764 
    1765                                 // Get forum data
    1766                                 $forum_slug = bp_action_variable( $offset );
    1767                                 $forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
    1768                                 $forums     = get_posts( $forum_args );
    1769 
    1770                                 // Forum exists
    1771                                 if ( !empty( $forums ) ) :
    1772                                         $forum = $forums[0];
    1773 
    1774                                         // Set up forum data
    1775                                         $forum_id = bbpress()->current_forum_id = $forum->ID;
    1776 
    1777                                         // Reset necessary forum_query attributes for forums loop to function
    1778                                         $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
    1779                                         $bbp->forum_query->in_the_loop             = true;
    1780                                         $bbp->forum_query->post                    = get_post( $forum_id );
    1781 
    1782                                         // Forum edit
    1783                                         if ( bp_action_variable( $offset + 1 ) == $bbp->edit_id ) :
    1784                                                 global $wp_query, $post;
    1785 
    1786                                                 $wp_query->bbp_is_edit       = true;
    1787                                                 $wp_query->bbp_is_forum_edit = true;
    1788                                                 $post                        = $forum;
    1789 
    1790                                                 bbp_set_query_name( 'bbp_forum_form' );
    1791 
    1792                                                 bbp_get_template_part( 'form', 'forum' );
    1793 
    1794                                         else :
    1795                                                 bbp_set_query_name( 'bbp_single_forum' ); ?>
    1796 
    1797                                                 <h3><?php bbp_forum_title(); ?></h3>
    1798 
    1799                                                 <?php bbp_get_template_part( 'content', 'single-forum' );
    1800 
    1801                                         endif;
    1802 
    1803                                 else :
    1804                                         bbp_get_template_part( 'feedback', 'no-topics' );
    1805                                         bbp_get_template_part( 'form',     'topic'     );
    1806 
    1807                                 endif;
    1808 
    1809                         // Single topic
    1810                         elseif ( bp_action_variable( $offset ) == $this->topic_slug ) :
    1811 
    1812                                 // Get topic data
    1813                                 $topic_slug = bp_action_variable( $offset + 1 );
    1814                                 $topic_args = array( 'name' => $topic_slug, 'post_type' => bbp_get_topic_post_type(), 'post_status' => $post_status );
    1815                                 $topics     = get_posts( $topic_args );
    1816 
    1817                                 // Topic exists
    1818                                 if ( !empty( $topics ) ) :
    1819                                         $topic = $topics[0];
    1820 
    1821                                         // Set up topic data
    1822                                         $topic_id = bbpress()->current_topic_id = $topic->ID;
    1823                                         $forum_id = bbp_get_topic_forum_id( $topic_id );
    1824 
    1825                                         // Reset necessary forum_query attributes for topics loop to function
    1826                                         $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
    1827                                         $bbp->forum_query->in_the_loop             = true;
    1828                                         $bbp->forum_query->post                    = get_post( $forum_id );
    1829 
    1830                                         // Reset necessary topic_query attributes for topics loop to function
    1831                                         $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
    1832                                         $bbp->topic_query->in_the_loop             = true;
    1833                                         $bbp->topic_query->post                    = $topic;
    1834 
    1835                                         // Topic edit
    1836                                         if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
    1837                                                 global $wp_query, $post;
    1838                                                 $wp_query->bbp_is_edit       = true;
    1839                                                 $wp_query->bbp_is_topic_edit = true;
    1840                                                 $post                        = $topic;
    1841 
    1842                                                 // Merge
    1843                                                 if ( !empty( $_GET['action'] ) && 'merge' == $_GET['action'] ) :
    1844                                                         bbp_set_query_name( 'bbp_topic_merge' );
    1845 
    1846                                                         bbp_get_template_part( 'form', 'topic-merge' );
    1847 
    1848                                                 // Split
    1849                                                 elseif ( !empty( $_GET['action'] ) && 'split' == $_GET['action'] ) :
    1850                                                         bbp_set_query_name( 'bbp_topic_split' );
    1851 
    1852                                                         bbp_get_template_part( 'form', 'topic-split' );
    1853 
    1854                                                 // Edit
    1855                                                 else :
    1856                                                         bbp_set_query_name( 'bbp_topic_form' );
    1857                                                         bbp_get_template_part( 'form', 'topic' );
    1858 
    1859                                                 endif;
    1860 
    1861                                         // Single Topic
    1862                                         else:
    1863 
    1864                                                 bbp_set_query_name( 'bbp_single_topic' ); ?>
    1865 
    1866                                                 <h3><?php bbp_topic_title(); ?></h3>
    1867 
    1868                                                 <?php bbp_get_template_part( 'content', 'single-topic' );
    1869 
    1870                                         endif;
    1871 
    1872                                 // No Topics
    1873                                 else :
    1874                                         bbp_get_template_part( 'feedback', 'no-topics'   );
    1875                                         bbp_get_template_part( 'form',     'topic'       );
    1876 
    1877                                 endif;
    1878 
    1879                         // Single reply
    1880                         elseif ( bp_action_variable( $offset ) == $this->reply_slug ) :
    1881 
    1882                                 // Get reply data
    1883                                 $reply_slug = bp_action_variable( $offset + 1 );
    1884                                 $reply_args = array( 'name' => $reply_slug, 'post_type' => bbp_get_reply_post_type() );
    1885                                 $replies    = get_posts( $reply_args );
    1886 
    1887                                 if ( empty( $replies ) )
    1888                                         return;
    1889 
    1890                                 // Get the first reply
    1891                                 $reply = $replies[0];
    1892 
    1893                                 // Set up reply data
    1894                                 $reply_id = bbpress()->current_reply_id = $reply->ID;
    1895                                 $topic_id = bbp_get_reply_topic_id( $reply_id );
    1896                                 $forum_id = bbp_get_reply_forum_id( $reply_id );
    1897 
    1898                                 // Reset necessary forum_query attributes for reply to function
    1899                                 $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
    1900                                 $bbp->forum_query->in_the_loop             = true;
    1901                                 $bbp->forum_query->post                    = get_post( $forum_id );
    1902 
    1903                                 // Reset necessary topic_query attributes for reply to function
    1904                                 $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
    1905                                 $bbp->topic_query->in_the_loop             = true;
    1906                                 $bbp->topic_query->post                    = get_post( $topic_id );
    1907 
    1908                                 // Reset necessary reply_query attributes for reply to function
    1909                                 $bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type();
    1910                                 $bbp->reply_query->in_the_loop             = true;
    1911                                 $bbp->reply_query->post                    = $reply;
    1912 
    1913                                 if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
    1914                                         global $wp_query, $post;
    1915 
    1916                                         $wp_query->bbp_is_edit       = true;
    1917                                         $wp_query->bbp_is_reply_edit = true;
    1918                                         $post                        = $reply;
    1919 
    1920                                         bbp_set_query_name( 'bbp_reply_form' );
    1921                                         bbp_get_template_part( 'form', 'reply' );
    1922 
    1923                                 endif;
    1924 
    1925                         endif; ?>
    1926 
    1927                 </div>
    1928 
    1929                 <?php
    1930         }
    1931 
    1932         /**
    1933          * Add forum row action HTML when viewing group forum admin
    1934          *
    1935          * @since bbPress (r3653)
    1936          * @uses bp_is_item_admin()
    1937          * @uses bbp_get_forum_id()
    1938          */
    1939         public function forum_row_actions() {
    1940 
    1941                 // Only admins can take actions on forums
    1942                 if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() ) : ?>
    1943 
    1944                 <div class="row-actions">
    1945 
    1946                         <?php echo 'Edit | View | Trash'; ?>
    1947 
    1948                 </div>
    1949 
    1950                 <?php endif;
    1951         }
    1952 
    1953         /**
    1954          * Add topic row action HTML when viewing group forum admin
    1955          *
    1956          * @since bbPress (r3653)
    1957          * @uses bp_is_item_admin()
    1958          * @uses bbp_get_forum_id()
    1959          */
    1960         public function topic_row_actions() {
    1961 
    1962                 // Only admins can take actions on forums
    1963                 if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() ) : ?>
    1964 
    1965                 <div class="row-actions">
    1966 
    1967                         <?php echo 'Edit | View | Trash | Close | Stick (To Front) | Spam'; ?>
    1968 
    1969                 </div>
    1970 
    1971                 <?php endif;
    1972         }
    1973 
    1974         /** Redirect Helpers ******************************************************/
    1975 
    1976         /**
    1977          * Redirect to the group forum screen
    1978          *
    1979          * @since bbPress (r3653)
    1980          * @param str $redirect_url
    1981          * @param str $redirect_to
    1982          */
    1983         public function new_topic_redirect_to( $redirect_url = '', $redirect_to = '', $topic_id = 0 ) {
    1984                 if ( bp_is_group() ) {
    1985                         $topic        = bbp_get_topic( $topic_id );
    1986                         $topic_hash   = '#post-' . $topic_id;
    1987                         $redirect_url = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name ) . $topic_hash;
    1988                 }
    1989 
    1990                 return $redirect_url;
    1991         }
    1992 
    1993         /**
    1994          * Redirect to the group forum screen
    1995          *
    1996          * @since bbPress (r3653)
    1997          */
    1998         public function new_reply_redirect_to( $redirect_url = '', $redirect_to = '', $reply_id = 0 ) {
    1999                 global $wp_rewrite;
    2000 
    2001                 if ( bp_is_group() ) {
    2002                         $topic_id       = bbp_get_reply_topic_id( $reply_id );
    2003                         $topic          = bbp_get_topic( $topic_id );
    2004                         $reply_position = bbp_get_reply_position( $reply_id, $topic_id );
    2005                         $reply_page     = ceil( (int) $reply_position / (int) bbp_get_replies_per_page() );
    2006                         $reply_hash     = '#post-' . $reply_id;
    2007                         $topic_url      = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name );
    2008 
    2009                         // Don't include pagination if on first page
    2010                         if ( 1 >= $reply_page ) {
    2011                                 $redirect_url = trailingslashit( $topic_url ) . $reply_hash;
    2012 
    2013                         // Include pagination
    2014                         } else {
    2015                                 $redirect_url = trailingslashit( $topic_url ) . trailingslashit( $wp_rewrite->pagination_base ) . trailingslashit( $reply_page ) . $reply_hash;
    2016                         }
    2017 
    2018                         // Add topic view query arg back to end if it is set
    2019                         if ( bbp_get_view_all() ) {
    2020                                 $redirect_url = bbp_add_view_all( $redirect_url );
    2021                         }
    2022                 }
    2023 
    2024                 return $redirect_url;
    2025         }
    2026 
    2027         /**
    2028          * Redirect to the group admin forum edit screen
    2029          *
    2030          * @since bbPress (r3653)
    2031          * @uses groups_get_current_group()
    2032          * @uses bp_is_group_admin_screen()
    2033          * @uses trailingslashit()
    2034          * @uses bp_get_root_domain()
    2035          * @uses bp_get_groups_root_slug()
    2036          */
    2037         public function edit_redirect_to( $redirect_url = '' ) {
    2038 
    2039                 // Get the current group, if there is one
    2040                 $group = groups_get_current_group();
    2041 
    2042                 // If this is a group of any kind, empty out the redirect URL
    2043                 if ( bp_is_group_admin_screen( $this->slug ) )
    2044                         $redirect_url = trailingslashit( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/' . $group->slug . '/admin/' . $this->slug );
    2045 
    2046                 return $redirect_url;
    2047         }
    2048 
    2049         /** Form Helpers **********************************************************/
    2050 
    2051         public function forum_parent() {
    2052         ?>
    2053 
    2054                 <input type="hidden" name="bbp_forum_parent_id" id="bbp_forum_parent_id" value="<?php bbp_group_forums_root_id(); ?>" />
    2055 
    2056         <?php
    2057         }
    2058 
    2059         public function topic_parent() {
    2060 
    2061                 $forum_ids = bbp_get_group_forum_ids( bp_get_current_group_id() ); ?>
    2062 
    2063                 <p>
    2064                         <label for="bbp_forum_id"><?php _e( 'Forum:', 'bbpress' ); ?></label><br />
    2065                         <?php bbp_dropdown( array( 'include' => $forum_ids, 'selected' => bbp_get_form_topic_forum() ) ); ?>
    2066                 </p>
    2067 
    2068         <?php
    2069         }
    2070 }
    2071 endif;
    2072 
    2073 /**
    2074  * Creates the Forums component in BuddyPress
    2075  *
    2076  * @since bbPress (r3653)
    2077  *
    2078  * @global type $bp
    2079  * @return If bbPress is not active
    2080  */
    2081 function bbp_setup_buddypress_component() {
    2082         global $bp;
    2083 
    2084         // Bail if no BuddyPress
    2085         if ( !empty( $bp->maintenance_mode ) || !defined( 'BP_VERSION' ) ) return;
    2086 
    2087         // Bail if BuddyPress Forums are already active
    2088         if ( bp_is_active( 'forums' ) && bp_forums_is_installed_correctly() ) return;
    2089 
    2090         // Create the new BuddyPress Forums component
    2091         $bp->forums = new BBP_Forums_Component();
    2092 
    2093         // Register the group extension only if groups are active
    2094         if ( bbp_is_group_forums_active() && bp_is_active( 'groups' ) ) {
    2095                 bp_register_group_extension( 'BBP_Forums_Group_Extension' );
    2096         }
    2097 }
    2098 
    2099 /** BuddyPress Helpers ********************************************************/
    2100 
    2101 /**
    2102  * Filter the current bbPress user ID with the current BuddyPress user ID
    2103  *
    2104  * @since bbPress (r3552)
    2105  *
    2106  * @global BuddyPress $bp
    2107  * @param int $user_id
    2108  * @param bool $displayed_user_fallback
    2109  * @param bool $current_user_fallback
    2110  * @return int User ID
    2111  */
    2112 function bbp_filter_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
    2113 
    2114         // Define local variable
    2115         $bbp_user_id = 0;
    2116 
    2117         // Get possible user ID's
    2118         $did = bp_displayed_user_id();
    2119         $lid = bp_loggedin_user_id();
    2120 
    2121         // Easy empty checking
    2122         if ( !empty( $user_id ) && is_numeric( $user_id ) )
    2123                 $bbp_user_id = $user_id;
    2124 
    2125         // Currently viewing or editing a user
    2126         elseif ( ( true == $displayed_user_fallback ) && !empty( $did ) )
    2127                 $bbp_user_id = $did;
    2128 
    2129         // Maybe fallback on the current_user ID
    2130         elseif ( ( true == $current_user_fallback ) && !empty( $lid ) )
    2131                 $bbp_user_id = $lid;
    2132 
    2133         return $bbp_user_id;
    2134 }
    2135 add_filter( 'bbp_get_user_id', 'bbp_filter_user_id', 10, 3 );
    2136 
    2137 /**
    2138  * Filter the bbPress is_single_user function with BuddyPress eqivalent
    2139  *
    2140  * @since bbPress (r3552)
    2141  *
    2142  * @param bool $is Optional. Default false
    2143  * @return bool True if viewing single user, false if not
    2144  */
    2145 function bbp_filter_is_single_user( $is = false ) {
    2146         if ( !empty( $is ) )
    2147                 return $is;
    2148 
    2149         return bp_is_user();
    2150 }
    2151 add_filter( 'bbp_is_single_user', 'bbp_filter_is_single_user', 10, 1 );
    2152 
    2153 /**
    2154  * Filter the bbPress is_user_home function with BuddyPress eqivalent
    2155  *
    2156  * @since bbPress (r3552)
    2157  *
    2158  * @param bool $is Optional. Default false
    2159  * @return bool True if viewing single user, false if not
    2160  */
    2161 function bbp_filter_is_user_home( $is = false ) {
    2162         if ( !empty( $is ) )
    2163                 return $is;
    2164 
    2165         return bp_is_my_profile();
    2166 }
    2167 add_filter( 'bbp_is_user_home', 'bbp_filter_is_user_home', 10, 1 );
    2168 
    2169 /** BuddyPress Screens ********************************************************/
    2170 
    2171 /**
    2172  * Hook bbPress topics template into plugins template
    2173  *
    2174  * @since bbPress (r3552)
    2175  *
    2176  * @uses add_action() To add the content hook
    2177  * @uses bp_core_load_template() To load the plugins template
    2178  */
    2179 function bbp_member_forums_screen_topics() {
    2180         add_action( 'bp_template_content', 'bbp_member_forums_topics_content' );
    2181         bp_core_load_template( apply_filters( 'bbp_member_forums_screen_topics', 'members/single/plugins' ) );
    2182 }
    2183 
    2184 /**
    2185  * Hook bbPress replies template into plugins template
    2186  *
    2187  * @since bbPress (r3552)
    2188  *
    2189  * @uses add_action() To add the content hook
    2190  * @uses bp_core_load_template() To load the plugins template
    2191  */
    2192 function bbp_member_forums_screen_replies() {
    2193         add_action( 'bp_template_content', 'bbp_member_forums_replies_content' );
    2194         bp_core_load_template( apply_filters( 'bbp_member_forums_screen_replies', 'members/single/plugins' ) );
    2195 }
    2196 
    2197 /**
    2198  * Hook bbPress favorites template into plugins template
    2199  *
    2200  * @since bbPress (r3552)
    2201  *
    2202  * @uses add_action() To add the content hook
    2203  * @uses bp_core_load_template() To load the plugins template
    2204  */
    2205 function bbp_member_forums_screen_favorites() {
    2206         add_action( 'bp_template_content', 'bbp_member_forums_favorites_content' );
    2207         bp_core_load_template( apply_filters( 'bbp_member_forums_screen_favorites', 'members/single/plugins' ) );
    2208 }
    2209 
    2210 /**
    2211  * Hook bbPress subscriptions template into plugins template
    2212  *
    2213  * @since bbPress (r3552)
    2214  *
    2215  * @uses add_action() To add the content hook
    2216  * @uses bp_core_load_template() To load the plugins template
    2217  */
    2218 function bbp_member_forums_screen_subscriptions() {
    2219         add_action( 'bp_template_content', 'bbp_member_forums_subscriptions_content' );
    2220         bp_core_load_template( apply_filters( 'bbp_member_forums_screen_subscriptions', 'members/single/plugins' ) );
    2221 }
    2222 
    2223 /** BuddyPress Templates ******************************************************/
    2224 
    2225 /**
    2226  * Get the topics created template part
    2227  *
    2228  * @since bbPress (r3552)
    2229  *
    2230  * @uses bbp_get_template_part()s
    2231  */
    2232 function bbp_member_forums_topics_content() {
    2233 ?>
    2234 
    2235         <div id="bbpress-forums">
    2236 
    2237                 <?php bbp_get_template_part( 'user', 'topics-created' ); ?>
    2238 
    2239         </div>
    2240 
    2241 <?php
    2242 }
    2243 
    2244 /**
    2245  * Get the topics replied to template part
    2246  *
    2247  * @since bbPress (r3552)
    2248  *
    2249  * @uses bbp_get_template_part()
    2250  */
    2251 function bbp_member_forums_replies_content() {
    2252 ?>
    2253 
    2254         <div id="bbpress-forums">
    2255 
    2256                 <?php bbp_get_template_part( 'user', 'topics-replied-to' ); ?>
    2257 
    2258         </div>
    2259 
    2260 <?php
    2261 }
    2262 
    2263 /**
    2264  * Get the topics favorited template part
    2265  *
    2266  * @since bbPress (r3552)
    2267  *
    2268  * @uses bbp_get_template_part()
    2269  */
    2270 function bbp_member_forums_favorites_content() {
    2271 ?>
    2272 
    2273         <div id="bbpress-forums">
    2274 
    2275                 <?php bbp_get_template_part( 'user', 'favorites' ); ?>
    2276 
    2277         </div>
    2278 
    2279 <?php
    2280 }
    2281 
    2282 /**
    2283  * Get the topics subscribed template part
    2284  *
    2285  * @since bbPress (r3552)
    2286  *
    2287  * @uses bbp_get_template_part()
    2288  */
    2289 function bbp_member_forums_subscriptions_content() {
    2290 ?>
    2291 
    2292         <div id="bbpress-forums">
    2293 
    2294                 <?php bbp_get_template_part( 'user', 'subscriptions' ); ?>
    2295 
    2296         </div>
    2297 
    2298 <?php
    2299 }
    2300 
    2301 /** Forum/Group Sync **********************************************************/
    2302 
    2303 /**
    2304  * These functions are used to keep the many-to-many relationships between
    2305  * groups and forums synchronized. Each forum and group stores ponters to each
    2306  * other in their respective meta. This way if a group or forum is deleted
    2307  * their associattions can be updated without much effort.
    2308  */
    2309 
    2310 /**
    2311  * Get forum ID's for a group
    2312  *
    2313  * @param type $group_id
    2314  * @since bbPress (r3653)
    2315  */
    2316 function bbp_get_group_forum_ids( $group_id = 0 ) {
    2317 
    2318         // Assume no forums
    2319         $forum_ids = array();
    2320 
    2321         // Use current group if none is set
    2322         if ( empty( $group_id ) )
    2323                 $group_id = bp_get_current_group_id();
    2324 
    2325         // Get the forums
    2326         if ( !empty( $group_id ) )
    2327                 $forum_ids = groups_get_groupmeta( $group_id, 'forum_id' );
    2328 
    2329         // Make sure result is an array
    2330         if ( !is_array( $forum_ids ) )
    2331                 $forum_ids = (array) $forum_ids;
    2332 
    2333         // Trim out any empty array items
    2334         $forum_ids = array_filter( $forum_ids );
    2335 
    2336         return (array) apply_filters( 'bbp_get_group_forum_ids', $forum_ids, $group_id );
    2337 }
    2338 
    2339 /**
    2340  * Get group ID's for a forum
    2341  *
    2342  * @param type $forum_id
    2343  * @since bbPress (r3653)
    2344  */
    2345 function bbp_get_forum_group_ids( $forum_id = 0 ) {
    2346 
    2347         // Assume no forums
    2348         $group_ids = array();
    2349 
    2350         // Use current group if none is set
    2351         if ( empty( $forum_id ) )
    2352                 $forum_id = bbp_get_forum_id();
    2353 
    2354         // Get the forums
    2355         if ( !empty( $forum_id ) )
    2356                 $group_ids = get_post_meta( $forum_id, '_bbp_group_ids', true );
    2357 
    2358         // Make sure result is an array
    2359         if ( !is_array( $group_ids ) )
    2360                 $group_ids = (array) $group_ids;
    2361 
    2362         // Trim out any empty array items
    2363         $group_ids = array_filter( $group_ids );
    2364 
    2365         return (array) apply_filters( 'bbp_get_forum_group_ids', $group_ids, $forum_id );
    2366 }
    2367 
    2368 /**
    2369  * Get forum ID's for a group
    2370  *
    2371  * @param type $group_id
    2372  * @since bbPress (r3653)
    2373  */
    2374 function bbp_update_group_forum_ids( $group_id = 0, $forum_ids = array() ) {
    2375 
    2376         // Use current group if none is set
    2377         if ( empty( $group_id ) )
    2378                 $group_id = bp_get_current_group_id();
    2379 
    2380         // Trim out any empties
    2381         $forum_ids = array_filter( $forum_ids );
    2382 
    2383         // Get the forums
    2384         return groups_update_groupmeta( $group_id, 'forum_id', $forum_ids );
    2385 }
    2386 
    2387 /**
    2388  * Update group ID's for a forum
    2389  *
    2390  * @param type $forum_id
    2391  * @since bbPress (r3653)
    2392  */
    2393 function bbp_update_forum_group_ids( $forum_id = 0, $group_ids = array() ) {
    2394         $forum_id = bbp_get_forum_id( $forum_id );
    2395 
    2396         // Trim out any empties
    2397         $group_ids = array_filter( $group_ids );
    2398 
    2399         // Get the forums
    2400         return update_post_meta( $forum_id, '_bbp_group_ids', $group_ids );
    2401 }
    2402 
    2403 /**
    2404  * Add a group to a forum
    2405  *
    2406  * @param type $group_id
    2407  * @since bbPress (r3653)
    2408  */
    2409 function bbp_add_group_id_to_forum( $forum_id = 0, $group_id = 0 ) {
    2410 
    2411         // Validate forum_id
    2412         $forum_id = bbp_get_forum_id( $forum_id );
    2413 
    2414         // Use current group if none is set
    2415         if ( empty( $group_id ) )
    2416                 $group_id = bp_get_current_group_id();
    2417 
    2418         // Get current group IDs
    2419         $group_ids = bbp_get_forum_group_ids( $forum_id );
    2420 
    2421         // Maybe update the groups forums
    2422         if ( !in_array( $group_id, $group_ids ) ) {
    2423                 $group_ids[] = $group_id;
    2424                 return bbp_update_forum_group_ids( $forum_id, $group_ids );
    2425         }
    2426 }
    2427 
    2428 /**
    2429  * Remove a forum from a group
    2430  *
    2431  * @param type $group_id
    2432  * @since bbPress (r3653)
    2433  */
    2434 function bbp_add_forum_id_to_group( $group_id = 0, $forum_id = 0 ) {
    2435 
    2436         // Validate forum_id
    2437         $forum_id = bbp_get_forum_id( $forum_id );
    2438 
    2439         // Use current group if none is set
    2440         if ( empty( $group_id ) )
    2441                 $group_id = bp_get_current_group_id();
    2442 
    2443         // Get current group IDs
    2444         $forum_ids = bbp_get_group_forum_ids( $group_id );
    2445 
    2446         // Maybe update the groups forums
    2447         if ( !in_array( $forum_id, $forum_ids ) ) {
    2448                 $forum_ids[] = $forum_id;
    2449                 return bbp_update_group_forum_ids( $group_id, $forum_ids );
    2450         }
    2451 }
    2452 
    2453 /**
    2454  * Remove a group from a forum
    2455  *
    2456  * @param type $group_id
    2457  * @since bbPress (r3653)
    2458  */
    2459 function bbp_remove_group_id_from_forum( $forum_id = 0, $group_id = 0 ) {
    2460 
    2461         // Validate forum_id
    2462         $forum_id = bbp_get_forum_id( $forum_id );
    2463 
    2464         // Use current group if none is set
    2465         if ( empty( $group_id ) )
    2466                 $group_id = bp_get_current_group_id();
    2467 
    2468         // Get current group IDs
    2469         $group_ids = bbp_get_forum_group_ids( $forum_id );
    2470 
    2471         // Maybe update the groups forums
    2472         if ( in_array( $group_id, $group_ids ) ) {
    2473                 unset( $group_ids[$group_id] );
    2474                 return bbp_update_forum_group_ids( $forum_id, $group_ids );
    2475         }
    2476 }
    2477 
    2478 /**
    2479  * Remove a forum from a group
    2480  *
    2481  * @param type $group_id
    2482  * @since bbPress (r3653)
    2483  */
    2484 function bbp_remove_forum_id_from_group( $group_id = 0, $forum_id = 0 ) {
    2485 
    2486         // Validate forum_id
    2487         $forum_id = bbp_get_forum_id( $forum_id );
    2488 
    2489         // Use current group if none is set
    2490         if ( empty( $group_id ) )
    2491                 $group_id = bp_get_current_group_id();
    2492 
    2493         // Get current group IDs
    2494         $forum_ids = bbp_get_group_forum_ids( $group_id );
    2495 
    2496         // Maybe update the groups forums
    2497         if ( in_array( $forum_id, $forum_ids ) ) {
    2498                 unset( $forum_ids[$forum_id] );
    2499                 return bbp_update_group_forum_ids( $group_id, $forum_ids );
    2500         }
    2501 }
    2502 
    2503 /**
    2504  * Remove a group from aall forums
    2505  *
    2506  * @param type $group_id
    2507  * @since bbPress (r3653)
    2508  */
    2509 function bbp_remove_group_id_from_all_forums( $group_id = 0 ) {
    2510 
    2511         // Use current group if none is set
    2512         if ( empty( $group_id ) )
    2513                 $group_id = bp_get_current_group_id();
    2514 
    2515         // Get current group IDs
    2516         $forum_ids = bbp_get_group_forum_ids( $group_id );
    2517 
    2518         // Loop through forums and remove this group from each one
    2519         foreach( (array) $forum_ids as $forum_id ) {
    2520                 bbp_remove_group_id_from_forum( $group_id, $forum_id );
    2521         }
    2522 }
    2523 
    2524 /**
    2525  * Remove a forum from all groups
    2526  *
    2527  * @param type $forum_id
    2528  * @since bbPress (r3653)
    2529  */
    2530 function bbp_remove_forum_id_from_all_groups( $forum_id = 0 ) {
    2531 
    2532         // Validate
    2533         $forum_id  = bbp_get_forum_id( $forum_id );
    2534         $group_ids = bbp_get_forum_group_ids( $forum_id );
    2535 
    2536         // Loop through groups and remove this forum from each one
    2537         foreach( (array) $group_ids as $group_id ) {
    2538                 bbp_remove_forum_id_from_group( $forum_id, $group_id );
    2539         }
    2540 }