From 583e0fac537c022145725d17105101b981d8e04f Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Fri, 21 Feb 2025 15:00:25 +0100 Subject: [PATCH 1/5] Delete old posts after processing items --- friends.php | 2 +- includes/class-feed.php | 11 ++--------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/friends.php b/friends.php index 1ac13d3a..5d8d20f4 100644 --- a/friends.php +++ b/friends.php @@ -60,7 +60,7 @@ add_action( 'plugins_loaded', array( __NAMESPACE__ . '\Friends', 'init' ) ); add_action( 'admin_init', array( __NAMESPACE__ . '\Plugin_Installer', 'register_hooks' ) ); -if ( is_admin() && FRIENDS_VERSION > get_option( 'friends_plugin_version' ) ) { +if ( is_admin() && version_compare( get_option( 'friends_plugin_version' ), FRIENDS_VERSION, '<' ) ) { add_action( 'admin_init', array( __NAMESPACE__ . '\Friends', 'upgrade_plugin' ) ); } diff --git a/includes/class-feed.php b/includes/class-feed.php index 549a2f6b..7775cea0 100644 --- a/includes/class-feed.php +++ b/includes/class-feed.php @@ -120,10 +120,6 @@ public function cron_friends_refresh_feeds() { $feed->set_polling_now(); $this->retrieve_feed( $feed ); $feed->was_polled(); - $friend_user = $feed->get_friend_user(); - if ( $friend_user ) { - $friend_user->delete_outdated_posts(); - } } } @@ -144,7 +140,6 @@ public function friends_retrieve_user_feeds( $user_id ) { $feed->set_polling_now(); $this->retrieve_feed( $feed ); $feed->was_polled(); - $friend_user->delete_outdated_posts(); } } } @@ -299,10 +294,6 @@ public function retrieve_friend_posts( $ignore_due_date = false ) { $feed->set_polling_now(); $this->retrieve_feed( $feed ); $feed->was_polled(); - $friend_user = $feed->get_friend_user(); - if ( $friend_user ) { - $friend_user->delete_outdated_posts(); - } } } @@ -728,6 +719,8 @@ public function process_incoming_feed_items( array $items, User_Feed $user_feed do_action( 'friends_retrieved_new_posts', $user_feed, $new_posts, $modified_posts, $friend_user ); + $friend_user->delete_outdated_posts(); + return $new_posts; } From 334c649eca25976ba6a7b0cf71b865a3b4bdb7b7 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Fri, 21 Feb 2025 15:28:17 +0100 Subject: [PATCH 2/5] Fix tests --- includes/class-feed.php | 3 ++- tests/test-activitypub.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/includes/class-feed.php b/includes/class-feed.php index 7775cea0..8b89c8bf 100644 --- a/includes/class-feed.php +++ b/includes/class-feed.php @@ -719,7 +719,8 @@ public function process_incoming_feed_items( array $items, User_Feed $user_feed do_action( 'friends_retrieved_new_posts', $user_feed, $new_posts, $modified_posts, $friend_user ); - $friend_user->delete_outdated_posts(); + $deleted_posts = $friend_user->delete_outdated_posts(); + $new_posts = array_diff( $new_posts, $deleted_posts ); return $new_posts; } diff --git a/tests/test-activitypub.php b/tests/test-activitypub.php index d0561d11..3060a20e 100644 --- a/tests/test-activitypub.php +++ b/tests/test-activitypub.php @@ -460,7 +460,7 @@ public function test_dont_override_activitypub_mentions() { 'href' => $this->actor, 'name' => '@' . $this->friend_nicename, ), - $object->get_tag() + $object->get_tag() ?? array() ); $this->assertContains( \get_rest_url( null, '/activitypub/1.0/users/1/followers' ), $object->get_cc() ); From b75ed3f204eee400c766c76278fa0aa4955f9926 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Fri, 21 Feb 2025 15:35:38 +0100 Subject: [PATCH 3/5] Introduce a cronjob to delete old posts --- includes/class-admin.php | 15 +++++++++++++++ includes/class-feed.php | 10 ++++++++++ includes/class-friends.php | 4 ++++ includes/class-user-feed.php | 16 ++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/includes/class-admin.php b/includes/class-admin.php index ac92a143..bed29643 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -3755,6 +3755,21 @@ public function friends_cron_test() { $result['description'] .= '

'; } + if ( ! wp_next_scheduled( 'cron_friends_delete_old_posts' ) ) { + $result['label'] = __( 'The friends delete old posts cron job is not enabled', 'friends' ); + $result['badge']['color'] = 'yellow'; + $result['status'] = 'warning'; + $result['description'] .= '

'; + $result['description'] .= wp_kses_post( + sprintf( + // translators: %s is a URL. + __( 'To fix this: Enable the Friends cron job.', 'friends' ), + esc_url( wp_nonce_url( add_query_arg( '_wp_http_referer', remove_query_arg( '_wp_http_referer' ), self_admin_url( 'admin.php?page=friends-settings&rerun-activate' ) ), 'friends-settings' ) ) + ) + ); + $result['description'] .= '

'; + } + return $result; } diff --git a/includes/class-feed.php b/includes/class-feed.php index 8b89c8bf..89ad1f2d 100644 --- a/includes/class-feed.php +++ b/includes/class-feed.php @@ -69,6 +69,7 @@ private function register_hooks() { add_action( 'cron_friends_refresh_feeds', array( $this, 'cron_friends_refresh_feeds' ) ); add_action( 'friends_retrieve_user_feeds', array( $this, 'friends_retrieve_user_feeds' ) ); + add_action( 'cron_friends_delete_old_posts', array( $this, 'cron_friends_delete_old_posts' ) ); add_action( 'wp_loaded', array( $this, 'friends_add_friend_redirect' ), 100 ); add_action( 'wp_feed_options', array( $this, 'wp_feed_options' ), 90 ); @@ -123,6 +124,15 @@ public function cron_friends_refresh_feeds() { } } + /** + * Cron function to delete old posts. + */ + public function cron_friends_delete_old_posts() { + foreach ( User_Feed::get_all_users() as $friend_user ) { + $friend_user->delete_old_posts(); + } + } + /** * Function to fetch a users feeds. * diff --git a/includes/class-friends.php b/includes/class-friends.php index 9b804593..3bdf9ea6 100644 --- a/includes/class-friends.php +++ b/includes/class-friends.php @@ -653,6 +653,10 @@ private static function setup() { wp_schedule_event( time(), 'fifteen-minutes', 'cron_friends_refresh_feeds' ); } + if ( ! wp_next_scheduled( 'cron_friends_delete_old_posts' ) ) { + wp_schedule_event( time(), 'daily', 'cron_friends_delete_old_posts' ); + } + self::add_default_sidebars_widgets(); flush_rewrite_rules(); } diff --git a/includes/class-user-feed.php b/includes/class-user-feed.php index 20d33e30..5eb4d2d0 100644 --- a/includes/class-user-feed.php +++ b/includes/class-user-feed.php @@ -723,6 +723,22 @@ public static function get_by_url( $url ) { return new \WP_Error( 'term_not_found' ); } + public static function get_all_users() { + $term_query = new \WP_Term_Query( + array( + 'taxonomy' => self::TAXONOMY, + ) + ); + $users = array(); + foreach ( $term_query->get_terms() as $term ) { + $feed = new self( $term ); + $friend_user = $feed->get_friend_user(); + $users[ $friend_user->ID ] = $friend_user; + } + + return $users; + } + /** * Get all feeds due. * From b25da2173c85f386773274ce9b2be7cbb317d52e Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Fri, 21 Feb 2025 15:48:37 +0100 Subject: [PATCH 4/5] Update tests --- includes/class-admin.php | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/includes/class-admin.php b/includes/class-admin.php index bed29643..afbb7f6f 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -3656,9 +3656,13 @@ public function site_status_tests( $tests ) { 'test' => array( $this, 'friend_roles_test' ), ); $tests['direct']['friends-cron'] = array( - 'label' => __( 'Friend cron job is enabled', 'friends' ), + 'label' => __( 'Friends cron job is enabled', 'friends' ), 'test' => array( $this, 'friends_cron_test' ), ); + $tests['direct']['friends-delete-cron'] = array( + 'label' => __( 'Friends delete old posts cron job is enabled', 'friends' ), + 'test' => array( $this, 'friends_cron_delete_test' ), + ); return $tests; } @@ -3727,7 +3731,7 @@ public function friend_roles_test() { public function friends_cron_test() { $result = array( - 'label' => __( 'The friend cron job is enabled', 'friends' ), + 'label' => __( 'The refresh cron job is enabled', 'friends' ), 'status' => 'good', 'badge' => array( 'label' => __( 'Friends', 'friends' ), @@ -3739,9 +3743,8 @@ public function friends_cron_test() { '

', 'test' => 'friends-cron', ); - if ( ! wp_next_scheduled( 'cron_friends_refresh_feeds' ) ) { - $result['label'] = __( 'The friends cron job is not enabled', 'friends' ); + $result['label'] = __( 'The refresh cron job is not enabled', 'friends' ); $result['badge']['color'] = 'red'; $result['status'] = 'critical'; $result['description'] .= '

'; @@ -3755,10 +3758,28 @@ public function friends_cron_test() { $result['description'] .= '

'; } + return $result; + } + + public function friends_cron_delete_test() { + $result = array( + 'label' => __( 'The cron job to delete old posts is enabled', 'friends' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Friends', 'friends' ), + 'color' => 'green', + ), + 'description' => + '

