Skip to:
Content

BuddyPress.org

Changeset 10522


Ignore:
Timestamp:
02/05/2016 05:22:55 AM (9 years ago)
Author:
boonebgorges
Message:

Move bp-messages classes to their own files.

See #6870.

Location:
trunk/src/bp-messages
Files:
3 edited
4 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-messages/bp-messages-loader.php

    r10417 r10522  
    1313defined( 'ABSPATH' ) || exit;
    1414
    15 /**
    16  * Implementation of BP_Component for the Messages component.
    17  *
    18  * @since 1.5.0
    19  */
    20 class BP_Messages_Component extends BP_Component {
    21 
    22     /**
    23      * If this is true, the Message autocomplete will return friends only, unless
    24      * this is set to false, in which any matching users will be returned.
    25      *
    26      * @since 1.5.0
    27      * @var bool
    28      */
    29     public $autocomplete_all;
    30 
    31     /**
    32      * Start the messages component creation process.
    33      *
    34      * @since 1.5.0
    35      */
    36     public function __construct() {
    37         parent::start(
    38             'messages',
    39             __( 'Private Messages', 'buddypress' ),
    40             buddypress()->plugin_dir,
    41             array(
    42                 'adminbar_myaccount_order' => 50,
    43                 'features'                 => array( 'star' )
    44             )
    45         );
    46     }
    47 
    48     /**
    49      * Include files.
    50      *
    51      * @since 1.5.0
    52      *
    53      * @param array $includes See {BP_Component::includes()} for details.
    54      */
    55     public function includes( $includes = array() ) {
    56 
    57         // Files to include.
    58         $includes = array(
    59             'cssjs',
    60             'cache',
    61             'actions',
    62             'screens',
    63             'classes',
    64             'filters',
    65             'template',
    66             'functions',
    67             'notifications',
    68             'widgets',
    69         );
    70 
    71         // Conditional includes.
    72         if ( bp_is_active( $this->id, 'star' ) ) {
    73             $includes[] = 'star';
    74         }
    75 
    76         parent::includes( $includes );
    77     }
    78 
    79     /**
    80      * Set up globals for the Messages component.
    81      *
    82      * The BP_MESSAGES_SLUG constant is deprecated, and only used here for
    83      * backwards compatibility.
    84      *
    85      * @since 1.5.0
    86      *
    87      * @param array $args Not used.
    88      */
    89     public function setup_globals( $args = array() ) {
    90         $bp = buddypress();
    91 
    92         // Define a slug, if necessary.
    93         if ( ! defined( 'BP_MESSAGES_SLUG' ) ) {
    94             define( 'BP_MESSAGES_SLUG', $this->id );
    95         }
    96 
    97         // Global tables for messaging component.
    98         $global_tables = array(
    99             'table_name_notices'    => $bp->table_prefix . 'bp_messages_notices',
    100             'table_name_messages'   => $bp->table_prefix . 'bp_messages_messages',
    101             'table_name_recipients' => $bp->table_prefix . 'bp_messages_recipients',
    102             'table_name_meta'       => $bp->table_prefix . 'bp_messages_meta',
    103         );
    104 
    105         // Metadata tables for messaging component.
    106         $meta_tables = array(
    107             'message' => $bp->table_prefix . 'bp_messages_meta',
    108         );
    109 
    110         $this->autocomplete_all = defined( 'BP_MESSAGES_AUTOCOMPLETE_ALL' );
    111 
    112         // All globals for messaging component.
    113         // Note that global_tables is included in this array.
    114         parent::setup_globals( array(
    115             'slug'                  => BP_MESSAGES_SLUG,
    116             'has_directory'         => false,
    117             'notification_callback' => 'messages_format_notifications',
    118             'search_string'         => __( 'Search Messages...', 'buddypress' ),
    119             'global_tables'         => $global_tables,
    120             'meta_tables'           => $meta_tables
    121         ) );
    122     }
    123 
    124     /**
    125      * Set up navigation for user pages.
    126      *
    127      * @param array $main_nav See {BP_Component::setup_nav()} for details.
    128      * @param array $sub_nav  See {BP_Component::setup_nav()} for details.
    129      */
    130     public function setup_nav( $main_nav = array(), $sub_nav = array() ) {
    131 
    132         // Determine user to use.
    133         if ( bp_displayed_user_domain() ) {
    134             $user_domain = bp_displayed_user_domain();
    135         } elseif ( bp_loggedin_user_domain() ) {
    136             $user_domain = bp_loggedin_user_domain();
    137         } else {
    138             return;
    139         }
    140 
    141         $access        = bp_core_can_edit_settings();
    142         $slug          = bp_get_messages_slug();
    143         $messages_link = trailingslashit( $user_domain . $slug );
    144 
    145         // Only grab count if we're on a user page and current user has access.
    146         if ( bp_is_user() && bp_user_has_access() ) {
    147             $count    = bp_get_total_unread_messages_count();
    148             $class    = ( 0 === $count ) ? 'no-count' : 'count';
    149             $nav_name = sprintf( __( 'Messages <span class="%s">%s</span>', 'buddypress' ), esc_attr( $class ), bp_core_number_format( $count ) );
    150         } else {
    151             $nav_name = __( 'Messages', 'buddypress' );
    152         }
    153 
    154         // Add 'Messages' to the main navigation.
    155         $main_nav = array(
    156             'name'                    => $nav_name,
    157             'slug'                    => $slug,
    158             'position'                => 50,
    159             'show_for_displayed_user' => $access,
    160             'screen_function'         => 'messages_screen_inbox',
    161             'default_subnav_slug'     => 'inbox',
    162             'item_css_id'             => $this->id
    163         );
    164 
    165         // Add the subnav items to the profile.
    166         $sub_nav[] = array(
    167             'name'            => __( 'Inbox', 'buddypress' ),
    168             'slug'            => 'inbox',
    169             'parent_url'      => $messages_link,
    170             'parent_slug'     => $slug,
    171             'screen_function' => 'messages_screen_inbox',
    172             'position'        => 10,
    173             'user_has_access' => $access
    174         );
    175 
    176         if ( bp_is_active( $this->id, 'star' ) ) {
    177             $sub_nav[] = array(
    178                 'name'            => __( 'Starred', 'buddypress' ),
    179                 'slug'            => bp_get_messages_starred_slug(),
    180                 'parent_url'      => $messages_link,
    181                 'parent_slug'     => $slug,
    182                 'screen_function' => 'bp_messages_star_screen',
    183                 'position'        => 11,
    184                 'user_has_access' => $access
    185             );
    186         }
    187 
    188         $sub_nav[] = array(
    189             'name'            => __( 'Sent', 'buddypress' ),
    190             'slug'            => 'sentbox',
    191             'parent_url'      => $messages_link,
    192             'parent_slug'     => $slug,
    193             'screen_function' => 'messages_screen_sentbox',
    194             'position'        => 20,
    195             'user_has_access' => $access
    196         );
    197 
    198         $sub_nav[] = array(
    199             'name'            => __( 'Compose', 'buddypress' ),
    200             'slug'            => 'compose',
    201             'parent_url'      => $messages_link,
    202             'parent_slug'     => $slug,
    203             'screen_function' => 'messages_screen_compose',
    204             'position'        => 30,
    205             'user_has_access' => $access
    206         );
    207 
    208         if ( bp_current_user_can( 'bp_moderate' ) ) {
    209             $sub_nav[] = array(
    210                 'name'            => __( 'Notices', 'buddypress' ),
    211                 'slug'            => 'notices',
    212                 'parent_url'      => $messages_link,
    213                 'parent_slug'     => $slug,
    214                 'screen_function' => 'messages_screen_notices',
    215                 'position'        => 90,
    216                 'user_has_access' => true
    217             );
    218         }
    219 
    220         parent::setup_nav( $main_nav, $sub_nav );
    221     }
    222 
    223     /**
    224      * Set up the Toolbar.
    225      *
    226      * @param array $wp_admin_nav See {BP_Component::setup_admin_bar()} for details.
    227      */
    228     public function setup_admin_bar( $wp_admin_nav = array() ) {
    229 
    230         // Menus for logged in user.
    231         if ( is_user_logged_in() ) {
    232 
    233             // Setup the logged in user variables.
    234             $messages_link = trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() );
    235 
    236             // Unread message count.
    237             $count = messages_get_unread_count();
    238             if ( !empty( $count ) ) {
    239                 $title = sprintf( __( 'Messages <span class="count">%s</span>', 'buddypress' ), bp_core_number_format( $count ) );
    240                 $inbox = sprintf( __( 'Inbox <span class="count">%s</span>',    'buddypress' ), bp_core_number_format( $count ) );
    241             } else {
    242                 $title = __( 'Messages', 'buddypress' );
    243                 $inbox = __( 'Inbox',    'buddypress' );
    244             }
    245 
    246             // Add main Messages menu.
    247             $wp_admin_nav[] = array(
    248                 'parent' => buddypress()->my_account_menu_id,
    249                 'id'     => 'my-account-' . $this->id,
    250                 'title'  => $title,
    251                 'href'   => $messages_link
    252             );
    253 
    254             // Inbox.
    255             $wp_admin_nav[] = array(
    256                 'parent' => 'my-account-' . $this->id,
    257                 'id'     => 'my-account-' . $this->id . '-inbox',
    258                 'title'  => $inbox,
    259                 'href'   => $messages_link
    260             );
    261 
    262             // Starred.
    263             if ( bp_is_active( $this->id, 'star' ) ) {
    264                 $wp_admin_nav[] = array(
    265                     'parent' => 'my-account-' . $this->id,
    266                     'id'     => 'my-account-' . $this->id . '-starred',
    267                     'title'  => __( 'Starred', 'buddypress' ),
    268                     'href'   => trailingslashit( $messages_link . bp_get_messages_starred_slug() )
    269                 );
    270             }
    271 
    272             // Sent Messages.
    273             $wp_admin_nav[] = array(
    274                 'parent' => 'my-account-' . $this->id,
    275                 'id'     => 'my-account-' . $this->id . '-sentbox',
    276                 'title'  => __( 'Sent', 'buddypress' ),
    277                 'href'   => trailingslashit( $messages_link . 'sentbox' )
    278             );
    279 
    280             // Compose Message.
    281             $wp_admin_nav[] = array(
    282                 'parent' => 'my-account-' . $this->id,
    283                 'id'     => 'my-account-' . $this->id . '-compose',
    284                 'title'  => __( 'Compose', 'buddypress' ),
    285                 'href'   => trailingslashit( $messages_link . 'compose' )
    286             );
    287 
    288             // Site Wide Notices.
    289             if ( bp_current_user_can( 'bp_moderate' ) ) {
    290                 $wp_admin_nav[] = array(
    291                     'parent' => 'my-account-' . $this->id,
    292                     'id'     => 'my-account-' . $this->id . '-notices',
    293                     'title'  => __( 'All Member Notices', 'buddypress' ),
    294                     'href'   => trailingslashit( $messages_link . 'notices' )
    295                 );
    296             }
    297         }
    298 
    299         parent::setup_admin_bar( $wp_admin_nav );
    300     }
    301 
    302     /**
    303      * Set up the title for pages and <title>.
    304      */
    305     public function setup_title() {
    306 
    307         if ( bp_is_messages_component() ) {
    308             $bp = buddypress();
    309 
    310             if ( bp_is_my_profile() ) {
    311                 $bp->bp_options_title = __( 'My Messages', 'buddypress' );
    312             } else {
    313                 $bp->bp_options_avatar = bp_core_fetch_avatar( array(
    314                     'item_id' => bp_displayed_user_id(),
    315                     'type'    => 'thumb',
    316                     'alt'     => sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_get_displayed_user_fullname() )
    317                 ) );
    318                 $bp->bp_options_title = bp_get_displayed_user_fullname();
    319             }
    320         }
    321 
    322         parent::setup_title();
    323     }
    324 
    325     /**
    326      * Setup cache groups
    327      *
    328      * @since 2.2.0
    329      */
    330     public function setup_cache_groups() {
    331 
    332         // Global groups.
    333         wp_cache_add_global_groups( array(
    334             'bp_messages',
    335             'bp_messages_threads',
    336             'bp_messages_unread_count',
    337             'message_meta'
    338         ) );
    339 
    340         parent::setup_cache_groups();
    341     }
    342 }
     15require dirname( __FILE__ ) . '/classes/class-bp-messages-component.php';
    34316
    34417/**
  • trunk/src/bp-messages/bp-messages-template.php

    r10421 r10522  
    1111defined( 'ABSPATH' ) || exit;
    1212
    13 /**
    14  * Message Box Template Class
    15  */
    16 class BP_Messages_Box_Template {
    17 
    18     /**
    19      * The loop iterator.
    20      *
    21      * @var int
    22      */
    23     public $current_thread = -1;
    24 
    25     /**
    26      * The number of threads returned by the paged query.
    27      *
    28      * @var int
    29      */
    30     public $current_thread_count = 0;
    31 
    32     /**
    33      * Total number of threads matching the query params.
    34      *
    35      * @var int
    36      */
    37     public $total_thread_count = 0;
    38 
    39     /**
    40      * Array of threads located by the query.
    41      *
    42      * @var array
    43      */
    44     public $threads = array();
    45 
    46     /**
    47      * The thread object currently being iterated on.
    48      *
    49      * @var object
    50      */
    51     public $thread = false;
    52 
    53     /**
    54      * A flag for whether the loop is currently being iterated.
    55      *
    56      * @var bool
    57      */
    58     public $in_the_loop = false;
    59 
    60     /**
    61      * User ID of the current inbox.
    62      *
    63      * @var int
    64      */
    65     public $user_id = 0;
    66 
    67     /**
    68      * The current "box" view ('notices', 'sentbox', 'inbox').
    69      *
    70      * @var string
    71      */
    72     public $box = 'inbox';
    73 
    74     /**
    75      * The page number being requested.
    76      *
    77      * @var int
    78      */
    79     public $pag_page = 1;
    80 
    81     /**
    82      * The number of items being requested per page.
    83      *
    84      * @var int
    85      */
    86     public $pag_num = 10;
    87 
    88     /**
    89      * An HTML string containing pagination links.
    90      *
    91      * @var string
    92      */
    93     public $pag_links = '';
    94 
    95     /**
    96      * Search terms for limiting the thread query.
    97      *
    98      * @var string
    99      */
    100     public $search_terms = '';
    101 
    102     /**
    103      * Constructor method.
    104      *
    105      * @param array $args {
    106      *     Array of arguments. See bp_has_message_threads() for full description.
    107      * }
    108      */
    109     public function __construct( $args = array() ) {
    110 
    111         // Backward compatibility with old method of passing arguments.
    112         if ( ! is_array( $args ) || func_num_args() > 1 ) {
    113             _deprecated_argument( __METHOD__, '2.2.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
    114 
    115             $old_args_keys = array(
    116                 0 => 'user_id',
    117                 1 => 'box',
    118                 2 => 'per_page',
    119                 3 => 'max',
    120                 4 => 'type',
    121                 5 => 'search_terms',
    122                 6 => 'page_arg'
    123             );
    124 
    125             $func_args = func_get_args();
    126             $args      = bp_core_parse_args_array( $old_args_keys, $func_args );
    127         }
    128 
    129         $r = wp_parse_args( $args, array(
    130             'page'         => 1,
    131             'per_page'     => 10,
    132             'page_arg'     => 'mpage',
    133             'box'          => 'inbox',
    134             'type'         => 'all',
    135             'user_id'      => bp_loggedin_user_id(),
    136             'max'          => false,
    137             'search_terms' => '',
    138             'meta_query'   => array(),
    139         ) );
    140 
    141         $this->pag_arg      = sanitize_key( $r['page_arg'] );
    142         $this->pag_page     = bp_sanitize_pagination_arg( $this->pag_arg, $r['page']     );
    143         $this->pag_num      = bp_sanitize_pagination_arg( 'num',          $r['per_page'] );
    144         $this->user_id      = $r['user_id'];
    145         $this->box          = $r['box'];
    146         $this->type         = $r['type'];
    147         $this->search_terms = $r['search_terms'];
    148 
    149         if ( 'notices' === $this->box ) {
    150             $this->threads = BP_Messages_Notice::get_notices( array(
    151                 'pag_num'  => $this->pag_num,
    152                 'pag_page' => $this->pag_page
    153             ) );
    154         } else {
    155             $threads = BP_Messages_Thread::get_current_threads_for_user( array(
    156                 'user_id'      => $this->user_id,
    157                 'box'          => $this->box,
    158                 'type'         => $this->type,
    159                 'limit'        => $this->pag_num,
    160                 'page'         => $this->pag_page,
    161                 'search_terms' => $this->search_terms,
    162                 'meta_query'   => $r['meta_query'],
    163             ) );
    164 
    165             $this->threads            = $threads['threads'];
    166             $this->total_thread_count = $threads['total'];
    167         }
    168 
    169         if ( !$this->threads ) {
    170             $this->thread_count       = 0;
    171             $this->total_thread_count = 0;
    172         } else {
    173             $total_notice_count = BP_Messages_Notice::get_total_notice_count();
    174 
    175             if ( empty( $r['max'] ) || ( (int) $r['max'] >= (int) $total_notice_count ) ) {
    176                 if ( 'notices' === $this->box ) {
    177                     $this->total_thread_count = (int) $total_notice_count;
    178                 }
    179             } else {
    180                 $this->total_thread_count = (int) $r['max'];
    181             }
    182 
    183             if ( ! empty( $r['max'] ) ) {
    184                 if ( (int) $r['max'] >= count( $this->threads ) ) {
    185                     $this->thread_count = count( $this->threads );
    186                 } else {
    187                     $this->thread_count = (int) $r['max'];
    188                 }
    189             } else {
    190                 $this->thread_count = count( $this->threads );
    191             }
    192         }
    193 
    194         if ( (int) $this->total_thread_count && (int) $this->pag_num ) {
    195             $pag_args = array(
    196                 $r['page_arg'] => '%#%',
    197             );
    198 
    199             if ( defined( 'DOING_AJAX' ) && true === (bool) DOING_AJAX ) {
    200                 $base = remove_query_arg( 's', wp_get_referer() );
    201             } else {
    202                 $base = '';
    203             }
    204 
    205             $add_args = array();
    206 
    207             if ( ! empty( $this->search_terms ) ) {
    208                 $add_args['s'] = $this->search_terms;
    209             }
    210 
    211             $this->pag_links = paginate_links( array(
    212                 'base'      => add_query_arg( $pag_args, $base ),
    213                 'format'    => '',
    214                 'total'     => ceil( (int) $this->total_thread_count / (int) $this->pag_num ),
    215                 'current'   => $this->pag_page,
    216                 'prev_text' => _x( '&larr;', 'Message pagination previous text', 'buddypress' ),
    217                 'next_text' => _x( '&rarr;', 'Message pagination next text', 'buddypress' ),
    218                 'mid_size'  => 1,
    219                 'add_args'  => $add_args,
    220             ) );
    221         }
    222     }
    223 
    224     /**
    225      * Whether there are threads available in the loop.
    226      *
    227      * @see bp_has_message_threads()
    228      *
    229      * @return bool True if there are items in the loop, otherwise false.
    230      */
    231     public function has_threads() {
    232         if ( $this->thread_count ) {
    233             return true;
    234         }
    235 
    236         return false;
    237     }
    238 
    239     /**
    240      * Set up the next member and iterate index.
    241      *
    242      * @return object The next member to iterate over.
    243      */
    244     public function next_thread() {
    245         $this->current_thread++;
    246         $this->thread = $this->threads[$this->current_thread];
    247 
    248         return $this->thread;
    249     }
    250 
    251     /**
    252      * Rewind the threads and reset thread index.
    253      */
    254     public function rewind_threads() {
    255         $this->current_thread = -1;
    256         if ( $this->thread_count > 0 ) {
    257             $this->thread = $this->threads[0];
    258         }
    259     }
    260 
    261     /**
    262      * Whether there are threads left in the loop to iterate over.
    263      *
    264      * This method is used by {@link bp_message_threads()} as part of the
    265      * while loop that controls iteration inside the threads loop, eg:
    266      *     while ( bp_message_threads() ) { ...
    267      *
    268      * @see bp_message_threads()
    269      *
    270      * @return bool True if there are more threads to show, otherwise false.
    271      */
    272     function message_threads() {
    273         if ( $this->current_thread + 1 < $this->thread_count ) {
    274             return true;
    275         } elseif ( $this->current_thread + 1 == $this->thread_count ) {
    276 
    277             /**
    278              * Fires when at the end of threads to iterate over.
    279              *
    280              * @since 1.5.0
    281              */
    282             do_action( 'messages_box_loop_end' );
    283             // Do some cleaning up after the loop.
    284             $this->rewind_threads();
    285         }
    286 
    287         $this->in_the_loop = false;
    288         return false;
    289     }
    290 
    291     /**
    292      * Set up the current thread inside the loop.
    293      *
    294      * Used by {@link bp_message_thread()} to set up the current thread data
    295      * while looping, so that template tags used during that iteration make
    296      * reference to the current thread.
    297      *
    298      * @see bp_message_thread()
    299      */
    300     public function the_message_thread() {
    301 
    302         $this->in_the_loop = true;
    303         $this->thread      = $this->next_thread();
    304 
    305         if ( ! bp_is_current_action( 'notices' ) ) {
    306             $last_message_index     = count( $this->thread->messages ) - 1;
    307             $this->thread->messages = array_reverse( (array) $this->thread->messages );
    308 
    309             // Set up the last message data.
    310             if ( count($this->thread->messages) > 1 ) {
    311                 if ( 'inbox' == $this->box ) {
    312                     foreach ( (array) $this->thread->messages as $key => $message ) {
    313                         if ( bp_loggedin_user_id() != $message->sender_id ) {
    314                             $last_message_index = $key;
    315                             break;
    316                         }
    317                     }
    318 
    319                 } elseif ( 'sentbox' == $this->box ) {
    320                     foreach ( (array) $this->thread->messages as $key => $message ) {
    321                         if ( bp_loggedin_user_id() == $message->sender_id ) {
    322                             $last_message_index = $key;
    323                             break;
    324                         }
    325                     }
    326                 }
    327             }
    328 
    329             $this->thread->last_message_id      = $this->thread->messages[ $last_message_index ]->id;
    330             $this->thread->last_message_date    = $this->thread->messages[ $last_message_index ]->date_sent;
    331             $this->thread->last_sender_id       = $this->thread->messages[ $last_message_index ]->sender_id;
    332             $this->thread->last_message_subject = $this->thread->messages[ $last_message_index ]->subject;
    333             $this->thread->last_message_content = $this->thread->messages[ $last_message_index ]->message;
    334         }
    335 
    336         // Loop has just started.
    337         if ( 0 == $this->current_thread ) {
    338 
    339             /**
    340              * Fires if at the start of the message thread loop.
    341              *
    342              * @since 1.5.0
    343              */
    344             do_action( 'messages_box_loop_start' );
    345         }
    346     }
    347 }
     13require dirname( __FILE__ ) . '/classes/class-bp-messages-box-template.php';
     14require dirname( __FILE__ ) . '/classes/class-bp-messages-thread-template.php';
    34815
    34916/**
     
    17531420
    17541421/**
    1755  * Message Thread Template Class
    1756  */
    1757 class BP_Messages_Thread_Template {
    1758 
    1759     /**
    1760      * The loop iterator.
    1761      *
    1762      * @var int
    1763      */
    1764     public $current_message = -1;
    1765 
    1766     /**
    1767      * Number of messages returned by the paged query.
    1768      *
    1769      * @var int
    1770      */
    1771     public $message_count = 0;
    1772 
    1773     /**
    1774      * The message object currently being iterated on.
    1775      *
    1776      * @var object
    1777      */
    1778     public $message;
    1779 
    1780     /**
    1781      * Thread that the current messages belong to.
    1782      *
    1783      * @var BP_Messages_Thread
    1784      */
    1785     public $thread;
    1786 
    1787     /**
    1788      * A flag for whether the loop is currently being iterated.
    1789      *
    1790      * @var bool
    1791      */
    1792     public $in_the_loop = false;
    1793 
    1794     /**
    1795      * The page number being requested.
    1796      *
    1797      * @var int
    1798      */
    1799     public $pag_page = 1;
    1800 
    1801     /**
    1802      * The number of items being requested per page.
    1803      *
    1804      * @var int
    1805      */
    1806     public $pag_num = 10;
    1807 
    1808     /**
    1809      * An HTML string containing pagination links.
    1810      *
    1811      * @var string
    1812      */
    1813     public $pag_links = '';
    1814 
    1815     /**
    1816      * The total number of messages matching the query.
    1817      *
    1818      * @var int
    1819      */
    1820     public $total_message_count = 0;
    1821 
    1822     /**
    1823      * Constructor method.
    1824      *
    1825      * @see BP_Messages_Thread::populate() for full parameter info.
    1826      *
    1827      * @param int    $thread_id ID of the message thread to display.
    1828      * @param string $order     Order to show the thread's messages in.
    1829      * @param array  $args      Array of arguments for the query.
    1830      */
    1831     public function __construct( $thread_id = 0, $order = 'ASC', $args = array() ) {
    1832         $this->thread        = new BP_Messages_Thread( $thread_id, $order, $args );
    1833         $this->message_count = count( $this->thread->messages );
    1834     }
    1835 
    1836     /**
    1837      * Whether there are messages available in the loop.
    1838      *
    1839      * @see bp_thread_has_messages()
    1840      *
    1841      * @return bool True if there are items in the loop, otherwise false.
    1842      */
    1843     public function has_messages() {
    1844         if ( ! empty( $this->message_count ) ) {
    1845             return true;
    1846         }
    1847 
    1848         return false;
    1849     }
    1850 
    1851     /**
    1852      * Set up the next member and iterate index.
    1853      *
    1854      * @return object The next member to iterate over.
    1855      */
    1856     public function next_message() {
    1857         $this->current_message++;
    1858         $this->message = $this->thread->messages[ $this->current_message ];
    1859 
    1860         return $this->message;
    1861     }
    1862 
    1863     /**
    1864      * Rewind the messages and reset message index.
    1865      */
    1866     public function rewind_messages() {
    1867         $this->current_message = -1;
    1868         if ( $this->message_count > 0 ) {
    1869             $this->message = $this->thread->messages[0];
    1870         }
    1871     }
    1872 
    1873     /**
    1874      * Whether there are messages left in the loop to iterate over.
    1875      *
    1876      * This method is used by {@link bp_thread_messages()} as part of the
    1877      * while loop that controls iteration inside the messages loop, eg:
    1878      *     while ( bp_thread_messages() ) { ...
    1879      *
    1880      * @see bp_thread_messages()
    1881      *
    1882      * @return bool True if there are more messages to show, otherwise false.
    1883      */
    1884     public function messages() {
    1885         if ( ( $this->current_message + 1 ) < $this->message_count ) {
    1886             return true;
    1887         } elseif ( ( $this->current_message + 1 ) === $this->message_count ) {
    1888 
    1889             /**
    1890              * Fires when at the end of messages to iterate over.
    1891              *
    1892              * @since 1.1.0
    1893              */
    1894             do_action( 'thread_loop_end' );
    1895             // Do some cleaning up after the loop.
    1896             $this->rewind_messages();
    1897         }
    1898 
    1899         $this->in_the_loop = false;
    1900         return false;
    1901     }
    1902 
    1903     /**
    1904      * Set up the current message inside the loop.
    1905      *
    1906      * Used by {@link bp_thread_the_message()} to set up the current
    1907      * message data while looping, so that template tags used during
    1908      * that iteration make reference to the current message.
    1909      *
    1910      * @see bp_thread_the_message()
    1911      */
    1912     public function the_message() {
    1913         $this->in_the_loop = true;
    1914         $this->message     = $this->next_message();
    1915 
    1916         // Loop has just started.
    1917         if ( 0 === $this->current_message ) {
    1918 
    1919             /**
    1920              * Fires if at the start of the message loop.
    1921              *
    1922              * @since 1.1.0
    1923              */
    1924             do_action( 'thread_loop_start' );
    1925         }
    1926     }
    1927 }
    1928 
    1929 /**
    19301422 * Initialize the messages template loop for a specific thread.
    19311423 *
  • trunk/src/bp-messages/bp-messages-widgets.php

    r10417 r10522  
    1111defined( 'ABSPATH' ) || exit;
    1212
     13require dirname( __FILE__ ) . '/classes/class-bp-messages-sitewide-notices-widget.php';
     14
    1315/**
    1416 * Register widgets for the Messages component.
     
    2022}
    2123add_action( 'bp_register_widgets', 'bp_messages_register_widgets' );
    22 
    23 /**
    24  * A widget that displays sitewide notices.
    25  *
    26  * @since 1.9.0
    27  */
    28 class BP_Messages_Sitewide_Notices_Widget extends WP_Widget {
    29 
    30     /**
    31      * Constructor method.
    32      */
    33     function __construct() {
    34         parent::__construct(
    35             'bp_messages_sitewide_notices_widget',
    36             __( '(BuddyPress) Sitewide Notices', 'buddypress' ),
    37             array(
    38                 'classname'   => 'widget_bp_core_sitewide_messages buddypress widget',
    39                 'description' => __( 'Display Sitewide Notices posted by the site administrator', 'buddypress' ),
    40             )
    41         );
    42     }
    43 
    44     /**
    45      * Render the widget.
    46      *
    47      * @see WP_Widget::widget() for a description of parameters.
    48      *
    49      * @param array $args     See {@WP_Widget::widget()}.
    50      * @param array $instance See {@WP_Widget::widget()}.
    51      */
    52     public function widget( $args, $instance ) {
    53 
    54         if ( ! is_user_logged_in() ) {
    55             return;
    56         }
    57 
    58         // Don't display the widget if there are no Notices to show.
    59         $notices = BP_Messages_Notice::get_active();
    60         if ( empty( $notices ) ) {
    61             return;
    62         }
    63 
    64         extract( $args );
    65 
    66         $title = ! empty( $instance['title'] ) ? $instance['title'] : '';
    67 
    68         /**
    69          * Filters the title of the Messages widget.
    70          *
    71          * @since 1.9.0
    72          * @since 2.3.0 Added 'instance' and 'id_base' to arguments passed to filter.
    73          *
    74          * @param string $title    The widget title.
    75          * @param array  $instance The settings for the particular instance of the widget.
    76          * @param string $id_base  Root ID for all widgets of this type.
    77          */
    78         $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
    79 
    80         echo $before_widget;
    81         echo $before_title . $title . $after_title; ?>
    82 
    83         <div class="bp-site-wide-message">
    84             <?php bp_message_get_notices(); ?>
    85         </div>
    86 
    87         <?php
    88 
    89         echo $after_widget;
    90     }
    91 
    92     /**
    93      * Process the saved settings for the widget.
    94      *
    95      * @see WP_Widget::update() for a description of parameters and
    96      *      return values.
    97      *
    98      * @param array $new_instance See {@WP_Widget::update()}.
    99      * @param array $old_instance See {@WP_Widget::update()}.
    100      * @return array $instance See {@WP_Widget::update()}.
    101      */
    102     public function update( $new_instance, $old_instance ) {
    103         $instance = $old_instance;
    104         $instance['title'] = strip_tags( $new_instance['title'] );
    105         return $instance;
    106     }
    107 
    108     /**
    109      * Render the settings form for Appearance > Widgets.
    110      *
    111      * @see WP_Widget::form() for a description of parameters.
    112      *
    113      * @param array $instance See {@WP_Widget::form()}.
    114      *
    115      * @return string Widget form output.
    116      */
    117     public function form( $instance ) {
    118         $instance = wp_parse_args( (array) $instance, array(
    119             'title' => '',
    120         ) );
    121 
    122         $title = strip_tags( $instance['title'] ); ?>
    123 
    124         <p>
    125             <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'buddypress' ); ?></label>
    126             <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
    127         </p>
    128 
    129         <?php
    130     }
    131 }
  • trunk/src/bp-messages/classes/class-bp-messages-box-template.php

    r10515 r10522  
    11<?php
    22/**
    3  * BuddyPress Messages Template Tags.
     3 * BuddyPress Messages Box Template Class.
    44 *
    55 * @package BuddyPress
     
    346346    }
    347347}
    348 
    349 /**
    350  * Retrieve private message threads for display in inbox/sentbox/notices.
    351  *
    352  * Similar to WordPress's have_posts() function, this function is responsible
    353  * for querying the database and retrieving private messages for display inside
    354  * the theme via individual template parts for a member's inbox/sentbox/notices.
    355  *
    356  * @since 1.0.0
    357  *
    358  * @global BP_Messages_Box_Template $messages_template
    359  *
    360  * @param array|string $args {
    361  *     Array of arguments. All are optional.
    362  *     @type int    $user_id      ID of the user whose threads are being loaded.
    363  *                                Default: ID of the logged-in user.
    364  *     @type string $box          Current "box" view. If not provided here, the current
    365  *                                view will be inferred from the URL.
    366  *     @type int    $per_page     Number of results to return per page. Default: 10.
    367  *     @type int    $max          Max results to return. Default: false.
    368  *     @type string $type         Type of messages to return. Values: 'all', 'read', 'unread'
    369  *                                Default: 'all'
    370  *     @type string $search_terms Terms to which to limit results. Default:
    371  *                                the value of $_REQUEST['s'].
    372  *     @type string $page_arg     URL argument used for the pagination param.
    373  *                                Default: 'mpage'.
    374  *     @type array  $meta_query   Meta query arguments. Only applicable if $box is
    375  *                                not 'notices'. See WP_Meta_Query more details.
    376  * }
    377  * @return bool True if there are threads to display, otherwise false.
    378  */
    379 function bp_has_message_threads( $args = array() ) {
    380     global $messages_template;
    381 
    382     // The default box the user is looking at.
    383     $current_action = bp_current_action();
    384     switch ( $current_action ) {
    385         case 'sentbox' :
    386         case 'notices' :
    387         case 'inbox'   :
    388             $default_box = $current_action;
    389             break;
    390         default :
    391             $default_box = 'inbox';
    392             break;
    393     }
    394 
    395     // User ID
    396     // @todo displayed user for moderators that get this far?
    397     $user_id = bp_loggedin_user_id();
    398 
    399     // Search Terms.
    400     $search_terms = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';
    401 
    402     // Parse the arguments.
    403     $r = bp_parse_args( $args, array(
    404         'user_id'      => $user_id,
    405         'box'          => $default_box,
    406         'per_page'     => 10,
    407         'max'          => false,
    408         'type'         => 'all',
    409         'search_terms' => $search_terms,
    410         'page_arg'     => 'mpage', // See https://buddypress.trac.wordpress.org/ticket/3679.
    411         'meta_query'   => array()
    412     ), 'has_message_threads' );
    413 
    414     // Load the messages loop global up with messages.
    415     $messages_template = new BP_Messages_Box_Template( $r );
    416 
    417     /**
    418      * Filters if there are any message threads to display in inbox/sentbox/notices.
    419      *
    420      * @since 1.1.0
    421      *
    422      * @param bool                     $value             Whether or not the message has threads.
    423      * @param BP_Messages_Box_Template $messages_template Current message box template object.
    424      * @param array                    $r                 Array of parsed arguments passed into function.
    425      */
    426     return apply_filters( 'bp_has_message_threads', $messages_template->has_threads(), $messages_template, $r );
    427 }
    428 
    429 /**
    430  * Check whether there are more threads to iterate over.
    431  *
    432  * @return bool
    433  */
    434 function bp_message_threads() {
    435     global $messages_template;
    436     return $messages_template->message_threads();
    437 }
    438 
    439 /**
    440  * Set up the current thread inside the loop.
    441  *
    442  * @return object
    443  */
    444 function bp_message_thread() {
    445     global $messages_template;
    446     return $messages_template->the_message_thread();
    447 }
    448 
    449 /**
    450  * Output the ID of the current thread in the loop.
    451  */
    452 function bp_message_thread_id() {
    453     echo bp_get_message_thread_id();
    454 }
    455     /**
    456      * Get the ID of the current thread in the loop.
    457      *
    458      * @return int
    459      */
    460     function bp_get_message_thread_id() {
    461         global $messages_template;
    462 
    463         /**
    464          * Filters the ID of the current thread in the loop.
    465          *
    466          * @since 1.0.0
    467          *
    468          * @param int $thread_id ID of the current thread in the loop.
    469          */
    470         return apply_filters( 'bp_get_message_thread_id', $messages_template->thread->thread_id );
    471     }
    472 
    473 /**
    474  * Output the subject of the current thread in the loop.
    475  */
    476 function bp_message_thread_subject() {
    477     echo bp_get_message_thread_subject();
    478 }
    479     /**
    480      * Get the subject of the current thread in the loop.
    481      *
    482      * @return string
    483      */
    484     function bp_get_message_thread_subject() {
    485         global $messages_template;
    486 
    487         /**
    488          * Filters the subject of the current thread in the loop.
    489          *
    490          * @since 1.1.0
    491          *
    492          * @param string $value Subject of the current thread in the loop.
    493          */
    494         return apply_filters( 'bp_get_message_thread_subject', $messages_template->thread->last_message_subject );
    495     }
    496 
    497 /**
    498  * Output an excerpt from the current message in the loop.
    499  */
    500 function bp_message_thread_excerpt() {
    501     echo bp_get_message_thread_excerpt();
    502 }
    503     /**
    504      * Generate an excerpt from the current message in the loop.
    505      *
    506      * @return string
    507      */
    508     function bp_get_message_thread_excerpt() {
    509         global $messages_template;
    510 
    511         /**
    512          * Filters the excerpt of the current thread in the loop.
    513          *
    514          * @since 1.0.0
    515          *
    516          * @param string $value Excerpt of the current thread in the loop.
    517          */
    518         return apply_filters( 'bp_get_message_thread_excerpt', strip_tags( bp_create_excerpt( $messages_template->thread->last_message_content, 75 ) ) );
    519     }
    520 
    521 /**
    522  * Output the thread's last message content.
    523  *
    524  * When viewing your Inbox, the last message is the most recent message in
    525  * the thread of which you are *not* the author.
    526  *
    527  * When viewing your Sentbox, last message is the most recent message in
    528  * the thread of which you *are* the member.
    529  *
    530  * @since 2.0.0
    531  */
    532 function bp_message_thread_content() {
    533     echo bp_get_message_thread_content();
    534 }
    535     /**
    536      * Return the thread's last message content.
    537      *
    538      * When viewing your Inbox, the last message is the most recent message in
    539      * the thread of which you are *not* the author.
    540      *
    541      * When viewing your Sentbox, last message is the most recent message in
    542      * the thread of which you *are* the member.
    543      *
    544      * @since 2.0.0
    545      *
    546      * @return string The raw content of the last message in the thread.
    547      */
    548     function bp_get_message_thread_content() {
    549         global $messages_template;
    550 
    551         /**
    552          * Filters the content of the last message in the thread.
    553          *
    554          * @since 2.0.0
    555          *
    556          * @param string $last_message_content Content of the last message in the thread.
    557          */
    558         return apply_filters( 'bp_get_message_thread_content', $messages_template->thread->last_message_content );
    559     }
    560 
    561 /**
    562  * Output a link to the page of the current thread's last author.
    563  */
    564 function bp_message_thread_from() {
    565     echo bp_get_message_thread_from();
    566 }
    567     /**
    568      * Get a link to the page of the current thread's last author.
    569      *
    570      * @return string
    571      */
    572     function bp_get_message_thread_from() {
    573         global $messages_template;
    574 
    575         /**
    576          * Filters the link to the page of the current thread's last author.
    577          *
    578          * @since 1.0.0
    579          *
    580          * @param string $value Link to the page of the current thread's last author.
    581          */
    582         return apply_filters( 'bp_get_message_thread_from', bp_core_get_userlink( $messages_template->thread->last_sender_id ) );
    583     }
    584 
    585 /**
    586  * Output links to the pages of the current thread's recipients.
    587  */
    588 function bp_message_thread_to() {
    589     echo bp_get_message_thread_to();
    590 }
    591     /**
    592      * Generate HTML links to the pages of the current thread's recipients.
    593      *
    594      * @return string
    595      */
    596     function bp_get_message_thread_to() {
    597         global $messages_template;
    598 
    599         /**
    600          * Filters the HTML links to the pages of the current thread's recipients.
    601          *
    602          * @since 1.0.0
    603          *
    604          * @param string $value HTML links to the pages of the current thread's recipients.
    605          */
    606         return apply_filters( 'bp_message_thread_to', BP_Messages_Thread::get_recipient_links($messages_template->thread->recipients ) );
    607     }
    608 
    609 /**
    610  * Output the permalink for a particular thread.
    611  *
    612  * @param int $thread_id Optional. ID of the thread. Default: current thread
    613  *                       being iterated on in the loop.
    614  */
    615 function bp_message_thread_view_link( $thread_id = 0 ) {
    616     echo bp_get_message_thread_view_link( $thread_id );
    617 }
    618     /**
    619      * Get the permalink of a particular thread.
    620      *
    621      * @param int $thread_id Optional. ID of the thread. Default: current
    622      *                       thread being iterated on in the loop.
    623      * @return string
    624      */
    625     function bp_get_message_thread_view_link( $thread_id = 0 ) {
    626         global $messages_template;
    627 
    628         if ( empty( $messages_template ) && (int) $thread_id > 0 ) {
    629             $thread_id = (int) $thread_id;
    630         } elseif ( ! empty( $messages_template->thread->thread_id ) ) {
    631             $thread_id = $messages_template->thread->thread_id;
    632         }
    633 
    634         /**
    635          * Filters the permalink of a particular thread.
    636          *
    637          * @since 1.0.0
    638          *
    639          * @param string $value permalink of a particular thread.
    640          */
    641         return apply_filters( 'bp_get_message_thread_view_link', trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/view/' . $thread_id ) );
    642     }
    643 
    644 /**
    645  * Output the URL for deleting the current thread.
    646  */
    647 function bp_message_thread_delete_link() {
    648     echo esc_url( bp_get_message_thread_delete_link() );
    649 }
    650     /**
    651      * Generate the URL for deleting the current thread.
    652      *
    653      * @return string
    654      */
    655     function bp_get_message_thread_delete_link() {
    656         global $messages_template;
    657 
    658         /**
    659          * Filters the URL for deleting the current thread.
    660          *
    661          * @since 1.0.0
    662          *
    663          * @param string $value URL for deleting the current thread.
    664          * @param string $value Text indicating action being executed.
    665          */
    666         return apply_filters( 'bp_get_message_thread_delete_link', wp_nonce_url( trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/delete/' . $messages_template->thread->thread_id ), 'messages_delete_thread' ) );
    667     }
    668 
    669 /**
    670  * Output the URL used for marking a single message thread as unread.
    671  *
    672  * Since this function directly outputs a URL, it is escaped.
    673  *
    674  * @since 2.2.0
    675  */
    676 function bp_the_message_thread_mark_unread_url() {
    677     echo esc_url( bp_get_the_message_thread_mark_unread_url() );
    678 }
    679     /**
    680      * Return the URL used for marking a single message thread as unread.
    681      *
    682      * @since 2.2.0
    683      *
    684      * @return string
    685      */
    686     function bp_get_the_message_thread_mark_unread_url() {
    687 
    688         // Get the message ID.
    689         $id = bp_get_message_thread_id();
    690 
    691         // Get the args to add to the URL.
    692         $args = array(
    693             'action'     => 'unread',
    694             'message_id' => $id
    695         );
    696 
    697         // Base unread URL.
    698         $url = trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/unread' );
    699 
    700         // Add the args to the URL.
    701         $url = add_query_arg( $args, $url );
    702 
    703         // Add the nonce.
    704         $url = wp_nonce_url( $url, 'bp_message_thread_mark_unread_' . $id );
    705 
    706         /**
    707          * Filters the URL used for marking a single message thread as unread.
    708          *
    709          * @since 2.2.0
    710          *
    711          * @param string $url URL used for marking a single message thread as unread.
    712          */
    713         return apply_filters( 'bp_get_the_message_thread_mark_unread_url', $url );
    714     }
    715 
    716 /**
    717  * Output the URL used for marking a single message thread as read.
    718  *
    719  * Since this function directly outputs a URL, it is escaped.
    720  *
    721  * @since 2.2.0
    722  */
    723 function bp_the_message_thread_mark_read_url() {
    724     echo esc_url( bp_get_the_message_thread_mark_read_url() );
    725 }
    726     /**
    727      * Return the URL used for marking a single message thread as read.
    728      *
    729      * @since 2.2.0
    730      *
    731      * @return string
    732      */
    733     function bp_get_the_message_thread_mark_read_url() {
    734 
    735         // Get the message ID.
    736         $id = bp_get_message_thread_id();
    737 
    738         // Get the args to add to the URL.
    739         $args = array(
    740             'action'     => 'read',
    741             'message_id' => $id
    742         );
    743 
    744         // Base read URL.
    745         $url = trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/read' );
    746 
    747         // Add the args to the URL.
    748         $url = add_query_arg( $args, $url );
    749 
    750         // Add the nonce.
    751         $url = wp_nonce_url( $url, 'bp_message_thread_mark_read_' . $id );
    752 
    753         /**
    754          * Filters the URL used for marking a single message thread as read.
    755          *
    756          * @since 2.2.0
    757          *
    758          * @param string $url URL used for marking a single message thread as read.
    759          */
    760         return apply_filters( 'bp_get_the_message_thread_mark_read_url', $url );
    761     }
    762 
    763 /**
    764  * Output the CSS class for the current thread.
    765  */
    766 function bp_message_css_class() {
    767     echo esc_attr( bp_get_message_css_class() );
    768 }
    769     /**
    770      * Generate the CSS class for the current thread.
    771      *
    772      * @return string
    773      */
    774     function bp_get_message_css_class() {
    775         global $messages_template;
    776 
    777         $class = false;
    778 
    779         if ( $messages_template->current_thread % 2 == 1 ) {
    780             $class .= 'alt';
    781         }
    782 
    783         /**
    784          * Filters the CSS class for the current thread.
    785          *
    786          * @since 1.2.10
    787          *
    788          * @param string $class Class string to be added to the list of classes.
    789          */
    790         return apply_filters( 'bp_get_message_css_class', trim( $class ) );
    791     }
    792 
    793 /**
    794  * Check whether the current thread has unread items.
    795  *
    796  * @return bool True if there are unread items, otherwise false.
    797  */
    798 function bp_message_thread_has_unread() {
    799     global $messages_template;
    800 
    801     $retval = ! empty( $messages_template->thread->unread_count )
    802         ? true
    803         : false;
    804 
    805     /**
    806      * Filters whether or not a message thread has unread items.
    807      *
    808      * @since 2.1.0
    809      *
    810      * @param bool $retval Whether or not a message thread has unread items.
    811      */
    812     return apply_filters( 'bp_message_thread_has_unread', $retval );
    813 }
    814 
    815 /**
    816  * Output the current thread's unread count.
    817  */
    818 function bp_message_thread_unread_count() {
    819     echo esc_html( bp_get_message_thread_unread_count() );
    820 }
    821     /**
    822      * Get the current thread's unread count.
    823      *
    824      * @return int
    825      */
    826     function bp_get_message_thread_unread_count() {
    827         global $messages_template;
    828 
    829         $count = ! empty( $messages_template->thread->unread_count )
    830             ? (int) $messages_template->thread->unread_count
    831             : false;
    832 
    833         /**
    834          * Filters the current thread's unread count.
    835          *
    836          * @since 1.0.0
    837          *
    838          * @param int $count Current thread unread count.
    839          */
    840         return apply_filters( 'bp_get_message_thread_unread_count', $count );
    841     }
    842 
    843 /**
    844  * Output a thread's total message count.
    845  *
    846  * @since 2.2.0
    847  *
    848  * @param int|bool $thread_id Optional. ID of the thread. Defaults to current thread ID.
    849  */
    850 function bp_message_thread_total_count( $thread_id = false ) {
    851     echo bp_get_message_thread_total_count( $thread_id );
    852 }
    853     /**
    854      * Get the current thread's total message count.
    855      *
    856      * @since 2.2.0
    857      *
    858      * @param int|bool $thread_id Optional. ID of the thread.
    859      *                            Defaults to current thread ID.
    860      * @return int
    861      */
    862     function bp_get_message_thread_total_count( $thread_id = false ) {
    863         if ( false === $thread_id ) {
    864             $thread_id = bp_get_message_thread_id();
    865         }
    866 
    867         $thread_template = new BP_Messages_Thread_Template( $thread_id, 'ASC', array(
    868             'update_meta_cache' => false
    869         ) );
    870 
    871         $count = 0;
    872         if ( ! empty( $thread_template->message_count ) ) {
    873             $count = intval( $thread_template->message_count );
    874         }
    875 
    876         /**
    877          * Filters the current thread's total message count.
    878          *
    879          * @since 2.2.0
    880          *
    881          * @param int $count Current thread total message count.
    882          */
    883         return apply_filters( 'bp_get_message_thread_total_count', $count );
    884     }
    885 
    886 /**
    887  * Output markup for the current thread's total and unread count.
    888  *
    889  * @since 2.2.0
    890  *
    891  * @param int|bool $thread_id Optional. ID of the thread. Default: current thread ID.
    892  */
    893 function bp_message_thread_total_and_unread_count( $thread_id = false ) {
    894     echo bp_get_message_thread_total_and_unread_count( $thread_id );
    895 }
    896     /**
    897      * Get markup for the current thread's total and unread count.
    898      *
    899      * @param int|bool $thread_id Optional. ID of the thread. Default: current thread ID.
    900      * @return string Markup displaying the total and unread count for the thread.
    901      */
    902     function bp_get_message_thread_total_and_unread_count( $thread_id = false ) {
    903         if ( false === $thread_id ) {
    904             $thread_id = bp_get_message_thread_id();
    905         }
    906 
    907         $total  = bp_get_message_thread_total_count( $thread_id );
    908         $unread = bp_get_message_thread_unread_count( $thread_id );
    909 
    910         return sprintf(
    911             '<span class="thread-count">(%1$s)</span> <span class="bp-screen-reader-text">%2$s</span>',
    912             number_format_i18n( $total ),
    913             sprintf( _n( '%d unread', '%d unread', $unread, 'buddypress' ), number_format_i18n( $unread ) )
    914         );
    915     }
    916 
    917 /**
    918  * Output the unformatted date of the last post in the current thread.
    919  */
    920 function bp_message_thread_last_post_date_raw() {
    921     echo bp_get_message_thread_last_post_date_raw();
    922 }
    923     /**
    924      * Get the unformatted date of the last post in the current thread.
    925      *
    926      * @return string
    927      */
    928     function bp_get_message_thread_last_post_date_raw() {
    929         global $messages_template;
    930 
    931         /**
    932          * Filters the unformatted date of the last post in the current thread.
    933          *
    934          * @since 2.1.0
    935          *
    936          * @param string $last_message_date Unformatted date of the last post in the current thread.
    937          */
    938         return apply_filters( 'bp_get_message_thread_last_message_date', $messages_template->thread->last_message_date );
    939     }
    940 
    941 /**
    942  * Output the nicely formatted date of the last post in the current thread.
    943  */
    944 function bp_message_thread_last_post_date() {
    945     echo bp_get_message_thread_last_post_date();
    946 }
    947     /**
    948      * Get the nicely formatted date of the last post in the current thread.
    949      *
    950      * @return string
    951      */
    952     function bp_get_message_thread_last_post_date() {
    953 
    954         /**
    955          * Filters the nicely formatted date of the last post in the current thread.
    956          *
    957          * @since 2.1.0
    958          *
    959          * @param string $value Formatted date of the last post in the current thread.
    960          */
    961         return apply_filters( 'bp_get_message_thread_last_post_date', bp_format_time( strtotime( bp_get_message_thread_last_post_date_raw() ) ) );
    962     }
    963 
    964 /**
    965  * Output the avatar for the last sender in the current message thread.
    966  *
    967  * @see bp_get_message_thread_avatar() for a description of arguments.
    968  *
    969  * @param array|string $args See {@link bp_get_message_thread_avatar()}.
    970  */
    971 function bp_message_thread_avatar( $args = '' ) {
    972     echo bp_get_message_thread_avatar( $args );
    973 }
    974     /**
    975      * Return the avatar for the last sender in the current message thread.
    976      *
    977      * @see bp_core_fetch_avatar() For a description of arguments and
    978      *      return values.
    979      *
    980      * @param array|string $args {
    981      *     Arguments are listed here with an explanation of their defaults.
    982      *     For more information about the arguments, see
    983      *     {@link bp_core_fetch_avatar()}.
    984      *     @type string      $type   Default: 'thumb'.
    985      *     @type int|bool    $width  Default: false.
    986      *     @type int|bool    $height Default: false.
    987      *     @type string      $class  Default: 'avatar'.
    988      *     @type string|bool $id     Default: false.
    989      *     @type string      $alt    Default: 'Profile picture of [display name]'.
    990      * }
    991      * @return string User avatar string.
    992      */
    993     function bp_get_message_thread_avatar( $args = '' ) {
    994         global $messages_template;
    995 
    996         $fullname = bp_core_get_user_displayname( $messages_template->thread->last_sender_id );
    997         $alt      = sprintf( __( 'Profile picture of %s', 'buddypress' ), $fullname );
    998 
    999         $r = bp_parse_args( $args, array(
    1000             'type'   => 'thumb',
    1001             'width'  => false,
    1002             'height' => false,
    1003             'class'  => 'avatar',
    1004             'id'     => false,
    1005             'alt'    => $alt
    1006         ) );
    1007 
    1008         /**
    1009          * Filters the avatar for the last sender in the current message thread.
    1010          *
    1011          * @since 1.0.0
    1012          *
    1013          * @param string $value User avatar string.
    1014          */
    1015         return apply_filters( 'bp_get_message_thread_avatar', bp_core_fetch_avatar( array(
    1016             'item_id' => $messages_template->thread->last_sender_id,
    1017             'type'    => $r['type'],
    1018             'alt'     => $r['alt'],
    1019             'css_id'  => $r['id'],
    1020             'class'   => $r['class'],
    1021             'width'   => $r['width'],
    1022             'height'  => $r['height'],
    1023         ) ) );
    1024     }
    1025 
    1026 /**
    1027  * Output the unread messages count for the current inbox.
    1028  */
    1029 function bp_total_unread_messages_count() {
    1030     echo bp_get_total_unread_messages_count();
    1031 }
    1032     /**
    1033      * Get the unread messages count for the current inbox.
    1034      *
    1035      * @return int
    1036      */
    1037     function bp_get_total_unread_messages_count() {
    1038 
    1039         /**
    1040          * Filters the unread messages count for the current inbox.
    1041          *
    1042          * @since 1.0.0
    1043          *
    1044          * @param int $value Unread messages count for the current inbox.
    1045          */
    1046         return apply_filters( 'bp_get_total_unread_messages_count', BP_Messages_Thread::get_inbox_count() );
    1047     }
    1048 
    1049 /**
    1050  * Output the pagination HTML for the current thread loop.
    1051  */
    1052 function bp_messages_pagination() {
    1053     echo bp_get_messages_pagination();
    1054 }
    1055     /**
    1056      * Get the pagination HTML for the current thread loop.
    1057      *
    1058      * @return string
    1059      */
    1060     function bp_get_messages_pagination() {
    1061         global $messages_template;
    1062 
    1063         /**
    1064          * Filters the pagination HTML for the current thread loop.
    1065          *
    1066          * @since 1.0.0
    1067          *
    1068          * @param int $pag_links Pagination HTML for the current thread loop.
    1069          */
    1070         return apply_filters( 'bp_get_messages_pagination', $messages_template->pag_links );
    1071     }
    1072 
    1073 /**
    1074  * Generate the "Viewing message x to y (of z messages)" string for a loop.
    1075  */
    1076 function bp_messages_pagination_count() {
    1077     global $messages_template;
    1078 
    1079     $start_num = intval( ( $messages_template->pag_page - 1 ) * $messages_template->pag_num ) + 1;
    1080     $from_num  = bp_core_number_format( $start_num );
    1081     $to_num    = bp_core_number_format( ( $start_num + ( $messages_template->pag_num - 1 ) > $messages_template->total_thread_count ) ? $messages_template->total_thread_count : $start_num + ( $messages_template->pag_num - 1 ) );
    1082     $total     = bp_core_number_format( $messages_template->total_thread_count );
    1083 
    1084     if ( 1 == $messages_template->total_thread_count ) {
    1085         $message = __( 'Viewing 1 message', 'buddypress' );
    1086     } else {
    1087         $message = sprintf( _n( 'Viewing %1$s - %2$s of %3$s message', 'Viewing %1$s - %2$s of %3$s messages', $messages_template->total_thread_count, 'buddypress' ), $from_num, $to_num, $total );
    1088     }
    1089 
    1090     echo esc_html( $message );
    1091 }
    1092 
    1093 /**
    1094  * Output the Private Message search form.
    1095  *
    1096  * @todo  Move markup to template part in: /members/single/messages/search.php
    1097  * @since 1.6.0
    1098  */
    1099 function bp_message_search_form() {
    1100 
    1101     // Get the default search text.
    1102     $default_search_value = bp_get_search_default_text( 'messages' );
    1103 
    1104     // Setup a few values based on what's being searched for.
    1105     $search_submitted     = ! empty( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : $default_search_value;
    1106     $search_placeholder   = ( $search_submitted === $default_search_value ) ? ' placeholder="' .  esc_attr( $search_submitted ) . '"' : '';
    1107     $search_value         = ( $search_submitted !== $default_search_value ) ? ' value="'       .  esc_attr( $search_submitted ) . '"' : '';
    1108 
    1109     // Start the output buffer, so form can be filtered.
    1110     ob_start(); ?>
    1111 
    1112     <form action="" method="get" id="search-message-form">
    1113         <label for="messages_search" class="bp-screen-reader-text"><?php esc_html_e( 'Search Messages', 'buddypress' ); ?></label>
    1114         <input type="text" name="s" id="messages_search"<?php echo $search_placeholder . $search_value; ?> />
    1115         <input type="submit" class="button" id="messages_search_submit" name="messages_search_submit" value="<?php esc_html_e( 'Search', 'buddypress' ); ?>" />
    1116     </form>
    1117 
    1118     <?php
    1119 
    1120     // Get the search form from the above output buffer.
    1121     $search_form_html = ob_get_clean();
    1122 
    1123     /**
    1124      * Filters the private message component search form.
    1125      *
    1126      * @since 2.2.0
    1127      *
    1128      * @param string $search_form_html HTML markup for the message search form.
    1129      */
    1130     echo apply_filters( 'bp_message_search_form', $search_form_html );
    1131 }
    1132 
    1133 /**
    1134  * Echo the form action for Messages HTML forms.
    1135  */
    1136 function bp_messages_form_action() {
    1137     echo esc_url( bp_get_messages_form_action() );
    1138 }
    1139     /**
    1140      * Return the form action for Messages HTML forms.
    1141      *
    1142      * @return string The form action.
    1143      */
    1144     function bp_get_messages_form_action() {
    1145 
    1146         /**
    1147          * Filters the form action for Messages HTML forms.
    1148          *
    1149          * @since 1.0.0
    1150          *
    1151          * @param string $value The form action.
    1152          */
    1153         return apply_filters( 'bp_get_messages_form_action', trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/' . bp_action_variable( 0 ) ) );
    1154     }
    1155 
    1156 /**
    1157  * Output the default username for the recipient box.
    1158  */
    1159 function bp_messages_username_value() {
    1160     echo esc_attr( bp_get_messages_username_value() );
    1161 }
    1162     /**
    1163      * Get the default username for the recipient box.
    1164      *
    1165      * @return string
    1166      */
    1167     function bp_get_messages_username_value() {
    1168         if ( isset( $_COOKIE['bp_messages_send_to'] ) ) {
    1169 
    1170             /**
    1171              * Filters the default username for the recipient box.
    1172              *
    1173              * Value passed into filter is dependent on if the 'bp_messages_send_to'
    1174              * cookie or 'r' $_GET parameter is set.
    1175              *
    1176              * @since 1.0.0
    1177              *
    1178              * @param string $value Default user name.
    1179              */
    1180             return apply_filters( 'bp_get_messages_username_value', $_COOKIE['bp_messages_send_to'] );
    1181         } elseif ( isset( $_GET['r'] ) && !isset( $_COOKIE['bp_messages_send_to'] ) ) {
    1182             /** This filter is documented in bp-messages-template.php */
    1183             return apply_filters( 'bp_get_messages_username_value', $_GET['r'] );
    1184         }
    1185     }
    1186 
    1187 /**
    1188  * Output the default value for the Subject field.
    1189  */
    1190 function bp_messages_subject_value() {
    1191     echo esc_attr( bp_get_messages_subject_value() );
    1192 }
    1193     /**
    1194      * Get the default value for the Subject field.
    1195      *
    1196      * Will get a value out of $_POST['subject'] if available (ie after a
    1197      * failed submission).
    1198      *
    1199      * @return string
    1200      */
    1201     function bp_get_messages_subject_value() {
    1202 
    1203         // Sanitized in bp-messages-filters.php.
    1204         $subject = ! empty( $_POST['subject'] )
    1205             ? $_POST['subject']
    1206             : '';
    1207 
    1208         /**
    1209          * Filters the default value for the subject field.
    1210          *
    1211          * @since 1.0.0
    1212          *
    1213          * @param string $subject The default value for the subject field.
    1214          */
    1215         return apply_filters( 'bp_get_messages_subject_value', $subject );
    1216     }
    1217 
    1218 /**
    1219  * Output the default value for the Compose content field.
    1220  */
    1221 function bp_messages_content_value() {
    1222     echo esc_textarea( bp_get_messages_content_value() );
    1223 }
    1224     /**
    1225      * Get the default value fo the Compose content field.
    1226      *
    1227      * Will get a value out of $_POST['content'] if available (ie after a
    1228      * failed submission).
    1229      *
    1230      * @return string
    1231      */
    1232     function bp_get_messages_content_value() {
    1233 
    1234         // Sanitized in bp-messages-filters.php.
    1235         $content = ! empty( $_POST['content'] )
    1236             ? $_POST['content']
    1237             : '';
    1238 
    1239         /**
    1240          * Filters the default value for the content field.
    1241          *
    1242          * @since 1.0.0
    1243          *
    1244          * @param string $content The default value for the content field.
    1245          */
    1246         return apply_filters( 'bp_get_messages_content_value', $content );
    1247     }
    1248 
    1249 /**
    1250  * Output the markup for the message type dropdown.
    1251  */
    1252 function bp_messages_options() {
    1253 ?>
    1254 
    1255     <label for="message-type-select" class="bp-screen-reader-text">
    1256         <?php _e( 'Select:', 'buddypress' ) ?>
    1257      </label>
    1258 
    1259     <select name="message-type-select" id="message-type-select">
    1260         <option value=""><?php _e( 'Select', 'buddypress' ); ?></option>
    1261         <option value="read"><?php _ex('Read', 'Message dropdown filter', 'buddypress') ?></option>
    1262         <option value="unread"><?php _ex('Unread', 'Message dropdown filter', 'buddypress') ?></option>
    1263         <option value="all"><?php _ex('All', 'Message dropdown filter', 'buddypress') ?></option>
    1264     </select> &nbsp;
    1265 
    1266     <?php if ( ! bp_is_current_action( 'sentbox' ) && ! bp_is_current_action( 'notices' ) ) : ?>
    1267 
    1268         <a href="#" id="mark_as_read"><?php _ex('Mark as Read', 'Message management markup', 'buddypress') ?></a> &nbsp;
    1269         <a href="#" id="mark_as_unread"><?php _ex('Mark as Unread', 'Message management markup', 'buddypress') ?></a> &nbsp;
    1270 
    1271     <?php endif; ?>
    1272 
    1273     <a href="#" id="delete_<?php echo bp_current_action(); ?>_messages"><?php _e( 'Delete Selected', 'buddypress' ); ?></a> &nbsp;
    1274 
    1275 <?php
    1276 }
    1277 
    1278 /**
    1279  * Output the dropdown for bulk management of messages.
    1280  *
    1281  * @since 2.2.0
    1282  */
    1283 function bp_messages_bulk_management_dropdown() {
    1284     ?>
    1285     <label class="bp-screen-reader-text" for="messages-select"><?php _e( 'Select Bulk Action', 'buddypress' ); ?></label>
    1286     <select name="messages_bulk_action" id="messages-select">
    1287         <option value="" selected="selected"><?php _e( 'Bulk Actions', 'buddypress' ); ?></option>
    1288         <option value="read"><?php _e( 'Mark read', 'buddypress' ); ?></option>
    1289         <option value="unread"><?php _e( 'Mark unread', 'buddypress' ); ?></option>
    1290         <option value="delete"><?php _e( 'Delete', 'buddypress' ); ?></option>
    1291         <?php
    1292             /**
    1293              * Action to add additional options to the messages bulk management dropdown.
    1294              *
    1295              * @since 2.3.0
    1296              */
    1297             do_action( 'bp_messages_bulk_management_dropdown' );
    1298         ?>
    1299     </select>
    1300     <input type="submit" id="messages-bulk-manage" class="button action" value="<?php esc_attr_e( 'Apply', 'buddypress' ); ?>">
    1301     <?php
    1302 }
    1303 
    1304 /**
    1305  * Return whether or not the notice is currently active.
    1306  *
    1307  * @since 1.6.0
    1308  *
    1309  * @return bool
    1310  */
    1311 function bp_messages_is_active_notice() {
    1312     global $messages_template;
    1313 
    1314     $retval = ! empty( $messages_template->thread->is_active )
    1315         ? true
    1316         : false;
    1317 
    1318     /**
    1319      * Filters whether or not the notice is currently active.
    1320      *
    1321      * @since 2.1.0
    1322      *
    1323      * @param bool $retval Whether or not the notice is currently active.
    1324      */
    1325     return apply_filters( 'bp_messages_is_active_notice', $retval );
    1326 }
    1327 
    1328 /**
    1329  * Output a string for the active notice.
    1330  *
    1331  * Since 1.6 this function has been deprecated in favor of text in the theme.
    1332  *
    1333  * @since 1.0.0
    1334  * @deprecated 1.6.0
    1335  * @uses bp_get_message_is_active_notice()
    1336  * @return bool
    1337  */
    1338 function bp_message_is_active_notice() {
    1339     echo bp_get_message_is_active_notice();
    1340 }
    1341     /**
    1342      * Returns a string for the active notice.
    1343      *
    1344      * Since 1.6 this function has been deprecated in favor of text in the
    1345      * theme.
    1346      *
    1347      * @since 1.0.0
    1348      * @deprecated 1.6.0
    1349      * @uses bp_messages_is_active_notice()
    1350      */
    1351     function bp_get_message_is_active_notice() {
    1352 
    1353         $string = bp_messages_is_active_notice()
    1354             ? __( 'Currently Active', 'buddypress' )
    1355             : '';
    1356 
    1357         return apply_filters( 'bp_get_message_is_active_notice', $string );
    1358     }
    1359 
    1360 /**
    1361  * Output the ID of the current notice in the loop.
    1362  */
    1363 function bp_message_notice_id() {
    1364     echo (int) bp_get_message_notice_id();
    1365 }
    1366     /**
    1367      * Get the ID of the current notice in the loop.
    1368      *
    1369      * @return int
    1370      */
    1371     function bp_get_message_notice_id() {
    1372         global $messages_template;
    1373 
    1374         /**
    1375          * Filters the ID of the current notice in the loop.
    1376          *
    1377          * @since 1.5.0
    1378          *
    1379          * @param int $id ID of the current notice in the loop.
    1380          */
    1381         return apply_filters( 'bp_get_message_notice_id', $messages_template->thread->id );
    1382     }
    1383 
    1384 /**
    1385  * Output the post date of the current notice in the loop.
    1386  */
    1387 function bp_message_notice_post_date() {
    1388     echo bp_get_message_notice_post_date();
    1389 }
    1390     /**
    1391      * Get the post date of the current notice in the loop.
    1392      *
    1393      * @return string
    1394      */
    1395     function bp_get_message_notice_post_date() {
    1396         global $messages_template;
    1397 
    1398         /**
    1399          * Filters the post date of the current notice in the loop.
    1400          *
    1401          * @since 1.0.0
    1402          *
    1403          * @param string $value Formatted post date of the current notice in the loop.
    1404          */
    1405         return apply_filters( 'bp_get_message_notice_post_date', bp_format_time( strtotime( $messages_template->thread->date_sent ) ) );
    1406     }
    1407 
    1408 /**
    1409  * Output the subject of the current notice in the loop.
    1410  */
    1411 function bp_message_notice_subject() {
    1412     echo bp_get_message_notice_subject();
    1413 }
    1414     /**
    1415      * Get the subject of the current notice in the loop.
    1416      *
    1417      * @return string
    1418      */
    1419     function bp_get_message_notice_subject() {
    1420         global $messages_template;
    1421 
    1422         /**
    1423          * Filters the subject of the current notice in the loop.
    1424          *
    1425          * @since 1.0.0
    1426          *
    1427          * @param string $subject Subject of the current notice in the loop.
    1428          */
    1429         return apply_filters( 'bp_get_message_notice_subject', $messages_template->thread->subject );
    1430     }
    1431 
    1432 /**
    1433  * Output the text of the current notice in the loop.
    1434  */
    1435 function bp_message_notice_text() {
    1436     echo bp_get_message_notice_text();
    1437 }
    1438     /**
    1439      * Get the text of the current notice in the loop.
    1440      *
    1441      * @return string
    1442      */
    1443     function bp_get_message_notice_text() {
    1444         global $messages_template;
    1445 
    1446         /**
    1447          * Filters the text of the current notice in the loop.
    1448          *
    1449          * @since 1.0.0
    1450          *
    1451          * @param string $message Text for the current notice in the loop.
    1452          */
    1453         return apply_filters( 'bp_get_message_notice_text', $messages_template->thread->message );
    1454     }
    1455 
    1456 /**
    1457  * Output the URL for deleting the current notice.
    1458  */
    1459 function bp_message_notice_delete_link() {
    1460     echo esc_url( bp_get_message_notice_delete_link() );
    1461 }
    1462     /**
    1463      * Get the URL for deleting the current notice.
    1464      *
    1465      * @return string Delete URL.
    1466      */
    1467     function bp_get_message_notice_delete_link() {
    1468         global $messages_template;
    1469 
    1470         /**
    1471          * Filters the URL for deleting the current notice.
    1472          *
    1473          * @since 1.0.0
    1474          *
    1475          * @param string $value URL for deleting the current notice.
    1476          * @param string $value Text indicating action being executed.
    1477          */
    1478         return apply_filters( 'bp_get_message_notice_delete_link', wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . '/notices/delete/' . $messages_template->thread->id, 'messages_delete_thread' ) );
    1479     }
    1480 
    1481 /**
    1482  * Output the URL for deactivating the current notice.
    1483  */
    1484 function bp_message_activate_deactivate_link() {
    1485     echo esc_url( bp_get_message_activate_deactivate_link() );
    1486 }
    1487     /**
    1488      * Get the URL for deactivating the current notice.
    1489      *
    1490      * @return string
    1491      */
    1492     function bp_get_message_activate_deactivate_link() {
    1493         global $messages_template;
    1494 
    1495         if ( 1 === (int) $messages_template->thread->is_active ) {
    1496             $link = wp_nonce_url( trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/notices/deactivate/' . $messages_template->thread->id ), 'messages_deactivate_notice' );
    1497         } else {
    1498             $link = wp_nonce_url( trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/notices/activate/' . $messages_template->thread->id ), 'messages_activate_notice' );
    1499         }
    1500 
    1501         /**
    1502          * Filters the URL for deactivating the current notice.
    1503          *
    1504          * @since 1.0.0
    1505          *
    1506          * @param string $link URL for deactivating the current notice.
    1507          */
    1508         return apply_filters( 'bp_get_message_activate_deactivate_link', $link );
    1509     }
    1510 
    1511 /**
    1512  * Output the Deactivate/Activate text for the notice action link.
    1513  */
    1514 function bp_message_activate_deactivate_text() {
    1515     echo esc_html( bp_get_message_activate_deactivate_text() );
    1516 }
    1517     /**
    1518      * Generate the text ('Deactivate' or 'Activate') for the notice action link.
    1519      *
    1520      * @return string
    1521      */
    1522     function bp_get_message_activate_deactivate_text() {
    1523         global $messages_template;
    1524 
    1525         if ( 1 === (int) $messages_template->thread->is_active  ) {
    1526             $text = __('Deactivate', 'buddypress');
    1527         } else {
    1528             $text = __('Activate', 'buddypress');
    1529         }
    1530 
    1531         /**
    1532          * Filters the "Deactivate" or "Activate" text for notice action links.
    1533          *
    1534          * @since 1.0.0
    1535          *
    1536          * @param string $text Text used for notice action links.
    1537          */
    1538         return apply_filters( 'bp_message_activate_deactivate_text', $text );
    1539     }
    1540 
    1541 /**
    1542  * Output the messages component slug.
    1543  *
    1544  * @since 1.5.0
    1545  *
    1546  * @uses bp_get_messages_slug()
    1547  */
    1548 function bp_messages_slug() {
    1549     echo bp_get_messages_slug();
    1550 }
    1551     /**
    1552      * Return the messages component slug.
    1553      *
    1554      * @since 1.5.0
    1555      *
    1556      * @return string
    1557      */
    1558     function bp_get_messages_slug() {
    1559 
    1560         /**
    1561          * Filters the messages component slug.
    1562          *
    1563          * @since 1.5.0
    1564          *
    1565          * @param string $slug Messages component slug.
    1566          */
    1567         return apply_filters( 'bp_get_messages_slug', buddypress()->messages->slug );
    1568     }
    1569 
    1570 /**
    1571  * Generate markup for currently active notices.
    1572  */
    1573 function bp_message_get_notices() {
    1574     $notice = BP_Messages_Notice::get_active();
    1575 
    1576     if ( empty( $notice ) ) {
    1577         return false;
    1578     }
    1579 
    1580     $closed_notices = bp_get_user_meta( bp_loggedin_user_id(), 'closed_notices', true );
    1581 
    1582     if ( empty( $closed_notices ) ) {
    1583         $closed_notices = array();
    1584     }
    1585 
    1586     if ( is_array( $closed_notices ) ) {
    1587         if ( !in_array( $notice->id, $closed_notices ) && $notice->id ) {
    1588             ?>
    1589             <div id="message" class="info notice" rel="n-<?php echo esc_attr( $notice->id ); ?>">
    1590                 <p>
    1591                     <strong><?php echo stripslashes( wp_filter_kses( $notice->subject ) ) ?></strong><br />
    1592                     <?php echo stripslashes( wp_filter_kses( $notice->message) ) ?>
    1593                     <a href="#" id="close-notice"><?php _e( 'Close', 'buddypress' ) ?></a>
    1594                 </p>
    1595             </div>
    1596             <?php
    1597         }
    1598     }
    1599 }
    1600 
    1601 /**
    1602  * Output the URL for the Private Message link in member profile headers.
    1603  */
    1604 function bp_send_private_message_link() {
    1605     echo esc_url( bp_get_send_private_message_link() );
    1606 }
    1607     /**
    1608      * Generate the URL for the Private Message link in member profile headers.
    1609      *
    1610      * @return bool|string False on failure, otherwise the URL.
    1611      */
    1612     function bp_get_send_private_message_link() {
    1613 
    1614         if ( bp_is_my_profile() || ! is_user_logged_in() ) {
    1615             return false;
    1616         }
    1617 
    1618         /**
    1619          * Filters the URL for the Private Message link in member profile headers.
    1620          *
    1621          * @since 1.2.10
    1622          *
    1623          * @param string $value URL for the Private Message link in member profile headers.
    1624          */
    1625         return apply_filters( 'bp_get_send_private_message_link', wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . '/compose/?r=' . bp_core_get_username( bp_displayed_user_id() ) ) );
    1626     }
    1627 
    1628 /**
    1629  * Output the 'Private Message' button for member profile headers.
    1630  *
    1631  * Explicitly named function to avoid confusion with public messages.
    1632  *
    1633  * @since 1.2.6
    1634  *
    1635  * @uses bp_get_send_message_button()
    1636  */
    1637 function bp_send_private_message_button() {
    1638     echo bp_get_send_message_button();
    1639 }
    1640 
    1641 /**
    1642  * Output the 'Private Message' button for member profile headers.
    1643  */
    1644 function bp_send_message_button() {
    1645     echo bp_get_send_message_button();
    1646 }
    1647     /**
    1648      * Generate the 'Private Message' button for member profile headers.
    1649      *
    1650      * @return string
    1651      */
    1652     function bp_get_send_message_button() {
    1653         // Note: 'bp_get_send_message_button' is a legacy filter. Use
    1654         // 'bp_get_send_message_button_args' instead. See #4536.
    1655         return apply_filters( 'bp_get_send_message_button',
    1656 
    1657             /**
    1658              * Filters the "Private Message" button for member profile headers.
    1659              *
    1660              * @since 1.8.0
    1661              *
    1662              * @param array $value See {@link BP_Button}.
    1663              */
    1664             bp_get_button( apply_filters( 'bp_get_send_message_button_args', array(
    1665                 'id'                => 'private_message',
    1666                 'component'         => 'messages',
    1667                 'must_be_logged_in' => true,
    1668                 'block_self'        => true,
    1669                 'wrapper_id'        => 'send-private-message',
    1670                 'link_href'         => bp_get_send_private_message_link(),
    1671                 'link_title'        => __( 'Send a private message to this user.', 'buddypress' ),
    1672                 'link_text'         => __( 'Private Message', 'buddypress' ),
    1673                 'link_class'        => 'send-message',
    1674             ) ) )
    1675         );
    1676     }
    1677 
    1678 /**
    1679  * Output the URL of the Messages AJAX loader gif.
    1680  */
    1681 function bp_message_loading_image_src() {
    1682     echo esc_url( bp_get_message_loading_image_src() );
    1683 }
    1684     /**
    1685      * Get the URL of the Messages AJAX loader gif.
    1686      *
    1687      * @return string
    1688      */
    1689     function bp_get_message_loading_image_src() {
    1690 
    1691         /**
    1692          * Filters the URL of the Messages AJAX loader gif.
    1693          *
    1694          * @since 1.0.0
    1695          *
    1696          * @param string $value URL of the Messages AJAX loader gif.
    1697          */
    1698         return apply_filters( 'bp_get_message_loading_image_src', buddypress()->messages->image_base . '/ajax-loader.gif' );
    1699     }
    1700 
    1701 /**
    1702  * Output the markup for the message recipient tabs.
    1703  */
    1704 function bp_message_get_recipient_tabs() {
    1705     $recipients = explode( ' ', bp_get_message_get_recipient_usernames() );
    1706 
    1707     foreach ( $recipients as $recipient ) {
    1708 
    1709         $user_id = bp_is_username_compatibility_mode()
    1710             ? bp_core_get_userid( $recipient )
    1711             : bp_core_get_userid_from_nicename( $recipient );
    1712 
    1713         if ( ! empty( $user_id ) ) : ?>
    1714 
    1715             <li id="un-<?php echo esc_attr( $recipient ); ?>" class="friend-tab">
    1716                 <span><?php
    1717                     echo bp_core_fetch_avatar( array( 'item_id' => $user_id, 'type' => 'thumb', 'width' => 15, 'height' => 15 ) );
    1718                     echo bp_core_get_userlink( $user_id );
    1719                 ?></span>
    1720             </li>
    1721 
    1722         <?php endif;
    1723     }
    1724 }
    1725 
    1726 /**
    1727  * Output recipient usernames for prefilling the 'To' field on the Compose screen.
    1728  */
    1729 function bp_message_get_recipient_usernames() {
    1730     echo esc_attr( bp_get_message_get_recipient_usernames() );
    1731 }
    1732     /**
    1733      * Get the recipient usernames for prefilling the 'To' field on the Compose screen.
    1734      *
    1735      * @return string
    1736      */
    1737     function bp_get_message_get_recipient_usernames() {
    1738 
    1739         // Sanitized in bp-messages-filters.php.
    1740         $recipients = isset( $_GET['r'] )
    1741             ? $_GET['r']
    1742             : '';
    1743 
    1744         /**
    1745          * Filters the recipients usernames for prefilling the 'To' field on the Compose screen.
    1746          *
    1747          * @since 1.0.0
    1748          *
    1749          * @param string $recipients Recipients usernames for 'To' field prefilling.
    1750          */
    1751         return apply_filters( 'bp_get_message_get_recipient_usernames', $recipients );
    1752     }
    1753 
    1754 /**
    1755  * Message Thread Template Class
    1756  */
    1757 class BP_Messages_Thread_Template {
    1758 
    1759     /**
    1760      * The loop iterator.
    1761      *
    1762      * @var int
    1763      */
    1764     public $current_message = -1;
    1765 
    1766     /**
    1767      * Number of messages returned by the paged query.
    1768      *
    1769      * @var int
    1770      */
    1771     public $message_count = 0;
    1772 
    1773     /**
    1774      * The message object currently being iterated on.
    1775      *
    1776      * @var object
    1777      */
    1778     public $message;
    1779 
    1780     /**
    1781      * Thread that the current messages belong to.
    1782      *
    1783      * @var BP_Messages_Thread
    1784      */
    1785     public $thread;
    1786 
    1787     /**
    1788      * A flag for whether the loop is currently being iterated.
    1789      *
    1790      * @var bool
    1791      */
    1792     public $in_the_loop = false;
    1793 
    1794     /**
    1795      * The page number being requested.
    1796      *
    1797      * @var int
    1798      */
    1799     public $pag_page = 1;
    1800 
    1801     /**
    1802      * The number of items being requested per page.
    1803      *
    1804      * @var int
    1805      */
    1806     public $pag_num = 10;
    1807 
    1808     /**
    1809      * An HTML string containing pagination links.
    1810      *
    1811      * @var string
    1812      */
    1813     public $pag_links = '';
    1814 
    1815     /**
    1816      * The total number of messages matching the query.
    1817      *
    1818      * @var int
    1819      */
    1820     public $total_message_count = 0;
    1821 
    1822     /**
    1823      * Constructor method.
    1824      *
    1825      * @see BP_Messages_Thread::populate() for full parameter info.
    1826      *
    1827      * @param int    $thread_id ID of the message thread to display.
    1828      * @param string $order     Order to show the thread's messages in.
    1829      * @param array  $args      Array of arguments for the query.
    1830      */
    1831     public function __construct( $thread_id = 0, $order = 'ASC', $args = array() ) {
    1832         $this->thread        = new BP_Messages_Thread( $thread_id, $order, $args );
    1833         $this->message_count = count( $this->thread->messages );
    1834     }
    1835 
    1836     /**
    1837      * Whether there are messages available in the loop.
    1838      *
    1839      * @see bp_thread_has_messages()
    1840      *
    1841      * @return bool True if there are items in the loop, otherwise false.
    1842      */
    1843     public function has_messages() {
    1844         if ( ! empty( $this->message_count ) ) {
    1845             return true;
    1846         }
    1847 
    1848         return false;
    1849     }
    1850 
    1851     /**
    1852      * Set up the next member and iterate index.
    1853      *
    1854      * @return object The next member to iterate over.
    1855      */
    1856     public function next_message() {
    1857         $this->current_message++;
    1858         $this->message = $this->thread->messages[ $this->current_message ];
    1859 
    1860         return $this->message;
    1861     }
    1862 
    1863     /**
    1864      * Rewind the messages and reset message index.
    1865      */
    1866     public function rewind_messages() {
    1867         $this->current_message = -1;
    1868         if ( $this->message_count > 0 ) {
    1869             $this->message = $this->thread->messages[0];
    1870         }
    1871     }
    1872 
    1873     /**
    1874      * Whether there are messages left in the loop to iterate over.
    1875      *
    1876      * This method is used by {@link bp_thread_messages()} as part of the
    1877      * while loop that controls iteration inside the messages loop, eg:
    1878      *     while ( bp_thread_messages() ) { ...
    1879      *
    1880      * @see bp_thread_messages()
    1881      *
    1882      * @return bool True if there are more messages to show, otherwise false.
    1883      */
    1884     public function messages() {
    1885         if ( ( $this->current_message + 1 ) < $this->message_count ) {
    1886             return true;
    1887         } elseif ( ( $this->current_message + 1 ) === $this->message_count ) {
    1888 
    1889             /**
    1890              * Fires when at the end of messages to iterate over.
    1891              *
    1892              * @since 1.1.0
    1893              */
    1894             do_action( 'thread_loop_end' );
    1895             // Do some cleaning up after the loop.
    1896             $this->rewind_messages();
    1897         }
    1898 
    1899         $this->in_the_loop = false;
    1900         return false;
    1901     }
    1902 
    1903     /**
    1904      * Set up the current message inside the loop.
    1905      *
    1906      * Used by {@link bp_thread_the_message()} to set up the current
    1907      * message data while looping, so that template tags used during
    1908      * that iteration make reference to the current message.
    1909      *
    1910      * @see bp_thread_the_message()
    1911      */
    1912     public function the_message() {
    1913         $this->in_the_loop = true;
    1914         $this->message     = $this->next_message();
    1915 
    1916         // Loop has just started.
    1917         if ( 0 === $this->current_message ) {
    1918 
    1919             /**
    1920              * Fires if at the start of the message loop.
    1921              *
    1922              * @since 1.1.0
    1923              */
    1924             do_action( 'thread_loop_start' );
    1925         }
    1926     }
    1927 }
    1928 
    1929 /**
    1930  * Initialize the messages template loop for a specific thread.
    1931  *
    1932  * @param array|string $args {
    1933  *     Array of arguments. All are optional.
    1934  *     @type int    $thread_id         ID of the thread whose messages you are displaying.
    1935  *                                     Default: if viewing a thread, the thread ID will be parsed from
    1936  *                                     the URL (bp_action_variable( 0 )).
    1937  *     @type string $order             'ASC' or 'DESC'. Default: 'ASC'.
    1938  *     @type bool   $update_meta_cache Whether to pre-fetch metadata for
    1939  *                                     queried message items. Default: true.
    1940  * }
    1941  * @return bool True if there are messages to display, otherwise false.
    1942  */
    1943 function bp_thread_has_messages( $args = '' ) {
    1944     global $thread_template;
    1945 
    1946     $r = bp_parse_args( $args, array(
    1947         'thread_id'         => false,
    1948         'order'             => 'ASC',
    1949         'update_meta_cache' => true,
    1950     ), 'thread_has_messages' );
    1951 
    1952     if ( empty( $r['thread_id'] ) && bp_is_messages_component() && bp_is_current_action( 'view' ) ) {
    1953         $r['thread_id'] = (int) bp_action_variable( 0 );
    1954     }
    1955 
    1956     // Set up extra args.
    1957     $extra_args = $r;
    1958     unset( $extra_args['thread_id'], $extra_args['order'] );
    1959 
    1960     $thread_template = new BP_Messages_Thread_Template( $r['thread_id'], $r['order'], $extra_args );
    1961 
    1962     return $thread_template->has_messages();
    1963 }
    1964 
    1965 /**
    1966  * Output the 'ASC' or 'DESC' messages order string for this loop.
    1967  */
    1968 function bp_thread_messages_order() {
    1969     echo esc_attr( bp_get_thread_messages_order() );
    1970 }
    1971     /**
    1972      * Get the 'ASC' or 'DESC' messages order string for this loop.
    1973      *
    1974      * @return string
    1975      */
    1976     function bp_get_thread_messages_order() {
    1977         global $thread_template;
    1978         return $thread_template->thread->messages_order;
    1979     }
    1980 
    1981 /**
    1982  * Check whether there are more messages to iterate over.
    1983  *
    1984  * @return bool
    1985  */
    1986 function bp_thread_messages() {
    1987     global $thread_template;
    1988 
    1989     return $thread_template->messages();
    1990 }
    1991 
    1992 /**
    1993  * Set up the current thread inside the loop.
    1994  *
    1995  * @return object
    1996  */
    1997 function bp_thread_the_message() {
    1998     global $thread_template;
    1999 
    2000     return $thread_template->the_message();
    2001 }
    2002 
    2003 /**
    2004  * Output the ID of the thread that the current loop belongs to.
    2005  */
    2006 function bp_the_thread_id() {
    2007     echo (int) bp_get_the_thread_id();
    2008 }
    2009     /**
    2010      * Get the ID of the thread that the current loop belongs to.
    2011      *
    2012      * @return int
    2013      */
    2014     function bp_get_the_thread_id() {
    2015         global $thread_template;
    2016 
    2017         /**
    2018          * Filters the ID of the thread that the current loop belongs to.
    2019          *
    2020          * @since 1.1.0
    2021          *
    2022          * @param int $thread_id ID of the thread.
    2023          */
    2024         return apply_filters( 'bp_get_the_thread_id', $thread_template->thread->thread_id );
    2025     }
    2026 
    2027 /**
    2028  * Output the subject of the thread currently being iterated over.
    2029  */
    2030 function bp_the_thread_subject() {
    2031     echo bp_get_the_thread_subject();
    2032 }
    2033     /**
    2034      * Get the subject of the thread currently being iterated over.
    2035      *
    2036      * @return string
    2037      */
    2038     function bp_get_the_thread_subject() {
    2039         global $thread_template;
    2040 
    2041         /**
    2042          * Filters the subject of the thread currently being iterated over.
    2043          *
    2044          * @since 1.1.0
    2045          *
    2046          * @return string $last_message_subject Subject of the thread currently being iterated over.
    2047          */
    2048         return apply_filters( 'bp_get_the_thread_subject', $thread_template->thread->last_message_subject );
    2049     }
    2050 
    2051 /**
    2052  * Get a list of thread recipients or a "x recipients" string.
    2053  *
    2054  * In BuddyPress 2.2.0, this parts of this functionality were moved into the
    2055  * members/single/messages/single.php template. This function is no longer used
    2056  * by BuddyPress.
    2057  *
    2058  * @return string
    2059  */
    2060 function bp_get_the_thread_recipients() {
    2061     if ( 5 <= bp_get_thread_recipients_count() ) {
    2062         $recipients = sprintf( __( '%s recipients', 'buddypress' ), number_format_i18n( bp_get_thread_recipients_count() ) );
    2063     } else {
    2064         $recipients = bp_get_thread_recipients_list();
    2065     }
    2066 
    2067     return apply_filters( 'bp_get_the_thread_recipients', $recipients );
    2068 }
    2069 
    2070 /**
    2071  * Get the number of recipients in the current thread.
    2072  *
    2073  * @since 2.2.0
    2074  *
    2075  * @return int
    2076  */
    2077 function bp_get_thread_recipients_count() {
    2078     global $thread_template;
    2079     return count( $thread_template->thread->recipients );
    2080 }
    2081 
    2082 /**
    2083  * Get the max number of recipients to list in the 'Conversation between...' gloss.
    2084  *
    2085  * @since 2.3.0
    2086  *
    2087  * @return int
    2088  */
    2089 function bp_get_max_thread_recipients_to_list() {
    2090     /**
    2091      * Filters the max number of recipients to list in the 'Conversation between...' gloss.
    2092      *
    2093      * @since 2.3.0
    2094      *
    2095      * @param int $count Recipient count. Default: 5.
    2096      */
    2097     return (int) apply_filters( 'bp_get_max_thread_recipients_to_list', 5 );
    2098 }
    2099 
    2100 /**
    2101  * Output HTML links to recipients in the current thread.
    2102  *
    2103  * @since 2.2.0
    2104  */
    2105 function bp_the_thread_recipients_list() {
    2106     echo bp_get_thread_recipients_list();
    2107 }
    2108     /**
    2109      * Generate HTML links to the profiles of recipients in the current thread.
    2110      *
    2111      * @since 2.2.0
    2112      *
    2113      * @return string
    2114      */
    2115     function bp_get_thread_recipients_list() {
    2116         global $thread_template;
    2117 
    2118         $recipient_links = array();
    2119 
    2120         foreach( (array) $thread_template->thread->recipients as $recipient ) {
    2121             if ( (int) $recipient->user_id !== bp_loggedin_user_id() ) {
    2122                 $recipient_link = bp_core_get_userlink( $recipient->user_id );
    2123 
    2124                 if ( empty( $recipient_link ) ) {
    2125                     $recipient_link = __( 'Deleted User', 'buddypress' );
    2126                 }
    2127 
    2128                 $recipient_links[] = $recipient_link;
    2129             }
    2130         }
    2131 
    2132         /**
    2133          * Filters the HTML links to the profiles of recipients in the current thread.
    2134          *
    2135          * @since 2.2.0
    2136          *
    2137          * @param string $value Comma-separated list of recipient HTML links for current thread.
    2138          */
    2139         return apply_filters( 'bp_get_the_thread_recipients_list', implode( ', ', $recipient_links ) );
    2140     }
    2141 
    2142 /**
    2143  * Echo the ID of the current message in the thread.
    2144  *
    2145  * @since 1.9.0
    2146  */
    2147 function bp_the_thread_message_id() {
    2148     echo (int) bp_get_the_thread_message_id();
    2149 }
    2150     /**
    2151      * Get the ID of the current message in the thread.
    2152      *
    2153      * @since 1.9.0
    2154      *
    2155      * @return int
    2156      */
    2157     function bp_get_the_thread_message_id() {
    2158         global $thread_template;
    2159 
    2160         $thread_message_id = isset( $thread_template->message->id )
    2161             ? (int) $thread_template->message->id
    2162             : null;
    2163 
    2164         /**
    2165          * Filters the ID of the current message in the thread.
    2166          *
    2167          * @since 1.9.0
    2168          *
    2169          * @param int $thread_message_id ID of the current message in the thread.
    2170          */
    2171         return apply_filters( 'bp_get_the_thread_message_id', $thread_message_id );
    2172     }
    2173 
    2174 /**
    2175  * Output the CSS classes for messages within a single thread.
    2176  *
    2177  * @since 2.1.0
    2178  */
    2179 function bp_the_thread_message_css_class() {
    2180     echo esc_attr( bp_get_the_thread_message_css_class() );
    2181 }
    2182     /**
    2183      * Generate the CSS classes for messages within a single thread.
    2184      *
    2185      * @since 2.1.0
    2186      *
    2187      * @return string
    2188      */
    2189     function bp_get_the_thread_message_css_class() {
    2190         global $thread_template;
    2191 
    2192         $classes = array();
    2193 
    2194         // Zebra-striping.
    2195         $classes[] = bp_get_the_thread_message_alt_class();
    2196 
    2197         // ID of the sender.
    2198         $classes[] = 'sent-by-' . intval( $thread_template->message->sender_id );
    2199 
    2200         // Whether the sender is the same as the logged-in user.
    2201         if ( bp_loggedin_user_id() == $thread_template->message->sender_id ) {
    2202             $classes[] = 'sent-by-me';
    2203         }
    2204 
    2205         /**
    2206          * Filters the CSS classes for messages within a single thread.
    2207          *
    2208          * @since 2.1.0
    2209          *
    2210          * @param array $classes Array of classes to add to the HTML class attribute.
    2211          */
    2212         $classes = apply_filters( 'bp_get_the_thread_message_css_class', $classes );
    2213 
    2214         return implode( ' ', $classes );
    2215     }
    2216 
    2217 /**
    2218  * Output the CSS class used for message zebra striping.
    2219  */
    2220 function bp_the_thread_message_alt_class() {
    2221     echo esc_attr( bp_get_the_thread_message_alt_class() );
    2222 }
    2223     /**
    2224      * Get the CSS class used for message zebra striping.
    2225      *
    2226      * @return string
    2227      */
    2228     function bp_get_the_thread_message_alt_class() {
    2229         global $thread_template;
    2230 
    2231         if ( $thread_template->current_message % 2 == 1 ) {
    2232             $class = 'even alt';
    2233         } else {
    2234             $class = 'odd';
    2235         }
    2236 
    2237         /**
    2238          * Filters the CSS class used for message zebra striping.
    2239          *
    2240          * @since 1.1.0
    2241          *
    2242          * @param string $class Class determined to be next for zebra striping effect.
    2243          */
    2244         return apply_filters( 'bp_get_the_thread_message_alt_class', $class );
    2245     }
    2246 
    2247 /**
    2248  * Output the ID for message sender within a single thread.
    2249  *
    2250  * @since 2.1.0
    2251  */
    2252 function bp_the_thread_message_sender_id() {
    2253     echo (int) bp_get_the_thread_message_sender_id();
    2254 }
    2255     /**
    2256      * Return the ID for message sender within a single thread.
    2257      *
    2258      * @since 2.1.0
    2259      *
    2260      * @return string
    2261      */
    2262     function bp_get_the_thread_message_sender_id() {
    2263         global $thread_template;
    2264 
    2265         $user_id = ! empty( $thread_template->message->sender_id )
    2266             ? $thread_template->message->sender_id
    2267             : 0;
    2268 
    2269         /**
    2270          * Filters the ID for message sender within a single thread.
    2271          *
    2272          * @since 2.1.0
    2273          *
    2274          * @param int $user_id ID of the message sender.
    2275          */
    2276         return (int) apply_filters( 'bp_get_the_thread_message_sender_id', (int) $user_id );
    2277     }
    2278 
    2279 /**
    2280  * Output the avatar for the current message sender.
    2281  *
    2282  * @param array|string $args See {@link bp_get_the_thread_message_sender_avatar_thumb()}
    2283  *                           for a description.
    2284  */
    2285 function bp_the_thread_message_sender_avatar( $args = '' ) {
    2286     echo bp_get_the_thread_message_sender_avatar_thumb( $args );
    2287 }
    2288     /**
    2289      * Get the avatar for the current message sender.
    2290      *
    2291      * @param array|string $args {
    2292      *     Array of arguments. See {@link bp_core_fetch_avatar()} for more
    2293      *     complete details. All arguments are optional.
    2294      *     @type string $type   Avatar type. Default: 'thumb'.
    2295      *     @type int    $width  Avatar width. Default: default for your $type.
    2296      *     @type int    $height Avatar height. Default: default for your $type.
    2297      * }
    2298      * @return string <img> tag containing the avatar.
    2299      */
    2300     function bp_get_the_thread_message_sender_avatar_thumb( $args = '' ) {
    2301         global $thread_template;
    2302 
    2303         $r = bp_parse_args( $args, array(
    2304             'type'   => 'thumb',
    2305             'width'  => false,
    2306             'height' => false,
    2307         ) );
    2308 
    2309         /**
    2310          * Filters the avatar for the current message sender.
    2311          *
    2312          * @since 1.1.0
    2313          *
    2314          * @param string $value <img> tag containing the avatar value.
    2315          */
    2316         return apply_filters( 'bp_get_the_thread_message_sender_avatar_thumb', bp_core_fetch_avatar( array(
    2317             'item_id' => $thread_template->message->sender_id,
    2318             'type'    => $r['type'],
    2319             'width'   => $r['width'],
    2320             'height'  => $r['height'],
    2321             'alt'     => bp_core_get_user_displayname( $thread_template->message->sender_id )
    2322         ) ) );
    2323     }
    2324 
    2325 /**
    2326  * Output a link to the sender of the current message.
    2327  *
    2328  * @since 1.1.0
    2329  */
    2330 function bp_the_thread_message_sender_link() {
    2331     echo esc_url( bp_get_the_thread_message_sender_link() );
    2332 }
    2333     /**
    2334      * Get a link to the sender of the current message.
    2335      *
    2336      * @since 1.1.0
    2337      *
    2338      * @return string
    2339      */
    2340     function bp_get_the_thread_message_sender_link() {
    2341         global $thread_template;
    2342 
    2343         /**
    2344          * Filters the link to the sender of the current message.
    2345          *
    2346          * @since 1.1.0
    2347          *
    2348          * @param string $value Link to the sender of the current message.
    2349          */
    2350         return apply_filters( 'bp_get_the_thread_message_sender_link', bp_core_get_userlink( $thread_template->message->sender_id, false, true ) );
    2351     }
    2352 
    2353 /**
    2354  * Output the display name of the sender of the current message.
    2355  *
    2356  * @since 1.1.0
    2357  */
    2358 function bp_the_thread_message_sender_name() {
    2359     echo esc_html( bp_get_the_thread_message_sender_name() );
    2360 }
    2361     /**
    2362      * Get the display name of the sender of the current message.
    2363      *
    2364      * @since 1.1.0
    2365      *
    2366      * @return string
    2367      */
    2368     function bp_get_the_thread_message_sender_name() {
    2369         global $thread_template;
    2370 
    2371         $display_name = bp_core_get_user_displayname( $thread_template->message->sender_id );
    2372 
    2373         if ( empty( $display_name ) ) {
    2374             $display_name = __( 'Deleted User', 'buddypress' );
    2375         }
    2376 
    2377         /**
    2378          * Filters the display name of the sender of the current message.
    2379          *
    2380          * @since 1.1.0
    2381          *
    2382          * @param string $display_name Display name of the sender of the current message.
    2383          */
    2384         return apply_filters( 'bp_get_the_thread_message_sender_name', $display_name );
    2385     }
    2386 
    2387 /**
    2388  * Output the URL for deleting the current thread.
    2389  *
    2390  * @since 1.5.0
    2391  */
    2392 function bp_the_thread_delete_link() {
    2393     echo esc_url( bp_get_the_thread_delete_link() );
    2394 }
    2395     /**
    2396      * Get the URL for deleting the current thread.
    2397      *
    2398      * @since 1.5.0
    2399      *
    2400      * @return string URL
    2401      */
    2402     function bp_get_the_thread_delete_link() {
    2403 
    2404         /**
    2405          * Filters the URL for deleting the current thread.
    2406          *
    2407          * @since 1.0.0
    2408          *
    2409          * @param string $value URL for deleting the current thread.
    2410          * @param string $value Text indicating action being executed.
    2411          */
    2412         return apply_filters( 'bp_get_message_thread_delete_link', wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . '/inbox/delete/' . bp_get_the_thread_id(), 'messages_delete_thread' ) );
    2413     }
    2414 
    2415 /**
    2416  * Output the 'Sent x hours ago' string for the current message.
    2417  *
    2418  * @since 1.1.0
    2419  */
    2420 function bp_the_thread_message_time_since() {
    2421     echo bp_get_the_thread_message_time_since();
    2422 }
    2423     /**
    2424      * Generate the 'Sent x hours ago' string for the current message.
    2425      *
    2426      * @since 1.1.0
    2427      *
    2428      * @return string
    2429      */
    2430     function bp_get_the_thread_message_time_since() {
    2431 
    2432         /**
    2433          * Filters the 'Sent x hours ago' string for the current message.
    2434          *
    2435          * @since 1.1.0
    2436          *
    2437          * @param string $value Default text of 'Sent x hours ago'.
    2438          */
    2439         return apply_filters( 'bp_get_the_thread_message_time_since', sprintf( __( 'Sent %s', 'buddypress' ), bp_core_time_since( bp_get_the_thread_message_date_sent() ) ) );
    2440     }
    2441 
    2442 /**
    2443  * Output the timestamp for the current message.
    2444  *
    2445  * @since 2.1.0
    2446  */
    2447 function bp_the_thread_message_date_sent() {
    2448     echo bp_get_the_thread_message_date_sent();
    2449 }
    2450     /**
    2451      * Generate the 'Sent x hours ago' string for the current message.
    2452      *
    2453      * @since 2.1.0
    2454      *
    2455      * @uses strtotime() To convert the message string into a usable timestamp.
    2456      *
    2457      * @return int
    2458      */
    2459     function bp_get_the_thread_message_date_sent() {
    2460         global $thread_template;
    2461 
    2462         /**
    2463          * Filters the date sent value for the current message as a timestamp.
    2464          *
    2465          * @since 2.1.0
    2466          *
    2467          * @param string $value Timestamp of the date sent value for the current message.
    2468          */
    2469         return apply_filters( 'bp_get_the_thread_message_date_sent', strtotime( $thread_template->message->date_sent ) );
    2470     }
    2471 
    2472 /**
    2473  * Output the content of the current message in the loop.
    2474  *
    2475  * @since 1.1.0
    2476  */
    2477 function bp_the_thread_message_content() {
    2478     echo bp_get_the_thread_message_content();
    2479 }
    2480     /**
    2481      * Get the content of the current message in the loop.
    2482      *
    2483      * @since 1.1.0
    2484      *
    2485      * @return string
    2486      */
    2487     function bp_get_the_thread_message_content() {
    2488         global $thread_template;
    2489 
    2490         /**
    2491          * Filters the content of the current message in the loop.
    2492          *
    2493          * @since 1.1.0
    2494          *
    2495          * @param string $message The content of the current message in the loop.
    2496          */
    2497         return apply_filters( 'bp_get_the_thread_message_content', $thread_template->message->message );
    2498     }
    2499 
    2500 /** Embeds *******************************************************************/
    2501 
    2502 /**
    2503  * Enable oEmbed support for Messages.
    2504  *
    2505  * @since 1.5.0
    2506  *
    2507  * @see BP_Embed
    2508  */
    2509 function bp_messages_embed() {
    2510     add_filter( 'embed_post_id',         'bp_get_the_thread_message_id' );
    2511     add_filter( 'bp_embed_get_cache',    'bp_embed_message_cache',      10, 3 );
    2512     add_action( 'bp_embed_update_cache', 'bp_embed_message_save_cache', 10, 3 );
    2513 }
    2514 add_action( 'thread_loop_start', 'bp_messages_embed' );
    2515 
    2516 /**
    2517  * Fetch a private message item's cached embeds.
    2518  *
    2519  * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}.
    2520  *
    2521  * @since 2.2.0
    2522  *
    2523  * @param string $cache    An empty string passed by BP_Embed::parse_oembed() for
    2524  *                         functions like this one to filter.
    2525  * @param int    $id       The ID of the message item.
    2526  * @param string $cachekey The cache key generated in BP_Embed::parse_oembed().
    2527  * @return mixed The cached embeds for this message item.
    2528  */
    2529 function bp_embed_message_cache( $cache, $id, $cachekey ) {
    2530     return bp_messages_get_meta( $id, $cachekey );
    2531 }
    2532 
    2533 /**
    2534  * Set a private message item's embed cache.
    2535  *
    2536  * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}.
    2537  *
    2538  * @since 2.2.0
    2539  *
    2540  * @param string $cache    An empty string passed by BP_Embed::parse_oembed() for
    2541  *                         functions like this one to filter.
    2542  * @param string $cachekey The cache key generated in BP_Embed::parse_oembed().
    2543  * @param int    $id       The ID of the message item.
    2544  */
    2545 function bp_embed_message_save_cache( $cache, $cachekey, $id ) {
    2546     bp_messages_update_meta( $id, $cachekey, $cache );
    2547 }
  • trunk/src/bp-messages/classes/class-bp-messages-component.php

    r10515 r10522  
    341341    }
    342342}
    343 
    344 /**
    345  * Bootstrap the Messages component.
    346  */
    347 function bp_setup_messages() {
    348     buddypress()->messages = new BP_Messages_Component();
    349 }
    350 add_action( 'bp_setup_components', 'bp_setup_messages', 6 );
  • trunk/src/bp-messages/classes/class-bp-messages-sitewide-notices-widget.php

    r10515 r10522  
    11<?php
    22/**
    3  * BuddyPress Messages Widgets.
     3 * BuddyPress Messages Sitewide Notices Widget.
    44 *
    55 * @package BuddyPress
     
    1010// Exit if accessed directly.
    1111defined( 'ABSPATH' ) || exit;
    12 
    13 /**
    14  * Register widgets for the Messages component.
    15  *
    16  * @since 1.9.0
    17  */
    18 function bp_messages_register_widgets() {
    19     add_action( 'widgets_init', create_function('', 'return register_widget( "BP_Messages_Sitewide_Notices_Widget" );') );
    20 }
    21 add_action( 'bp_register_widgets', 'bp_messages_register_widgets' );
    2212
    2313/**
  • trunk/src/bp-messages/classes/class-bp-messages-thread-template.php

    r10515 r10522  
    11<?php
    22/**
    3  * BuddyPress Messages Template Tags.
     3 * BuddyPress Messages Thread Template Class.
    44 *
    55 * @package BuddyPress
     
    1010// Exit if accessed directly.
    1111defined( 'ABSPATH' ) || exit;
    12 
    13 /**
    14  * Message Box Template Class
    15  */
    16 class BP_Messages_Box_Template {
    17 
    18     /**
    19      * The loop iterator.
    20      *
    21      * @var int
    22      */
    23     public $current_thread = -1;
    24 
    25     /**
    26      * The number of threads returned by the paged query.
    27      *
    28      * @var int
    29      */
    30     public $current_thread_count = 0;
    31 
    32     /**
    33      * Total number of threads matching the query params.
    34      *
    35      * @var int
    36      */
    37     public $total_thread_count = 0;
    38 
    39     /**
    40      * Array of threads located by the query.
    41      *
    42      * @var array
    43      */
    44     public $threads = array();
    45 
    46     /**
    47      * The thread object currently being iterated on.
    48      *
    49      * @var object
    50      */
    51     public $thread = false;
    52 
    53     /**
    54      * A flag for whether the loop is currently being iterated.
    55      *
    56      * @var bool
    57      */
    58     public $in_the_loop = false;
    59 
    60     /**
    61      * User ID of the current inbox.
    62      *
    63      * @var int
    64      */
    65     public $user_id = 0;
    66 
    67     /**
    68      * The current "box" view ('notices', 'sentbox', 'inbox').
    69      *
    70      * @var string
    71      */
    72     public $box = 'inbox';
    73 
    74     /**
    75      * The page number being requested.
    76      *
    77      * @var int
    78      */
    79     public $pag_page = 1;
    80 
    81     /**
    82      * The number of items being requested per page.
    83      *
    84      * @var int
    85      */
    86     public $pag_num = 10;
    87 
    88     /**
    89      * An HTML string containing pagination links.
    90      *
    91      * @var string
    92      */
    93     public $pag_links = '';
    94 
    95     /**
    96      * Search terms for limiting the thread query.
    97      *
    98      * @var string
    99      */
    100     public $search_terms = '';
    101 
    102     /**
    103      * Constructor method.
    104      *
    105      * @param array $args {
    106      *     Array of arguments. See bp_has_message_threads() for full description.
    107      * }
    108      */
    109     public function __construct( $args = array() ) {
    110 
    111         // Backward compatibility with old method of passing arguments.
    112         if ( ! is_array( $args ) || func_num_args() > 1 ) {
    113             _deprecated_argument( __METHOD__, '2.2.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
    114 
    115             $old_args_keys = array(
    116                 0 => 'user_id',
    117                 1 => 'box',
    118                 2 => 'per_page',
    119                 3 => 'max',
    120                 4 => 'type',
    121                 5 => 'search_terms',
    122                 6 => 'page_arg'
    123             );
    124 
    125             $func_args = func_get_args();
    126             $args      = bp_core_parse_args_array( $old_args_keys, $func_args );
    127         }
    128 
    129         $r = wp_parse_args( $args, array(
    130             'page'         => 1,
    131             'per_page'     => 10,
    132             'page_arg'     => 'mpage',
    133             'box'          => 'inbox',
    134             'type'         => 'all',
    135             'user_id'      => bp_loggedin_user_id(),
    136             'max'          => false,
    137             'search_terms' => '',
    138             'meta_query'   => array(),
    139         ) );
    140 
    141         $this->pag_arg      = sanitize_key( $r['page_arg'] );
    142         $this->pag_page     = bp_sanitize_pagination_arg( $this->pag_arg, $r['page']     );
    143         $this->pag_num      = bp_sanitize_pagination_arg( 'num',          $r['per_page'] );
    144         $this->user_id      = $r['user_id'];
    145         $this->box          = $r['box'];
    146         $this->type         = $r['type'];
    147         $this->search_terms = $r['search_terms'];
    148 
    149         if ( 'notices' === $this->box ) {
    150             $this->threads = BP_Messages_Notice::get_notices( array(
    151                 'pag_num'  => $this->pag_num,
    152                 'pag_page' => $this->pag_page
    153             ) );
    154         } else {
    155             $threads = BP_Messages_Thread::get_current_threads_for_user( array(
    156                 'user_id'      => $this->user_id,
    157                 'box'          => $this->box,
    158                 'type'         => $this->type,
    159                 'limit'        => $this->pag_num,
    160                 'page'         => $this->pag_page,
    161                 'search_terms' => $this->search_terms,
    162                 'meta_query'   => $r['meta_query'],
    163             ) );
    164 
    165             $this->threads            = $threads['threads'];
    166             $this->total_thread_count = $threads['total'];
    167         }
    168 
    169         if ( !$this->threads ) {
    170             $this->thread_count       = 0;
    171             $this->total_thread_count = 0;
    172         } else {
    173             $total_notice_count = BP_Messages_Notice::get_total_notice_count();
    174 
    175             if ( empty( $r['max'] ) || ( (int) $r['max'] >= (int) $total_notice_count ) ) {
    176                 if ( 'notices' === $this->box ) {
    177                     $this->total_thread_count = (int) $total_notice_count;
    178                 }
    179             } else {
    180                 $this->total_thread_count = (int) $r['max'];
    181             }
    182 
    183             if ( ! empty( $r['max'] ) ) {
    184                 if ( (int) $r['max'] >= count( $this->threads ) ) {
    185                     $this->thread_count = count( $this->threads );
    186                 } else {
    187                     $this->thread_count = (int) $r['max'];
    188                 }
    189             } else {
    190                 $this->thread_count = count( $this->threads );
    191             }
    192         }
    193 
    194         if ( (int) $this->total_thread_count && (int) $this->pag_num ) {
    195             $pag_args = array(
    196                 $r['page_arg'] => '%#%',
    197             );
    198 
    199             if ( defined( 'DOING_AJAX' ) && true === (bool) DOING_AJAX ) {
    200                 $base = remove_query_arg( 's', wp_get_referer() );
    201             } else {
    202                 $base = '';
    203             }
    204 
    205             $add_args = array();
    206 
    207             if ( ! empty( $this->search_terms ) ) {
    208                 $add_args['s'] = $this->search_terms;
    209             }
    210 
    211             $this->pag_links = paginate_links( array(
    212                 'base'      => add_query_arg( $pag_args, $base ),
    213                 'format'    => '',
    214                 'total'     => ceil( (int) $this->total_thread_count / (int) $this->pag_num ),
    215                 'current'   => $this->pag_page,
    216                 'prev_text' => _x( '&larr;', 'Message pagination previous text', 'buddypress' ),
    217                 'next_text' => _x( '&rarr;', 'Message pagination next text', 'buddypress' ),
    218                 'mid_size'  => 1,
    219                 'add_args'  => $add_args,
    220             ) );
    221         }
    222     }
    223 
    224     /**
    225      * Whether there are threads available in the loop.
    226      *
    227      * @see bp_has_message_threads()
    228      *
    229      * @return bool True if there are items in the loop, otherwise false.
    230      */
    231     public function has_threads() {
    232         if ( $this->thread_count ) {
    233             return true;
    234         }
    235 
    236         return false;
    237     }
    238 
    239     /**
    240      * Set up the next member and iterate index.
    241      *
    242      * @return object The next member to iterate over.
    243      */
    244     public function next_thread() {
    245         $this->current_thread++;
    246         $this->thread = $this->threads[$this->current_thread];
    247 
    248         return $this->thread;
    249     }
    250 
    251     /**
    252      * Rewind the threads and reset thread index.
    253      */
    254     public function rewind_threads() {
    255         $this->current_thread = -1;
    256         if ( $this->thread_count > 0 ) {
    257             $this->thread = $this->threads[0];
    258         }
    259     }
    260 
    261     /**
    262      * Whether there are threads left in the loop to iterate over.
    263      *
    264      * This method is used by {@link bp_message_threads()} as part of the
    265      * while loop that controls iteration inside the threads loop, eg:
    266      *     while ( bp_message_threads() ) { ...
    267      *
    268      * @see bp_message_threads()
    269      *
    270      * @return bool True if there are more threads to show, otherwise false.
    271      */
    272     function message_threads() {
    273         if ( $this->current_thread + 1 < $this->thread_count ) {
    274             return true;
    275         } elseif ( $this->current_thread + 1 == $this->thread_count ) {
    276 
    277             /**
    278              * Fires when at the end of threads to iterate over.
    279              *
    280              * @since 1.5.0
    281              */
    282             do_action( 'messages_box_loop_end' );
    283             // Do some cleaning up after the loop.
    284             $this->rewind_threads();
    285         }
    286 
    287         $this->in_the_loop = false;
    288         return false;
    289     }
    290 
    291     /**
    292      * Set up the current thread inside the loop.
    293      *
    294      * Used by {@link bp_message_thread()} to set up the current thread data
    295      * while looping, so that template tags used during that iteration make
    296      * reference to the current thread.
    297      *
    298      * @see bp_message_thread()
    299      */
    300     public function the_message_thread() {
    301 
    302         $this->in_the_loop = true;
    303         $this->thread      = $this->next_thread();
    304 
    305         if ( ! bp_is_current_action( 'notices' ) ) {
    306             $last_message_index     = count( $this->thread->messages ) - 1;
    307             $this->thread->messages = array_reverse( (array) $this->thread->messages );
    308 
    309             // Set up the last message data.
    310             if ( count($this->thread->messages) > 1 ) {
    311                 if ( 'inbox' == $this->box ) {
    312                     foreach ( (array) $this->thread->messages as $key => $message ) {
    313                         if ( bp_loggedin_user_id() != $message->sender_id ) {
    314                             $last_message_index = $key;
    315                             break;
    316                         }
    317                     }
    318 
    319                 } elseif ( 'sentbox' == $this->box ) {
    320                     foreach ( (array) $this->thread->messages as $key => $message ) {
    321                         if ( bp_loggedin_user_id() == $message->sender_id ) {
    322                             $last_message_index = $key;
    323                             break;
    324                         }
    325                     }
    326                 }
    327             }
    328 
    329             $this->thread->last_message_id      = $this->thread->messages[ $last_message_index ]->id;
    330             $this->thread->last_message_date    = $this->thread->messages[ $last_message_index ]->date_sent;
    331             $this->thread->last_sender_id       = $this->thread->messages[ $last_message_index ]->sender_id;
    332             $this->thread->last_message_subject = $this->thread->messages[ $last_message_index ]->subject;
    333             $this->thread->last_message_content = $this->thread->messages[ $last_message_index ]->message;
    334         }
    335 
    336         // Loop has just started.
    337         if ( 0 == $this->current_thread ) {
    338 
    339             /**
    340              * Fires if at the start of the message thread loop.
    341              *
    342              * @since 1.5.0
    343              */
    344             do_action( 'messages_box_loop_start' );
    345         }
    346     }
    347 }
    348 
    349 /**
    350  * Retrieve private message threads for display in inbox/sentbox/notices.
    351  *
    352  * Similar to WordPress's have_posts() function, this function is responsible
    353  * for querying the database and retrieving private messages for display inside
    354  * the theme via individual template parts for a member's inbox/sentbox/notices.
    355  *
    356  * @since 1.0.0
    357  *
    358  * @global BP_Messages_Box_Template $messages_template
    359  *
    360  * @param array|string $args {
    361  *     Array of arguments. All are optional.
    362  *     @type int    $user_id      ID of the user whose threads are being loaded.
    363  *                                Default: ID of the logged-in user.
    364  *     @type string $box          Current "box" view. If not provided here, the current
    365  *                                view will be inferred from the URL.
    366  *     @type int    $per_page     Number of results to return per page. Default: 10.
    367  *     @type int    $max          Max results to return. Default: false.
    368  *     @type string $type         Type of messages to return. Values: 'all', 'read', 'unread'
    369  *                                Default: 'all'
    370  *     @type string $search_terms Terms to which to limit results. Default:
    371  *                                the value of $_REQUEST['s'].
    372  *     @type string $page_arg     URL argument used for the pagination param.
    373  *                                Default: 'mpage'.
    374  *     @type array  $meta_query   Meta query arguments. Only applicable if $box is
    375  *                                not 'notices'. See WP_Meta_Query more details.
    376  * }
    377  * @return bool True if there are threads to display, otherwise false.
    378  */
    379 function bp_has_message_threads( $args = array() ) {
    380     global $messages_template;
    381 
    382     // The default box the user is looking at.
    383     $current_action = bp_current_action();
    384     switch ( $current_action ) {
    385         case 'sentbox' :
    386         case 'notices' :
    387         case 'inbox'   :
    388             $default_box = $current_action;
    389             break;
    390         default :
    391             $default_box = 'inbox';
    392             break;
    393     }
    394 
    395     // User ID
    396     // @todo displayed user for moderators that get this far?
    397     $user_id = bp_loggedin_user_id();
    398 
    399     // Search Terms.
    400     $search_terms = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';
    401 
    402     // Parse the arguments.
    403     $r = bp_parse_args( $args, array(
    404         'user_id'      => $user_id,
    405         'box'          => $default_box,
    406         'per_page'     => 10,
    407         'max'          => false,
    408         'type'         => 'all',
    409         'search_terms' => $search_terms,
    410         'page_arg'     => 'mpage', // See https://buddypress.trac.wordpress.org/ticket/3679.
    411         'meta_query'   => array()
    412     ), 'has_message_threads' );
    413 
    414     // Load the messages loop global up with messages.
    415     $messages_template = new BP_Messages_Box_Template( $r );
    416 
    417     /**
    418      * Filters if there are any message threads to display in inbox/sentbox/notices.
    419      *
    420      * @since 1.1.0
    421      *
    422      * @param bool                     $value             Whether or not the message has threads.
    423      * @param BP_Messages_Box_Template $messages_template Current message box template object.
    424      * @param array                    $r                 Array of parsed arguments passed into function.
    425      */
    426     return apply_filters( 'bp_has_message_threads', $messages_template->has_threads(), $messages_template, $r );
    427 }
    428 
    429 /**
    430  * Check whether there are more threads to iterate over.
    431  *
    432  * @return bool
    433  */
    434 function bp_message_threads() {
    435     global $messages_template;
    436     return $messages_template->message_threads();
    437 }
    438 
    439 /**
    440  * Set up the current thread inside the loop.
    441  *
    442  * @return object
    443  */
    444 function bp_message_thread() {
    445     global $messages_template;
    446     return $messages_template->the_message_thread();
    447 }
    448 
    449 /**
    450  * Output the ID of the current thread in the loop.
    451  */
    452 function bp_message_thread_id() {
    453     echo bp_get_message_thread_id();
    454 }
    455     /**
    456      * Get the ID of the current thread in the loop.
    457      *
    458      * @return int
    459      */
    460     function bp_get_message_thread_id() {
    461         global $messages_template;
    462 
    463         /**
    464          * Filters the ID of the current thread in the loop.
    465          *
    466          * @since 1.0.0
    467          *
    468          * @param int $thread_id ID of the current thread in the loop.
    469          */
    470         return apply_filters( 'bp_get_message_thread_id', $messages_template->thread->thread_id );
    471     }
    472 
    473 /**
    474  * Output the subject of the current thread in the loop.
    475  */
    476 function bp_message_thread_subject() {
    477     echo bp_get_message_thread_subject();
    478 }
    479     /**
    480      * Get the subject of the current thread in the loop.
    481      *
    482      * @return string
    483      */
    484     function bp_get_message_thread_subject() {
    485         global $messages_template;
    486 
    487         /**
    488          * Filters the subject of the current thread in the loop.
    489          *
    490          * @since 1.1.0
    491          *
    492          * @param string $value Subject of the current thread in the loop.
    493          */
    494         return apply_filters( 'bp_get_message_thread_subject', $messages_template->thread->last_message_subject );
    495     }
    496 
    497 /**
    498  * Output an excerpt from the current message in the loop.
    499  */
    500 function bp_message_thread_excerpt() {
    501     echo bp_get_message_thread_excerpt();
    502 }
    503     /**
    504      * Generate an excerpt from the current message in the loop.
    505      *
    506      * @return string
    507      */
    508     function bp_get_message_thread_excerpt() {
    509         global $messages_template;
    510 
    511         /**
    512          * Filters the excerpt of the current thread in the loop.
    513          *
    514          * @since 1.0.0
    515          *
    516          * @param string $value Excerpt of the current thread in the loop.
    517          */
    518         return apply_filters( 'bp_get_message_thread_excerpt', strip_tags( bp_create_excerpt( $messages_template->thread->last_message_content, 75 ) ) );
    519     }
    520 
    521 /**
    522  * Output the thread's last message content.
    523  *
    524  * When viewing your Inbox, the last message is the most recent message in
    525  * the thread of which you are *not* the author.
    526  *
    527  * When viewing your Sentbox, last message is the most recent message in
    528  * the thread of which you *are* the member.
    529  *
    530  * @since 2.0.0
    531  */
    532 function bp_message_thread_content() {
    533     echo bp_get_message_thread_content();
    534 }
    535     /**
    536      * Return the thread's last message content.
    537      *
    538      * When viewing your Inbox, the last message is the most recent message in
    539      * the thread of which you are *not* the author.
    540      *
    541      * When viewing your Sentbox, last message is the most recent message in
    542      * the thread of which you *are* the member.
    543      *
    544      * @since 2.0.0
    545      *
    546      * @return string The raw content of the last message in the thread.
    547      */
    548     function bp_get_message_thread_content() {
    549         global $messages_template;
    550 
    551         /**
    552          * Filters the content of the last message in the thread.
    553          *
    554          * @since 2.0.0
    555          *
    556          * @param string $last_message_content Content of the last message in the thread.
    557          */
    558         return apply_filters( 'bp_get_message_thread_content', $messages_template->thread->last_message_content );
    559     }
    560 
    561 /**
    562  * Output a link to the page of the current thread's last author.
    563  */
    564 function bp_message_thread_from() {
    565     echo bp_get_message_thread_from();
    566 }
    567     /**
    568      * Get a link to the page of the current thread's last author.
    569      *
    570      * @return string
    571      */
    572     function bp_get_message_thread_from() {
    573         global $messages_template;
    574 
    575         /**
    576          * Filters the link to the page of the current thread's last author.
    577          *
    578          * @since 1.0.0
    579          *
    580          * @param string $value Link to the page of the current thread's last author.
    581          */
    582         return apply_filters( 'bp_get_message_thread_from', bp_core_get_userlink( $messages_template->thread->last_sender_id ) );
    583     }
    584 
    585 /**
    586  * Output links to the pages of the current thread's recipients.
    587  */
    588 function bp_message_thread_to() {
    589     echo bp_get_message_thread_to();
    590 }
    591     /**
    592      * Generate HTML links to the pages of the current thread's recipients.
    593      *
    594      * @return string
    595      */
    596     function bp_get_message_thread_to() {
    597         global $messages_template;
    598 
    599         /**
    600          * Filters the HTML links to the pages of the current thread's recipients.
    601          *
    602          * @since 1.0.0
    603          *
    604          * @param string $value HTML links to the pages of the current thread's recipients.
    605          */
    606         return apply_filters( 'bp_message_thread_to', BP_Messages_Thread::get_recipient_links($messages_template->thread->recipients ) );
    607     }
    608 
    609 /**
    610  * Output the permalink for a particular thread.
    611  *
    612  * @param int $thread_id Optional. ID of the thread. Default: current thread
    613  *                       being iterated on in the loop.
    614  */
    615 function bp_message_thread_view_link( $thread_id = 0 ) {
    616     echo bp_get_message_thread_view_link( $thread_id );
    617 }
    618     /**
    619      * Get the permalink of a particular thread.
    620      *
    621      * @param int $thread_id Optional. ID of the thread. Default: current
    622      *                       thread being iterated on in the loop.
    623      * @return string
    624      */
    625     function bp_get_message_thread_view_link( $thread_id = 0 ) {
    626         global $messages_template;
    627 
    628         if ( empty( $messages_template ) && (int) $thread_id > 0 ) {
    629             $thread_id = (int) $thread_id;
    630         } elseif ( ! empty( $messages_template->thread->thread_id ) ) {
    631             $thread_id = $messages_template->thread->thread_id;
    632         }
    633 
    634         /**
    635          * Filters the permalink of a particular thread.
    636          *
    637          * @since 1.0.0
    638          *
    639          * @param string $value permalink of a particular thread.
    640          */
    641         return apply_filters( 'bp_get_message_thread_view_link', trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/view/' . $thread_id ) );
    642     }
    643 
    644 /**
    645  * Output the URL for deleting the current thread.
    646  */
    647 function bp_message_thread_delete_link() {
    648     echo esc_url( bp_get_message_thread_delete_link() );
    649 }
    650     /**
    651      * Generate the URL for deleting the current thread.
    652      *
    653      * @return string
    654      */
    655     function bp_get_message_thread_delete_link() {
    656         global $messages_template;
    657 
    658         /**
    659          * Filters the URL for deleting the current thread.
    660          *
    661          * @since 1.0.0
    662          *
    663          * @param string $value URL for deleting the current thread.
    664          * @param string $value Text indicating action being executed.
    665          */
    666         return apply_filters( 'bp_get_message_thread_delete_link', wp_nonce_url( trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/delete/' . $messages_template->thread->thread_id ), 'messages_delete_thread' ) );
    667     }
    668 
    669 /**
    670  * Output the URL used for marking a single message thread as unread.
    671  *
    672  * Since this function directly outputs a URL, it is escaped.
    673  *
    674  * @since 2.2.0
    675  */
    676 function bp_the_message_thread_mark_unread_url() {
    677     echo esc_url( bp_get_the_message_thread_mark_unread_url() );
    678 }
    679     /**
    680      * Return the URL used for marking a single message thread as unread.
    681      *
    682      * @since 2.2.0
    683      *
    684      * @return string
    685      */
    686     function bp_get_the_message_thread_mark_unread_url() {
    687 
    688         // Get the message ID.
    689         $id = bp_get_message_thread_id();
    690 
    691         // Get the args to add to the URL.
    692         $args = array(
    693             'action'     => 'unread',
    694             'message_id' => $id
    695         );
    696 
    697         // Base unread URL.
    698         $url = trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/unread' );
    699 
    700         // Add the args to the URL.
    701         $url = add_query_arg( $args, $url );
    702 
    703         // Add the nonce.
    704         $url = wp_nonce_url( $url, 'bp_message_thread_mark_unread_' . $id );
    705 
    706         /**
    707          * Filters the URL used for marking a single message thread as unread.
    708          *
    709          * @since 2.2.0
    710          *
    711          * @param string $url URL used for marking a single message thread as unread.
    712          */
    713         return apply_filters( 'bp_get_the_message_thread_mark_unread_url', $url );
    714     }
    715 
    716 /**
    717  * Output the URL used for marking a single message thread as read.
    718  *
    719  * Since this function directly outputs a URL, it is escaped.
    720  *
    721  * @since 2.2.0
    722  */
    723 function bp_the_message_thread_mark_read_url() {
    724     echo esc_url( bp_get_the_message_thread_mark_read_url() );
    725 }
    726     /**
    727      * Return the URL used for marking a single message thread as read.
    728      *
    729      * @since 2.2.0
    730      *
    731      * @return string
    732      */
    733     function bp_get_the_message_thread_mark_read_url() {
    734 
    735         // Get the message ID.
    736         $id = bp_get_message_thread_id();
    737 
    738         // Get the args to add to the URL.
    739         $args = array(
    740             'action'     => 'read',
    741             'message_id' => $id
    742         );
    743 
    744         // Base read URL.
    745         $url = trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/read' );
    746 
    747         // Add the args to the URL.
    748         $url = add_query_arg( $args, $url );
    749 
    750         // Add the nonce.
    751         $url = wp_nonce_url( $url, 'bp_message_thread_mark_read_' . $id );
    752 
    753         /**
    754          * Filters the URL used for marking a single message thread as read.
    755          *
    756          * @since 2.2.0
    757          *
    758          * @param string $url URL used for marking a single message thread as read.
    759          */
    760         return apply_filters( 'bp_get_the_message_thread_mark_read_url', $url );
    761     }
    762 
    763 /**
    764  * Output the CSS class for the current thread.
    765  */
    766 function bp_message_css_class() {
    767     echo esc_attr( bp_get_message_css_class() );
    768 }
    769     /**
    770      * Generate the CSS class for the current thread.
    771      *
    772      * @return string
    773      */
    774     function bp_get_message_css_class() {
    775         global $messages_template;
    776 
    777         $class = false;
    778 
    779         if ( $messages_template->current_thread % 2 == 1 ) {
    780             $class .= 'alt';
    781         }
    782 
    783         /**
    784          * Filters the CSS class for the current thread.
    785          *
    786          * @since 1.2.10
    787          *
    788          * @param string $class Class string to be added to the list of classes.
    789          */
    790         return apply_filters( 'bp_get_message_css_class', trim( $class ) );
    791     }
    792 
    793 /**
    794  * Check whether the current thread has unread items.
    795  *
    796  * @return bool True if there are unread items, otherwise false.
    797  */
    798 function bp_message_thread_has_unread() {
    799     global $messages_template;
    800 
    801     $retval = ! empty( $messages_template->thread->unread_count )
    802         ? true
    803         : false;
    804 
    805     /**
    806      * Filters whether or not a message thread has unread items.
    807      *
    808      * @since 2.1.0
    809      *
    810      * @param bool $retval Whether or not a message thread has unread items.
    811      */
    812     return apply_filters( 'bp_message_thread_has_unread', $retval );
    813 }
    814 
    815 /**
    816  * Output the current thread's unread count.
    817  */
    818 function bp_message_thread_unread_count() {
    819     echo esc_html( bp_get_message_thread_unread_count() );
    820 }
    821     /**
    822      * Get the current thread's unread count.
    823      *
    824      * @return int
    825      */
    826     function bp_get_message_thread_unread_count() {
    827         global $messages_template;
    828 
    829         $count = ! empty( $messages_template->thread->unread_count )
    830             ? (int) $messages_template->thread->unread_count
    831             : false;
    832 
    833         /**
    834          * Filters the current thread's unread count.
    835          *
    836          * @since 1.0.0
    837          *
    838          * @param int $count Current thread unread count.
    839          */
    840         return apply_filters( 'bp_get_message_thread_unread_count', $count );
    841     }
    842 
    843 /**
    844  * Output a thread's total message count.
    845  *
    846  * @since 2.2.0
    847  *
    848  * @param int|bool $thread_id Optional. ID of the thread. Defaults to current thread ID.
    849  */
    850 function bp_message_thread_total_count( $thread_id = false ) {
    851     echo bp_get_message_thread_total_count( $thread_id );
    852 }
    853     /**
    854      * Get the current thread's total message count.
    855      *
    856      * @since 2.2.0
    857      *
    858      * @param int|bool $thread_id Optional. ID of the thread.
    859      *                            Defaults to current thread ID.
    860      * @return int
    861      */
    862     function bp_get_message_thread_total_count( $thread_id = false ) {
    863         if ( false === $thread_id ) {
    864             $thread_id = bp_get_message_thread_id();
    865         }
    866 
    867         $thread_template = new BP_Messages_Thread_Template( $thread_id, 'ASC', array(
    868             'update_meta_cache' => false
    869         ) );
    870 
    871         $count = 0;
    872         if ( ! empty( $thread_template->message_count ) ) {
    873             $count = intval( $thread_template->message_count );
    874         }
    875 
    876         /**
    877          * Filters the current thread's total message count.
    878          *
    879          * @since 2.2.0
    880          *
    881          * @param int $count Current thread total message count.
    882          */
    883         return apply_filters( 'bp_get_message_thread_total_count', $count );
    884     }
    885 
    886 /**
    887  * Output markup for the current thread's total and unread count.
    888  *
    889  * @since 2.2.0
    890  *
    891  * @param int|bool $thread_id Optional. ID of the thread. Default: current thread ID.
    892  */
    893 function bp_message_thread_total_and_unread_count( $thread_id = false ) {
    894     echo bp_get_message_thread_total_and_unread_count( $thread_id );
    895 }
    896     /**
    897      * Get markup for the current thread's total and unread count.
    898      *
    899      * @param int|bool $thread_id Optional. ID of the thread. Default: current thread ID.
    900      * @return string Markup displaying the total and unread count for the thread.
    901      */
    902     function bp_get_message_thread_total_and_unread_count( $thread_id = false ) {
    903         if ( false === $thread_id ) {
    904             $thread_id = bp_get_message_thread_id();
    905         }
    906 
    907         $total  = bp_get_message_thread_total_count( $thread_id );
    908         $unread = bp_get_message_thread_unread_count( $thread_id );
    909 
    910         return sprintf(
    911             '<span class="thread-count">(%1$s)</span> <span class="bp-screen-reader-text">%2$s</span>',
    912             number_format_i18n( $total ),
    913             sprintf( _n( '%d unread', '%d unread', $unread, 'buddypress' ), number_format_i18n( $unread ) )
    914         );
    915     }
    916 
    917 /**
    918  * Output the unformatted date of the last post in the current thread.
    919  */
    920 function bp_message_thread_last_post_date_raw() {
    921     echo bp_get_message_thread_last_post_date_raw();
    922 }
    923     /**
    924      * Get the unformatted date of the last post in the current thread.
    925      *
    926      * @return string
    927      */
    928     function bp_get_message_thread_last_post_date_raw() {
    929         global $messages_template;
    930 
    931         /**
    932          * Filters the unformatted date of the last post in the current thread.
    933          *
    934          * @since 2.1.0
    935          *
    936          * @param string $last_message_date Unformatted date of the last post in the current thread.
    937          */
    938         return apply_filters( 'bp_get_message_thread_last_message_date', $messages_template->thread->last_message_date );
    939     }
    940 
    941 /**
    942  * Output the nicely formatted date of the last post in the current thread.
    943  */
    944 function bp_message_thread_last_post_date() {
    945     echo bp_get_message_thread_last_post_date();
    946 }
    947     /**
    948      * Get the nicely formatted date of the last post in the current thread.
    949      *
    950      * @return string
    951      */
    952     function bp_get_message_thread_last_post_date() {
    953 
    954         /**
    955          * Filters the nicely formatted date of the last post in the current thread.
    956          *
    957          * @since 2.1.0
    958          *
    959          * @param string $value Formatted date of the last post in the current thread.
    960          */
    961         return apply_filters( 'bp_get_message_thread_last_post_date', bp_format_time( strtotime( bp_get_message_thread_last_post_date_raw() ) ) );
    962     }
    963 
    964 /**
    965  * Output the avatar for the last sender in the current message thread.
    966  *
    967  * @see bp_get_message_thread_avatar() for a description of arguments.
    968  *
    969  * @param array|string $args See {@link bp_get_message_thread_avatar()}.
    970  */
    971 function bp_message_thread_avatar( $args = '' ) {
    972     echo bp_get_message_thread_avatar( $args );
    973 }
    974     /**
    975      * Return the avatar for the last sender in the current message thread.
    976      *
    977      * @see bp_core_fetch_avatar() For a description of arguments and
    978      *      return values.
    979      *
    980      * @param array|string $args {
    981      *     Arguments are listed here with an explanation of their defaults.
    982      *     For more information about the arguments, see
    983      *     {@link bp_core_fetch_avatar()}.
    984      *     @type string      $type   Default: 'thumb'.
    985      *     @type int|bool    $width  Default: false.
    986      *     @type int|bool    $height Default: false.
    987      *     @type string      $class  Default: 'avatar'.
    988      *     @type string|bool $id     Default: false.
    989      *     @type string      $alt    Default: 'Profile picture of [display name]'.
    990      * }
    991      * @return string User avatar string.
    992      */
    993     function bp_get_message_thread_avatar( $args = '' ) {
    994         global $messages_template;
    995 
    996         $fullname = bp_core_get_user_displayname( $messages_template->thread->last_sender_id );
    997         $alt      = sprintf( __( 'Profile picture of %s', 'buddypress' ), $fullname );
    998 
    999         $r = bp_parse_args( $args, array(
    1000             'type'   => 'thumb',
    1001             'width'  => false,
    1002             'height' => false,
    1003             'class'  => 'avatar',
    1004             'id'     => false,
    1005             'alt'    => $alt
    1006         ) );
    1007 
    1008         /**
    1009          * Filters the avatar for the last sender in the current message thread.
    1010          *
    1011          * @since 1.0.0
    1012          *
    1013          * @param string $value User avatar string.
    1014          */
    1015         return apply_filters( 'bp_get_message_thread_avatar', bp_core_fetch_avatar( array(
    1016             'item_id' => $messages_template->thread->last_sender_id,
    1017             'type'    => $r['type'],
    1018             'alt'     => $r['alt'],
    1019             'css_id'  => $r['id'],
    1020             'class'   => $r['class'],
    1021             'width'   => $r['width'],
    1022             'height'  => $r['height'],
    1023         ) ) );
    1024     }
    1025 
    1026 /**
    1027  * Output the unread messages count for the current inbox.
    1028  */
    1029 function bp_total_unread_messages_count() {
    1030     echo bp_get_total_unread_messages_count();
    1031 }
    1032     /**
    1033      * Get the unread messages count for the current inbox.
    1034      *
    1035      * @return int
    1036      */
    1037     function bp_get_total_unread_messages_count() {
    1038 
    1039         /**
    1040          * Filters the unread messages count for the current inbox.
    1041          *
    1042          * @since 1.0.0
    1043          *
    1044          * @param int $value Unread messages count for the current inbox.
    1045          */
    1046         return apply_filters( 'bp_get_total_unread_messages_count', BP_Messages_Thread::get_inbox_count() );
    1047     }
    1048 
    1049 /**
    1050  * Output the pagination HTML for the current thread loop.
    1051  */
    1052 function bp_messages_pagination() {
    1053     echo bp_get_messages_pagination();
    1054 }
    1055     /**
    1056      * Get the pagination HTML for the current thread loop.
    1057      *
    1058      * @return string
    1059      */
    1060     function bp_get_messages_pagination() {
    1061         global $messages_template;
    1062 
    1063         /**
    1064          * Filters the pagination HTML for the current thread loop.
    1065          *
    1066          * @since 1.0.0
    1067          *
    1068          * @param int $pag_links Pagination HTML for the current thread loop.
    1069          */
    1070         return apply_filters( 'bp_get_messages_pagination', $messages_template->pag_links );
    1071     }
    1072 
    1073 /**
    1074  * Generate the "Viewing message x to y (of z messages)" string for a loop.
    1075  */
    1076 function bp_messages_pagination_count() {
    1077     global $messages_template;
    1078 
    1079     $start_num = intval( ( $messages_template->pag_page - 1 ) * $messages_template->pag_num ) + 1;
    1080     $from_num  = bp_core_number_format( $start_num );
    1081     $to_num    = bp_core_number_format( ( $start_num + ( $messages_template->pag_num - 1 ) > $messages_template->total_thread_count ) ? $messages_template->total_thread_count : $start_num + ( $messages_template->pag_num - 1 ) );
    1082     $total     = bp_core_number_format( $messages_template->total_thread_count );
    1083 
    1084     if ( 1 == $messages_template->total_thread_count ) {
    1085         $message = __( 'Viewing 1 message', 'buddypress' );
    1086     } else {
    1087         $message = sprintf( _n( 'Viewing %1$s - %2$s of %3$s message', 'Viewing %1$s - %2$s of %3$s messages', $messages_template->total_thread_count, 'buddypress' ), $from_num, $to_num, $total );
    1088     }
    1089 
    1090     echo esc_html( $message );
    1091 }
    1092 
    1093 /**
    1094  * Output the Private Message search form.
    1095  *
    1096  * @todo  Move markup to template part in: /members/single/messages/search.php
    1097  * @since 1.6.0
    1098  */
    1099 function bp_message_search_form() {
    1100 
    1101     // Get the default search text.
    1102     $default_search_value = bp_get_search_default_text( 'messages' );
    1103 
    1104     // Setup a few values based on what's being searched for.
    1105     $search_submitted     = ! empty( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : $default_search_value;
    1106     $search_placeholder   = ( $search_submitted === $default_search_value ) ? ' placeholder="' .  esc_attr( $search_submitted ) . '"' : '';
    1107     $search_value         = ( $search_submitted !== $default_search_value ) ? ' value="'       .  esc_attr( $search_submitted ) . '"' : '';
    1108 
    1109     // Start the output buffer, so form can be filtered.
    1110     ob_start(); ?>
    1111 
    1112     <form action="" method="get" id="search-message-form">
    1113         <label for="messages_search" class="bp-screen-reader-text"><?php esc_html_e( 'Search Messages', 'buddypress' ); ?></label>
    1114         <input type="text" name="s" id="messages_search"<?php echo $search_placeholder . $search_value; ?> />
    1115         <input type="submit" class="button" id="messages_search_submit" name="messages_search_submit" value="<?php esc_html_e( 'Search', 'buddypress' ); ?>" />
    1116     </form>
    1117 
    1118     <?php
    1119 
    1120     // Get the search form from the above output buffer.
    1121     $search_form_html = ob_get_clean();
    1122 
    1123     /**
    1124      * Filters the private message component search form.
    1125      *
    1126      * @since 2.2.0
    1127      *
    1128      * @param string $search_form_html HTML markup for the message search form.
    1129      */
    1130     echo apply_filters( 'bp_message_search_form', $search_form_html );
    1131 }
    1132 
    1133 /**
    1134  * Echo the form action for Messages HTML forms.
    1135  */
    1136 function bp_messages_form_action() {
    1137     echo esc_url( bp_get_messages_form_action() );
    1138 }
    1139     /**
    1140      * Return the form action for Messages HTML forms.
    1141      *
    1142      * @return string The form action.
    1143      */
    1144     function bp_get_messages_form_action() {
    1145 
    1146         /**
    1147          * Filters the form action for Messages HTML forms.
    1148          *
    1149          * @since 1.0.0
    1150          *
    1151          * @param string $value The form action.
    1152          */
    1153         return apply_filters( 'bp_get_messages_form_action', trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/' . bp_current_action() . '/' . bp_action_variable( 0 ) ) );
    1154     }
    1155 
    1156 /**
    1157  * Output the default username for the recipient box.
    1158  */
    1159 function bp_messages_username_value() {
    1160     echo esc_attr( bp_get_messages_username_value() );
    1161 }
    1162     /**
    1163      * Get the default username for the recipient box.
    1164      *
    1165      * @return string
    1166      */
    1167     function bp_get_messages_username_value() {
    1168         if ( isset( $_COOKIE['bp_messages_send_to'] ) ) {
    1169 
    1170             /**
    1171              * Filters the default username for the recipient box.
    1172              *
    1173              * Value passed into filter is dependent on if the 'bp_messages_send_to'
    1174              * cookie or 'r' $_GET parameter is set.
    1175              *
    1176              * @since 1.0.0
    1177              *
    1178              * @param string $value Default user name.
    1179              */
    1180             return apply_filters( 'bp_get_messages_username_value', $_COOKIE['bp_messages_send_to'] );
    1181         } elseif ( isset( $_GET['r'] ) && !isset( $_COOKIE['bp_messages_send_to'] ) ) {
    1182             /** This filter is documented in bp-messages-template.php */
    1183             return apply_filters( 'bp_get_messages_username_value', $_GET['r'] );
    1184         }
    1185     }
    1186 
    1187 /**
    1188  * Output the default value for the Subject field.
    1189  */
    1190 function bp_messages_subject_value() {
    1191     echo esc_attr( bp_get_messages_subject_value() );
    1192 }
    1193     /**
    1194      * Get the default value for the Subject field.
    1195      *
    1196      * Will get a value out of $_POST['subject'] if available (ie after a
    1197      * failed submission).
    1198      *
    1199      * @return string
    1200      */
    1201     function bp_get_messages_subject_value() {
    1202 
    1203         // Sanitized in bp-messages-filters.php.
    1204         $subject = ! empty( $_POST['subject'] )
    1205             ? $_POST['subject']
    1206             : '';
    1207 
    1208         /**
    1209          * Filters the default value for the subject field.
    1210          *
    1211          * @since 1.0.0
    1212          *
    1213          * @param string $subject The default value for the subject field.
    1214          */
    1215         return apply_filters( 'bp_get_messages_subject_value', $subject );
    1216     }
    1217 
    1218 /**
    1219  * Output the default value for the Compose content field.
    1220  */
    1221 function bp_messages_content_value() {
    1222     echo esc_textarea( bp_get_messages_content_value() );
    1223 }
    1224     /**
    1225      * Get the default value fo the Compose content field.
    1226      *
    1227      * Will get a value out of $_POST['content'] if available (ie after a
    1228      * failed submission).
    1229      *
    1230      * @return string
    1231      */
    1232     function bp_get_messages_content_value() {
    1233 
    1234         // Sanitized in bp-messages-filters.php.
    1235         $content = ! empty( $_POST['content'] )
    1236             ? $_POST['content']
    1237             : '';
    1238 
    1239         /**
    1240          * Filters the default value for the content field.
    1241          *
    1242          * @since 1.0.0
    1243          *
    1244          * @param string $content The default value for the content field.
    1245          */
    1246         return apply_filters( 'bp_get_messages_content_value', $content );
    1247     }
    1248 
    1249 /**
    1250  * Output the markup for the message type dropdown.
    1251  */
    1252 function bp_messages_options() {
    1253 ?>
    1254 
    1255     <label for="message-type-select" class="bp-screen-reader-text">
    1256         <?php _e( 'Select:', 'buddypress' ) ?>
    1257      </label>
    1258 
    1259     <select name="message-type-select" id="message-type-select">
    1260         <option value=""><?php _e( 'Select', 'buddypress' ); ?></option>
    1261         <option value="read"><?php _ex('Read', 'Message dropdown filter', 'buddypress') ?></option>
    1262         <option value="unread"><?php _ex('Unread', 'Message dropdown filter', 'buddypress') ?></option>
    1263         <option value="all"><?php _ex('All', 'Message dropdown filter', 'buddypress') ?></option>
    1264     </select> &nbsp;
    1265 
    1266     <?php if ( ! bp_is_current_action( 'sentbox' ) && ! bp_is_current_action( 'notices' ) ) : ?>
    1267 
    1268         <a href="#" id="mark_as_read"><?php _ex('Mark as Read', 'Message management markup', 'buddypress') ?></a> &nbsp;
    1269         <a href="#" id="mark_as_unread"><?php _ex('Mark as Unread', 'Message management markup', 'buddypress') ?></a> &nbsp;
    1270 
    1271     <?php endif; ?>
    1272 
    1273     <a href="#" id="delete_<?php echo bp_current_action(); ?>_messages"><?php _e( 'Delete Selected', 'buddypress' ); ?></a> &nbsp;
    1274 
    1275 <?php
    1276 }
    1277 
    1278 /**
    1279  * Output the dropdown for bulk management of messages.
    1280  *
    1281  * @since 2.2.0
    1282  */
    1283 function bp_messages_bulk_management_dropdown() {
    1284     ?>
    1285     <label class="bp-screen-reader-text" for="messages-select"><?php _e( 'Select Bulk Action', 'buddypress' ); ?></label>
    1286     <select name="messages_bulk_action" id="messages-select">
    1287         <option value="" selected="selected"><?php _e( 'Bulk Actions', 'buddypress' ); ?></option>
    1288         <option value="read"><?php _e( 'Mark read', 'buddypress' ); ?></option>
    1289         <option value="unread"><?php _e( 'Mark unread', 'buddypress' ); ?></option>
    1290         <option value="delete"><?php _e( 'Delete', 'buddypress' ); ?></option>
    1291         <?php
    1292             /**
    1293              * Action to add additional options to the messages bulk management dropdown.
    1294              *
    1295              * @since 2.3.0
    1296              */
    1297             do_action( 'bp_messages_bulk_management_dropdown' );
    1298         ?>
    1299     </select>
    1300     <input type="submit" id="messages-bulk-manage" class="button action" value="<?php esc_attr_e( 'Apply', 'buddypress' ); ?>">
    1301     <?php
    1302 }
    1303 
    1304 /**
    1305  * Return whether or not the notice is currently active.
    1306  *
    1307  * @since 1.6.0
    1308  *
    1309  * @return bool
    1310  */
    1311 function bp_messages_is_active_notice() {
    1312     global $messages_template;
    1313 
    1314     $retval = ! empty( $messages_template->thread->is_active )
    1315         ? true
    1316         : false;
    1317 
    1318     /**
    1319      * Filters whether or not the notice is currently active.
    1320      *
    1321      * @since 2.1.0
    1322      *
    1323      * @param bool $retval Whether or not the notice is currently active.
    1324      */
    1325     return apply_filters( 'bp_messages_is_active_notice', $retval );
    1326 }
    1327 
    1328 /**
    1329  * Output a string for the active notice.
    1330  *
    1331  * Since 1.6 this function has been deprecated in favor of text in the theme.
    1332  *
    1333  * @since 1.0.0
    1334  * @deprecated 1.6.0
    1335  * @uses bp_get_message_is_active_notice()
    1336  * @return bool
    1337  */
    1338 function bp_message_is_active_notice() {
    1339     echo bp_get_message_is_active_notice();
    1340 }
    1341     /**
    1342      * Returns a string for the active notice.
    1343      *
    1344      * Since 1.6 this function has been deprecated in favor of text in the
    1345      * theme.
    1346      *
    1347      * @since 1.0.0
    1348      * @deprecated 1.6.0
    1349      * @uses bp_messages_is_active_notice()
    1350      */
    1351     function bp_get_message_is_active_notice() {
    1352 
    1353         $string = bp_messages_is_active_notice()
    1354             ? __( 'Currently Active', 'buddypress' )
    1355             : '';
    1356 
    1357         return apply_filters( 'bp_get_message_is_active_notice', $string );
    1358     }
    1359 
    1360 /**
    1361  * Output the ID of the current notice in the loop.
    1362  */
    1363 function bp_message_notice_id() {
    1364     echo (int) bp_get_message_notice_id();
    1365 }
    1366     /**
    1367      * Get the ID of the current notice in the loop.
    1368      *
    1369      * @return int
    1370      */
    1371     function bp_get_message_notice_id() {
    1372         global $messages_template;
    1373 
    1374         /**
    1375          * Filters the ID of the current notice in the loop.
    1376          *
    1377          * @since 1.5.0
    1378          *
    1379          * @param int $id ID of the current notice in the loop.
    1380          */
    1381         return apply_filters( 'bp_get_message_notice_id', $messages_template->thread->id );
    1382     }
    1383 
    1384 /**
    1385  * Output the post date of the current notice in the loop.
    1386  */
    1387 function bp_message_notice_post_date() {
    1388     echo bp_get_message_notice_post_date();
    1389 }
    1390     /**
    1391      * Get the post date of the current notice in the loop.
    1392      *
    1393      * @return string
    1394      */
    1395     function bp_get_message_notice_post_date() {
    1396         global $messages_template;
    1397 
    1398         /**
    1399          * Filters the post date of the current notice in the loop.
    1400          *
    1401          * @since 1.0.0
    1402          *
    1403          * @param string $value Formatted post date of the current notice in the loop.
    1404          */
    1405         return apply_filters( 'bp_get_message_notice_post_date', bp_format_time( strtotime( $messages_template->thread->date_sent ) ) );
    1406     }
    1407 
    1408 /**
    1409  * Output the subject of the current notice in the loop.
    1410  */
    1411 function bp_message_notice_subject() {
    1412     echo bp_get_message_notice_subject();
    1413 }
    1414     /**
    1415      * Get the subject of the current notice in the loop.
    1416      *
    1417      * @return string
    1418      */
    1419     function bp_get_message_notice_subject() {
    1420         global $messages_template;
    1421 
    1422         /**
    1423          * Filters the subject of the current notice in the loop.
    1424          *
    1425          * @since 1.0.0
    1426          *
    1427          * @param string $subject Subject of the current notice in the loop.
    1428          */
    1429         return apply_filters( 'bp_get_message_notice_subject', $messages_template->thread->subject );
    1430     }
    1431 
    1432 /**
    1433  * Output the text of the current notice in the loop.
    1434  */
    1435 function bp_message_notice_text() {
    1436     echo bp_get_message_notice_text();
    1437 }
    1438     /**
    1439      * Get the text of the current notice in the loop.
    1440      *
    1441      * @return string
    1442      */
    1443     function bp_get_message_notice_text() {
    1444         global $messages_template;
    1445 
    1446         /**
    1447          * Filters the text of the current notice in the loop.
    1448          *
    1449          * @since 1.0.0
    1450          *
    1451          * @param string $message Text for the current notice in the loop.
    1452          */
    1453         return apply_filters( 'bp_get_message_notice_text', $messages_template->thread->message );
    1454     }
    1455 
    1456 /**
    1457  * Output the URL for deleting the current notice.
    1458  */
    1459 function bp_message_notice_delete_link() {
    1460     echo esc_url( bp_get_message_notice_delete_link() );
    1461 }
    1462     /**
    1463      * Get the URL for deleting the current notice.
    1464      *
    1465      * @return string Delete URL.
    1466      */
    1467     function bp_get_message_notice_delete_link() {
    1468         global $messages_template;
    1469 
    1470         /**
    1471          * Filters the URL for deleting the current notice.
    1472          *
    1473          * @since 1.0.0
    1474          *
    1475          * @param string $value URL for deleting the current notice.
    1476          * @param string $value Text indicating action being executed.
    1477          */
    1478         return apply_filters( 'bp_get_message_notice_delete_link', wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . '/notices/delete/' . $messages_template->thread->id, 'messages_delete_thread' ) );
    1479     }
    1480 
    1481 /**
    1482  * Output the URL for deactivating the current notice.
    1483  */
    1484 function bp_message_activate_deactivate_link() {
    1485     echo esc_url( bp_get_message_activate_deactivate_link() );
    1486 }
    1487     /**
    1488      * Get the URL for deactivating the current notice.
    1489      *
    1490      * @return string
    1491      */
    1492     function bp_get_message_activate_deactivate_link() {
    1493         global $messages_template;
    1494 
    1495         if ( 1 === (int) $messages_template->thread->is_active ) {
    1496             $link = wp_nonce_url( trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/notices/deactivate/' . $messages_template->thread->id ), 'messages_deactivate_notice' );
    1497         } else {
    1498             $link = wp_nonce_url( trailingslashit( bp_loggedin_user_domain() . bp_get_messages_slug() . '/notices/activate/' . $messages_template->thread->id ), 'messages_activate_notice' );
    1499         }
    1500 
    1501         /**
    1502          * Filters the URL for deactivating the current notice.
    1503          *
    1504          * @since 1.0.0
    1505          *
    1506          * @param string $link URL for deactivating the current notice.
    1507          */
    1508         return apply_filters( 'bp_get_message_activate_deactivate_link', $link );
    1509     }
    1510 
    1511 /**
    1512  * Output the Deactivate/Activate text for the notice action link.
    1513  */
    1514 function bp_message_activate_deactivate_text() {
    1515     echo esc_html( bp_get_message_activate_deactivate_text() );
    1516 }
    1517     /**
    1518      * Generate the text ('Deactivate' or 'Activate') for the notice action link.
    1519      *
    1520      * @return string
    1521      */
    1522     function bp_get_message_activate_deactivate_text() {
    1523         global $messages_template;
    1524 
    1525         if ( 1 === (int) $messages_template->thread->is_active  ) {
    1526             $text = __('Deactivate', 'buddypress');
    1527         } else {
    1528             $text = __('Activate', 'buddypress');
    1529         }
    1530 
    1531         /**
    1532          * Filters the "Deactivate" or "Activate" text for notice action links.
    1533          *
    1534          * @since 1.0.0
    1535          *
    1536          * @param string $text Text used for notice action links.
    1537          */
    1538         return apply_filters( 'bp_message_activate_deactivate_text', $text );
    1539     }
    1540 
    1541 /**
    1542  * Output the messages component slug.
    1543  *
    1544  * @since 1.5.0
    1545  *
    1546  * @uses bp_get_messages_slug()
    1547  */
    1548 function bp_messages_slug() {
    1549     echo bp_get_messages_slug();
    1550 }
    1551     /**
    1552      * Return the messages component slug.
    1553      *
    1554      * @since 1.5.0
    1555      *
    1556      * @return string
    1557      */
    1558     function bp_get_messages_slug() {
    1559 
    1560         /**
    1561          * Filters the messages component slug.
    1562          *
    1563          * @since 1.5.0
    1564          *
    1565          * @param string $slug Messages component slug.
    1566          */
    1567         return apply_filters( 'bp_get_messages_slug', buddypress()->messages->slug );
    1568     }
    1569 
    1570 /**
    1571  * Generate markup for currently active notices.
    1572  */
    1573 function bp_message_get_notices() {
    1574     $notice = BP_Messages_Notice::get_active();
    1575 
    1576     if ( empty( $notice ) ) {
    1577         return false;
    1578     }
    1579 
    1580     $closed_notices = bp_get_user_meta( bp_loggedin_user_id(), 'closed_notices', true );
    1581 
    1582     if ( empty( $closed_notices ) ) {
    1583         $closed_notices = array();
    1584     }
    1585 
    1586     if ( is_array( $closed_notices ) ) {
    1587         if ( !in_array( $notice->id, $closed_notices ) && $notice->id ) {
    1588             ?>
    1589             <div id="message" class="info notice" rel="n-<?php echo esc_attr( $notice->id ); ?>">
    1590                 <p>
    1591                     <strong><?php echo stripslashes( wp_filter_kses( $notice->subject ) ) ?></strong><br />
    1592                     <?php echo stripslashes( wp_filter_kses( $notice->message) ) ?>
    1593                     <a href="#" id="close-notice"><?php _e( 'Close', 'buddypress' ) ?></a>
    1594                 </p>
    1595             </div>
    1596             <?php
    1597         }
    1598     }
    1599 }
    1600 
    1601 /**
    1602  * Output the URL for the Private Message link in member profile headers.
    1603  */
    1604 function bp_send_private_message_link() {
    1605     echo esc_url( bp_get_send_private_message_link() );
    1606 }
    1607     /**
    1608      * Generate the URL for the Private Message link in member profile headers.
    1609      *
    1610      * @return bool|string False on failure, otherwise the URL.
    1611      */
    1612     function bp_get_send_private_message_link() {
    1613 
    1614         if ( bp_is_my_profile() || ! is_user_logged_in() ) {
    1615             return false;
    1616         }
    1617 
    1618         /**
    1619          * Filters the URL for the Private Message link in member profile headers.
    1620          *
    1621          * @since 1.2.10
    1622          *
    1623          * @param string $value URL for the Private Message link in member profile headers.
    1624          */
    1625         return apply_filters( 'bp_get_send_private_message_link', wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . '/compose/?r=' . bp_core_get_username( bp_displayed_user_id() ) ) );
    1626     }
    1627 
    1628 /**
    1629  * Output the 'Private Message' button for member profile headers.
    1630  *
    1631  * Explicitly named function to avoid confusion with public messages.
    1632  *
    1633  * @since 1.2.6
    1634  *
    1635  * @uses bp_get_send_message_button()
    1636  */
    1637 function bp_send_private_message_button() {
    1638     echo bp_get_send_message_button();
    1639 }
    1640 
    1641 /**
    1642  * Output the 'Private Message' button for member profile headers.
    1643  */
    1644 function bp_send_message_button() {
    1645     echo bp_get_send_message_button();
    1646 }
    1647     /**
    1648      * Generate the 'Private Message' button for member profile headers.
    1649      *
    1650      * @return string
    1651      */
    1652     function bp_get_send_message_button() {
    1653         // Note: 'bp_get_send_message_button' is a legacy filter. Use
    1654         // 'bp_get_send_message_button_args' instead. See #4536.
    1655         return apply_filters( 'bp_get_send_message_button',
    1656 
    1657             /**
    1658              * Filters the "Private Message" button for member profile headers.
    1659              *
    1660              * @since 1.8.0
    1661              *
    1662              * @param array $value See {@link BP_Button}.
    1663              */
    1664             bp_get_button( apply_filters( 'bp_get_send_message_button_args', array(
    1665                 'id'                => 'private_message',
    1666                 'component'         => 'messages',
    1667                 'must_be_logged_in' => true,
    1668                 'block_self'        => true,
    1669                 'wrapper_id'        => 'send-private-message',
    1670                 'link_href'         => bp_get_send_private_message_link(),
    1671                 'link_title'        => __( 'Send a private message to this user.', 'buddypress' ),
    1672                 'link_text'         => __( 'Private Message', 'buddypress' ),
    1673                 'link_class'        => 'send-message',
    1674             ) ) )
    1675         );
    1676     }
    1677 
    1678 /**
    1679  * Output the URL of the Messages AJAX loader gif.
    1680  */
    1681 function bp_message_loading_image_src() {
    1682     echo esc_url( bp_get_message_loading_image_src() );
    1683 }
    1684     /**
    1685      * Get the URL of the Messages AJAX loader gif.
    1686      *
    1687      * @return string
    1688      */
    1689     function bp_get_message_loading_image_src() {
    1690 
    1691         /**
    1692          * Filters the URL of the Messages AJAX loader gif.
    1693          *
    1694          * @since 1.0.0
    1695          *
    1696          * @param string $value URL of the Messages AJAX loader gif.
    1697          */
    1698         return apply_filters( 'bp_get_message_loading_image_src', buddypress()->messages->image_base . '/ajax-loader.gif' );
    1699     }
    1700 
    1701 /**
    1702  * Output the markup for the message recipient tabs.
    1703  */
    1704 function bp_message_get_recipient_tabs() {
    1705     $recipients = explode( ' ', bp_get_message_get_recipient_usernames() );
    1706 
    1707     foreach ( $recipients as $recipient ) {
    1708 
    1709         $user_id = bp_is_username_compatibility_mode()
    1710             ? bp_core_get_userid( $recipient )
    1711             : bp_core_get_userid_from_nicename( $recipient );
    1712 
    1713         if ( ! empty( $user_id ) ) : ?>
    1714 
    1715             <li id="un-<?php echo esc_attr( $recipient ); ?>" class="friend-tab">
    1716                 <span><?php
    1717                     echo bp_core_fetch_avatar( array( 'item_id' => $user_id, 'type' => 'thumb', 'width' => 15, 'height' => 15 ) );
    1718                     echo bp_core_get_userlink( $user_id );
    1719                 ?></span>
    1720             </li>
    1721 
    1722         <?php endif;
    1723     }
    1724 }
    1725 
    1726 /**
    1727  * Output recipient usernames for prefilling the 'To' field on the Compose screen.
    1728  */
    1729 function bp_message_get_recipient_usernames() {
    1730     echo esc_attr( bp_get_message_get_recipient_usernames() );
    1731 }
    1732     /**
    1733      * Get the recipient usernames for prefilling the 'To' field on the Compose screen.
    1734      *
    1735      * @return string
    1736      */
    1737     function bp_get_message_get_recipient_usernames() {
    1738 
    1739         // Sanitized in bp-messages-filters.php.
    1740         $recipients = isset( $_GET['r'] )
    1741             ? $_GET['r']
    1742             : '';
    1743 
    1744         /**
    1745          * Filters the recipients usernames for prefilling the 'To' field on the Compose screen.
    1746          *
    1747          * @since 1.0.0
    1748          *
    1749          * @param string $recipients Recipients usernames for 'To' field prefilling.
    1750          */
    1751         return apply_filters( 'bp_get_message_get_recipient_usernames', $recipients );
    1752     }
    175312
    175413/**
     
    1926185    }
    1927186}
    1928 
    1929 /**
    1930  * Initialize the messages template loop for a specific thread.
    1931  *
    1932  * @param array|string $args {
    1933  *     Array of arguments. All are optional.
    1934  *     @type int    $thread_id         ID of the thread whose messages you are displaying.
    1935  *                                     Default: if viewing a thread, the thread ID will be parsed from
    1936  *                                     the URL (bp_action_variable( 0 )).
    1937  *     @type string $order             'ASC' or 'DESC'. Default: 'ASC'.
    1938  *     @type bool   $update_meta_cache Whether to pre-fetch metadata for
    1939  *                                     queried message items. Default: true.
    1940  * }
    1941  * @return bool True if there are messages to display, otherwise false.
    1942  */
    1943 function bp_thread_has_messages( $args = '' ) {
    1944     global $thread_template;
    1945 
    1946     $r = bp_parse_args( $args, array(
    1947         'thread_id'         => false,
    1948         'order'             => 'ASC',
    1949         'update_meta_cache' => true,
    1950     ), 'thread_has_messages' );
    1951 
    1952     if ( empty( $r['thread_id'] ) && bp_is_messages_component() && bp_is_current_action( 'view' ) ) {
    1953         $r['thread_id'] = (int) bp_action_variable( 0 );
    1954     }
    1955 
    1956     // Set up extra args.
    1957     $extra_args = $r;
    1958     unset( $extra_args['thread_id'], $extra_args['order'] );
    1959 
    1960     $thread_template = new BP_Messages_Thread_Template( $r['thread_id'], $r['order'], $extra_args );
    1961 
    1962     return $thread_template->has_messages();
    1963 }
    1964 
    1965 /**
    1966  * Output the 'ASC' or 'DESC' messages order string for this loop.
    1967  */
    1968 function bp_thread_messages_order() {
    1969     echo esc_attr( bp_get_thread_messages_order() );
    1970 }
    1971     /**
    1972      * Get the 'ASC' or 'DESC' messages order string for this loop.
    1973      *
    1974      * @return string
    1975      */
    1976     function bp_get_thread_messages_order() {
    1977         global $thread_template;
    1978         return $thread_template->thread->messages_order;
    1979     }
    1980 
    1981 /**
    1982  * Check whether there are more messages to iterate over.
    1983  *
    1984  * @return bool
    1985  */
    1986 function bp_thread_messages() {
    1987     global $thread_template;
    1988 
    1989     return $thread_template->messages();
    1990 }
    1991 
    1992 /**
    1993  * Set up the current thread inside the loop.
    1994  *
    1995  * @return object
    1996  */
    1997 function bp_thread_the_message() {
    1998     global $thread_template;
    1999 
    2000     return $thread_template->the_message();
    2001 }
    2002 
    2003 /**
    2004  * Output the ID of the thread that the current loop belongs to.
    2005  */
    2006 function bp_the_thread_id() {
    2007     echo (int) bp_get_the_thread_id();
    2008 }
    2009     /**
    2010      * Get the ID of the thread that the current loop belongs to.
    2011      *
    2012      * @return int
    2013      */
    2014     function bp_get_the_thread_id() {
    2015         global $thread_template;
    2016 
    2017         /**
    2018          * Filters the ID of the thread that the current loop belongs to.
    2019          *
    2020          * @since 1.1.0
    2021          *
    2022          * @param int $thread_id ID of the thread.
    2023          */
    2024         return apply_filters( 'bp_get_the_thread_id', $thread_template->thread->thread_id );
    2025     }
    2026 
    2027 /**
    2028  * Output the subject of the thread currently being iterated over.
    2029  */
    2030 function bp_the_thread_subject() {
    2031     echo bp_get_the_thread_subject();
    2032 }
    2033     /**
    2034      * Get the subject of the thread currently being iterated over.
    2035      *
    2036      * @return string
    2037      */
    2038     function bp_get_the_thread_subject() {
    2039         global $thread_template;
    2040 
    2041         /**
    2042          * Filters the subject of the thread currently being iterated over.
    2043          *
    2044          * @since 1.1.0
    2045          *
    2046          * @return string $last_message_subject Subject of the thread currently being iterated over.
    2047          */
    2048         return apply_filters( 'bp_get_the_thread_subject', $thread_template->thread->last_message_subject );
    2049     }
    2050 
    2051 /**
    2052  * Get a list of thread recipients or a "x recipients" string.
    2053  *
    2054  * In BuddyPress 2.2.0, this parts of this functionality were moved into the
    2055  * members/single/messages/single.php template. This function is no longer used
    2056  * by BuddyPress.
    2057  *
    2058  * @return string
    2059  */
    2060 function bp_get_the_thread_recipients() {
    2061     if ( 5 <= bp_get_thread_recipients_count() ) {
    2062         $recipients = sprintf( __( '%s recipients', 'buddypress' ), number_format_i18n( bp_get_thread_recipients_count() ) );
    2063     } else {
    2064         $recipients = bp_get_thread_recipients_list();
    2065     }
    2066 
    2067     return apply_filters( 'bp_get_the_thread_recipients', $recipients );
    2068 }
    2069 
    2070 /**
    2071  * Get the number of recipients in the current thread.
    2072  *
    2073  * @since 2.2.0
    2074  *
    2075  * @return int
    2076  */
    2077 function bp_get_thread_recipients_count() {
    2078     global $thread_template;
    2079     return count( $thread_template->thread->recipients );
    2080 }
    2081 
    2082 /**
    2083  * Get the max number of recipients to list in the 'Conversation between...' gloss.
    2084  *
    2085  * @since 2.3.0
    2086  *
    2087  * @return int
    2088  */
    2089 function bp_get_max_thread_recipients_to_list() {
    2090     /**
    2091      * Filters the max number of recipients to list in the 'Conversation between...' gloss.
    2092      *
    2093      * @since 2.3.0
    2094      *
    2095      * @param int $count Recipient count. Default: 5.
    2096      */
    2097     return (int) apply_filters( 'bp_get_max_thread_recipients_to_list', 5 );
    2098 }
    2099 
    2100 /**
    2101  * Output HTML links to recipients in the current thread.
    2102  *
    2103  * @since 2.2.0
    2104  */
    2105 function bp_the_thread_recipients_list() {
    2106     echo bp_get_thread_recipients_list();
    2107 }
    2108     /**
    2109      * Generate HTML links to the profiles of recipients in the current thread.
    2110      *
    2111      * @since 2.2.0
    2112      *
    2113      * @return string
    2114      */
    2115     function bp_get_thread_recipients_list() {
    2116         global $thread_template;
    2117 
    2118         $recipient_links = array();
    2119 
    2120         foreach( (array) $thread_template->thread->recipients as $recipient ) {
    2121             if ( (int) $recipient->user_id !== bp_loggedin_user_id() ) {
    2122                 $recipient_link = bp_core_get_userlink( $recipient->user_id );
    2123 
    2124                 if ( empty( $recipient_link ) ) {
    2125                     $recipient_link = __( 'Deleted User', 'buddypress' );
    2126                 }
    2127 
    2128                 $recipient_links[] = $recipient_link;
    2129             }
    2130         }
    2131 
    2132         /**
    2133          * Filters the HTML links to the profiles of recipients in the current thread.
    2134          *
    2135          * @since 2.2.0
    2136          *
    2137          * @param string $value Comma-separated list of recipient HTML links for current thread.
    2138          */
    2139         return apply_filters( 'bp_get_the_thread_recipients_list', implode( ', ', $recipient_links ) );
    2140     }
    2141 
    2142 /**
    2143  * Echo the ID of the current message in the thread.
    2144  *
    2145  * @since 1.9.0
    2146  */
    2147 function bp_the_thread_message_id() {
    2148     echo (int) bp_get_the_thread_message_id();
    2149 }
    2150     /**
    2151      * Get the ID of the current message in the thread.
    2152      *
    2153      * @since 1.9.0
    2154      *
    2155      * @return int
    2156      */
    2157     function bp_get_the_thread_message_id() {
    2158         global $thread_template;
    2159 
    2160         $thread_message_id = isset( $thread_template->message->id )
    2161             ? (int) $thread_template->message->id
    2162             : null;
    2163 
    2164         /**
    2165          * Filters the ID of the current message in the thread.
    2166          *
    2167          * @since 1.9.0
    2168          *
    2169          * @param int $thread_message_id ID of the current message in the thread.
    2170          */
    2171         return apply_filters( 'bp_get_the_thread_message_id', $thread_message_id );
    2172     }
    2173 
    2174 /**
    2175  * Output the CSS classes for messages within a single thread.
    2176  *
    2177  * @since 2.1.0
    2178  */
    2179 function bp_the_thread_message_css_class() {
    2180     echo esc_attr( bp_get_the_thread_message_css_class() );
    2181 }
    2182     /**
    2183      * Generate the CSS classes for messages within a single thread.
    2184      *
    2185      * @since 2.1.0
    2186      *
    2187      * @return string
    2188      */
    2189     function bp_get_the_thread_message_css_class() {
    2190         global $thread_template;
    2191 
    2192         $classes = array();
    2193 
    2194         // Zebra-striping.
    2195         $classes[] = bp_get_the_thread_message_alt_class();
    2196 
    2197         // ID of the sender.
    2198         $classes[] = 'sent-by-' . intval( $thread_template->message->sender_id );
    2199 
    2200         // Whether the sender is the same as the logged-in user.
    2201         if ( bp_loggedin_user_id() == $thread_template->message->sender_id ) {
    2202             $classes[] = 'sent-by-me';
    2203         }
    2204 
    2205         /**
    2206          * Filters the CSS classes for messages within a single thread.
    2207          *
    2208          * @since 2.1.0
    2209          *
    2210          * @param array $classes Array of classes to add to the HTML class attribute.
    2211          */
    2212         $classes = apply_filters( 'bp_get_the_thread_message_css_class', $classes );
    2213 
    2214         return implode( ' ', $classes );
    2215     }
    2216 
    2217 /**
    2218  * Output the CSS class used for message zebra striping.
    2219  */
    2220 function bp_the_thread_message_alt_class() {
    2221     echo esc_attr( bp_get_the_thread_message_alt_class() );
    2222 }
    2223     /**
    2224      * Get the CSS class used for message zebra striping.
    2225      *
    2226      * @return string
    2227      */
    2228     function bp_get_the_thread_message_alt_class() {
    2229         global $thread_template;
    2230 
    2231         if ( $thread_template->current_message % 2 == 1 ) {
    2232             $class = 'even alt';
    2233         } else {
    2234             $class = 'odd';
    2235         }
    2236 
    2237         /**
    2238          * Filters the CSS class used for message zebra striping.
    2239          *
    2240          * @since 1.1.0
    2241          *
    2242          * @param string $class Class determined to be next for zebra striping effect.
    2243          */
    2244         return apply_filters( 'bp_get_the_thread_message_alt_class', $class );
    2245     }
    2246 
    2247 /**
    2248  * Output the ID for message sender within a single thread.
    2249  *
    2250  * @since 2.1.0
    2251  */
    2252 function bp_the_thread_message_sender_id() {
    2253     echo (int) bp_get_the_thread_message_sender_id();
    2254 }
    2255     /**
    2256      * Return the ID for message sender within a single thread.
    2257      *
    2258      * @since 2.1.0
    2259      *
    2260      * @return string
    2261      */
    2262     function bp_get_the_thread_message_sender_id() {
    2263         global $thread_template;
    2264 
    2265         $user_id = ! empty( $thread_template->message->sender_id )
    2266             ? $thread_template->message->sender_id
    2267             : 0;
    2268 
    2269         /**
    2270          * Filters the ID for message sender within a single thread.
    2271          *
    2272          * @since 2.1.0
    2273          *
    2274          * @param int $user_id ID of the message sender.
    2275          */
    2276         return (int) apply_filters( 'bp_get_the_thread_message_sender_id', (int) $user_id );
    2277     }
    2278 
    2279 /**
    2280  * Output the avatar for the current message sender.
    2281  *
    2282  * @param array|string $args See {@link bp_get_the_thread_message_sender_avatar_thumb()}
    2283  *                           for a description.
    2284  */
    2285 function bp_the_thread_message_sender_avatar( $args = '' ) {
    2286     echo bp_get_the_thread_message_sender_avatar_thumb( $args );
    2287 }
    2288     /**
    2289      * Get the avatar for the current message sender.
    2290      *
    2291      * @param array|string $args {
    2292      *     Array of arguments. See {@link bp_core_fetch_avatar()} for more
    2293      *     complete details. All arguments are optional.
    2294      *     @type string $type   Avatar type. Default: 'thumb'.
    2295      *     @type int    $width  Avatar width. Default: default for your $type.
    2296      *     @type int    $height Avatar height. Default: default for your $type.
    2297      * }
    2298      * @return string <img> tag containing the avatar.
    2299      */
    2300     function bp_get_the_thread_message_sender_avatar_thumb( $args = '' ) {
    2301         global $thread_template;
    2302 
    2303         $r = bp_parse_args( $args, array(
    2304             'type'   => 'thumb',
    2305             'width'  => false,
    2306             'height' => false,
    2307         ) );
    2308 
    2309         /**
    2310          * Filters the avatar for the current message sender.
    2311          *
    2312          * @since 1.1.0
    2313          *
    2314          * @param string $value <img> tag containing the avatar value.
    2315          */
    2316         return apply_filters( 'bp_get_the_thread_message_sender_avatar_thumb', bp_core_fetch_avatar( array(
    2317             'item_id' => $thread_template->message->sender_id,
    2318             'type'    => $r['type'],
    2319             'width'   => $r['width'],
    2320             'height'  => $r['height'],
    2321             'alt'     => bp_core_get_user_displayname( $thread_template->message->sender_id )
    2322         ) ) );
    2323     }
    2324 
    2325 /**
    2326  * Output a link to the sender of the current message.
    2327  *
    2328  * @since 1.1.0
    2329  */
    2330 function bp_the_thread_message_sender_link() {
    2331     echo esc_url( bp_get_the_thread_message_sender_link() );
    2332 }
    2333     /**
    2334      * Get a link to the sender of the current message.
    2335      *
    2336      * @since 1.1.0
    2337      *
    2338      * @return string
    2339      */
    2340     function bp_get_the_thread_message_sender_link() {
    2341         global $thread_template;
    2342 
    2343         /**
    2344          * Filters the link to the sender of the current message.
    2345          *
    2346          * @since 1.1.0
    2347          *
    2348          * @param string $value Link to the sender of the current message.
    2349          */
    2350         return apply_filters( 'bp_get_the_thread_message_sender_link', bp_core_get_userlink( $thread_template->message->sender_id, false, true ) );
    2351     }
    2352 
    2353 /**
    2354  * Output the display name of the sender of the current message.
    2355  *
    2356  * @since 1.1.0
    2357  */
    2358 function bp_the_thread_message_sender_name() {
    2359     echo esc_html( bp_get_the_thread_message_sender_name() );
    2360 }
    2361     /**
    2362      * Get the display name of the sender of the current message.
    2363      *
    2364      * @since 1.1.0
    2365      *
    2366      * @return string
    2367      */
    2368     function bp_get_the_thread_message_sender_name() {
    2369         global $thread_template;
    2370 
    2371         $display_name = bp_core_get_user_displayname( $thread_template->message->sender_id );
    2372 
    2373         if ( empty( $display_name ) ) {
    2374             $display_name = __( 'Deleted User', 'buddypress' );
    2375         }
    2376 
    2377         /**
    2378          * Filters the display name of the sender of the current message.
    2379          *
    2380          * @since 1.1.0
    2381          *
    2382          * @param string $display_name Display name of the sender of the current message.
    2383          */
    2384         return apply_filters( 'bp_get_the_thread_message_sender_name', $display_name );
    2385     }
    2386 
    2387 /**
    2388  * Output the URL for deleting the current thread.
    2389  *
    2390  * @since 1.5.0
    2391  */
    2392 function bp_the_thread_delete_link() {
    2393     echo esc_url( bp_get_the_thread_delete_link() );
    2394 }
    2395     /**
    2396      * Get the URL for deleting the current thread.
    2397      *
    2398      * @since 1.5.0
    2399      *
    2400      * @return string URL
    2401      */
    2402     function bp_get_the_thread_delete_link() {
    2403 
    2404         /**
    2405          * Filters the URL for deleting the current thread.
    2406          *
    2407          * @since 1.0.0
    2408          *
    2409          * @param string $value URL for deleting the current thread.
    2410          * @param string $value Text indicating action being executed.
    2411          */
    2412         return apply_filters( 'bp_get_message_thread_delete_link', wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . '/inbox/delete/' . bp_get_the_thread_id(), 'messages_delete_thread' ) );
    2413     }
    2414 
    2415 /**
    2416  * Output the 'Sent x hours ago' string for the current message.
    2417  *
    2418  * @since 1.1.0
    2419  */
    2420 function bp_the_thread_message_time_since() {
    2421     echo bp_get_the_thread_message_time_since();
    2422 }
    2423     /**
    2424      * Generate the 'Sent x hours ago' string for the current message.
    2425      *
    2426      * @since 1.1.0
    2427      *
    2428      * @return string
    2429      */
    2430     function bp_get_the_thread_message_time_since() {
    2431 
    2432         /**
    2433          * Filters the 'Sent x hours ago' string for the current message.
    2434          *
    2435          * @since 1.1.0
    2436          *
    2437          * @param string $value Default text of 'Sent x hours ago'.
    2438          */
    2439         return apply_filters( 'bp_get_the_thread_message_time_since', sprintf( __( 'Sent %s', 'buddypress' ), bp_core_time_since( bp_get_the_thread_message_date_sent() ) ) );
    2440     }
    2441 
    2442 /**
    2443  * Output the timestamp for the current message.
    2444  *
    2445  * @since 2.1.0
    2446  */
    2447 function bp_the_thread_message_date_sent() {
    2448     echo bp_get_the_thread_message_date_sent();
    2449 }
    2450     /**
    2451      * Generate the 'Sent x hours ago' string for the current message.
    2452      *
    2453      * @since 2.1.0
    2454      *
    2455      * @uses strtotime() To convert the message string into a usable timestamp.
    2456      *
    2457      * @return int
    2458      */
    2459     function bp_get_the_thread_message_date_sent() {
    2460         global $thread_template;
    2461 
    2462         /**
    2463          * Filters the date sent value for the current message as a timestamp.
    2464          *
    2465          * @since 2.1.0
    2466          *
    2467          * @param string $value Timestamp of the date sent value for the current message.
    2468          */
    2469         return apply_filters( 'bp_get_the_thread_message_date_sent', strtotime( $thread_template->message->date_sent ) );
    2470     }
    2471 
    2472 /**
    2473  * Output the content of the current message in the loop.
    2474  *
    2475  * @since 1.1.0
    2476  */
    2477 function bp_the_thread_message_content() {
    2478     echo bp_get_the_thread_message_content();
    2479 }
    2480     /**
    2481      * Get the content of the current message in the loop.
    2482      *
    2483      * @since 1.1.0
    2484      *
    2485      * @return string
    2486      */
    2487     function bp_get_the_thread_message_content() {
    2488         global $thread_template;
    2489 
    2490         /**
    2491          * Filters the content of the current message in the loop.
    2492          *
    2493          * @since 1.1.0
    2494          *
    2495          * @param string $message The content of the current message in the loop.
    2496          */
    2497         return apply_filters( 'bp_get_the_thread_message_content', $thread_template->message->message );
    2498     }
    2499 
    2500 /** Embeds *******************************************************************/
    2501 
    2502 /**
    2503  * Enable oEmbed support for Messages.
    2504  *
    2505  * @since 1.5.0
    2506  *
    2507  * @see BP_Embed
    2508  */
    2509 function bp_messages_embed() {
    2510     add_filter( 'embed_post_id',         'bp_get_the_thread_message_id' );
    2511     add_filter( 'bp_embed_get_cache',    'bp_embed_message_cache',      10, 3 );
    2512     add_action( 'bp_embed_update_cache', 'bp_embed_message_save_cache', 10, 3 );
    2513 }
    2514 add_action( 'thread_loop_start', 'bp_messages_embed' );
    2515 
    2516 /**
    2517  * Fetch a private message item's cached embeds.
    2518  *
    2519  * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}.
    2520  *
    2521  * @since 2.2.0
    2522  *
    2523  * @param string $cache    An empty string passed by BP_Embed::parse_oembed() for
    2524  *                         functions like this one to filter.
    2525  * @param int    $id       The ID of the message item.
    2526  * @param string $cachekey The cache key generated in BP_Embed::parse_oembed().
    2527  * @return mixed The cached embeds for this message item.
    2528  */
    2529 function bp_embed_message_cache( $cache, $id, $cachekey ) {
    2530     return bp_messages_get_meta( $id, $cachekey );
    2531 }
    2532 
    2533 /**
    2534  * Set a private message item's embed cache.
    2535  *
    2536  * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}.
    2537  *
    2538  * @since 2.2.0
    2539  *
    2540  * @param string $cache    An empty string passed by BP_Embed::parse_oembed() for
    2541  *                         functions like this one to filter.
    2542  * @param string $cachekey The cache key generated in BP_Embed::parse_oembed().
    2543  * @param int    $id       The ID of the message item.
    2544  */
    2545 function bp_embed_message_save_cache( $cache, $cachekey, $id ) {
    2546     bp_messages_update_meta( $id, $cachekey, $cache );
    2547 }
Note: See TracChangeset for help on using the changeset viewer.