From ad3a2cb4555c2b887287ac8440ba5215564b6f4e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:22:13 +0000 Subject: [PATCH 1/5] Initial plan From 78a22d80c28dacffd51572a9cbfd1fd8ccd082ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:26:29 +0000 Subject: [PATCH 2/5] Fix duplicate-cron false positive for hooks with unique args (e.g. publish_future_post) Co-authored-by: swissspidy <841956+swissspidy@users.noreply.github.com> --- features/check-cron-duplicates.feature | 15 +++++++++++++++ src/Check/Cron_Duplicates.php | 9 +++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/features/check-cron-duplicates.feature b/features/check-cron-duplicates.feature index 0449c2b..d63aa1e 100644 --- a/features/check-cron-duplicates.feature +++ b/features/check-cron-duplicates.feature @@ -26,6 +26,21 @@ Feature: Check for excess duplicate cron entries | cron-duplicates | success | All cron job counts are within normal operating expectations. | And STDERR should be empty + Scenario: Cron check is healthy when same hook has unique args (e.g. publish_future_post) + Given a wp-content/mu-plugins/plugin.php file: + """ + = $this->threshold_count ) { + ++$job_counts[ $key ]; + if ( $job_counts[ $key ] >= $this->threshold_count ) { $excess_duplicates = true; } } From 9bafe5891c5913b1eb7acbfd3a22cbb1c721989a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:19:27 +0000 Subject: [PATCH 3/5] Fix: request args field explicitly and guard against missing args key Co-authored-by: swissspidy <841956+swissspidy@users.noreply.github.com> --- src/Check/Cron.php | 8 +++++++- src/Check/Cron_Duplicates.php | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Check/Cron.php b/src/Check/Cron.php index e83ace1..3b4e1de 100644 --- a/src/Check/Cron.php +++ b/src/Check/Cron.php @@ -16,7 +16,13 @@ protected static function get_crons() { } ob_start(); - WP_CLI::run_command( array( 'cron', 'event', 'list' ), array( 'format' => 'json' ) ); + WP_CLI::run_command( + array( 'cron', 'event', 'list' ), + array( + 'format' => 'json', + 'fields' => 'hook,args', + ) + ); $ret = ob_get_clean(); self::$crons = ! empty( $ret ) ? json_decode( $ret, true ) : array(); return self::$crons; diff --git a/src/Check/Cron_Duplicates.php b/src/Check/Cron_Duplicates.php index 7ee497f..031e59c 100644 --- a/src/Check/Cron_Duplicates.php +++ b/src/Check/Cron_Duplicates.php @@ -19,7 +19,7 @@ public function run() { $job_counts = array(); $excess_duplicates = false; foreach ( $crons as $job ) { - $key = json_encode( array( $job['hook'], $job['args'] ) ); + $key = json_encode( array( $job['hook'], isset( $job['args'] ) ? $job['args'] : array() ) ); if ( ! isset( $job_counts[ $key ] ) ) { $job_counts[ $key ] = 0; } From 54949882d6c317fff30a3d351a2521257d1e16f9 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Thu, 19 Mar 2026 23:44:28 +0100 Subject: [PATCH 4/5] Update src/Check/Cron_Duplicates.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Check/Cron_Duplicates.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Check/Cron_Duplicates.php b/src/Check/Cron_Duplicates.php index 031e59c..0bf4dfb 100644 --- a/src/Check/Cron_Duplicates.php +++ b/src/Check/Cron_Duplicates.php @@ -19,7 +19,15 @@ public function run() { $job_counts = array(); $excess_duplicates = false; foreach ( $crons as $job ) { - $key = json_encode( array( $job['hook'], isset( $job['args'] ) ? $job['args'] : array() ) ); + $key_data = array( $job['hook'], isset( $job['args'] ) ? $job['args'] : array() ); + if ( function_exists( 'wp_json_encode' ) ) { + $key = wp_json_encode( $key_data ); + } else { + $key = json_encode( $key_data ); + } + if ( false === $key ) { + $key = serialize( $key_data ); + } if ( ! isset( $job_counts[ $key ] ) ) { $job_counts[ $key ] = 0; } From 5c2340221d6bb35f17ffdcc561edf81e08552543 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Fri, 20 Mar 2026 22:32:45 +0100 Subject: [PATCH 5/5] Lint fix --- src/Check/Cron_Duplicates.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Check/Cron_Duplicates.php b/src/Check/Cron_Duplicates.php index 0bf4dfb..b21eef5 100644 --- a/src/Check/Cron_Duplicates.php +++ b/src/Check/Cron_Duplicates.php @@ -26,6 +26,7 @@ public function run() { $key = json_encode( $key_data ); } if ( false === $key ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize $key = serialize( $key_data ); } if ( ! isset( $job_counts[ $key ] ) ) {