$group_name,
'forum_desc' => $group_desc
) );
groups_update_groupmeta( $group_id, 'forum_id', $forum_id );
/**
* Fires after the creation of a new forum inside a specific BuddyPress group.
*
* @since 1.0.0
*
* @param int $forum_id ID of the newly created forum.
* @param int $group_id ID of the associated group.
*/
do_action( 'groups_new_group_forum', $forum_id, $group_id );
}
/**
* Update group forum metadata (title, description, slug) when the group's details are edited.
*
* @since 1.1.0
*
* @param int $group_id Group id, passed from groups_details_updated.
* @return false|null
*/
function groups_update_group_forum( $group_id ) {
$group = groups_get_group( $group_id );
/**
* Bail in the following three situations:
* 1. Forums are not enabled for this group
* 2. The BP Forum component is not enabled
* 3. The built-in bbPress forums are not correctly installed (usually means they've been
* uninstalled)
*/
if ( empty( $group->enable_forum ) || !bp_is_active( 'forums' ) || ( function_exists( 'bp_forums_is_installed_correctly' ) && !bp_forums_is_installed_correctly() ) ) {
return false;
}
/**
* Filters the group forum metadata value argument.
*
* @since 1.2.5
*
* @param array $value Array of metadata values to update the group forum with.
*/
bp_forums_update_forum( apply_filters( 'groups_update_group_forum', array(
'forum_id' => groups_get_groupmeta( $group_id, 'forum_id' ),
'forum_name' => $group->name,
'forum_desc' => $group->description,
'forum_slug' => $group->slug
) ) );
}
add_action( 'groups_details_updated', 'groups_update_group_forum' );
/**
* Create a new group forum post.
*
* Uses the bundled version of bbPress packaged with BuddyPress.
*
* @since 1.0.0
*
* @param string $post_text The text for the forum post.
* @param int $topic_id The topic ID used so we can identify where the new
* forum post should reside.
* @param mixed $page The page number where the new forum post should reside.
* Default: false.
* @return mixed The new forum post ID on success. Boolean false on failure.
*/
function groups_new_group_forum_post( $post_text, $topic_id, $page = false ) {
if ( empty( $post_text ) ) {
return false;
}
/**
* Filters the text for the forum post before save.
*
* @since 1.2.0
*
* @param string $post_text Text for the forum post.
*/
$post_text = apply_filters( 'group_forum_post_text_before_save', $post_text );
/**
* Filters the ID for the forum post before save.
*
* @since 1.2.0
*
* @param int $topic_id ID of the topic the post will be associated with.
*/
$topic_id = apply_filters( 'group_forum_post_topic_id_before_save', $topic_id );
$post_id = bp_forums_insert_post( array(
'post_text' => $post_text,
'topic_id' => $topic_id
) );
if ( empty( $post_id ) ) {
return false;
}
$topic = bp_forums_get_topic_details( $topic_id );
$activity_action = sprintf( __( '%1$s replied to the forum topic %2$s in the group %3$s', 'buddypress'), bp_core_get_userlink( bp_loggedin_user_id() ), '' . esc_attr( $topic->topic_title ) . '', '' . esc_attr( bp_get_current_group_name() ) . '' );
$activity_content = bp_create_excerpt( $post_text );
$primary_link = bp_get_group_permalink( groups_get_current_group() ) . 'forum/topic/' . $topic->topic_slug . '/';
if ( !empty( $page ) ) {
$primary_link .= "?topic_page=" . $page;
}
/**
* Filters the new groups activity forum post action.
*
* @since 1.2.0
*
* @param string $activity_action Formatted action related to group activity posting.
* @param int $post_id ID of the newly created group forum post.
* @param string $post_text The text for the forum post.
* @param object $topic Object holding current topic details. Passed by reference.
*/
$action = apply_filters_ref_array( 'groups_activity_new_forum_post_action', array( $activity_action, $post_id, $post_text, &$topic ) );
/**
* Filters the new groups activity forum post content.
*
* @since 1.2.0
*
* @param string $activity_content Excerpt-length activity content to be posted.
* @param int $post_id ID of the newly created group forum post.
* @param string $post_text The text for the forum post.
* @param object $topic Object holding current topic details. Passed by reference.
*/
$content = apply_filters_ref_array( 'groups_activity_new_forum_post_content', array( $activity_content, $post_id, $post_text, &$topic ) );
/**
* Filters the new groups activity forum post primary link.
*
* @since 1.1.0
*
* @param string $value URL to the newly posted forum post.
*/
$filtered_primary_link = apply_filters( 'groups_activity_new_forum_post_primary_link', "{$primary_link}#post-{$post_id}" );
groups_record_activity( array(
'action' => $action,
'content' => $content,
'primary_link' => $filtered_primary_link,
'type' => 'new_forum_post',
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $post_id
) );
/**
* Fires after the creation of a new group forum topic post.
*
* @since 1.0.0
*
* @param int $value ID of the current group.
* @param int $post_id ID of the new created forum topic post.
*/
do_action( 'groups_new_forum_topic_post', bp_get_current_group_id(), $post_id );
return $post_id;
}
/**
* Create a new group forum topic.
*
* Uses the bundled version of bbPress packaged with BuddyPress.
*
* @since 1.0.0
*
* @param string $topic_title The title for the forum topic.
* @param string $topic_text The text for the forum topic.
* @param string $topic_tags A comma-delimited string of topic tags.
* @param int $forum_id The forum ID this forum topic resides in.
* @return mixed The new topic object on success. Boolean false on failure.
*/
function groups_new_group_forum_topic( $topic_title, $topic_text, $topic_tags, $forum_id ) {
if ( empty( $topic_title ) || empty( $topic_text ) )
return false;
/**
* Filters the new groups forum topic title before saving.
*
* @since 1.2.0
*
* @param string $topic_title The title for the forum topic.
*/
$topic_title = apply_filters( 'group_forum_topic_title_before_save', $topic_title );
/**
* Filters the new groups forum topic text before saving.
*
* @since 1.2.0
*
* @param string $topic_text The text for the forum topic.
*/
$topic_text = apply_filters( 'group_forum_topic_text_before_save', $topic_text );
/**
* Filters the new groups forum topic tags before saving.
*
* @since 1.2.0
*
* @param string $topic_tags A comma-delimited string of topic tags.
*/
$topic_tags = apply_filters( 'group_forum_topic_tags_before_save', $topic_tags );
/**
* Filters the forum ID this forum topic resides in.
*
* @since 1.2.0
*
* @param string $forum_id The forum ID this forum topic resides in.
*/
$forum_id = apply_filters( 'group_forum_topic_forum_id_before_save', $forum_id );
$topic_id = bp_forums_new_topic( array(
'topic_title' => $topic_title,
'topic_text' => $topic_text,
'topic_tags' => $topic_tags,
'forum_id' => $forum_id
) );
if ( empty( $topic_id ) ) {
return false;
}
$topic = bp_forums_get_topic_details( $topic_id );
$activity_action = sprintf( __( '%1$s started the forum topic %2$s in the group %3$s', 'buddypress'), bp_core_get_userlink( bp_loggedin_user_id() ), '' . esc_attr( $topic->topic_title ) . '', '' . esc_attr( bp_get_current_group_name() ) . '' );
$activity_content = bp_create_excerpt( $topic_text );
/**
* Filters the new groups activity forum topic action.
*
* @since 1.2.0
*
* @param string $activity_action Formatted action related to forum topic.
* @param string $topic_text New topic text.
* @param object $topic Object holding current topic details. Passed by reference.
*/
$action = apply_filters_ref_array( 'groups_activity_new_forum_topic_action', array( $activity_action, $topic_text, &$topic ) );
/**
* Filters the new groups activity forum topic content.
*
* @since 1.2.0
*
* @param string $activity_content Excerpt-length activity content to be posted.
* @param string $topic_text New topic text.
* @param object $topic Object holding current topic details. Passed by reference.
*/
$content = apply_filters_ref_array( 'groups_activity_new_forum_topic_content', array( $activity_content, $topic_text, &$topic ) );
/**
* Filters the new groups activity forum topic primary link.
*
* @since 1.1.0
*
* @param string $value Concatenated primary link.
*/
$primary_link = apply_filters( 'groups_activity_new_forum_topic_primary_link', bp_get_group_permalink( groups_get_current_group() ) . 'forum/topic/' . $topic->topic_slug . '/' );
groups_record_activity( array(
'action' => $action,
'content' => $content,
'primary_link' => $primary_link,
'type' => 'new_forum_topic',
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $topic->topic_id
) );
/**
* Fires after the creation of a new group forum topic.
*
* @since 1.0.0
*
* @param int $value ID of the current group.
* @param object $topic Object holding current topic details. Passed by reference.
*/
do_action_ref_array( 'groups_new_forum_topic', array( bp_get_current_group_id(), &$topic ) );
return $topic;
}
/**
* Update an existing group forum topic.
*
* Uses the bundled version of bbPress packaged with BuddyPress.
*
* @since 1.1.0
*
* @param int $topic_id The topic ID of the existing forum topic.
* @param string $topic_title The title for the forum topic.
* @param string $topic_text The text for the forum topic.
* @param mixed $topic_tags A comma-delimited string of topic tags. Optional.
* @return mixed The topic object on success. Boolean false on failure.
*/
function groups_update_group_forum_topic( $topic_id, $topic_title, $topic_text, $topic_tags = false ) {
$bp = buddypress();
/** This filter is documented in bp-groups/bp-groups-forums.php */
$topic_title = apply_filters( 'group_forum_topic_title_before_save', $topic_title );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$topic_text = apply_filters( 'group_forum_topic_text_before_save', $topic_text );
$topic = bp_forums_update_topic( array(
'topic_title' => $topic_title,
'topic_text' => $topic_text,
'topic_id' => $topic_id,
'topic_tags' => $topic_tags
) );
if ( empty( $topic ) ) {
return false;
}
// Get the corresponding activity item.
if ( bp_is_active( 'activity' ) ) {
$id = bp_activity_get_activity_id( array(
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $topic_id,
'component' => $bp->groups->id,
'type' => 'new_forum_topic'
) );
}
$activity_action = sprintf( __( '%1$s edited the forum topic %2$s in the group %3$s', 'buddypress'), bp_core_get_userlink( $topic->topic_poster ), '' . esc_attr( $topic->topic_title ) . '', '' . esc_attr( bp_get_current_group_name() ) . '' );
$activity_content = bp_create_excerpt( $topic_text );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$action = apply_filters_ref_array( 'groups_activity_new_forum_topic_action', array( $activity_action, $topic_text, &$topic ) );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$content = apply_filters_ref_array( 'groups_activity_new_forum_topic_content', array( $activity_content, $topic_text, &$topic ) );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$primary_link = apply_filters( 'groups_activity_new_forum_topic_primary_link', bp_get_group_permalink( groups_get_current_group() ) . 'forum/topic/' . $topic->topic_slug . '/' );
groups_record_activity( array(
'id' => $id,
'action' => $action,
'content' => $content,
'primary_link' => $primary_link,
'type' => 'new_forum_topic',
'item_id' => (int) bp_get_current_group_id(),
'user_id' => (int) $topic->topic_poster,
'secondary_item_id' => $topic->topic_id,
'recorded_time ' => $topic->topic_time
) );
/**
* Fires after the update of a group forum topic.
*
* @since 1.1.0
*
* @param object $topic Object holding current topic being updated. Passed by reference.
*/
do_action_ref_array( 'groups_update_group_forum_topic', array( &$topic ) );
return $topic;
}
/**
* Update an existing group forum post.
*
* Uses the bundled version of bbPress packaged with BuddyPress.
*
* @since 1.1.0
*
* @param int $post_id The post ID of the existing forum post.
* @param string $post_text The text for the forum post.
* @param int $topic_id The topic ID of the existing forum topic.
* @param mixed $page The page number where the new forum post should reside. Optional.
* @return mixed The forum post ID on success. Boolean false on failure.
*/
function groups_update_group_forum_post( $post_id, $post_text, $topic_id, $page = false ) {
$bp = buddypress();
/** This filter is documented in bp-groups/bp-groups-forums.php */
$post_text = apply_filters( 'group_forum_post_text_before_save', $post_text );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$topic_id = apply_filters( 'group_forum_post_topic_id_before_save', $topic_id );
$post = bp_forums_get_post( $post_id );
$post_id = bp_forums_insert_post( array(
'post_id' => $post_id,
'post_text' => $post_text,
'post_time' => $post->post_time,
'topic_id' => $topic_id,
'poster_id' => $post->poster_id
) );
if ( empty( $post_id ) ) {
return false;
}
$topic = bp_forums_get_topic_details( $topic_id );
$activity_action = sprintf( __( '%1$s replied to the forum topic %2$s in the group %3$s', 'buddypress'), bp_core_get_userlink( $post->poster_id ), '' . esc_attr( $topic->topic_title ) . '', '' . esc_attr( bp_get_current_group_name() ) . '' );
$activity_content = bp_create_excerpt( $post_text );
$primary_link = bp_get_group_permalink( groups_get_current_group() ) . 'forum/topic/' . $topic->topic_slug . '/';
if ( !empty( $page ) ) {
$primary_link .= "?topic_page=" . $page;
}
// Get the corresponding activity item.
if ( bp_is_active( 'activity' ) ) {
$id = bp_activity_get_activity_id( array(
'user_id' => $post->poster_id,
'component' => $bp->groups->id,
'type' => 'new_forum_post',
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $post_id
) );
}
/** This filter is documented in bp-groups/bp-groups-forums.php */
$action = apply_filters_ref_array( 'groups_activity_new_forum_post_action', array( $activity_action, $post_text, &$topic, &$topic ) );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$content = apply_filters_ref_array( 'groups_activity_new_forum_post_content', array( $activity_content, $post_text, &$topic, &$topic ) );
/** This filter is documented in bp-groups/bp-groups-forums.php */
$filtered_primary_link = apply_filters( 'groups_activity_new_forum_post_primary_link', $primary_link . "#post-" . $post_id );
groups_record_activity( array(
'id' => $id,
'action' => $action,
'content' => $content,
'primary_link' => $filtered_primary_link,
'type' => 'new_forum_post',
'item_id' => (int) bp_get_current_group_id(),
'user_id' => (int) $post->poster_id,
'secondary_item_id' => $post_id,
'recorded_time' => $post->post_time
) );
/**
* Fires after the update of a group forum post.
*
* @since 1.1.0
*
* @param object $post Object holding current post being updated.
* @param object $topic Object holding current topic details. Passed by reference.
*/
do_action_ref_array( 'groups_update_group_forum_post', array( $post, &$topic ) );
return $post_id;
}
/**
* Delete a group forum topic and also any corresponding activity items.
*
* Uses the bundled version of bbPress packaged with BuddyPress.
*
* @since 1.1.0
*
* @param int $topic_id The ID of the topic to be deleted.
* @return bool True if the delete routine went through properly.
*/
function groups_delete_group_forum_topic( $topic_id ) {
$bp = buddypress();
// Before deleting the thread, get the post ids so that their activity items can be deleted.
$posts = bp_forums_get_topic_posts( array( 'topic_id' => $topic_id, 'per_page' => -1 ) );
$action = bp_forums_delete_topic( array( 'topic_id' => $topic_id ) );
if ( !empty( $action ) ) {
/**
* Fires before the deletion of a group forum topic.
*
* @since 1.2.9
*
* @param int $topic_id ID of the topic to be deleted.
*/
do_action( 'groups_before_delete_group_forum_topic', $topic_id );
// Delete the corresponding activity stream items.
if ( bp_is_active( 'activity' ) ) {
// The activity item for the initial topic.
bp_activity_delete( array(
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $topic_id,
'component' => $bp->groups->id,
'type' => 'new_forum_topic'
) );
// The activity item for each post.
foreach ( (array) $posts as $post ) {
bp_activity_delete( array(
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $post->post_id,
'component' => $bp->groups->id,
'type' => 'new_forum_post'
) );
}
}
/**
* Fires after the deletion of a group forum topic.
*
* @since 1.1.0
*
* @param int $topic_id ID of the topic that was deleted.
*/
do_action( 'groups_delete_group_forum_topic', $topic_id );
}
return (bool) $action;
}
/**
* Delete a group forum post and its corresponding activity item.
*
* Uses the bundled version of bbPress packaged with BuddyPress.
*
* @since 1.1.0
*
* @param int $post_id The ID of the post you want to delete.
* @param int|bool $topic_id Optional. The topic to which the post belongs. This
* value isn't used in the function but is passed along
* to do_action() hooks.
* @return bool True on success.
*/
function groups_delete_group_forum_post( $post_id, $topic_id = false ) {
$action = bp_forums_delete_post( array( 'post_id' => $post_id ) );
if ( !empty( $action ) ) {
/**
* Fires before the deletion of a group forum post.
*
* @since 1.5.0
*
* @param int $post_id ID of the post to be deleted.
* @param int $topic_id ID of the associated topic.
*/
do_action( 'groups_before_delete_group_forum_post', $post_id, $topic_id );
// Delete the corresponding activity stream item.
if ( bp_is_active( 'activity' ) ) {
bp_activity_delete( array(
'item_id' => bp_get_current_group_id(),
'secondary_item_id' => $post_id,
'component' => buddypress()->groups->id,
'type' => 'new_forum_post'
) );
}
/**
* Fires after the deletion of a group forum post.
*
* @since 1.1.0
*
* @param int $post_id ID of the post that was deleted.
* @param int $topic_id ID of the associated topic.
*/
do_action( 'groups_delete_group_forum_post', $post_id, $topic_id );
}
return (bool) $action;
}
/**
* Get a total count of all public topics of a given type, across groups/forums.
*
* @since 1.5.0
*
* @param string $type Either 'newest', 'popular', 'unreplied', 'tags'.
* Default: 'newest'.
* @return int The topic count.
*/
function groups_total_public_forum_topic_count( $type = 'newest' ) {
/**
* Filters the total count of all public topics of a given type, across groups/forums.
*
* @since 1.1.0
*
* @param int $value Total count of all public topics.
*/
return apply_filters( 'groups_total_public_forum_topic_count', BP_Groups_Group::get_global_forum_topic_count( $type ) );
}
/**
* Get a total count of all topics of a given status, across groups/forums.
*
* @since 1.5.0
*
* @param string $status Which groups to count. 'public', 'private', 'hidden',
* 'all'. Default: 'public'.
* @param string|bool $search_terms Optional. Limit by a search term.
* @return int The topic count.
*/
function groups_total_forum_topic_count( $status = 'public', $search_terms = false ) {
/**
* Filters the total count of all topics of a given status, across groups/forums.
*
* @since 1.5.0
*
* @param int $value Total count of all topics.
*/
return apply_filters( 'groups_total_forum_topic_count', BP_Groups_Group::get_global_topic_count( $status, $search_terms ) );
}