[ Index ] |
PHP Cross Reference of BBPress |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * bbPress BuddyPress Activity Class 5 * 6 * @package bbPress 7 * @subpackage BuddyPress 8 */ 9 10 // Exit if accessed directly 11 defined( 'ABSPATH' ) || exit; 12 13 if ( ! class_exists( 'BBP_BuddyPress_Activity' ) ) : 14 /** 15 * Loads BuddyPress Activity extension 16 * 17 * @since 2.0.0 bbPress (r3395) 18 * 19 * @package bbPress 20 * @subpackage BuddyPress 21 */ 22 class BBP_BuddyPress_Activity { 23 24 /** Variables *************************************************************/ 25 26 /** 27 * The name of the BuddyPress component, used in activity streams 28 * 29 * @var string 30 */ 31 private $component = ''; 32 33 /** 34 * Forum Create Activity Action 35 * 36 * @var string 37 */ 38 private $forum_create = ''; 39 40 /** 41 * Topic Create Activity Action 42 * 43 * @var string 44 */ 45 private $topic_create = ''; 46 47 /** 48 * Topic Close Activity Action 49 * 50 * @var string 51 */ 52 private $topic_close = ''; 53 54 /** 55 * Topic Edit Activity Action 56 * 57 * @var string 58 */ 59 private $topic_edit = ''; 60 61 /** 62 * Topic Open Activity Action 63 * 64 * @var string 65 */ 66 private $topic_open = ''; 67 68 /** 69 * Reply Create Activity Action 70 * 71 * @var string 72 */ 73 private $reply_create = ''; 74 75 /** 76 * Reply Edit Activity Action 77 * 78 * @var string 79 */ 80 private $reply_edit = ''; 81 82 /** Setup Methods *********************************************************/ 83 84 /** 85 * The bbPress BuddyPress Activity loader 86 * 87 * @since 2.0.0 bbPress (r3395) 88 */ 89 public function __construct() { 90 $this->setup_globals(); 91 $this->setup_actions(); 92 $this->setup_filters(); 93 $this->fully_loaded(); 94 } 95 96 /** 97 * Extension variables 98 * 99 * @since 2.0.0 bbPress (r3395) 100 * 101 * @access private 102 */ 103 private function setup_globals() { 104 105 // The name of the BuddyPress component, used in activity streams 106 $this->component = 'bbpress'; 107 108 // Forums 109 $this->forum_create = 'bbp_forum_create'; 110 111 // Topics 112 $this->topic_create = 'bbp_topic_create'; 113 $this->topic_edit = 'bbp_topic_edit'; 114 $this->topic_close = 'bbp_topic_close'; 115 $this->topic_open = 'bbp_topic_open'; 116 117 // Replies 118 $this->reply_create = 'bbp_reply_create'; 119 $this->reply_edit = 'bbp_reply_edit'; 120 } 121 122 /** 123 * Setup the actions 124 * 125 * @since 2.0.0 bbPress (r3395) 126 * 127 * @access private 128 */ 129 private function setup_actions() { 130 131 // Register the activity stream actions 132 add_action( 'bp_register_activity_actions', array( $this, 'register_activity_actions' ) ); 133 134 // Hook into topic and reply creation 135 add_action( 'bbp_new_topic', array( $this, 'topic_create' ), 10, 4 ); 136 add_action( 'bbp_new_reply', array( $this, 'reply_create' ), 10, 5 ); 137 138 // Hook into topic and reply status changes 139 add_action( 'edit_post', array( $this, 'topic_update' ), 10, 2 ); 140 add_action( 'edit_post', array( $this, 'reply_update' ), 10, 2 ); 141 142 // Hook into topic and reply deletion 143 add_action( 'bbp_delete_topic', array( $this, 'topic_delete' ), 10, 1 ); 144 add_action( 'bbp_delete_reply', array( $this, 'reply_delete' ), 10, 1 ); 145 } 146 147 /** 148 * Setup the filters 149 * 150 * @since 2.0.0 bbPress (r3395) 151 * 152 * @access private 153 */ 154 private function setup_filters() { 155 156 // Obey BuddyPress commenting rules 157 add_filter( 'bp_activity_can_comment', array( $this, 'activity_can_comment' ) ); 158 159 // Link directly to the topic or reply 160 add_filter( 'bp_activity_get_permalink', array( $this, 'activity_get_permalink' ), 10, 2 ); 161 } 162 163 /** 164 * Allow the variables, actions, and filters to be modified by third party 165 * plugins and themes. 166 * 167 * @since 2.1.0 bbPress (r3902) 168 */ 169 private function fully_loaded() { 170 do_action_ref_array( 'bbp_buddypress_activity_loaded', array( $this ) ); 171 } 172 173 /** Methods ***************************************************************/ 174 175 /** 176 * Register our activity actions with BuddyPress 177 * 178 * @since 2.0.0 bbPress (r3395) 179 */ 180 public function register_activity_actions() { 181 182 // Sitewide topic 183 bp_activity_set_action( 184 $this->component, 185 $this->topic_create, 186 esc_html__( 'New forum topic', 'bbpress' ), 187 'bbp_format_activity_action_new_topic', 188 esc_html__( 'Topics', 'bbpress' ), 189 array( 'activity', 'member', 'member_groups', 'group' ) 190 ); 191 192 // Sitewide reply 193 bp_activity_set_action( 194 $this->component, 195 $this->reply_create, 196 esc_html__( 'New forum reply', 'bbpress' ), 197 'bbp_format_activity_action_new_reply', 198 esc_html__( 'Replies', 'bbpress' ), 199 array( 'activity', 'member', 'member_groups', 'group' ) 200 ); 201 } 202 203 /** 204 * Wrapper for recoding bbPress actions to the BuddyPress activity stream 205 * 206 * @since 2.0.0 bbPress (r3395) 207 * 208 * @param array $args Array of arguments for bp_activity_add() 209 * 210 * @return int Activity ID if successful, false if not 211 */ 212 private function record_activity( $args = array() ) { 213 214 // Default activity args 215 $activity = bbp_parse_args( $args, array( 216 'id' => null, 217 'user_id' => bbp_get_current_user_id(), 218 'type' => '', 219 'action' => '', 220 'item_id' => '', 221 'secondary_item_id' => '', 222 'content' => '', 223 'primary_link' => '', 224 'component' => $this->component, 225 'recorded_time' => bp_core_current_time(), 226 'hide_sitewide' => false 227 ), 'record_activity' ); 228 229 // Add the activity 230 return bp_activity_add( $activity ); 231 } 232 233 /** 234 * Wrapper for deleting bbPress actions from BuddyPress activity stream 235 * 236 * @since 2.0.0 bbPress (r3395) 237 * 238 * @param array $args Array of arguments for bp_activity_add() 239 * 240 * @return int Activity ID if successful, false if not 241 */ 242 public function delete_activity( $args = array() ) { 243 244 // Default activity args 245 $activity = bbp_parse_args( $args, array( 246 'item_id' => false, 247 'component' => $this->component, 248 'type' => false, 249 'user_id' => false, 250 'secondary_item_id' => false 251 ), 'delete_activity' ); 252 253 // Delete the activity 254 bp_activity_delete_by_item_id( $activity ); 255 } 256 257 /** 258 * Check for an existing activity stream entry for a given post_id 259 * 260 * @param int $post_id ID of the topic or reply 261 * @return int if an activity id is verified, false if not 262 */ 263 private static function get_activity_id( $post_id = 0 ) { 264 265 // Try to get the activity ID of the post 266 $activity_id = (int) get_post_meta( $post_id, '_bbp_activity_id', true ); 267 268 // Bail if no activity ID is in post meta 269 if ( empty( $activity_id ) ) { 270 return null; 271 } 272 273 // Get the activity stream item, bail if it doesn't exist 274 $existing = new BP_Activity_Activity( $activity_id ); 275 if ( empty( $existing->component ) ) { 276 return null; 277 } 278 279 // Return the activity ID since we've verified the connection 280 return $activity_id; 281 } 282 283 /** 284 * Maybe disable activity stream comments on select actions 285 * 286 * @since 2.0.0 bbPress (r3399) 287 * 288 * @global BP_Activity_Template $activities_template 289 * @param boolean $can_comment 290 * @return boolean 291 */ 292 public function activity_can_comment( $can_comment = true ) { 293 global $activities_template; 294 295 // Already forced off, so comply 296 if ( false === $can_comment ) { 297 return $can_comment; 298 } 299 300 // Check if blog & forum activity stream commenting is off 301 if ( ! empty( $activities_template->disable_blogforum_replies ) ) { 302 303 // Get the current action name 304 $action_name = bp_get_activity_action_name(); 305 306 // Setup the array of possibly disabled actions 307 $disabled_actions = array( 308 $this->topic_create, 309 $this->reply_create 310 ); 311 312 // Check if this activity stream action is disabled 313 if ( in_array( $action_name, $disabled_actions, true ) ) { 314 $can_comment = false; 315 } 316 } 317 318 return $can_comment; 319 } 320 321 /** 322 * Maybe link directly to topics and replies in activity stream entries 323 * 324 * @since 2.0.0 bbPress (r3399) 325 * 326 * @param string $link 327 * @param mixed $activity_object 328 * @return string The link to the activity stream item 329 */ 330 public function activity_get_permalink( $link = '', $activity_object = false ) { 331 332 // Setup the array of actions to link directly to 333 $disabled_actions = array( 334 $this->topic_create, 335 $this->reply_create 336 ); 337 338 // Check if this activity stream action is directly linked 339 if ( in_array( $activity_object->type, $disabled_actions, true ) ) { 340 $link = $activity_object->primary_link; 341 } 342 343 return $link; 344 } 345 346 /** Topics ****************************************************************/ 347 348 /** 349 * Record an activity stream entry when a topic is created or updated 350 * 351 * @since 2.0.0 bbPress (r3395) 352 * 353 * @param int $topic_id 354 * @param int $forum_id 355 * @param array $anonymous_data 356 * @param int $topic_author_id 357 * @return Bail early if topic is by anonymous user 358 */ 359 public function topic_create( $topic_id = 0, $forum_id = 0, $anonymous_data = array(), $topic_author_id = 0 ) { 360 361 // Bail early if topic is by anonymous user 362 if ( ! empty( $anonymous_data ) ) { 363 return; 364 } 365 366 // Bail if site is private 367 if ( ! bbp_is_site_public() ) { 368 return; 369 } 370 371 // Validate activity data 372 $user_id = bbp_get_user_id( $topic_author_id ); 373 $topic_id = bbp_get_topic_id( $topic_id ); 374 $forum_id = bbp_get_forum_id( $forum_id ); 375 376 // Bail if user is not active 377 if ( bbp_is_user_inactive( $user_id ) ) { 378 return; 379 } 380 381 // Bail if topic is not published 382 if ( ! bbp_is_topic_published( $topic_id ) ) { 383 return; 384 } 385 386 // User link for topic author 387 $user_link = bbp_get_user_profile_link( $user_id ); 388 389 // Topic 390 $topic_permalink = bbp_get_topic_permalink( $topic_id ); 391 $topic_title = get_post_field( 'post_title', $topic_id, 'raw' ); 392 $topic_content = get_post_field( 'post_content', $topic_id, 'raw' ); 393 $topic_link = '<a href="' . $topic_permalink . '">' . $topic_title . '</a>'; 394 395 // Forum 396 $forum_permalink = bbp_get_forum_permalink( $forum_id ); 397 $forum_title = get_post_field( 'post_title', $forum_id, 'raw' ); 398 $forum_link = '<a href="' . $forum_permalink . '">' . $forum_title . '</a>'; 399 400 // Activity action & text 401 $activity_text = sprintf( esc_html__( '%1$s started the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link ); 402 $activity_action = apply_filters( 'bbp_activity_topic_create', $activity_text, $user_id, $topic_id, $forum_id ); 403 $activity_content = apply_filters( 'bbp_activity_topic_create_excerpt', $topic_content ); 404 405 // Compile and record the activity stream results 406 $activity_id = $this->record_activity( array( 407 'id' => $this->get_activity_id( $topic_id ), 408 'user_id' => $user_id, 409 'action' => $activity_action, 410 'content' => $activity_content, 411 'primary_link' => $topic_permalink, 412 'type' => $this->topic_create, 413 'item_id' => $topic_id, 414 'secondary_item_id' => $forum_id, 415 'recorded_time' => get_post_time( 'Y-m-d H:i:s', true, $topic_id ), 416 'hide_sitewide' => ! bbp_is_forum_public( $forum_id, false ) 417 ) ); 418 419 // Add the activity entry ID as a meta value to the topic 420 if ( ! empty( $activity_id ) ) { 421 update_post_meta( $topic_id, '_bbp_activity_id', $activity_id ); 422 } 423 } 424 425 /** 426 * Delete the activity stream entry when a topic is spammed, trashed, or deleted 427 * 428 * @param int $topic_id 429 */ 430 public function topic_delete( $topic_id = 0 ) { 431 432 // Get activity ID, bail if it doesn't exist 433 $activity_id = $this->get_activity_id( $topic_id ); 434 if ( ! empty( $activity_id ) ) { 435 return bp_activity_delete( array( 'id' => $activity_id ) ); 436 } 437 438 return false; 439 } 440 441 /** 442 * Update the activity stream entry when a topic status changes 443 * 444 * @param int $topic_id 445 * @param obj $post 446 * @return Bail early if not a topic, or topic is by anonymous user 447 */ 448 public function topic_update( $topic_id = 0, $post = null ) { 449 450 // Bail early if not a topic 451 if ( get_post_type( $post ) !== bbp_get_topic_post_type() ) { 452 return; 453 } 454 455 // Bail early if revisions are off 456 if ( ! bbp_allow_revisions() || ! post_type_supports( bbp_get_topic_post_type(), 'revisions' ) ) { 457 return; 458 } 459 460 $topic_id = bbp_get_topic_id( $topic_id ); 461 462 // Bail early if topic is by anonymous user 463 if ( bbp_is_topic_anonymous( $topic_id ) ) { 464 return; 465 } 466 467 // Action based on new status 468 if ( bbp_is_topic_public( $post->ID ) ) { 469 470 // Validate topic data 471 $forum_id = bbp_get_topic_forum_id( $topic_id ); 472 $topic_author_id = bbp_get_topic_author_id( $topic_id ); 473 474 $this->topic_create( $topic_id, $forum_id, array(), $topic_author_id ); 475 } else { 476 $this->topic_delete( $topic_id ); 477 } 478 } 479 480 /** Replies ***************************************************************/ 481 482 /** 483 * Record an activity stream entry when a reply is created 484 * 485 * @since 2.0.0 bbPress (r3395) 486 * 487 * @param int $topic_id 488 * @param int $forum_id 489 * @param array $anonymous_data 490 * @param int $topic_author_id 491 * @return Bail early if topic is by anonymous user 492 */ 493 public function reply_create( $reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = array(), $reply_author_id = 0 ) { 494 495 // Do not log activity of anonymous users 496 if ( ! empty( $anonymous_data ) ) { 497 return; 498 } 499 500 // Bail if site is private 501 if ( ! bbp_is_site_public() ) { 502 return; 503 } 504 505 // Validate activity data 506 $user_id = bbp_get_user_id( $reply_author_id ); 507 $reply_id = bbp_get_reply_id( $reply_id ); 508 $topic_id = bbp_get_topic_id( $topic_id ); 509 $forum_id = bbp_get_forum_id( $forum_id ); 510 511 // Bail if user is not active 512 if ( bbp_is_user_inactive( $user_id ) ) { 513 return; 514 } 515 516 // Bail if reply is not published 517 if ( ! bbp_is_reply_published( $reply_id ) ) { 518 return; 519 } 520 521 // Setup links for activity stream 522 $user_link = bbp_get_user_profile_link( $user_id ); 523 524 // Reply 525 $reply_url = bbp_get_reply_url( $reply_id ); 526 $reply_content = get_post_field( 'post_content', $reply_id, 'raw' ); 527 528 // Topic 529 $topic_permalink = bbp_get_topic_permalink( $topic_id ); 530 $topic_title = get_post_field( 'post_title', $topic_id, 'raw' ); 531 $topic_link = '<a href="' . $topic_permalink . '">' . $topic_title . '</a>'; 532 533 // Forum 534 $forum_permalink = bbp_get_forum_permalink( $forum_id ); 535 $forum_title = get_post_field( 'post_title', $forum_id, 'raw' ); 536 $forum_link = '<a href="' . $forum_permalink . '">' . $forum_title . '</a>'; 537 538 // Activity action & text 539 $activity_text = sprintf( esc_html__( '%1$s replied to the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link ); 540 $activity_action = apply_filters( 'bbp_activity_reply_create', $activity_text, $user_id, $reply_id, $topic_id ); 541 $activity_content = apply_filters( 'bbp_activity_reply_create_excerpt', $reply_content ); 542 543 // Compile and record the activity stream results 544 $activity_id = $this->record_activity( array( 545 'id' => $this->get_activity_id( $reply_id ), 546 'user_id' => $user_id, 547 'action' => $activity_action, 548 'content' => $activity_content, 549 'primary_link' => $reply_url, 550 'type' => $this->reply_create, 551 'item_id' => $reply_id, 552 'secondary_item_id' => $topic_id, 553 'recorded_time' => get_post_time( 'Y-m-d H:i:s', true, $reply_id ), 554 'hide_sitewide' => ! bbp_is_forum_public( $forum_id, false ) 555 ) ); 556 557 // Add the activity entry ID as a meta value to the reply 558 if ( ! empty( $activity_id ) ) { 559 update_post_meta( $reply_id, '_bbp_activity_id', $activity_id ); 560 } 561 } 562 563 /** 564 * Delete the activity stream entry when a reply is spammed, trashed, or deleted 565 * 566 * @param int $reply_id 567 */ 568 public function reply_delete( $reply_id ) { 569 570 // Get activity ID, bail if it doesn't exist 571 $activity_id = $this->get_activity_id( $reply_id ); 572 if ( ! empty( $activity_id ) ) { 573 return bp_activity_delete( array( 'id' => $activity_id ) ); 574 } 575 576 return false; 577 } 578 579 /** 580 * Update the activity stream entry when a reply status changes 581 * 582 * @param int $reply_id 583 * @param obj $post 584 * @return Bail early if not a reply, or reply is by anonymous user 585 */ 586 public function reply_update( $reply_id, $post ) { 587 588 // Bail early if not a reply 589 if ( get_post_type( $post ) !== bbp_get_reply_post_type() ) { 590 return; 591 } 592 593 // Bail early if revisions are off 594 if ( ! bbp_allow_revisions() || ! post_type_supports( bbp_get_reply_post_type(), 'revisions' ) ) { 595 return; 596 } 597 598 $reply_id = bbp_get_reply_id( $reply_id ); 599 600 // Bail early if reply is by anonymous user 601 if ( bbp_is_reply_anonymous( $reply_id ) ) { 602 return; 603 } 604 605 // Action based on new status 606 if ( bbp_get_public_status_id() === $post->post_status ) { 607 608 // Validate reply data 609 $topic_id = bbp_get_reply_topic_id( $reply_id ); 610 $forum_id = bbp_get_reply_forum_id( $reply_id ); 611 $reply_author_id = bbp_get_reply_author_id( $reply_id ); 612 613 $this->reply_create( $reply_id, $topic_id, $forum_id, array(), $reply_author_id ); 614 } else { 615 $this->reply_delete( $reply_id ); 616 } 617 } 618 } 619 endif;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sat Dec 21 01:00:52 2024 | Cross-referenced by PHPXref 0.7.1 |