Skip to:
Content

BuddyPress.org

Changeset 13149


Ignore:
Timestamp:
11/14/2021 03:16:38 PM (3 years ago)
Author:
imath
Message:

Improve the bp_activity_comments cache management

This cache should also be cleared when:

  • an activity comment has been marked as spam/ham.
  • an activity comment has been updated.

Props oztaser

Fixes #8296

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-activity/bp-activity-cache.php

    r11101 r13149  
    4848    wp_cache_delete( $activity->id, 'bp_activity' );
    4949    wp_cache_delete( 'bp_activity_sitewide_front', 'bp' );
     50
     51    // Clear the comments cache for the parent activity ID.
     52    if ( 'activity_comment' === $activity->type ) {
     53        wp_cache_delete( $activity->item_id, 'bp_activity_comments' );
     54    }
    5055}
    5156add_action( 'bp_activity_after_save', 'bp_activity_clear_cache_for_activity' );
  • trunk/src/bp-activity/bp-activity-functions.php

    r13146 r13149  
    35963596    wp_cache_delete( 'bp_activity_sitewide_front', 'bp' );
    35973597
     3598    if ( 'activity_comment' === $activity->type ) {
     3599        $activity_id = $activity->item_id;
     3600    } else {
     3601        $activity_id = $activity->id;
     3602    }
     3603
    35983604    // Clear the activity comment cache for this activity item.
    3599     wp_cache_delete( $activity->id, 'bp_activity_comments' );
     3605    wp_cache_delete( $activity_id, 'bp_activity_comments' );
    36003606
    36013607    // If Akismet is active, and this was a manual spam/ham request, stop Akismet checking the activity.
     
    36433649    wp_cache_delete( 'bp_activity_sitewide_front', 'bp' );
    36443650
     3651    if ( 'activity_comment' === $activity->type ) {
     3652        $activity_id = $activity->item_id;
     3653    } else {
     3654        $activity_id = $activity->id;
     3655    }
     3656
    36453657    // Clear the activity comment cache for this activity item.
    3646     wp_cache_delete( $activity->id, 'bp_activity_comments' );
     3658    wp_cache_delete( $activity_id, 'bp_activity_comments' );
    36473659
    36483660    // If Akismet is active, and this was a manual spam/ham request, stop Akismet checking the activity.
  • trunk/tests/phpunit/testcases/activity/cache.php

    r11737 r13149  
    359359        $this->assertEqualSets( array( $activities[0] ), wp_list_pluck( $q2['activities'], 'id' ) );
    360360    }
     361
     362    /**
     363     * @ticket BP8296
     364     */
     365    public function test_activity_comments_cache_should_be_cleared_when_parent_activity_marked_as_spam() {
     366        $u1 = self::factory()->user->create();
     367        $u2 = self::factory()->user->create();
     368
     369        $activity = self::factory()->activity->create(
     370            array(
     371                'component' => buddypress()->activity->id,
     372                'type'      => 'activity_update',
     373                'user_id'   => $u1,
     374                'content'   => 'bar',
     375            )
     376        );
     377
     378        $comment = bp_activity_new_comment(
     379            array(
     380                'activity_id'       => $activity,
     381                'skip_notification' => true,
     382                'user_id'           => $u2,
     383                'content'           => 'foo',
     384            )
     385        );
     386
     387        $activities = bp_activity_get(
     388            array(
     389                'display_comments' => true,
     390            )
     391        );
     392
     393        $cached_ids = wp_list_pluck( wp_cache_get( $activity, 'bp_activity_comments' ), 'content', 'id' );
     394        $this->assertTrue( 'foo' === $cached_ids[ $comment ] );
     395
     396        $activity_obj = new BP_Activity_Activity( $activity );
     397
     398        // An activity is always saved after being marked as spam.
     399        bp_activity_mark_as_spam( $activity_obj );
     400        $activity_obj->save();
     401
     402        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The activity comments cache should be cleared when an activity has been marked as spam' );
     403    }
     404
     405    /**
     406     * @ticket BP8296
     407     */
     408    public function test_activity_comments_cache_should_be_cleared_when_activity_comment_marked_as_spam() {
     409        $u1 = self::factory()->user->create();
     410        $u2 = self::factory()->user->create();
     411
     412        $activity = self::factory()->activity->create(
     413            array(
     414                'component' => buddypress()->activity->id,
     415                'type'      => 'activity_update',
     416                'user_id'   => $u1,
     417                'content'   => 'foo',
     418            )
     419        );
     420
     421        $comment = bp_activity_new_comment(
     422            array(
     423                'activity_id'       => $activity,
     424                'skip_notification' => true,
     425                'user_id'           => $u2,
     426                'content'           => 'bar',
     427            )
     428        );
     429
     430        $activities = bp_activity_get(
     431            array(
     432                'display_comments' => true,
     433            )
     434        );
     435
     436        $cached_ids = wp_list_pluck( wp_cache_get( $activity, 'bp_activity_comments' ), 'content', 'id' );
     437        $this->assertTrue( 'bar' === $cached_ids[ $comment ] );
     438
     439        $comment_obj = new BP_Activity_Activity( $comment );
     440
     441        // An activity is always saved after being marked as spam.
     442        bp_activity_mark_as_spam( $comment_obj );
     443        $comment_obj->save();
     444
     445        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The parent activity comments cache should be cleared when an activity comment has been marked as spam' );
     446    }
     447
     448    /**
     449     * @ticket BP8296
     450     */
     451    public function test_activity_comments_cache_should_be_cleared_when_parent_activity_marked_as_ham() {
     452        $u1 = self::factory()->user->create();
     453        $u2 = self::factory()->user->create();
     454
     455        $activity = self::factory()->activity->create(
     456            array(
     457                'component' => buddypress()->activity->id,
     458                'type'      => 'activity_update',
     459                'user_id'   => $u1,
     460                'content'   => 'bar',
     461            )
     462        );
     463
     464        $comment = bp_activity_new_comment(
     465            array(
     466                'activity_id'       => $activity,
     467                'skip_notification' => true,
     468                'user_id'           => $u2,
     469                'content'           => 'foo',
     470            )
     471        );
     472
     473        $activities = bp_activity_get(
     474            array(
     475                'display_comments' => true,
     476            )
     477        );
     478
     479        $activity_obj          = new BP_Activity_Activity( $activity );
     480        $activity_obj->is_spam = 1;
     481        $activity_obj->save();
     482
     483        // An activity is always saved after being marked as spam.
     484        bp_activity_mark_as_ham( $activity_obj );
     485        $activity_obj->save();
     486
     487        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The activity comments cache should be cleared when an activity has been marked as ham' );
     488    }
     489
     490    /**
     491     * @ticket BP8296
     492     */
     493    public function test_activity_comments_cache_should_be_cleared_when_activity_comment_marked_as_ham() {
     494        $u1 = self::factory()->user->create();
     495        $u2 = self::factory()->user->create();
     496
     497        $activity = self::factory()->activity->create(
     498            array(
     499                'component' => buddypress()->activity->id,
     500                'type'      => 'activity_update',
     501                'user_id'   => $u1,
     502                'content'   => 'foo',
     503            )
     504        );
     505
     506        $comment = bp_activity_new_comment(
     507            array(
     508                'activity_id'       => $activity,
     509                'skip_notification' => true,
     510                'user_id'           => $u2,
     511                'content'           => 'bar',
     512            )
     513        );
     514
     515        $activities = bp_activity_get(
     516            array(
     517                'display_comments' => true,
     518            )
     519        );
     520
     521        $comment_obj          = new BP_Activity_Activity( $comment );
     522        $comment_obj->is_spam = 1;
     523        $comment_obj->save();
     524
     525        // An activity is always saved after being marked as spam.
     526        bp_activity_mark_as_ham( $comment_obj );
     527        $comment_obj->save();
     528
     529        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The parent activity comments cache should be cleared when an activity comment has been marked as ham' );
     530    }
     531
     532    /**
     533     * @ticket BP8296
     534     */
     535    public function test_activity_comments_cache_should_be_cleared_when_activity_comment_has_been_updated() {
     536        $u1 = self::factory()->user->create();
     537        $u2 = self::factory()->user->create();
     538
     539        $activity = self::factory()->activity->create(
     540            array(
     541                'component' => buddypress()->activity->id,
     542                'type'      => 'activity_update',
     543                'user_id'   => $u1,
     544                'content'   => 'foo',
     545            )
     546        );
     547
     548        $comment = bp_activity_new_comment(
     549            array(
     550                'activity_id'       => $activity,
     551                'skip_notification' => true,
     552                'user_id'           => $u2,
     553                'content'           => 'bar',
     554            )
     555        );
     556
     557        $activities = bp_activity_get(
     558            array(
     559                'display_comments' => true,
     560            )
     561        );
     562
     563        $comment_obj          = new BP_Activity_Activity( $comment );
     564        $comment_obj->content = 'foo';
     565        $comment_obj->save();
     566
     567        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The parent activity comments cache should be cleared when an activity comment has been updated' );
     568    }
     569
     570    /**
     571     * @ticket BP8296
     572     */
     573    public function test_activity_comments_cache_should_be_cleared_when_activity_comment_has_been_deleted() {
     574        $u1 = self::factory()->user->create();
     575        $u2 = self::factory()->user->create();
     576
     577        $activity = self::factory()->activity->create(
     578            array(
     579                'component' => buddypress()->activity->id,
     580                'type'      => 'activity_update',
     581                'user_id'   => $u1,
     582                'content'   => 'foo',
     583            )
     584        );
     585
     586        $comment = bp_activity_new_comment(
     587            array(
     588                'activity_id'       => $activity,
     589                'skip_notification' => true,
     590                'user_id'           => $u2,
     591                'content'           => 'bar',
     592            )
     593        );
     594
     595        $activities = bp_activity_get(
     596            array(
     597                'display_comments' => true,
     598            )
     599        );
     600
     601        bp_activity_delete_comment( $activity, $comment );
     602
     603        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The parent activity comments cache should be cleared when an activity comment has been deleted' );
     604    }
     605
     606    /**
     607     * @ticket BP8296
     608     */
     609    public function test_activity_comments_cache_should_be_cleared_when_activity_comment_has_been_added() {
     610        $u1 = self::factory()->user->create();
     611        $u2 = self::factory()->user->create();
     612
     613        $activity = self::factory()->activity->create(
     614            array(
     615                'component' => buddypress()->activity->id,
     616                'type'      => 'activity_update',
     617                'user_id'   => $u1,
     618                'content'   => 'foo',
     619            )
     620        );
     621
     622        $c1 = bp_activity_new_comment(
     623            array(
     624                'activity_id'       => $activity,
     625                'skip_notification' => true,
     626                'user_id'           => $u2,
     627                'content'           => 'bar',
     628            )
     629        );
     630
     631        $activities = bp_activity_get(
     632            array(
     633                'display_comments' => true,
     634            )
     635        );
     636
     637        $c2 = bp_activity_new_comment(
     638            array(
     639                'activity_id'       => $activity,
     640                'skip_notification' => true,
     641                'user_id'           => $u1,
     642                'content'           => 'taz',
     643            )
     644        );
     645
     646        $this->assertFalse( wp_cache_get( $activity, 'bp_activity_comments' ), 'The parent activity comments cache should be cleared when a new activity comment has been added' );
     647    }
    361648}
Note: See TracChangeset for help on using the changeset viewer.