| 264 | /** Engagements ***************************************************************/ |
| 265 | |
| 266 | /** |
| 267 | * Get the users who have engaged in a topic |
| 268 | * |
| 269 | * @since 2.6.0 bbPress (r6310) |
| 270 | * |
| 271 | * @param int $topic_id Optional. Topic id |
| 272 | * @uses bbp_get_users_for_object() To get user IDs who engaged |
| 273 | * @uses apply_filters() Calls 'bbp_get_topic_engagements' with the users and |
| 274 | * topic id |
| 275 | * @return array|bool Results if the topic has any engagements, otherwise false |
| 276 | */ |
| 277 | function bbp_get_topic_engagements( $topic_id = 0 ) { |
| 278 | $topic_id = bbp_get_topic_id( $topic_id ); |
| 279 | $users = bbp_get_users_for_object( $topic_id, '_bbp_engagement' ); |
| 280 | |
| 281 | return (array) apply_filters( 'bbp_get_topic_engagements', $users, $topic_id ); |
| 282 | } |
| 283 | |
| 284 | /** |
| 285 | * Get a user's topic engagements |
| 286 | * |
| 287 | * @since 2.6.0 bbPress (r6310) |
| 288 | * |
| 289 | * @param int $user_id Optional. User id |
| 290 | * @uses bbp_has_topics() To get the topics |
| 291 | * @uses apply_filters() Calls 'bbp_get_user_engagements' with the topic query and |
| 292 | * user id |
| 293 | * @return array|bool Results if user has engaged, otherwise false |
| 294 | */ |
| 295 | function bbp_get_user_engagements( $user_id = 0 ) { |
| 296 | $user_id = bbp_get_user_id( $user_id ); |
| 297 | $engagements = bbp_has_topics( array( |
| 298 | 'meta_query' => array( |
| 299 | array( |
| 300 | 'key' => '_bbp_engagement', |
| 301 | 'value' => $user_id, |
| 302 | 'compare' => 'NUMERIC' |
| 303 | ) |
| 304 | ) |
| 305 | ) ); |
| 306 | |
| 307 | return apply_filters( 'bbp_get_user_engagements', $engagements, $user_id ); |
| 308 | } |
| 309 | |
| 310 | /** |
| 311 | * Get a user's engaged topic ids |
| 312 | * |
| 313 | * @since 2.6.0 bbPress (r6310) |
| 314 | * |
| 315 | * @param int $user_id Optional. User id |
| 316 | * @uses bbp_get_user_id() To get the user id |
| 317 | * @uses bbp_get_topic_post_type() To get the topic post type |
| 318 | * @uses apply_filters() Calls 'bbp_get_user_engaged_topic_ids' with |
| 319 | * the engaged topics and user id |
| 320 | * @return array|bool Results if user has engaged, otherwise false |
| 321 | */ |
| 322 | function bbp_get_user_engaged_topic_ids( $user_id = 0 ) { |
| 323 | $user_id = bbp_get_user_id( $user_id ); |
| 324 | $engagements = new WP_Query( array( |
| 325 | 'fields' => 'ids', |
| 326 | 'post_type' => bbp_get_topic_post_type(), |
| 327 | 'nopaging' => true, |
| 328 | 'no_found_rows' => true, |
| 329 | 'meta_query' => array( array( |
| 330 | 'key' => '_bbp_engagement', |
| 331 | 'value' => $user_id, |
| 332 | 'compare' => 'NUMERIC' |
| 333 | ) ) |
| 334 | ) ); |
| 335 | |
| 336 | return (array) apply_filters( 'bbp_get_user_engaged_topic_ids', $engagements->posts, $user_id ); |
| 337 | } |
| 338 | |
| 339 | /** |
| 340 | * Check if a user is engaged in a topic or not |
| 341 | * |
| 342 | * @since 2.6.0 bbPress (r6310) |
| 343 | * |
| 344 | * @param int $user_id Optional. User id |
| 345 | * @param int $topic_id Optional. Topic id |
| 346 | * @uses bbp_get_user_id() To get the user id |
| 347 | * @uses bbp_get_user_engaged_topic_ids() To get the user engaged topics |
| 348 | * @uses bbp_get_topic() To get the topic |
| 349 | * @uses bbp_get_topic_id() To get the topic id |
| 350 | * @uses bbp_is_object_of_user() To check if the user has engaged |
| 351 | * @uses apply_filters() Calls 'bbp_is_user_engaged' with the bool, user id, |
| 352 | * topic id and engagements |
| 353 | * @return bool True if the topic is in user's engagements, otherwise false |
| 354 | */ |
| 355 | function bbp_is_user_engaged( $user_id = 0, $topic_id = 0 ) { |
| 356 | $retval = false; |
| 357 | $user_id = bbp_get_user_id( $user_id, true, true ); |
| 358 | $engagements = bbp_get_user_engaged_topic_ids( $user_id ); |
| 359 | |
| 360 | if ( ! empty( $engagements ) ) { |
| 361 | |
| 362 | // Checking a specific topic id |
| 363 | if ( ! empty( $topic_id ) ) { |
| 364 | $topic = bbp_get_topic( $topic_id ); |
| 365 | $topic_id = ! empty( $topic ) ? $topic->ID : 0; |
| 366 | |
| 367 | // Using the global topic id |
| 368 | } elseif ( bbp_get_topic_id() ) { |
| 369 | $topic_id = bbp_get_topic_id(); |
| 370 | |
| 371 | // Use the current post id |
| 372 | } elseif ( ! bbp_get_topic_id() ) { |
| 373 | $topic_id = get_the_ID(); |
| 374 | } |
| 375 | |
| 376 | // Is topic_id in the user's engagements |
| 377 | if ( ! empty( $topic_id ) ) { |
| 378 | $retval = bbp_is_object_of_user( $topic_id, $user_id, '_bbp_engagement' ); |
| 379 | } |
| 380 | } |
| 381 | |
| 382 | return (bool) apply_filters( 'bbp_is_user_engaged', (bool) $retval, $user_id, $topic_id, $engagements ); |
| 383 | } |
| 384 | |
| 385 | /** |
| 386 | * Add a topic to user's engagements |
| 387 | * |
| 388 | * @since 2.6.0 bbPress (r6310) |
| 389 | * |
| 390 | * @param int $user_id Optional. User id |
| 391 | * @param int $topic_id Optional. Topic id |
| 392 | * @uses bbp_is_user_engaged() To check if the user is engaged in a topic |
| 393 | * @uses do_action() Calls 'bbp_add_user_engagement' with the user id and topic id |
| 394 | * @return bool Always true |
| 395 | */ |
| 396 | function bbp_add_user_engagement( $user_id = 0, $topic_id = 0 ) { |
| 397 | |
| 398 | // Bail if not enough info |
| 399 | if ( empty( $user_id ) || empty( $topic_id ) ) { |
| 400 | return false; |
| 401 | } |
| 402 | |
| 403 | // Bail if no topic |
| 404 | $topic = bbp_get_topic( $topic_id ); |
| 405 | if ( empty( $topic ) ) { |
| 406 | return false; |
| 407 | } |
| 408 | |
| 409 | // Bail if already a engaged |
| 410 | if ( bbp_is_user_engaged( $user_id, $topic_id ) ) { |
| 411 | return false; |
| 412 | } |
| 413 | |
| 414 | // Bail if add fails |
| 415 | if ( ! bbp_add_user_to_object( $topic_id, $user_id, '_bbp_engagement' ) ) { |
| 416 | return false; |
| 417 | } |
| 418 | |
| 419 | do_action( 'bbp_add_user_engagement', $user_id, $topic_id ); |
| 420 | |
| 421 | return true; |
| 422 | } |
| 423 | |
| 424 | /** |
| 425 | * Remove a topic from user's engagements |
| 426 | * |
| 427 | * @since 2.6.0 bbPress (r6310) |
| 428 | * |
| 429 | * @param int $user_id Optional. User id |
| 430 | * @param int $topic_id Optional. Topic id |
| 431 | * @uses bbp_is_user_engaged() To check if the user is engaged in a topic |
| 432 | * @uses do_action() Calls 'bbp_remove_user_engagement' with the user & topic id |
| 433 | * @return bool True if the topic was removed from user's engagements, otherwise |
| 434 | * false |
| 435 | */ |
| 436 | function bbp_remove_user_engagement( $user_id, $topic_id ) { |
| 437 | |
| 438 | // Bail if not enough info |
| 439 | if ( empty( $user_id ) || empty( $topic_id ) ) { |
| 440 | return false; |
| 441 | } |
| 442 | |
| 443 | // Bail if not already engaged |
| 444 | if ( ! bbp_is_user_engaged( $user_id, $topic_id ) ) { |
| 445 | return false; |
| 446 | } |
| 447 | |
| 448 | // Bail if remove fails |
| 449 | if ( ! bbp_remove_user_from_object( $topic_id, $user_id, '_bbp_engagement' ) ) { |
| 450 | return false; |
| 451 | } |
| 452 | |
| 453 | do_action( 'bbp_remove_user_engagement', $user_id, $topic_id ); |
| 454 | |
| 455 | return true; |
| 456 | } |
| 457 | |