' . + __( 'The Friends Plugin uses a cron job to delete old posts your friends.', 'friends' ) . + '

', + 'test' => 'friends-delete-cron', + ); + if ( ! wp_next_scheduled( 'cron_friends_delete_old_posts' ) ) { - $result['label'] = __( 'The friends delete old posts cron job is not enabled', 'friends' ); - $result['badge']['color'] = 'yellow'; - $result['status'] = 'warning'; + $result['label'] = __( 'The cron job to delete old posts is not enabled', 'friends' ); + $result['badge']['color'] = 'orange'; + $result['status'] = 'recommended'; $result['description'] .= '

'; $result['description'] .= wp_kses_post( sprintf( From 4f8908190a3569d2ed344f673de1d39dd4324983 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Fri, 21 Feb 2025 16:19:57 +0100 Subject: [PATCH 5/5] Sort incoming posts better --- includes/class-feed.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/includes/class-feed.php b/includes/class-feed.php index 89ad1f2d..dc971074 100644 --- a/includes/class-feed.php +++ b/includes/class-feed.php @@ -557,6 +557,14 @@ public function process_incoming_feed_items( array $items, User_Feed $user_feed $post_formats = get_post_format_strings(); $feed_post_format = $user_feed->get_post_format(); + // Sort items by date asc so that older posts will have lower ids than newer posts. + usort( + $items, + function ( $a, $b ) { + return strtotime( $a->date ) - strtotime( $b->date ); + } + ); + // Limit this as a safety measure. add_filter( 'wp_revisions_to_keep', array( $this, 'revisions_to_keep' ) ); $new_posts = array();