BP_Notifications_Template
The main notifications template loop class.
Description Description
Responsible for loading a group of notifications into a loop for display.
Source Source
File: bp-notifications/classes/class-bp-notifications-template.php
class BP_Notifications_Template { /** * The loop iterator. * * @since 1.9.0 * @var int */ public $current_notification = -1; /** * The number of notifications returned by the paged query. * * @since 1.9.0 * @var int */ public $current_notification_count; /** * Total number of notifications matching the query. * * @since 1.9.0 * @var int */ public $total_notification_count; /** * Array of notifications located by the query. * * @since 1.9.0 * @var array */ public $notifications; /** * The notification object currently being iterated on. * * @since 1.9.0 * @var object */ public $notification; /** * A flag for whether the loop is currently being iterated. * * @since 1.9.0 * @var bool */ public $in_the_loop; /** * The ID of the user to whom the displayed notifications belong. * * @since 1.9.0 * @var int */ public $user_id; /** * The page number being requested. * * @since 1.9.0 * @var int */ public $pag_page; /** * The $_GET argument used in URLs for determining pagination. * * @since 1.9.0 * @var int */ public $pag_arg; /** * The number of items to display per page of results. * * @since 1.9.0 * @var int */ public $pag_num; /** * An HTML string containing pagination links. * * @since 1.9.0 * @var string */ public $pag_links; /** * A string to match against. * * @since 1.9.0 * @var string */ public $search_terms; /** * A database column to order the results by. * * @since 1.9.0 * @var string */ public $order_by; /** * The direction to sort the results (ASC or DESC). * * @since 1.9.0 * @var string */ public $sort_order; /** * Array of variables used in this notification query. * * @since 2.2.2 * @var array */ public $query_vars; /** * Constructor method. * * @see bp_has_notifications() For information on the array format. * * @since 1.9.0 * * @param array $args { * An array of arguments. See {@link bp_has_notifications()} * for more details. * } */ public function __construct( $args = array() ) { // Parse arguments. $r = wp_parse_args( $args, array( 'id' => false, 'user_id' => 0, 'item_id' => false, 'secondary_item_id' => false, 'component_name' => bp_notifications_get_registered_components(), 'component_action' => false, 'is_new' => true, 'search_terms' => '', 'order_by' => 'date_notified', 'sort_order' => 'DESC', 'page_arg' => 'npage', 'page' => 1, 'per_page' => 25, 'max' => null, 'meta_query' => false, 'date_query' => false ) ); // Sort order direction. $orders = array( 'ASC', 'DESC' ); if ( ! empty( $_GET['sort_order'] ) && in_array( $_GET['sort_order'], $orders ) ) { $r['sort_order'] = $_GET['sort_order']; } else { $r['sort_order'] = in_array( $r['sort_order'], $orders ) ? $r['sort_order'] : 'DESC'; } // Setup variables. $this->pag_arg = sanitize_key( $r['page_arg'] ); $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $r['page'] ); $this->pag_num = bp_sanitize_pagination_arg( 'num', $r['per_page'] ); $this->user_id = $r['user_id']; $this->is_new = $r['is_new']; $this->search_terms = $r['search_terms']; $this->order_by = $r['order_by']; $this->sort_order = $r['sort_order']; $this->query_vars = array( 'id' => $r['id'], 'user_id' => $this->user_id, 'item_id' => $r['item_id'], 'secondary_item_id' => $r['secondary_item_id'], 'component_name' => $r['component_name'], 'component_action' => $r['component_action'], 'meta_query' => $r['meta_query'], 'date_query' => $r['date_query'], 'is_new' => $this->is_new, 'search_terms' => $this->search_terms, 'order_by' => $this->order_by, 'sort_order' => $this->sort_order, 'page' => $this->pag_page, 'per_page' => $this->pag_num, ); // Setup the notifications to loop through. $this->notifications = BP_Notifications_Notification::get( $this->query_vars ); $this->total_notification_count = BP_Notifications_Notification::get_total_count( $this->query_vars ); if ( empty( $this->notifications ) ) { $this->notification_count = 0; $this->total_notification_count = 0; } else { if ( ! empty( $r['max'] ) ) { if ( $r['max'] >= count( $this->notifications ) ) { $this->notification_count = count( $this->notifications ); } else { $this->notification_count = (int) $r['max']; } } else { $this->notification_count = count( $this->notifications ); } } if ( (int) $this->total_notification_count && (int) $this->pag_num ) { $add_args = array( 'sort_order' => $this->sort_order, ); $this->pag_links = paginate_links( array( 'base' => add_query_arg( $this->pag_arg, '%#%' ), 'format' => '', 'total' => ceil( (int) $this->total_notification_count / (int) $this->pag_num ), 'current' => $this->pag_page, 'prev_text' => _x( '←', 'Notifications pagination previous text', 'buddypress' ), 'next_text' => _x( '→', 'Notifications pagination next text', 'buddypress' ), 'mid_size' => 1, 'add_args' => $add_args, ) ); } } /** * Whether there are notifications available in the loop. * * @since 1.9.0 * * @see bp_has_notifications() * * @return bool True if there are items in the loop, otherwise false. */ public function has_notifications() { if ( $this->notification_count ) { return true; } return false; } /** * Set up the next notification and iterate index. * * @since 1.9.0 * * @return object The next notification to iterate over. */ public function next_notification() { $this->current_notification++; $this->notification = $this->notifications[ $this->current_notification ]; return $this->notification; } /** * Rewind the blogs and reset blog index. * * @since 1.9.0 */ public function rewind_notifications() { $this->current_notification = -1; if ( $this->notification_count > 0 ) { $this->notification = $this->notifications[0]; } } /** * Whether there are notifications left in the loop to iterate over. * * This method is used by {@link bp_notifications()} as part of the * while loop that controls iteration inside the notifications loop, eg: * while ( bp_notifications() ) { ... * * @since 1.9.0 * * @see bp_notifications() * * @return bool True if there are more notifications to show, * otherwise false. */ public function notifications() { if ( $this->current_notification + 1 < $this->notification_count ) { return true; } elseif ( $this->current_notification + 1 == $this->notification_count ) { /** * Fires right before the rewinding of notification posts. * * @since 1.9.0 */ do_action( 'notifications_loop_end'); $this->rewind_notifications(); } $this->in_the_loop = false; return false; } /** * Set up the current notification inside the loop. * * Used by {@link bp_the_notification()} to set up the current * notification data while looping, so that template tags used during * that iteration make reference to the current notification. * * @since 1.9.0 * * @see bp_the_notification() */ public function the_notification() { $this->in_the_loop = true; $this->notification = $this->next_notification(); // Loop has just started. if ( 0 === $this->current_notification ) { /** * Fires if the current notification item is the first in the notification loop. * * @since 1.9.0 */ do_action( 'notifications_loop_start' ); } } }
Changelog Changelog
Version | Description |
---|---|
1.9.0 | Introduced. |
Methods Methods
- __construct — Constructor method.
- has_notifications — Whether there are notifications available in the loop.
- next_notification — Set up the next notification and iterate index.
- notifications — Whether there are notifications left in the loop to iterate over.
- rewind_notifications — Rewind the blogs and reset blog index.
- the_notification — Set up the current notification inside the loop.