'bbp_mark_read',
'topic_id' => $topic_id
),
bbp_get_reply_url( $item_id )
),
'bbp_mark_topic_' . $topic_id
);
// Cast to int
$action_item_count = (int) $action_item_count;
// Multiple
if ( $action_item_count > 1 ) {
$filter = 'bbp_multiple_new_subscription_notification';
$text = sprintf(
/* translators: 1: Number of replies, 2: Topic title */
esc_html__( 'You have %1$d new replies to %2$s', 'bbpress' ),
$action_item_count,
$topic_title
);
// Single
} else {
$filter = 'bbp_single_new_subscription_notification';
$text = ! empty( $secondary_item_id )
? sprintf(
/* translators: 1: Number of replies, 2: Topic title, 3: Reply author name */
esc_html__( 'You have %1$d new reply to %2$s from %3$s', 'bbpress' ),
$action_item_count,
$topic_title,
bp_core_get_user_displayname( $secondary_item_id )
)
: sprintf(
/* translators: 1: Number of replies, 2: Topic title */
esc_html__( 'You have %1$d new reply to %2$s', 'bbpress' ),
$action_item_count,
$topic_title
);
}
// WordPress Toolbar
if ( 'string' === $format ) {
$return = apply_filters( $filter, '' . esc_html( $text ) . '', $action_item_count, $text, $topic_link );
// Deprecated BuddyBar
} else {
$return = apply_filters( $filter,
array(
'text' => $text,
'link' => $topic_link
),
$topic_link,
$action_item_count,
$text,
$topic_title
);
}
do_action( 'bbp_format_buddypress_notifications', $component_action_name, $item_id, $secondary_item_id, $action_item_count, $format, $component_action_name, $component_name, $id );
return $return;
}
/**
* Hooked into the new reply function, this notification action is responsible
* for notifying topic and hierarchical reply authors of topic replies.
*
* @since 2.5.0 bbPress (r5155)
*
* @param int $reply_id
* @param int $topic_id
* @param int $forum_id (not used)
* @param array $anonymous_data (not used)
* @param int $author_id
* @param bool $is_edit Used to bail if this gets hooked to an edit action
* @param int $reply_to
*/
function bbp_buddypress_add_notification( $reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = array(), $author_id = 0, $is_edit = false, $reply_to = 0 ) {
// Bail if somehow this is hooked to an edit action
if ( ! empty( $is_edit ) ) {
return;
}
// Bail if the reply is not published
if ( ! bbp_is_reply_published( $reply_id ) ) {
return;
}
// Get author information
$topic_author_id = bbp_get_topic_author_id( $topic_id );
$secondary_item_id = $author_id;
// Hierarchical replies
if ( ! empty( $reply_to ) ) {
$reply_to_item_id = bbp_get_topic_author_id( $reply_to );
}
// Get some reply information
$args = array(
'user_id' => $topic_author_id,
'item_id' => $reply_id,
'component_name' => bbp_get_component_name(),
'component_action' => 'bbp_new_reply_' . $topic_id,
'date_notified' => get_post( $reply_id )->post_date,
);
// Notify the topic author if not the current reply author
if ( $author_id !== $topic_author_id ) {
$args['secondary_item_id'] = $secondary_item_id;
bp_notifications_add_notification( $args );
}
// Notify the immediate reply author if not the current reply author
if ( ! empty( $reply_to ) && ( $author_id !== $reply_to_item_id ) ) {
$args['user_id'] = $reply_to_item_id;
$args['secondary_item_id'] = $topic_author_id;
bp_notifications_add_notification( $args );
}
}
/**
* Mark notifications as read when reading a topic
*
* @since 2.5.0 bbPress (r5155)
*
* @return If not trying to mark a notification as read
*/
function bbp_buddypress_mark_notifications( $action = '' ) {
// Bail if no topic ID is passed
if ( empty( $_GET['topic_id'] ) ) {
return;
}
// Bail if action is not for this function
if ( 'bbp_mark_read' !== $action ) {
return;
}
// Get required data
$user_id = bp_loggedin_user_id();
$topic_id = absint( $_GET['topic_id'] );
// By default, Redirect to this topic ID
$redirect_id = $topic_id;
// Check nonce
if ( ! bbp_verify_nonce_request( 'bbp_mark_topic_' . $topic_id ) ) {
bbp_add_error( 'bbp_notification_topic_id', __( 'Error: Are you sure you wanted to do that?', 'bbpress' ) );
// Check current user's ability to edit the user
} elseif ( ! current_user_can( 'edit_user', $user_id ) ) {
bbp_add_error( 'bbp_notification_permission', __( 'Error: You do not have permission to mark notifications for that user.', 'bbpress' ) );
}
// Bail if we have errors
if ( ! bbp_has_errors() ) {
// Default to nothing marked
$reply_marked = $topic_marked = $marked = false;
// Get these once
$post_type = bbp_get_reply_post_type();
$component = bbp_get_component_name();
$c_action = 'bbp_new_reply_' . $topic_id;
// Get all reply IDs for the topic
$replies = bbp_get_all_child_ids( $topic_id, $post_type );
// If topic has replies
if ( ! empty( $replies ) ) {
// Loop through each reply and attempt to mark it
foreach ( $replies as $reply_id ) {
// Attempt to clear notification for this user & reply ID
$reply_marked = bp_notifications_mark_notifications_by_item_id( $user_id, $reply_id, $component, $c_action );
// If marked, redirect to this reply ID
if ( ! empty( $reply_marked ) ) {
$redirect_id = $reply_id;
}
}
}
// Attempt to clear notifications for this user & topic
$topic_marked = bp_notifications_mark_notifications_by_type( $user_id, $component, $c_action );
// Maybe combine updated/marked rows
if ( is_numeric( $topic_marked ) || is_numeric( $reply_marked ) ) {
$marked = (int) $topic_marked + (int) $reply_marked;
}
// Do additional subscriptions actions
do_action( 'bbp_notifications_handler', $marked, $user_id, $topic_id, $action );
}
// Redirect to the topic
$redirect = bbp_get_reply_url( $redirect_id );
// Redirect
bbp_redirect( $redirect );
}