forums->id = 'forums'; $bp->forums->image_base = BP_PLUGIN_URL . '/bp-forums/images'; $bp->forums->bbconfig = $bp->site_options['bb-config-location']; $bp->forums->slug = BP_FORUMS_SLUG; /* Register this in the active components array */ $bp->active_components[$bp->forums->slug] = $bp->forums->id; do_action( 'bp_forums_setup' ); } add_action( 'bp_setup_globals', 'bp_forums_setup' ); function bp_forums_is_installed_correctly() { global $bp; if ( file_exists( $bp->forums->bbconfig ) ) return true; return false; } function bp_forums_setup_root_component() { /* Register 'forums' as a root component */ bp_core_add_root_component( BP_FORUMS_SLUG ); } add_action( 'bp_setup_root_components', 'bp_forums_setup_root_component' ); function bp_forums_directory_forums_setup() { global $bp; if ( $bp->current_component == $bp->forums->slug ) { if ( (int) $bp->site_options['bp-disable-forum-directory'] || !function_exists( 'groups_install' ) ) return false; if ( !bp_forums_is_installed_correctly() ) { bp_core_add_message( __( 'The forums component has not been set up yet.', 'buddypress' ), 'error' ); bp_core_redirect( $bp->root_domain ); } $bp->is_directory = true; do_action( 'bbpress_init' ); /* Check to see if the user has posted a new topic from the forums page. */ if ( isset( $_POST['submit_topic'] ) && function_exists( 'bp_forums_new_topic' ) ) { /* Check the nonce */ check_admin_referer( 'bp_forums_new_topic' ); if ( $bp->groups->current_group = groups_get_group( array( 'group_id' => $_POST['topic_group_id'] ) ) ) { /* Auto join this user if they are not yet a member of this group */ if ( !is_site_admin() && 'public' == $bp->groups->current_group->status && !groups_is_user_member( $bp->loggedin_user->id, $bp->groups->current_group->id ) ) groups_join_group( $bp->groups->current_group->id, $bp->groups->current_group->id ); if ( $forum_id = groups_get_groupmeta( $bp->groups->current_group->id, 'forum_id' ) ) { if ( !$topic = groups_new_group_forum_topic( $_POST['topic_title'], $_POST['topic_text'], $_POST['topic_tags'], $forum_id ) ) bp_core_add_message( __( 'There was an error when creating the topic', 'buddypress'), 'error' ); else bp_core_add_message( __( 'The topic was created successfully', 'buddypress') ); bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) . '/forum/topic/' . $topic->topic_slug . '/' ); } } } do_action( 'bp_forums_directory_forums_setup' ); bp_core_load_template( apply_filters( 'bp_forums_template_directory_forums_setup', 'forums/index' ) ); } } add_action( 'wp', 'bp_forums_directory_forums_setup', 2 ); function bp_forums_add_admin_menu() { global $bp; if ( !is_site_admin() ) return false; require ( BP_PLUGIN_DIR . '/bp-forums/bp-forums-admin.php' ); /* Add the administration tab under the "Site Admin" tab for site administrators */ add_submenu_page( 'bp-general-settings', __( 'Forums Setup', 'buddypress' ), __( 'Forums Setup', 'buddypress' ), 'manage_options', 'bb-forums-setup', "bp_forums_bbpress_admin" ); } add_action( 'admin_menu', 'bp_forums_add_admin_menu' ); /* Forum Functions */ function bp_forums_get_forum( $forum_id ) { do_action( 'bbpress_init' ); return bb_get_forum( $forum_id ); } function bp_forums_new_forum( $args = '' ) { do_action( 'bbpress_init' ); $defaults = array( 'forum_name' => '', 'forum_desc' => '', 'forum_parent_id' => BP_FORUMS_PARENT_FORUM_ID, 'forum_order' => false, 'forum_is_category' => 0 ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); return bb_new_forum( array( 'forum_name' => stripslashes( $forum_name ), 'forum_desc' => stripslashes( $forum_desc ), 'forum_parent' => $forum_parent_id, 'forum_order' => $forum_order, 'forum_is_category' => $forum_is_category ) ); } /* Topic Functions */ function bp_forums_get_forum_topics( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'type' => 'newest', 'forum_id' => false, 'user_id' => false, 'page' => 1, 'per_page' => 15, 'exclude' => false, 'show_stickies' => 'all', 'filter' => false // if $type = tag then filter is the tag name, otherwise it's terms to search on. ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); switch ( $type ) { case 'newest': $query = new BB_Query( 'topic', array( 'forum_id' => $forum_id, 'topic_author_id' => $user_id, 'per_page' => $per_page, 'page' => $page, 'number' => $per_page, 'exclude' => $exclude, 'topic_title' => $filter, 'sticky' => $show_stickies ), 'get_latest_topics' ); $topics =& $query->results; break; case 'popular': $query = new BB_Query( 'topic', array( 'forum_id' => $forum_id, 'topic_author_id' => $user_id, 'per_page' => $per_page, 'page' => $page, 'order_by' => 't.topic_posts', 'topic_title' => $filter, 'sticky' => $show_stickies ) ); $topics =& $query->results; break; case 'unreplied': $query = new BB_Query( 'topic', array( 'forum_id' => $forum_id, 'topic_author_id' => $user_id, 'post_count' => 1, 'per_page' => $per_page, 'page' => $page, 'order_by' => 't.topic_time', 'topic_title' => $filter, 'sticky' => $show_stickies ) ); $topics =& $query->results; break; case 'tags': $query = new BB_Query( 'topic', array( 'forum_id' => $forum_id, 'topic_author_id' => $user_id, 'tag' => $filter, 'per_page' => $per_page, 'page' => $page, 'order_by' => 't.topic_time', 'sticky' => $show_stickies ) ); $topics =& $query->results; break; } return apply_filters( 'bp_forums_get_forum_topics', $topics, &$r ); } function bp_forums_get_topic_details( $topic_id ) { do_action( 'bbpress_init' ); $query = new BB_Query( 'topic', 'topic_id=' . $topic_id . '&page=1' /* Page override so bbPress doesn't use the URI */ ); return $query->results[0]; } function bp_forums_get_topic_id_from_slug( $topic_slug ) { do_action( 'bbpress_init' ); return bb_get_id_from_slug( 'topic', $topic_slug ); } function bp_forums_new_topic( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'topic_title' => '', 'topic_slug' => '', 'topic_text' => '', 'topic_poster' => $bp->loggedin_user->id, // accepts ids 'topic_poster_name' => $bp->loggedin_user->fullname, // accept names 'topic_last_poster' => $bp->loggedin_user->id, // accepts ids 'topic_last_poster_name' => $bp->loggedin_user->fullname, // accept names 'topic_start_time' => date( 'Y-m-d H:i:s' ), 'topic_time' => date( 'Y-m-d H:i:s' ), 'topic_open' => 1, 'topic_tags' => false, // accepts array or comma delim 'forum_id' => 0 // accepts ids or slugs ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); $topic_title = strip_tags( $topic_title ); if ( empty( $topic_title ) || !strlen( trim( $topic_title ) ) ) return false; if ( empty( $topic_slug ) ) $topic_slug = sanitize_title( $topic_title ); if ( !$topic_id = bb_insert_topic( array( 'topic_title' => stripslashes( $topic_title ), 'topic_slug' => $topic_slug, 'topic_poster' => $topic_poster, 'topic_poster_name' => $topic_poster_name, 'topic_last_poster' => $topic_last_poster, 'topic_last_poster_name' => $topic_last_poster_name, 'topic_start_time' => $topic_start_time, 'topic_time' => $topic_time, 'topic_open' => $topic_open, 'forum_id' => (int)$forum_id, 'tags' => $topic_tags ) ) ) return false; /* Now insert the first post. */ if ( !bp_forums_insert_post( array( 'topic_id' => $topic_id, 'post_text' => $topic_text, 'post_time' => $topic_time, 'poster_id' => $topic_poster ) ) ) return false; do_action( 'bp_forums_new_topic', $topic_id ); return $topic_id; } function bp_forums_update_topic( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'topic_id' => false, 'topic_title' => '', 'topic_text' => '' ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); if ( !$topic_id = bb_insert_topic( array( 'topic_id' => $topic_id, 'topic_title' => stripslashes( $topic_title ) ) ) ) return false; if ( !$post = bb_get_first_post( $topic_id ) ) return false; /* Update the first post */ if ( !$post = bp_forums_insert_post( array( 'post_id' => $post->post_id, 'topic_id' => $topic_id, 'post_text' => $topic_text, 'post_time' => $post->post_time, 'poster_id' => $post->poster_id, 'poster_ip' => $post->poster_ip, 'post_status' => $post->post_status, 'post_position' => $post->post_position ) ) ) return false; return bp_forums_get_topic_details( $topic_id ); } function bp_forums_sticky_topic( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'topic_id' => false, 'mode' => 'stick' // stick/unstick ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); if ( 'stick' == $mode ) return bb_stick_topic( $topic_id ); else if ( 'unstick' == $mode ) return bb_unstick_topic( $topic_id ); return false; } function bp_forums_openclose_topic( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'topic_id' => false, 'mode' => 'close' // stick/unstick ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); if ( 'close' == $mode ) return bb_close_topic( $topic_id ); else if ( 'open' == $mode ) return bb_open_topic( $topic_id ); return false; } function bp_forums_delete_topic( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'topic_id' => false ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); return bb_delete_topic( $topic_id, 1 ); } function bp_forums_total_topic_count() { do_action( 'bbpress_init' ); $query = new BB_Query( 'topic', array( 'page' => 1, 'per_page' => -1, 'count' => true ) ); $count = $query->count; $query = null; return $count; } function bp_forums_total_topic_count_for_user( $user_id = false ) { global $bp; do_action( 'bbpress_init' ); if ( !$user_id ) $user_id = ( $bp->displayed_user->id ) ? $bp->displayed_user->id : $bp->loggedin_user->id; $query = new BB_Query( 'topic', array( 'topic_author_id' => $user_id, 'page' => 1, 'per_page' => -1, 'count' => true ) ); $count = $query->count; $query = null; return $count; } function bp_forums_get_topic_extras( $topics ) { global $bp, $wpdb, $bbdb; if ( empty( $topics ) ) return $topics; /* Get the topic ids */ foreach ( (array)$topics as $topic ) $topic_ids[] = $topic->topic_id; $topic_ids = $wpdb->escape( join( ',', (array)$topic_ids ) ); /* Fetch the topic's last poster details */ $poster_details = $wpdb->get_results( $wpdb->prepare( "SELECT t.topic_id, t.topic_last_poster, u.user_login, u.user_nicename, u.user_email, u.display_name FROM {$wpdb->users} u, {$bbdb->topics} t WHERE u.ID = t.topic_last_poster AND t.topic_id IN ( {$topic_ids} )" ) ); for ( $i = 0; $i < count( $topics ); $i++ ) { foreach ( (array)$poster_details as $poster ) { if ( $poster->topic_id == $topics[$i]->topic_id ) { $topics[$i]->topic_last_poster_email = $poster->user_email; $topics[$i]->topic_last_poster_nicename = $poster->user_nicename; $topics[$i]->topic_last_poster_login = $poster->user_login; $topics[$i]->topic_last_poster_displayname = $poster->display_name; } } } /* Fetch fullname for the topic's last poster */ if ( function_exists( 'xprofile_install' ) ) { $poster_names = $wpdb->get_results( $wpdb->prepare( "SELECT t.topic_id, pd.value FROM {$bp->profile->table_name_data} pd, {$bbdb->topics} t WHERE pd.user_id = t.topic_last_poster AND pd.field_id = 1 AND t.topic_id IN ( {$topic_ids} )" ) ); for ( $i = 0; $i < count( $topics ); $i++ ) { foreach ( (array)$poster_names as $name ) { if ( $name->topic_id == $topics[$i]->topic_id ) $topics[$i]->topic_last_poster_displayname = $name->value; } } } return $topics; } /* Post Functions */ function bp_forums_get_topic_posts( $args = '' ) { do_action( 'bbpress_init' ); $defaults = array( 'topic_id' => false, 'page' => 1, 'per_page' => 15, 'order' => 'ASC' ); $args = wp_parse_args( $args, $defaults ); $query = new BB_Query( 'post', $args, 'get_thread' ); return bp_forums_get_post_extras( $query->results ); } function bp_forums_get_post( $post_id ) { do_action( 'bbpress_init' ); return bb_get_post( $post_id ); } function bp_forums_delete_post( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'post_id' => false ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); return bb_delete_post( $post_id, 1 ); } function bp_forums_insert_post( $args = '' ) { global $bp; do_action( 'bbpress_init' ); $defaults = array( 'post_id' => false, 'topic_id' => false, 'post_text' => '', 'post_time' => date( 'Y-m-d H:i:s' ), 'poster_id' => $bp->loggedin_user->id, // accepts ids or names 'poster_ip' => $_SERVER['REMOTE_ADDR'], 'post_status' => 0, // use bb_delete_post() instead 'post_position' => false ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); if ( !$post = bp_forums_get_post( $post_id ) ) $post_id = false; if ( !isset( $topic_id ) ) $topic_id = $post->topic_id; if ( empty( $post_text ) ) $post_text = $post->post_text; if ( !isset( $post_time ) ) $post_time = $post->post_time; if ( !isset( $post_position ) ) $post_position = $post->post_position; $post_id = bb_insert_post( array( 'post_id' => $post_id, 'topic_id' => $topic_id, 'post_text' => stripslashes( trim( $post_text ) ), 'post_time' => $post_time, 'poster_id' => $poster_id, 'poster_ip' => $poster_ip, 'post_status' => $post_status, 'post_position' => $post_position ) ); if ( $post_id ) do_action( 'bp_forums_new_post', $post_id ); return $post_id; } function bp_forums_get_post_extras( $posts ) { global $bp, $wpdb; if ( empty( $posts ) ) return $posts; /* Get the user ids */ foreach ( (array)$posts as $post ) $user_ids[] = $post->poster_id; $user_ids = $wpdb->escape( join( ',', (array)$user_ids ) ); /* Fetch the poster's user_email, user_nicename and user_login */ $poster_details = $wpdb->get_results( $wpdb->prepare( "SELECT u.ID as user_id, u.user_login, u.user_nicename, u.user_email, u.display_name FROM {$wpdb->users} u WHERE u.ID IN ( {$user_ids} )" ) ); for ( $i = 0; $i < count( $posts ); $i++ ) { foreach ( (array)$poster_details as $poster ) { if ( $poster->user_id == $posts[$i]->poster_id ) { $posts[$i]->poster_email = $poster->user_email; $posts[$i]->poster_login = $poster->user_nicename; $posts[$i]->poster_nicename = $poster->user_login; $posts[$i]->poster_name = $poster->display_name; } } } /* Fetch fullname for each poster. */ if ( function_exists( 'xprofile_install' ) ) { $poster_names = $wpdb->get_results( $wpdb->prepare( "SELECT pd.user_id, pd.value FROM {$bp->profile->table_name_data} pd WHERE pd.user_id IN ( {$user_ids} )" ) ); for ( $i = 0; $i < count( $posts ); $i++ ) { foreach ( (array)$poster_names as $name ) { if ( $name->user_id == $topics[$i]->user_id ) $posts[$i]->poster_name = $poster->value; } } } return $posts; } function bp_forums_get_forum_topicpost_count( $forum_id ) { global $wpdb, $bbdb; do_action( 'bbpress_init' ); /* Need to find a bbPress function that does this */ return $wpdb->get_results( $wpdb->prepare( "SELECT topics, posts from {$bbdb->forums} WHERE forum_id = %d", $forum_id ) ); } function bp_forums_filter_caps( $allcaps ) { global $bp, $wp_roles, $bb_table_prefix; $bb_cap = get_usermeta( $bp->loggedin_user->id, $bb_table_prefix . 'capabilities' ); if ( empty( $bb_cap ) ) return $allcaps; $bb_cap = array_keys($bb_cap); $bb_cap = $wp_roles->get_role( $bb_cap[0] ); $bb_cap = $bb_cap->capabilities; return array_merge( (array) $allcaps, (array) $bb_cap ); } add_filter( 'user_has_cap', 'bp_forums_filter_caps' ); /******************************************************************************** * Caching * * Caching functions handle the clearing of cached objects and pages on specific * actions throughout BuddyPress. */ // List actions to clear super cached pages on, if super cache is installed add_action( 'bp_forums_new_forum', 'bp_core_clear_cache' ); add_action( 'bp_forums_new_topic', 'bp_core_clear_cache' ); add_action( 'bp_forums_new_post', 'bp_core_clear_cache' ); ?>