Changeset 10522
- Timestamp:
- 02/05/2016 05:22:55 AM (9 years ago)
- Location:
- trunk/src/bp-messages
- Files:
-
- 3 edited
- 4 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bp-messages/bp-messages-loader.php
r10417 r10522 13 13 defined( 'ABSPATH' ) || exit; 14 14 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 } 15 require dirname( __FILE__ ) . '/classes/class-bp-messages-component.php'; 343 16 344 17 /** -
trunk/src/bp-messages/bp-messages-template.php
r10421 r10522 11 11 defined( 'ABSPATH' ) || exit; 12 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( '←', 'Message pagination previous text', 'buddypress' ), 217 'next_text' => _x( '→', '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 } 13 require dirname( __FILE__ ) . '/classes/class-bp-messages-box-template.php'; 14 require dirname( __FILE__ ) . '/classes/class-bp-messages-thread-template.php'; 348 15 349 16 /** … … 1753 1420 1754 1421 /** 1755 * Message Thread Template Class1756 */1757 class BP_Messages_Thread_Template {1758 1759 /**1760 * The loop iterator.1761 *1762 * @var int1763 */1764 public $current_message = -1;1765 1766 /**1767 * Number of messages returned by the paged query.1768 *1769 * @var int1770 */1771 public $message_count = 0;1772 1773 /**1774 * The message object currently being iterated on.1775 *1776 * @var object1777 */1778 public $message;1779 1780 /**1781 * Thread that the current messages belong to.1782 *1783 * @var BP_Messages_Thread1784 */1785 public $thread;1786 1787 /**1788 * A flag for whether the loop is currently being iterated.1789 *1790 * @var bool1791 */1792 public $in_the_loop = false;1793 1794 /**1795 * The page number being requested.1796 *1797 * @var int1798 */1799 public $pag_page = 1;1800 1801 /**1802 * The number of items being requested per page.1803 *1804 * @var int1805 */1806 public $pag_num = 10;1807 1808 /**1809 * An HTML string containing pagination links.1810 *1811 * @var string1812 */1813 public $pag_links = '';1814 1815 /**1816 * The total number of messages matching the query.1817 *1818 * @var int1819 */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 the1877 * 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.01893 */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 current1907 * message data while looping, so that template tags used during1908 * 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.01923 */1924 do_action( 'thread_loop_start' );1925 }1926 }1927 }1928 1929 /**1930 1422 * Initialize the messages template loop for a specific thread. 1931 1423 * -
trunk/src/bp-messages/bp-messages-widgets.php
r10417 r10522 11 11 defined( 'ABSPATH' ) || exit; 12 12 13 require dirname( __FILE__ ) . '/classes/class-bp-messages-sitewide-notices-widget.php'; 14 13 15 /** 14 16 * Register widgets for the Messages component. … … 20 22 } 21 23 add_action( 'bp_register_widgets', 'bp_messages_register_widgets' ); 22 23 /**24 * A widget that displays sitewide notices.25 *26 * @since 1.9.027 */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.072 * @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 <?php88 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 and96 * 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 <?php130 }131 } -
trunk/src/bp-messages/classes/class-bp-messages-box-template.php
r10515 r10522 1 1 <?php 2 2 /** 3 * BuddyPress Messages Template Tags.3 * BuddyPress Messages Box Template Class. 4 4 * 5 5 * @package BuddyPress … … 346 346 } 347 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 responsible353 * for querying the database and retrieving private messages for display inside354 * the theme via individual template parts for a member's inbox/sentbox/notices.355 *356 * @since 1.0.0357 *358 * @global BP_Messages_Box_Template $messages_template359 *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 current365 * 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 is375 * 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 ID396 // @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.0421 *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 bool433 */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 object443 */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 int459 */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.0467 *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 string483 */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.0491 *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 string507 */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.0515 *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 in525 * the thread of which you are *not* the author.526 *527 * When viewing your Sentbox, last message is the most recent message in528 * the thread of which you *are* the member.529 *530 * @since 2.0.0531 */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 in539 * the thread of which you are *not* the author.540 *541 * When viewing your Sentbox, last message is the most recent message in542 * the thread of which you *are* the member.543 *544 * @since 2.0.0545 *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.0555 *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 string571 */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.0579 *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 string595 */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.0603 *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 thread613 * 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: current622 * thread being iterated on in the loop.623 * @return string624 */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.0638 *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 string654 */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.0662 *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.0675 */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.0683 *684 * @return string685 */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' => $id695 );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.0710 *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.0722 */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.0730 *731 * @return string732 */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' => $id742 );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.0757 *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 string773 */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.10787 *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 ? true803 : false;804 805 /**806 * Filters whether or not a message thread has unread items.807 *808 * @since 2.1.0809 *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 int825 */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_count831 : false;832 833 /**834 * Filters the current thread's unread count.835 *836 * @since 1.0.0837 *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.0847 *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.0857 *858 * @param int|bool $thread_id Optional. ID of the thread.859 * Defaults to current thread ID.860 * @return int861 */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' => false869 ) );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.0880 *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.0890 *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 string927 */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.0935 *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 string951 */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.0958 *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 and978 * 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, see983 * {@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' => $alt1006 ) );1007 1008 /**1009 * Filters the avatar for the last sender in the current message thread.1010 *1011 * @since 1.0.01012 *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 int1036 */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.01043 *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 string1059 */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.01067 *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.php1097 * @since 1.6.01098 */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 <?php1119 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.01127 *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.01150 *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 string1166 */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.01177 *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 a1197 * failed submission).1198 *1199 * @return string1200 */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.01212 *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 a1228 * failed submission).1229 *1230 * @return string1231 */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.01243 *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> 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> 1269 <a href="#" id="mark_as_unread"><?php _ex('Mark as Unread', 'Message management markup', 'buddypress') ?></a> 1270 1271 <?php endif; ?>1272 1273 <a href="#" id="delete_<?php echo bp_current_action(); ?>_messages"><?php _e( 'Delete Selected', 'buddypress' ); ?></a> 1274 1275 <?php1276 }1277 1278 /**1279 * Output the dropdown for bulk management of messages.1280 *1281 * @since 2.2.01282 */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 <?php1292 /**1293 * Action to add additional options to the messages bulk management dropdown.1294 *1295 * @since 2.3.01296 */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 <?php1302 }1303 1304 /**1305 * Return whether or not the notice is currently active.1306 *1307 * @since 1.6.01308 *1309 * @return bool1310 */1311 function bp_messages_is_active_notice() {1312 global $messages_template;1313 1314 $retval = ! empty( $messages_template->thread->is_active )1315 ? true1316 : false;1317 1318 /**1319 * Filters whether or not the notice is currently active.1320 *1321 * @since 2.1.01322 *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.01334 * @deprecated 1.6.01335 * @uses bp_get_message_is_active_notice()1336 * @return bool1337 */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 the1345 * theme.1346 *1347 * @since 1.0.01348 * @deprecated 1.6.01349 * @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 int1370 */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.01378 *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 string1394 */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.01402 *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 string1418 */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.01426 *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 string1442 */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.01450 *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.01474 *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 string1491 */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.01505 *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 string1521 */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.01535 *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.01545 *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.01555 *1556 * @return string1557 */1558 function bp_get_messages_slug() {1559 1560 /**1561 * Filters the messages component slug.1562 *1563 * @since 1.5.01564 *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 <?php1597 }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.101622 *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.61634 *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 string1651 */1652 function bp_get_send_message_button() {1653 // Note: 'bp_get_send_message_button' is a legacy filter. Use1654 // '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.01661 *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 string1688 */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.01695 *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><?php1717 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 string1736 */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.01748 *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 Class1756 */1757 class BP_Messages_Thread_Template {1758 1759 /**1760 * The loop iterator.1761 *1762 * @var int1763 */1764 public $current_message = -1;1765 1766 /**1767 * Number of messages returned by the paged query.1768 *1769 * @var int1770 */1771 public $message_count = 0;1772 1773 /**1774 * The message object currently being iterated on.1775 *1776 * @var object1777 */1778 public $message;1779 1780 /**1781 * Thread that the current messages belong to.1782 *1783 * @var BP_Messages_Thread1784 */1785 public $thread;1786 1787 /**1788 * A flag for whether the loop is currently being iterated.1789 *1790 * @var bool1791 */1792 public $in_the_loop = false;1793 1794 /**1795 * The page number being requested.1796 *1797 * @var int1798 */1799 public $pag_page = 1;1800 1801 /**1802 * The number of items being requested per page.1803 *1804 * @var int1805 */1806 public $pag_num = 10;1807 1808 /**1809 * An HTML string containing pagination links.1810 *1811 * @var string1812 */1813 public $pag_links = '';1814 1815 /**1816 * The total number of messages matching the query.1817 *1818 * @var int1819 */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 the1877 * 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.01893 */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 current1907 * message data while looping, so that template tags used during1908 * 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.01923 */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 from1936 * 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 for1939 * 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 string1975 */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 bool1985 */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 object1996 */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 int2013 */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.02021 *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 string2037 */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.02045 *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 the2055 * members/single/messages/single.php template. This function is no longer used2056 * by BuddyPress.2057 *2058 * @return string2059 */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.02074 *2075 * @return int2076 */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.02086 *2087 * @return int2088 */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.02094 *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.02104 */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.02112 *2113 * @return string2114 */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.02136 *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.02146 */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.02154 *2155 * @return int2156 */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->id2162 : null;2163 2164 /**2165 * Filters the ID of the current message in the thread.2166 *2167 * @since 1.9.02168 *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.02178 */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.02186 *2187 * @return string2188 */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.02209 *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 string2227 */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.02241 *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.02251 */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.02259 *2260 * @return string2261 */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_id2267 : 0;2268 2269 /**2270 * Filters the ID for message sender within a single thread.2271 *2272 * @since 2.1.02273 *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 more2293 * 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.02313 *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.02329 */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.02337 *2338 * @return string2339 */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.02347 *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.02357 */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.02365 *2366 * @return string2367 */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.02381 *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.02391 */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.02399 *2400 * @return string URL2401 */2402 function bp_get_the_thread_delete_link() {2403 2404 /**2405 * Filters the URL for deleting the current thread.2406 *2407 * @since 1.0.02408 *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.02419 */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.02427 *2428 * @return string2429 */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.02436 *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.02446 */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.02454 *2455 * @uses strtotime() To convert the message string into a usable timestamp.2456 *2457 * @return int2458 */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.02466 *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.02476 */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.02484 *2485 * @return string2486 */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.02494 *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.02506 *2507 * @see BP_Embed2508 */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.02522 *2523 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for2524 * 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.02539 *2540 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for2541 * 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 341 341 } 342 342 } 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 1 1 <?php 2 2 /** 3 * BuddyPress Messages Widgets.3 * BuddyPress Messages Sitewide Notices Widget. 4 4 * 5 5 * @package BuddyPress … … 10 10 // Exit if accessed directly. 11 11 defined( 'ABSPATH' ) || exit; 12 13 /**14 * Register widgets for the Messages component.15 *16 * @since 1.9.017 */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' );22 12 23 13 /** -
trunk/src/bp-messages/classes/class-bp-messages-thread-template.php
r10515 r10522 1 1 <?php 2 2 /** 3 * BuddyPress Messages T emplate Tags.3 * BuddyPress Messages Thread Template Class. 4 4 * 5 5 * @package BuddyPress … … 10 10 // Exit if accessed directly. 11 11 defined( 'ABSPATH' ) || exit; 12 13 /**14 * Message Box Template Class15 */16 class BP_Messages_Box_Template {17 18 /**19 * The loop iterator.20 *21 * @var int22 */23 public $current_thread = -1;24 25 /**26 * The number of threads returned by the paged query.27 *28 * @var int29 */30 public $current_thread_count = 0;31 32 /**33 * Total number of threads matching the query params.34 *35 * @var int36 */37 public $total_thread_count = 0;38 39 /**40 * Array of threads located by the query.41 *42 * @var array43 */44 public $threads = array();45 46 /**47 * The thread object currently being iterated on.48 *49 * @var object50 */51 public $thread = false;52 53 /**54 * A flag for whether the loop is currently being iterated.55 *56 * @var bool57 */58 public $in_the_loop = false;59 60 /**61 * User ID of the current inbox.62 *63 * @var int64 */65 public $user_id = 0;66 67 /**68 * The current "box" view ('notices', 'sentbox', 'inbox').69 *70 * @var string71 */72 public $box = 'inbox';73 74 /**75 * The page number being requested.76 *77 * @var int78 */79 public $pag_page = 1;80 81 /**82 * The number of items being requested per page.83 *84 * @var int85 */86 public $pag_num = 10;87 88 /**89 * An HTML string containing pagination links.90 *91 * @var string92 */93 public $pag_links = '';94 95 /**96 * Search terms for limiting the thread query.97 *98 * @var string99 */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_page153 ) );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( '←', 'Message pagination previous text', 'buddypress' ),217 'next_text' => _x( '→', '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 the265 * 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.0281 */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 data295 * while looping, so that template tags used during that iteration make296 * 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.0343 */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 responsible353 * for querying the database and retrieving private messages for display inside354 * the theme via individual template parts for a member's inbox/sentbox/notices.355 *356 * @since 1.0.0357 *358 * @global BP_Messages_Box_Template $messages_template359 *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 current365 * 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 is375 * 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 ID396 // @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.0421 *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 bool433 */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 object443 */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 int459 */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.0467 *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 string483 */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.0491 *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 string507 */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.0515 *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 in525 * the thread of which you are *not* the author.526 *527 * When viewing your Sentbox, last message is the most recent message in528 * the thread of which you *are* the member.529 *530 * @since 2.0.0531 */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 in539 * the thread of which you are *not* the author.540 *541 * When viewing your Sentbox, last message is the most recent message in542 * the thread of which you *are* the member.543 *544 * @since 2.0.0545 *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.0555 *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 string571 */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.0579 *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 string595 */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.0603 *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 thread613 * 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: current622 * thread being iterated on in the loop.623 * @return string624 */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.0638 *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 string654 */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.0662 *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.0675 */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.0683 *684 * @return string685 */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' => $id695 );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.0710 *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.0722 */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.0730 *731 * @return string732 */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' => $id742 );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.0757 *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 string773 */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.10787 *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 ? true803 : false;804 805 /**806 * Filters whether or not a message thread has unread items.807 *808 * @since 2.1.0809 *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 int825 */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_count831 : false;832 833 /**834 * Filters the current thread's unread count.835 *836 * @since 1.0.0837 *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.0847 *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.0857 *858 * @param int|bool $thread_id Optional. ID of the thread.859 * Defaults to current thread ID.860 * @return int861 */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' => false869 ) );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.0880 *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.0890 *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 string927 */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.0935 *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 string951 */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.0958 *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 and978 * 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, see983 * {@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' => $alt1006 ) );1007 1008 /**1009 * Filters the avatar for the last sender in the current message thread.1010 *1011 * @since 1.0.01012 *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 int1036 */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.01043 *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 string1059 */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.01067 *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.php1097 * @since 1.6.01098 */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 <?php1119 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.01127 *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.01150 *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 string1166 */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.01177 *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 a1197 * failed submission).1198 *1199 * @return string1200 */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.01212 *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 a1228 * failed submission).1229 *1230 * @return string1231 */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.01243 *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> 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> 1269 <a href="#" id="mark_as_unread"><?php _ex('Mark as Unread', 'Message management markup', 'buddypress') ?></a> 1270 1271 <?php endif; ?>1272 1273 <a href="#" id="delete_<?php echo bp_current_action(); ?>_messages"><?php _e( 'Delete Selected', 'buddypress' ); ?></a> 1274 1275 <?php1276 }1277 1278 /**1279 * Output the dropdown for bulk management of messages.1280 *1281 * @since 2.2.01282 */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 <?php1292 /**1293 * Action to add additional options to the messages bulk management dropdown.1294 *1295 * @since 2.3.01296 */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 <?php1302 }1303 1304 /**1305 * Return whether or not the notice is currently active.1306 *1307 * @since 1.6.01308 *1309 * @return bool1310 */1311 function bp_messages_is_active_notice() {1312 global $messages_template;1313 1314 $retval = ! empty( $messages_template->thread->is_active )1315 ? true1316 : false;1317 1318 /**1319 * Filters whether or not the notice is currently active.1320 *1321 * @since 2.1.01322 *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.01334 * @deprecated 1.6.01335 * @uses bp_get_message_is_active_notice()1336 * @return bool1337 */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 the1345 * theme.1346 *1347 * @since 1.0.01348 * @deprecated 1.6.01349 * @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 int1370 */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.01378 *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 string1394 */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.01402 *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 string1418 */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.01426 *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 string1442 */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.01450 *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.01474 *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 string1491 */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.01505 *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 string1521 */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.01535 *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.01545 *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.01555 *1556 * @return string1557 */1558 function bp_get_messages_slug() {1559 1560 /**1561 * Filters the messages component slug.1562 *1563 * @since 1.5.01564 *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 <?php1597 }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.101622 *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.61634 *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 string1651 */1652 function bp_get_send_message_button() {1653 // Note: 'bp_get_send_message_button' is a legacy filter. Use1654 // '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.01661 *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 string1688 */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.01695 *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><?php1717 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 string1736 */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.01748 *1749 * @param string $recipients Recipients usernames for 'To' field prefilling.1750 */1751 return apply_filters( 'bp_get_message_get_recipient_usernames', $recipients );1752 }1753 12 1754 13 /** … … 1926 185 } 1927 186 } 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 from1936 * 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 for1939 * 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 string1975 */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 bool1985 */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 object1996 */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 int2013 */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.02021 *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 string2037 */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.02045 *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 the2055 * members/single/messages/single.php template. This function is no longer used2056 * by BuddyPress.2057 *2058 * @return string2059 */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.02074 *2075 * @return int2076 */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.02086 *2087 * @return int2088 */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.02094 *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.02104 */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.02112 *2113 * @return string2114 */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.02136 *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.02146 */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.02154 *2155 * @return int2156 */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->id2162 : null;2163 2164 /**2165 * Filters the ID of the current message in the thread.2166 *2167 * @since 1.9.02168 *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.02178 */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.02186 *2187 * @return string2188 */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.02209 *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 string2227 */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.02241 *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.02251 */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.02259 *2260 * @return string2261 */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_id2267 : 0;2268 2269 /**2270 * Filters the ID for message sender within a single thread.2271 *2272 * @since 2.1.02273 *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 more2293 * 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.02313 *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.02329 */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.02337 *2338 * @return string2339 */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.02347 *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.02357 */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.02365 *2366 * @return string2367 */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.02381 *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.02391 */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.02399 *2400 * @return string URL2401 */2402 function bp_get_the_thread_delete_link() {2403 2404 /**2405 * Filters the URL for deleting the current thread.2406 *2407 * @since 1.0.02408 *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.02419 */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.02427 *2428 * @return string2429 */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.02436 *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.02446 */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.02454 *2455 * @uses strtotime() To convert the message string into a usable timestamp.2456 *2457 * @return int2458 */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.02466 *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.02476 */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.02484 *2485 * @return string2486 */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.02494 *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.02506 *2507 * @see BP_Embed2508 */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.02522 *2523 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for2524 * 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.02539 *2540 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for2541 * 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.