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();