From 1cbc66abb1dc590e26adeb9cf44ad6a0b059ab84 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 14:58:45 -0800 Subject: [PATCH 01/41] Admin Menu: Reorder menu items so external links appear last MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adjusts the menu positions for Jetpack admin menu items to place all links that open in new windows (external links marked with ↗) after internal links. This improves the user experience by grouping similar link types together. Changes: - Activity Log: moved from position 8 to 14 - Subscribers: moved from position 11 to 15 - Jetpack Manage: moved from position 15 to 16 - Scan & VaultPress Backup (external): base offset changed from 9 to 17 - Updated test to verify external links appear after Settings Internal links (Settings at position 13) now appear before all external links. Made-with: Cursor --- .../update-header-and-nav-cleanup-and-improvements | 4 ++++ .../packages/my-jetpack/src/class-activitylog.php | 4 ++-- .../my-jetpack/src/class-jetpack-manage.php | 2 +- .../update-header-and-nav-cleanup-and-improvements | 4 ++++ .../modules/scan/class-admin-sidebar-link.php | 2 +- projects/plugins/jetpack/modules/subscriptions.php | 2 +- .../tests/php/general/Jetpack_Admin_Menu_Test.php | 13 ++++++++----- 7 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 projects/packages/my-jetpack/changelog/update-header-and-nav-cleanup-and-improvements create mode 100644 projects/plugins/jetpack/changelog/update-header-and-nav-cleanup-and-improvements diff --git a/projects/packages/my-jetpack/changelog/update-header-and-nav-cleanup-and-improvements b/projects/packages/my-jetpack/changelog/update-header-and-nav-cleanup-and-improvements new file mode 100644 index 000000000000..d0e608741f9f --- /dev/null +++ b/projects/packages/my-jetpack/changelog/update-header-and-nav-cleanup-and-improvements @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Reorder admin menu items so external links appear last. diff --git a/projects/packages/my-jetpack/src/class-activitylog.php b/projects/packages/my-jetpack/src/class-activitylog.php index f6a1d9f98450..b2c19bbf4d3e 100644 --- a/projects/packages/my-jetpack/src/class-activitylog.php +++ b/projects/packages/my-jetpack/src/class-activitylog.php @@ -46,13 +46,13 @@ public static function add_submenu_jetpack() { } return Admin_Menu::add_menu( - /** "Activity Log" is a product name, do not translate. */ + /** "Activity Log" is a product name, do not translate. */ 'Activity Log', 'Activity Log ', 'manage_options', esc_url( Redirect::get_url( 'cloud-activity-log-wp-menu', $args ) ), null, - 8 + 14 ); } } diff --git a/projects/packages/my-jetpack/src/class-jetpack-manage.php b/projects/packages/my-jetpack/src/class-jetpack-manage.php index cb07b88d4d50..7ce62abd6892 100644 --- a/projects/packages/my-jetpack/src/class-jetpack-manage.php +++ b/projects/packages/my-jetpack/src/class-jetpack-manage.php @@ -80,7 +80,7 @@ public static function add_submenu_jetpack() { 'manage_options', esc_url( Redirect::get_url( 'cloud-manage-dashboard-wp-menu', $args ) ), null, - 15 + 16 ); } diff --git a/projects/plugins/jetpack/changelog/update-header-and-nav-cleanup-and-improvements b/projects/plugins/jetpack/changelog/update-header-and-nav-cleanup-and-improvements new file mode 100644 index 000000000000..7c654690b9dc --- /dev/null +++ b/projects/plugins/jetpack/changelog/update-header-and-nav-cleanup-and-improvements @@ -0,0 +1,4 @@ +Significance: patch +Type: enhancement + +Admin Menu: Reorder menu items so that links opening in new windows appear last. diff --git a/projects/plugins/jetpack/modules/scan/class-admin-sidebar-link.php b/projects/plugins/jetpack/modules/scan/class-admin-sidebar-link.php index 7481ddf2cf73..49f89cfcc312 100644 --- a/projects/plugins/jetpack/modules/scan/class-admin-sidebar-link.php +++ b/projects/plugins/jetpack/modules/scan/class-admin-sidebar-link.php @@ -115,7 +115,7 @@ public function maybe_add_admin_link() { */ private function get_link_offset() { global $submenu; - $offset = 9; + $offset = 17; if ( ! array_key_exists( 'jetpack', $submenu ) ) { return $offset; diff --git a/projects/plugins/jetpack/modules/subscriptions.php b/projects/plugins/jetpack/modules/subscriptions.php index 883d7cb3a49d..ac9136e5f4e6 100644 --- a/projects/plugins/jetpack/modules/subscriptions.php +++ b/projects/plugins/jetpack/modules/subscriptions.php @@ -1058,7 +1058,7 @@ public function add_subscribers_menu() { 'manage_options', esc_url( $link ), null, - 11 + 15 ); } diff --git a/projects/plugins/jetpack/tests/php/general/Jetpack_Admin_Menu_Test.php b/projects/plugins/jetpack/tests/php/general/Jetpack_Admin_Menu_Test.php index c9ac78005361..d5b324f4d104 100644 --- a/projects/plugins/jetpack/tests/php/general/Jetpack_Admin_Menu_Test.php +++ b/projects/plugins/jetpack/tests/php/general/Jetpack_Admin_Menu_Test.php @@ -45,6 +45,7 @@ public function tear_down() { /** * Test the order of many of the Jetpack admin menu items. + * External links (those that open in new windows) should appear after internal links. * * @see https://github.com/Automattic/jetpack-roadmap/issues/856#issuecomment-2308599496 */ @@ -77,13 +78,15 @@ public function test_jetpack_admin_menu_order() { $search_submenu_position = array_search( 'Jetpack Search', $submenu_names, true ); $settings_submenu_position = array_search( 'Settings', $submenu_names, true ); - if ( in_array( 'Activity Log', $submenu_names, true ) ) { - $activity_log_submenu_position = array_search( 'Activity Log', $submenu_names, true ); - $this->assertLessThan( $search_submenu_position, $activity_log_submenu_position, 'Activity Log should be above Search in the submenu order.' ); - $this->assertLessThan( $activity_log_submenu_position, $backup_submenu_position, 'Jetpack VaultPress Backup should be above Activity Log in the submenu order.' ); - } + // Test internal link ordering (should appear before Settings). $this->assertLessThan( $backup_submenu_position, $videopress_submenu_position, 'Jetpack VideoPress should be above Jetpack VaultPress Backup in the submenu order.' ); $this->assertLessThan( $search_submenu_position, $backup_submenu_position, 'Jetpack VaultPress Backup should be above Search in the submenu order.' ); $this->assertLessThan( $settings_submenu_position, $search_submenu_position, 'Search should be above Settings in the submenu order.' ); + + // Test that external links (those that open in new windows) appear after Settings. + if ( in_array( 'Activity Log', $submenu_names, true ) ) { + $activity_log_submenu_position = array_search( 'Activity Log', $submenu_names, true ); + $this->assertLessThan( $activity_log_submenu_position, $settings_submenu_position, 'Settings should be above Activity Log in the submenu order (external links should be last).' ); + } } } From cd60b97947dbccbc22a81f92482a7f0a3cf42c84 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 15:53:12 -0800 Subject: [PATCH 02/41] Remove unnecessary paragraph bottom padding --- .../boost/app/assets/src/js/layout/header/header.module.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/plugins/boost/app/assets/src/js/layout/header/header.module.scss b/projects/plugins/boost/app/assets/src/js/layout/header/header.module.scss index 522d17070389..e93c1f177a7b 100644 --- a/projects/plugins/boost/app/assets/src/js/layout/header/header.module.scss +++ b/projects/plugins/boost/app/assets/src/js/layout/header/header.module.scss @@ -22,7 +22,7 @@ font-size: 13px; color: #757575; margin: 0; - padding-block-end: 8px; + padding: 0; } } From 9c736c8b6c2dab83fa9e1c0a301f2c44d56b762b Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 16:56:24 -0800 Subject: [PATCH 03/41] Add devin's wp.org handle to readme --- projects/plugins/jetpack/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/plugins/jetpack/readme.txt b/projects/plugins/jetpack/readme.txt index da208acf3d00..c5227061beac 100644 --- a/projects/plugins/jetpack/readme.txt +++ b/projects/plugins/jetpack/readme.txt @@ -1,5 +1,5 @@ === Jetpack - WP Security, Backup, Speed, & Growth === -Contributors: automattic, adamkheckler, adrianmoldovanwp, aduth, akirk, allendav, alternatekev, andy, annamcphee, annezazu, apeatling, arcangelini, arsihasi, azaozz, barry, batmoo, beaulebens, bindlegirl, biskobe, bjorsch, blobaugh, brbrr, brileyhooper, cainm, cena, cfinke, cgastrell, chaselivingston, chellycat, clickysteve, csonnek, danielbachhuber, daniloercoli, davoraltman, delawski, designsimply, dkmyta, dllh, drawmyface, dsmart, dun2mis, dzver, ebinnion, egregor, eliorivero, enej, eoigal, erania-pinnera, ethitter, fgiannar, gcorne, georgestephanis, gibrown, goldsounds, hew, hugobaeta, hypertextranch, iammattthomas, iandunn, joen, jblz, jeffgolenski, jeherve, jenhooks, jenia, jessefriedman, jgs, jkudish, jmdodd, joanrho, johnjamesjacoby, jshreve, kbrownkd, keoshi, koke, kraftbj, lancewillett, leogermani, lhkowalski, lschuyler, macmanx, martinremy, matt, mattwiebe, matveb, maverick3x6, mcsf, mdawaffe, mdbitz, MichaelArestad, migueluy, miguelxavierpenha, mikeyarce, mkaz, nancythanki, nickmomrik, njweller, nunyvega, obenland, oskosk, pento, professor44, rachelsquirrel, rdcoll, renatoagds, retrofox, richardmtl, richardmuscat, robertbpugh, roccotripaldi, ryancowles, samhotchkiss, samiff, scarstocea, scottsweb, sdixon194, sdquirk, sermitr, simison, stephdau, thehenridev, tmoorewp, tyxla, Viper007Bond, westi, williamvianas, wpkaren, yoavf, zinigor +Contributors: automattic, adamkheckler, adrianmoldovanwp, aduth, akirk, allendav, alternatekev, andy, annamcphee, annezazu, apeatling, arcangelini, arsihasi, azaozz, barry, batmoo, beaulebens, bindlegirl, biskobe, bjorsch, blobaugh, brbrr, brileyhooper, cainm, cena, cfinke, cgastrell, chaselivingston, chellycat, clickysteve, csonnek, danielbachhuber, daniloercoli, davoraltman, delawski, designsimply, dkmyta, dllh, drawmyface, dsmart, dun2mis, dzver, ebinnion, egregor, eliorivero, enej, eoigal, erania-pinnera, ethitter, fgiannar, gcorne, georgestephanis, gibrown, goldsounds, hew, hugobaeta, hypertextranch, iammattthomas, iandunn, joen, jblz, jeffgolenski, jeherve, jenhooks, jenia, jessefriedman, jgs, jkudish, jmdodd, joanrho, johnjamesjacoby, jshreve, kbrownkd, keoshi, koke, kraftbj, lancewillett, leogermani, lhkowalski, lschuyler, macmanx, martinremy, matt, mattwiebe, matveb, maverick3x6, mcsf, mdawaffe, mdbitz, MichaelArestad, migueluy, miguelxavierpenha, mikeyarce, mkaz, nancythanki, nickmomrik, njweller, nunyvega, obenland, oskosk, pento, professor44, rachelsquirrel, rdcoll, renatoagds, retrofox, richardmtl, richardmuscat, robertbpugh, roccotripaldi, ryancowles, samhotchkiss, samiff, scarstocea, scottsweb, sdixon194, sdquirk, sermitr, simison, stephdau, thehenridev, tmoorewp, tyxla, Viper007Bond, westi, williamvianas, wpkaren, yoavf, zinigor, dlocc Tags: Security, backup, malware, scan, performance Stable tag: 15.6-beta Requires at least: 6.8 From fad3e8fbb784a600736bc155a4454bc5c443db59 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 16:56:52 -0800 Subject: [PATCH 04/41] Remove paragraph bottom padding causing vertical alignment issues --- .../components/components/admin-page/style.module.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/projects/js-packages/components/components/admin-page/style.module.scss b/projects/js-packages/components/components/admin-page/style.module.scss index c4d13fa6566b..a7a71b502b2a 100644 --- a/projects/js-packages/components/components/admin-page/style.module.scss +++ b/projects/js-packages/components/components/admin-page/style.module.scss @@ -45,3 +45,7 @@ :global(.jetpack-admin-page #dolly) { background-color: #fff; } + +:global(.jetpack-admin-page .admin-ui-page__header-subtitle) { + padding-bottom: 0; +} From 36d5cea6fd14f2159ab7ee96741f441c77f2900e Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 17:21:05 -0800 Subject: [PATCH 05/41] add devin (dlocc) to contributors list --- projects/plugins/boost/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/plugins/boost/readme.txt b/projects/plugins/boost/readme.txt index 9a5bdd5a280a..1c03b4d9e3ae 100644 --- a/projects/plugins/boost/readme.txt +++ b/projects/plugins/boost/readme.txt @@ -1,5 +1,5 @@ === Jetpack Boost - Website Speed, Performance and Critical CSS === -Contributors: automattic, xwp, adnan007, bjorsch, danwalmsley, davidlonjon, dilirity, donncha, ebinnion, exelero, jeherve, jpolakovic, karthikbhatb, kraftbj, lsarsfield, luchad0res, pyronaur, rheinardkorf, scruffian, thingalon +Contributors: automattic, xwp, adnan007, bjorsch, danwalmsley, davidlonjon, dilirity, donncha, ebinnion, exelero, jeherve, jpolakovic, karthikbhatb, kraftbj, lsarsfield, luchad0res, pyronaur, rheinardkorf, scruffian, thingalon, dlocc Donate link: https://automattic.com Tags: performance, speed, web vitals, critical css, cache Requires at least: 6.8 From 0a1cc55693e245153d2d2b0f356c9b60fd79eaa9 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 17:42:23 -0800 Subject: [PATCH 06/41] Backup: Replace Jetpack Button with WordPress Button component Replace @automattic/jetpack-components Button with @wordpress/components Button in the BackupNowButton component for better consistency with WordPress core components. Changes: - Updated import to use @wordpress/components Button - Removed custom weight prop (not supported by WordPress Button) - Updated variant default to 'solid' - Added size='compact' prop for appropriate button sizing Made-with: Cursor --- .../update-header-and-nav-cleanup-and-improvements | 4 ++++ .../backup/src/js/components/back-up-now/index.jsx | 9 +++------ 2 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 projects/packages/backup/changelog/update-header-and-nav-cleanup-and-improvements diff --git a/projects/packages/backup/changelog/update-header-and-nav-cleanup-and-improvements b/projects/packages/backup/changelog/update-header-and-nav-cleanup-and-improvements new file mode 100644 index 000000000000..9670460299a2 --- /dev/null +++ b/projects/packages/backup/changelog/update-header-and-nav-cleanup-and-improvements @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Replace @automattic/jetpack-components Button with @wordpress/components Button in BackupNowButton component. diff --git a/projects/packages/backup/src/js/components/back-up-now/index.jsx b/projects/packages/backup/src/js/components/back-up-now/index.jsx index 8f5bb789986d..a5ccca74fcc5 100644 --- a/projects/packages/backup/src/js/components/back-up-now/index.jsx +++ b/projects/packages/backup/src/js/components/back-up-now/index.jsx @@ -1,6 +1,5 @@ -import { Button } from '@automattic/jetpack-components'; import apiFetch from '@wordpress/api-fetch'; -import { Tooltip } from '@wordpress/components'; +import { Button, Tooltip } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; import { __ } from '@wordpress/i18n'; import PropTypes from 'prop-types'; @@ -14,8 +13,7 @@ export const BackupNowButton = ( { children, tooltipText, tracksEventName, - variant = 'primary', - weight = 'regular', + variant = 'solid', onClick, } ) => { const { tracks } = useAnalytics(); @@ -91,11 +89,11 @@ export const BackupNowButton = ( { const button = (
@@ -110,7 +108,6 @@ BackupNowButton.propTypes = { tooltipText: PropTypes.string, tracksEventName: PropTypes.string, variant: PropTypes.oneOf( [ 'primary', 'secondary', 'tertiary' ] ), - weight: PropTypes.oneOf( [ 'regular', 'bold' ] ), onClick: PropTypes.func, }; From 7259e4d58bb74798c595ac39fe00812ac2702d2d Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 17:44:23 -0800 Subject: [PATCH 07/41] Admin Menu: Simplify menu item titles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplify Jetpack admin menu item titles for better readability: - "Akismet Anti-spam" → "Anti-spam" - "VaultPress Backup" → "Backups" These shorter titles provide a cleaner menu experience while maintaining clarity about the product functionality. Made-with: Cursor --- .../changelog/update-header-and-nav-cleanup-and-improvements | 4 ++++ projects/packages/admin-ui/src/class-admin-menu.php | 2 +- projects/packages/backup/changelog/simplify-menu-title | 4 ++++ projects/packages/backup/src/class-jetpack-backup.php | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 projects/packages/admin-ui/changelog/update-header-and-nav-cleanup-and-improvements create mode 100644 projects/packages/backup/changelog/simplify-menu-title diff --git a/projects/packages/admin-ui/changelog/update-header-and-nav-cleanup-and-improvements b/projects/packages/admin-ui/changelog/update-header-and-nav-cleanup-and-improvements new file mode 100644 index 000000000000..b61bd655a188 --- /dev/null +++ b/projects/packages/admin-ui/changelog/update-header-and-nav-cleanup-and-improvements @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Simplify Akismet admin menu title from 'Akismet Anti-spam' to 'Anti-spam'. diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index c96b867b45a4..ae4be20501bd 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -58,7 +58,7 @@ function () { remove_action( 'admin_menu', array( 'Akismet_Admin', 'admin_menu' ), 5 ); // Add an Anti-spam menu item for Jetpack. - self::add_menu( __( 'Akismet Anti-spam', 'jetpack-admin-ui' ), __( 'Akismet Anti-spam', 'jetpack-admin-ui' ), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ), 6 ); + self::add_menu( __( 'Akismet Anti-spam', 'jetpack-admin-ui' ), __( 'Anti-spam', 'jetpack-admin-ui' ), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ), 6 ); }, 4 ); diff --git a/projects/packages/backup/changelog/simplify-menu-title b/projects/packages/backup/changelog/simplify-menu-title new file mode 100644 index 000000000000..a44a79d67e63 --- /dev/null +++ b/projects/packages/backup/changelog/simplify-menu-title @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Simplify admin menu title from 'VaultPress Backup' to 'Backups'. diff --git a/projects/packages/backup/src/class-jetpack-backup.php b/projects/packages/backup/src/class-jetpack-backup.php index 385c24b8fa2b..2b954497f613 100644 --- a/projects/packages/backup/src/class-jetpack-backup.php +++ b/projects/packages/backup/src/class-jetpack-backup.php @@ -162,7 +162,7 @@ function () { public static function add_wp_admin_submenu() { $page_suffix = Admin_Menu::add_menu( __( 'Jetpack VaultPress Backup', 'jetpack-backup-pkg' ), - _x( 'VaultPress Backup', 'The Jetpack VaultPress Backup product name, without the Jetpack prefix', 'jetpack-backup-pkg' ), + _x( 'Backups', 'The Jetpack VaultPress Backup product name, without the Jetpack prefix', 'jetpack-backup-pkg' ), 'manage_options', 'jetpack-backup', array( __CLASS__, 'plugin_settings_page' ), From d611f0e16ce55057bb8b949ececcbe6dacd37fad Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 17:48:38 -0800 Subject: [PATCH 08/41] Add missing changelog entries for admin header improvements Made-with: Cursor --- .../changelog/update-header-and-nav-cleanup-and-improvements | 5 +++++ .../changelog/update-header-and-nav-cleanup-and-improvements | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 projects/js-packages/components/changelog/update-header-and-nav-cleanup-and-improvements create mode 100644 projects/plugins/boost/changelog/update-header-and-nav-cleanup-and-improvements diff --git a/projects/js-packages/components/changelog/update-header-and-nav-cleanup-and-improvements b/projects/js-packages/components/changelog/update-header-and-nav-cleanup-and-improvements new file mode 100644 index 000000000000..c16dbb28f9f5 --- /dev/null +++ b/projects/js-packages/components/changelog/update-header-and-nav-cleanup-and-improvements @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Part of admin header normalization work + +Remove padding from admin page header subtitle for consistent spacing. diff --git a/projects/plugins/boost/changelog/update-header-and-nav-cleanup-and-improvements b/projects/plugins/boost/changelog/update-header-and-nav-cleanup-and-improvements new file mode 100644 index 000000000000..042f59eaa73d --- /dev/null +++ b/projects/plugins/boost/changelog/update-header-and-nav-cleanup-and-improvements @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Add dlocc contributor to readme, remove header padding + + From a21d0870c0038dc2c5335e3fa78a096f0c3c3464 Mon Sep 17 00:00:00 2001 From: Devin Walker Date: Mon, 2 Mar 2026 18:03:33 -0800 Subject: [PATCH 09/41] Update projects/packages/backup/src/class-jetpack-backup.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- projects/packages/backup/src/class-jetpack-backup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/backup/src/class-jetpack-backup.php b/projects/packages/backup/src/class-jetpack-backup.php index 2b954497f613..d7c74279d92a 100644 --- a/projects/packages/backup/src/class-jetpack-backup.php +++ b/projects/packages/backup/src/class-jetpack-backup.php @@ -162,7 +162,7 @@ function () { public static function add_wp_admin_submenu() { $page_suffix = Admin_Menu::add_menu( __( 'Jetpack VaultPress Backup', 'jetpack-backup-pkg' ), - _x( 'Backups', 'The Jetpack VaultPress Backup product name, without the Jetpack prefix', 'jetpack-backup-pkg' ), + _x( 'Backups', 'Menu label for the Jetpack Backups page in WP Admin', 'jetpack-backup-pkg' ), 'manage_options', 'jetpack-backup', array( __CLASS__, 'plugin_settings_page' ), From 649069d2cdad06e3c5c42959417e7d2c0d439177 Mon Sep 17 00:00:00 2001 From: Devin Walker Date: Mon, 2 Mar 2026 18:04:01 -0800 Subject: [PATCH 10/41] Update projects/packages/my-jetpack/src/class-activitylog.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- projects/packages/my-jetpack/src/class-activitylog.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/my-jetpack/src/class-activitylog.php b/projects/packages/my-jetpack/src/class-activitylog.php index b2c19bbf4d3e..fecdce9ca310 100644 --- a/projects/packages/my-jetpack/src/class-activitylog.php +++ b/projects/packages/my-jetpack/src/class-activitylog.php @@ -46,7 +46,7 @@ public static function add_submenu_jetpack() { } return Admin_Menu::add_menu( - /** "Activity Log" is a product name, do not translate. */ + /** "Activity Log" is a product name, do not translate. */ 'Activity Log', 'Activity Log ', 'manage_options', From 10b8090fd230d411e399272222ae41e23b1ceb04 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 18:06:28 -0800 Subject: [PATCH 11/41] Update BackupNowButton propTypes to include new variant options Changed the variant prop in the BackupNowButton component from 'primary', 'secondary', 'tertiary' to 'solid', 'outline', 'minimal', 'unstyled' for improved flexibility in button styling. --- .../packages/backup/src/js/components/back-up-now/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/backup/src/js/components/back-up-now/index.jsx b/projects/packages/backup/src/js/components/back-up-now/index.jsx index a5ccca74fcc5..6a96d2637d92 100644 --- a/projects/packages/backup/src/js/components/back-up-now/index.jsx +++ b/projects/packages/backup/src/js/components/back-up-now/index.jsx @@ -107,7 +107,7 @@ BackupNowButton.propTypes = { children: PropTypes.node, tooltipText: PropTypes.string, tracksEventName: PropTypes.string, - variant: PropTypes.oneOf( [ 'primary', 'secondary', 'tertiary' ] ), + variant: PropTypes.oneOf( [ 'solid', 'outline', 'minimal', 'unstyled' ] ), onClick: PropTypes.func, }; From 84fc4afa6f7aba37eaf28fccae5ce7b626fa3076 Mon Sep 17 00:00:00 2001 From: Devin Walker Date: Mon, 2 Mar 2026 20:35:01 -0800 Subject: [PATCH 12/41] Update projects/plugins/jetpack/readme.txt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- projects/plugins/jetpack/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/plugins/jetpack/readme.txt b/projects/plugins/jetpack/readme.txt index c5227061beac..b001fb2b2b94 100644 --- a/projects/plugins/jetpack/readme.txt +++ b/projects/plugins/jetpack/readme.txt @@ -1,5 +1,5 @@ === Jetpack - WP Security, Backup, Speed, & Growth === -Contributors: automattic, adamkheckler, adrianmoldovanwp, aduth, akirk, allendav, alternatekev, andy, annamcphee, annezazu, apeatling, arcangelini, arsihasi, azaozz, barry, batmoo, beaulebens, bindlegirl, biskobe, bjorsch, blobaugh, brbrr, brileyhooper, cainm, cena, cfinke, cgastrell, chaselivingston, chellycat, clickysteve, csonnek, danielbachhuber, daniloercoli, davoraltman, delawski, designsimply, dkmyta, dllh, drawmyface, dsmart, dun2mis, dzver, ebinnion, egregor, eliorivero, enej, eoigal, erania-pinnera, ethitter, fgiannar, gcorne, georgestephanis, gibrown, goldsounds, hew, hugobaeta, hypertextranch, iammattthomas, iandunn, joen, jblz, jeffgolenski, jeherve, jenhooks, jenia, jessefriedman, jgs, jkudish, jmdodd, joanrho, johnjamesjacoby, jshreve, kbrownkd, keoshi, koke, kraftbj, lancewillett, leogermani, lhkowalski, lschuyler, macmanx, martinremy, matt, mattwiebe, matveb, maverick3x6, mcsf, mdawaffe, mdbitz, MichaelArestad, migueluy, miguelxavierpenha, mikeyarce, mkaz, nancythanki, nickmomrik, njweller, nunyvega, obenland, oskosk, pento, professor44, rachelsquirrel, rdcoll, renatoagds, retrofox, richardmtl, richardmuscat, robertbpugh, roccotripaldi, ryancowles, samhotchkiss, samiff, scarstocea, scottsweb, sdixon194, sdquirk, sermitr, simison, stephdau, thehenridev, tmoorewp, tyxla, Viper007Bond, westi, williamvianas, wpkaren, yoavf, zinigor, dlocc +Contributors: automattic, adamkheckler, adrianmoldovanwp, aduth, akirk, allendav, alternatekev, andy, annamcphee, annezazu, apeatling, arcangelini, arsihasi, azaozz, barry, batmoo, beaulebens, bindlegirl, biskobe, bjorsch, blobaugh, brbrr, brileyhooper, cainm, cena, cfinke, cgastrell, chaselivingston, chellycat, clickysteve, csonnek, danielbachhuber, daniloercoli, davoraltman, delawski, designsimply, dkmyta, dllh, dlocc, drawmyface, dsmart, dun2mis, dzver, ebinnion, egregor, eliorivero, enej, eoigal, erania-pinnera, ethitter, fgiannar, gcorne, georgestephanis, gibrown, goldsounds, hew, hugobaeta, hypertextranch, iammattthomas, iandunn, joen, jblz, jeffgolenski, jeherve, jenhooks, jenia, jessefriedman, jgs, jkudish, jmdodd, joanrho, johnjamesjacoby, jshreve, kbrownkd, keoshi, koke, kraftbj, lancewillett, leogermani, lhkowalski, lschuyler, macmanx, martinremy, matt, mattwiebe, matveb, maverick3x6, mcsf, mdawaffe, mdbitz, MichaelArestad, migueluy, miguelxavierpenha, mikeyarce, mkaz, nancythanki, nickmomrik, njweller, nunyvega, obenland, oskosk, pento, professor44, rachelsquirrel, rdcoll, renatoagds, retrofox, richardmtl, richardmuscat, robertbpugh, roccotripaldi, ryancowles, samhotchkiss, samiff, scarstocea, scottsweb, sdixon194, sdquirk, sermitr, simison, stephdau, thehenridev, tmoorewp, tyxla, Viper007Bond, westi, williamvianas, wpkaren, yoavf, zinigor Tags: Security, backup, malware, scan, performance Stable tag: 15.6-beta Requires at least: 6.8 From be32c94a17dde92b43e01e180689af32bcae955c Mon Sep 17 00:00:00 2001 From: Devin Walker Date: Mon, 2 Mar 2026 20:35:36 -0800 Subject: [PATCH 13/41] Update projects/js-packages/components/components/admin-page/style.module.scss Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../components/components/admin-page/style.module.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/js-packages/components/components/admin-page/style.module.scss b/projects/js-packages/components/components/admin-page/style.module.scss index a7a71b502b2a..8288bb248619 100644 --- a/projects/js-packages/components/components/admin-page/style.module.scss +++ b/projects/js-packages/components/components/admin-page/style.module.scss @@ -47,5 +47,6 @@ } :global(.jetpack-admin-page .admin-ui-page__header-subtitle) { + padding-block-end: 0; padding-bottom: 0; } From ebdfb8ead2652c548278106a6c240bde10f570a5 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 22:13:02 -0800 Subject: [PATCH 14/41] admin-ui: Add Upgrade to Pro menu item for free users Adds a styled "Upgrade to Pro" submenu item to the Jetpack wp-admin menu for sites on the free plan. The item shows a star icon in Jetpack green (#069e08) and links to the Jetpack upgrade page. It is suppressed for any site with an active paid plan or license. Because all Jetpack standalone plugins (Backup, Boost, Protect, Social, Search, VideoPress) register their menus through the shared Admin_Menu class, this single change propagates to every plugin automatically. Made-with: Cursor --- .../feature-upsell-to-pro-wp-admin-menu | 4 + projects/packages/admin-ui/composer.json | 4 +- .../admin-ui/src/class-admin-menu.php | 113 +++++++++++ .../admin-ui/tests/php/Admin_Menu_Test.php | 188 +++++++++++++++++- 4 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 projects/packages/admin-ui/changelog/feature-upsell-to-pro-wp-admin-menu diff --git a/projects/packages/admin-ui/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/packages/admin-ui/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..1b8d768aff7f --- /dev/null +++ b/projects/packages/admin-ui/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Add Upgrade to Pro menu item for free users in the Jetpack admin menu. diff --git a/projects/packages/admin-ui/composer.json b/projects/packages/admin-ui/composer.json index 2a087ed0027c..c50ee15c4130 100644 --- a/projects/packages/admin-ui/composer.json +++ b/projects/packages/admin-ui/composer.json @@ -4,7 +4,9 @@ "type": "jetpack-library", "license": "GPL-2.0-or-later", "require": { - "php": ">=7.2" + "php": ">=7.2", + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev" }, "require-dev": { "yoast/phpunit-polyfills": "^4.0.0", diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index ae4be20501bd..5d9e8741c5f5 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -15,6 +15,20 @@ class Admin_Menu { const PACKAGE_VERSION = '0.5.11'; + /** + * Redirect source slug used as the upgrade URL identifier and CSS class. + * + * @var string + */ + const UPGRADE_MENU_SLUG = 'jetpack-upgrade-menu'; + + /** + * Fallback upgrade URL when the Redirect class is unavailable. + * + * @var string + */ + const UPGRADE_MENU_FALLBACK_URL = 'https://jetpack.com/upgrade/'; + /** * Whether this class has been initialized * @@ -40,6 +54,7 @@ public static function init() { self::handle_akismet_menu(); add_action( 'admin_menu', array( __CLASS__, 'admin_menu_hook_callback' ), 1000 ); // Jetpack uses 998. add_action( 'network_admin_menu', array( __CLASS__, 'admin_menu_hook_callback' ), 1000 ); // Jetpack uses 998. + add_action( 'admin_head', array( __CLASS__, 'add_upgrade_menu_item_styles' ) ); } } @@ -140,6 +155,8 @@ function ( $a, $b ) { if ( ! $can_see_toplevel_menu ) { remove_menu_page( 'jetpack' ); } + + self::maybe_add_upgrade_menu_item(); } /** @@ -225,4 +242,100 @@ public static function get_top_level_menu_item_url( $fallback = false ) { $url = $fallback ? $fallback : admin_url(); return $url; } + + /** + * Checks whether the current site is on a free Jetpack plan with no active paid license. + * + * @return bool True if the site has no paid plan. + */ + private static function is_free_plan() { + if ( class_exists( '\Automattic\Jetpack\Current_Plan' ) ) { + $plan = \Automattic\Jetpack\Current_Plan::get(); + return 'free' === ( $plan['class'] ?? 'free' ); + } + + $plan = get_option( 'jetpack_active_plan', array() ); + return 'free' === ( $plan['class'] ?? 'free' ); + } + + /** + * Conditionally adds an "Upgrade to Pro" submenu item for free-plan sites. + * + * The item is only added when the Jetpack top-level menu is visible and the + * site has not yet purchased a paid Jetpack plan or license. + * + * @return void + */ + private static function maybe_add_upgrade_menu_item() { + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + if ( ! self::is_free_plan() ) { + return; + } + + $upgrade_url = class_exists( '\Automattic\Jetpack\Redirect' ) + ? \Automattic\Jetpack\Redirect::get_url( self::UPGRADE_MENU_SLUG ) + : self::UPGRADE_MENU_FALLBACK_URL; + + $menu_title = '' + . esc_html__( 'Upgrade to Pro', 'jetpack-admin-ui' ); + + add_submenu_page( + 'jetpack', + __( 'Upgrade to Pro', 'jetpack-admin-ui' ), + $menu_title, + 'manage_options', + esc_url( $upgrade_url ), + null, + 999 + ); + + // Add a CSS class to the
  • element so styles can target it precisely. + global $submenu; + if ( ! empty( $submenu['jetpack'] ) ) { + foreach ( $submenu['jetpack'] as $index => $item ) { + if ( isset( $item[2] ) && false !== strpos( $item[2], self::UPGRADE_MENU_SLUG ) ) { + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + $submenu['jetpack'][ $index ][4] = ( ! empty( $item[4] ) ? $item[4] . ' ' : '' ) . self::UPGRADE_MENU_SLUG; + break; + } + } + } + } + + /** + * Outputs inline CSS to style the "Upgrade to Pro" menu item in Jetpack green. + * + * Only outputs on Jetpack admin pages and only for free-plan sites. + * + * @return void + */ + public static function add_upgrade_menu_item_styles() { + $screen = get_current_screen(); + if ( ! $screen || false === strpos( $screen->id, 'jetpack' ) ) { + return; + } + + if ( ! self::is_free_plan() ) { + return; + } + ?> + + 'upgrade_test_admin', + 'user_pass' => 'pass', + 'user_email' => 'upgrade_admin@example.com', + 'role' => 'administrator', + ) + ); + + self::$editor_user_id = wp_insert_user( + array( + 'user_login' => 'upgrade_test_editor', + 'user_pass' => 'pass', + 'user_email' => 'upgrade_editor@example.com', + 'role' => 'editor', + ) + ); + } + + /** + * Reset shared state before each test. + * + * @return void + */ + public function setUp(): void { + parent::setUp(); + global $submenu; + $submenu = array(); + delete_option( 'jetpack_active_plan' ); + } + /** * Tests whether the page_suffix we return in our method will match the page_suffix returned by the native WP methods * @@ -77,7 +130,7 @@ public static function page_suffix_matches_data() { } /** - * Undocumented function + * Tests that the first registered menu item is returned correctly. * * @return void */ @@ -95,4 +148,137 @@ public function test_first_menu() { $this->assertSame( 'menu_2', $first ); } + + /** + * Upgrade item appears in the submenu for an administrator on a free plan. + * + * @return void + */ + public function test_upgrade_menu_item_shown_for_free_plan_admin() { + wp_set_current_user( self::$admin_user_id ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemPresent(); + } + + /** + * Upgrade item is absent when the site has a paid plan. + * + * @return void + */ + public function test_upgrade_menu_item_hidden_for_paid_plan() { + wp_set_current_user( self::$admin_user_id ); + update_option( 'jetpack_active_plan', array( 'class' => 'security' ) ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemAbsent(); + } + + /** + * Upgrade item is absent for users without manage_options capability. + * + * @return void + */ + public function test_upgrade_menu_item_hidden_for_non_admin() { + wp_set_current_user( self::$editor_user_id ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemAbsent(); + } + + /** + * CSS styles are output for a free-plan admin on a Jetpack screen. + * + * @return void + */ + public function test_upgrade_menu_item_styles_output_for_free_plan() { + wp_set_current_user( self::$admin_user_id ); + set_current_screen( 'jetpack' ); + + ob_start(); + Admin_Menu::add_upgrade_menu_item_styles(); + $output = ob_get_clean(); + + set_current_screen( 'front' ); + + $this->assertStringContainsString( 'jetpack-upgrade-menu__icon', $output ); + $this->assertStringContainsString( '#069e08', $output ); + } + + /** + * No CSS output when the site has a paid plan, even on a Jetpack screen. + * + * @return void + */ + public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { + wp_set_current_user( self::$admin_user_id ); + update_option( 'jetpack_active_plan', array( 'class' => 'premium' ) ); + set_current_screen( 'jetpack' ); + + ob_start(); + Admin_Menu::add_upgrade_menu_item_styles(); + $output = ob_get_clean(); + + set_current_screen( 'front' ); + + $this->assertSame( '', $output ); + } + + /** + * No CSS output when viewing a non-Jetpack admin screen, even on a free plan. + * + * @return void + */ + public function test_upgrade_menu_item_styles_no_output_outside_jetpack_screens() { + wp_set_current_user( self::$admin_user_id ); + set_current_screen( 'dashboard' ); + + ob_start(); + Admin_Menu::add_upgrade_menu_item_styles(); + $output = ob_get_clean(); + + set_current_screen( 'front' ); + + $this->assertSame( '', $output ); + } + + /** + * Asserts the upgrade submenu item is present under the jetpack top-level menu. + * + * @return void + */ + private function assertUpgradeMenuItemPresent() { + global $submenu; + $slugs = array_column( $submenu['jetpack'] ?? array(), 2 ); + $found = array_filter( + $slugs, + function ( $slug ) { + return false !== strpos( $slug, Admin_Menu::UPGRADE_MENU_SLUG ); + } + ); + $this->assertNotEmpty( $found, 'Expected the upgrade menu item to be registered.' ); + } + + /** + * Asserts the upgrade submenu item is absent from the jetpack top-level menu. + * + * @return void + */ + private function assertUpgradeMenuItemAbsent() { + global $submenu; + $slugs = array_column( $submenu['jetpack'] ?? array(), 2 ); + $found = array_filter( + $slugs, + function ( $slug ) { + return false !== strpos( $slug, Admin_Menu::UPGRADE_MENU_SLUG ); + } + ); + $this->assertEmpty( $found, 'Expected the upgrade menu item to be absent.' ); + } } From 3f16dcc0fbbdcc6a41487319e2741a1a0db75f92 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Mon, 2 Mar 2026 22:48:40 -0800 Subject: [PATCH 15/41] admin-ui: Update "Upgrade to Pro" menu item styles and tests Enhances the "Upgrade to Pro" submenu item by adding a link icon and adjusting CSS styles for better visibility. The styles are now applied globally across all admin screens for free-plan sites, ensuring consistent presentation. Additionally, the related tests have been updated to reflect these changes, removing unnecessary screen checks and clarifying the conditions for CSS output. --- .../admin-ui/src/class-admin-menu.php | 15 ++++----- .../admin-ui/tests/php/Admin_Menu_Test.php | 33 +++---------------- 2 files changed, 10 insertions(+), 38 deletions(-) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index 5d9e8741c5f5..a93fe693bae4 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -280,7 +280,8 @@ private static function maybe_add_upgrade_menu_item() { : self::UPGRADE_MENU_FALLBACK_URL; $menu_title = '' - . esc_html__( 'Upgrade to Pro', 'jetpack-admin-ui' ); + . esc_html__( 'Upgrade to Pro', 'jetpack-admin-ui' ) + . ' '; add_submenu_page( 'jetpack', @@ -308,16 +309,12 @@ private static function maybe_add_upgrade_menu_item() { /** * Outputs inline CSS to style the "Upgrade to Pro" menu item in Jetpack green. * - * Only outputs on Jetpack admin pages and only for free-plan sites. + * The sidebar menu is visible on every admin page, so styles must load globally. + * Only outputs for free-plan sites. * * @return void */ public static function add_upgrade_menu_item_styles() { - $screen = get_current_screen(); - if ( ! $screen || false === strpos( $screen->id, 'jetpack' ) ) { - return; - } - if ( ! self::is_free_plan() ) { return; } @@ -325,10 +322,10 @@ public static function add_upgrade_menu_item_styles() { From 34cf1f0d88637cab50135e7602a8806bc2a80076 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Fri, 13 Mar 2026 13:57:49 -0700 Subject: [PATCH 22/41] Fix upgrade menu detection by checking is_free field The previous fix checked for plan['class'] which doesn't exist in the raw jetpack_active_plan option data. The 'class' field is only added by Current_Plan::get() when it processes the option. The raw option does contain 'is_free' and 'product_slug' fields which we can use directly. Now checking: 1. plan['is_free'] field (explicitly set to false for paid plans) 2. plan['product_slug'] (anything other than 'jetpack_free' is paid) 3. jetpack_site_products option (for attached licenses) This ensures the upgrade menu is hidden for all paid plans and licenses. Made-with: Cursor --- .../admin-ui/src/class-admin-menu.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index 49797b00e9c7..cb2c2c83d62b 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -281,14 +281,22 @@ private static function is_free_plan() { return $is_free; } - // Check the active plan. + // Check the active plan - use the is_free field or product_slug. $plan = get_option( 'jetpack_active_plan', array() ); - if ( isset( $plan['class'] ) && 'free' !== $plan['class'] ) { + + // If the plan explicitly says it's not free, trust that. + if ( isset( $plan['is_free'] ) && false === $plan['is_free'] ) { + $is_free = false; + return $is_free; + } + + // Check if the product slug indicates a paid plan. + if ( isset( $plan['product_slug'] ) && 'jetpack_free' !== $plan['product_slug'] ) { $is_free = false; return $is_free; } - // Also check for site products (licenses can add products without changing plan class). + // Also check for site products (licenses can add products without changing plan). $products = get_option( 'jetpack_site_products', array() ); if ( ! empty( $products ) && is_array( $products ) ) { $is_free = false; @@ -300,10 +308,9 @@ private static function is_free_plan() { } /** - * Conditionally adds an "Upgrade to Pro" submenu item for free-plan sites. + * Conditionally adds an "Upgrade Jetpack" submenu item for free-plan sites. * - * Only shown to users with manage_options capability on self-hosted sites - * without a paid Jetpack plan or license. + * Only shown to users with manage_options capability on self-hosted sites without a paid Jetpack plan or license. * * @return void */ From fa2df071831e467cf142d8901d20287ec0c876e8 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Fri, 13 Mar 2026 14:00:41 -0700 Subject: [PATCH 23/41] Add comprehensive tests for upgrade menu plan detection Adds test coverage for the new plan detection logic that checks multiple fields in the jetpack_active_plan option: New test scenarios: - is_free field set to true (should show upgrade menu) - is_free field set to false (should hide upgrade menu) - product_slug for paid plans (should hide upgrade menu) - jetpack_site_products with attached licenses (should hide upgrade menu) - CSS styles output matches menu visibility for all scenarios Also ensures admin user context is set for style tests to properly test capability checks. These tests verify the fix for incorrectly showing upgrade menus on sites with paid plans that don't have a 'class' field in the raw option data. Made-with: Cursor --- .../admin-ui/tests/php/Admin_Menu_Test.php | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index 29e4e79df73d..0dd9b4634761 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -201,6 +201,27 @@ public function test_upgrade_menu_item_shown_for_free_plan_admin() { $this->assertUpgradeMenuItemPresent(); } + /** + * Upgrade item is shown when is_free is explicitly true. + * + * @return void + */ + public function test_upgrade_menu_item_shown_when_is_free_true() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_active_plan', + array( + 'product_slug' => 'jetpack_free', + 'is_free' => true, + ) + ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemPresent(); + } + /** * Upgrade item is absent when the site has a paid plan. * @@ -216,6 +237,71 @@ public function test_upgrade_menu_item_hidden_for_paid_plan() { $this->assertUpgradeMenuItemAbsent(); } + /** + * Upgrade item is absent when the plan has is_free field set to false. + * + * Tests the real-world data structure where plan option includes is_free field. + * + * @return void + */ + public function test_upgrade_menu_item_hidden_when_is_free_false() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_active_plan', + array( + 'product_slug' => 'jetpack_complete', + 'is_free' => false, + ) + ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemAbsent(); + } + + /** + * Upgrade item is absent when product_slug indicates a paid plan. + * + * @return void + */ + public function test_upgrade_menu_item_hidden_for_paid_product_slug() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_active_plan', + array( + 'product_slug' => 'jetpack_security_daily', + ) + ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemAbsent(); + } + + /** + * Upgrade item is absent when site has products from attached licenses. + * + * @return void + */ + public function test_upgrade_menu_item_hidden_when_site_has_products() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_site_products', + array( + array( + 'product_slug' => 'jetpack_backup_daily', + ), + ) + ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemAbsent(); + } + /** * Upgrade item is absent for users without manage_options capability. * @@ -238,6 +324,8 @@ public function test_upgrade_menu_item_hidden_for_non_admin() { * @return void */ public function test_upgrade_menu_item_styles_output_for_free_plan() { + wp_set_current_user( self::$admin_user_id ); + ob_start(); Admin_Menu::add_upgrade_menu_item_styles(); $output = ob_get_clean(); @@ -252,6 +340,7 @@ public function test_upgrade_menu_item_styles_output_for_free_plan() { * @return void */ public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { + wp_set_current_user( self::$admin_user_id ); update_option( 'jetpack_active_plan', array( 'class' => 'premium' ) ); ob_start(); @@ -261,6 +350,51 @@ public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { $this->assertSame( '', $output ); } + /** + * No CSS output when is_free is false. + * + * @return void + */ + public function test_upgrade_menu_item_styles_no_output_when_is_free_false() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_active_plan', + array( + 'product_slug' => 'jetpack_complete', + 'is_free' => false, + ) + ); + + ob_start(); + Admin_Menu::add_upgrade_menu_item_styles(); + $output = ob_get_clean(); + + $this->assertSame( '', $output ); + } + + /** + * No CSS output when site has products. + * + * @return void + */ + public function test_upgrade_menu_item_styles_no_output_when_site_has_products() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_site_products', + array( + array( + 'product_slug' => 'jetpack_backup_daily', + ), + ) + ); + + ob_start(); + Admin_Menu::add_upgrade_menu_item_styles(); + $output = ob_get_clean(); + + $this->assertSame( '', $output ); + } + /** * Asserts the upgrade submenu item is present under the jetpack top-level menu. * From de846ecb2918badc3c4bbc27a77a062cf8f50621 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Fri, 13 Mar 2026 14:18:01 -0700 Subject: [PATCH 24/41] Update composer.lock to include new Jetpack dependencies and update existing references - Added dependencies for automattic/jetpack-plans, automattic/jetpack-redirect, and automattic/jetpack-status with development versions. - Updated the reference for the automattic/admin-ui package. - Enhanced the autoload and scripts sections for the new jetpack-plans package to improve functionality and testing capabilities. --- projects/plugins/wpcloud-sso/composer.lock | 68 +++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/projects/plugins/wpcloud-sso/composer.lock b/projects/plugins/wpcloud-sso/composer.lock index c4277945b15e..aa31e2f72145 100644 --- a/projects/plugins/wpcloud-sso/composer.lock +++ b/projects/plugins/wpcloud-sso/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "fee1504bb96380c418e439af5696ba75fbfc0d96" + "reference": "e119470d0077ec0a7b7adfff711672eb2ab6754a" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { @@ -650,6 +653,69 @@ "relative": true } }, + { + "name": "automattic/jetpack-plans", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/plans", + "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" + }, + "require": { + "automattic/jetpack-connection": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-status": "@dev", + "automattic/jetpack-test-environment": "@dev", + "automattic/phpunit-select-config": "@dev", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-plans", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "0.11.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ], + "build-production": [ + "echo 'Add your build step to composer.json, please!'" + ], + "build-development": [ + "echo 'Add your build step to composer.json, please!'" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Fetch information about Jetpack Plans from wpcom", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-redirect", "version": "dev-trunk", From 5b70ad861759bb942debc84539b2266a88383a36 Mon Sep 17 00:00:00 2001 From: devinwalker Date: Fri, 13 Mar 2026 14:25:14 -0700 Subject: [PATCH 25/41] Admin UI: Update docblock to reference "Upgrade Jetpack" Fix remaining reference to "Upgrade to Pro" in code documentation. Made-with: Cursor --- projects/packages/admin-ui/src/class-admin-menu.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index cb2c2c83d62b..3a340617c44e 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -283,13 +283,13 @@ private static function is_free_plan() { // Check the active plan - use the is_free field or product_slug. $plan = get_option( 'jetpack_active_plan', array() ); - + // If the plan explicitly says it's not free, trust that. if ( isset( $plan['is_free'] ) && false === $plan['is_free'] ) { $is_free = false; return $is_free; } - + // Check if the product slug indicates a paid plan. if ( isset( $plan['product_slug'] ) && 'jetpack_free' !== $plan['product_slug'] ) { $is_free = false; @@ -350,7 +350,7 @@ private static function maybe_add_upgrade_menu_item() { } /** - * Outputs inline CSS to style the "Upgrade to Pro" menu item in Jetpack green. + * Outputs inline CSS to style the "Upgrade Jetpack" menu item in Jetpack green. * * The sidebar menu is visible on every admin page, so styles must load globally. * Only outputs for free-plan sites on self-hosted installs. From dbf2f016ab945acede58bbdedffd9505d2ab03cc Mon Sep 17 00:00:00 2001 From: Jetpack Bot Date: Fri, 13 Mar 2026 21:28:14 +0000 Subject: [PATCH 26/41] Add changelog entries. --- projects/plugins/wpcloud-sso/changelog/pr-47418 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 projects/plugins/wpcloud-sso/changelog/pr-47418 diff --git a/projects/plugins/wpcloud-sso/changelog/pr-47418 b/projects/plugins/wpcloud-sso/changelog/pr-47418 new file mode 100644 index 000000000000..07a9969e052c --- /dev/null +++ b/projects/plugins/wpcloud-sso/changelog/pr-47418 @@ -0,0 +1,4 @@ +Significance: patch +Type: changed +Comment: composer.lock update for internal admin-ui dependency changes; no user-facing impact + From ec433d97e2f7d9bee9627045b7025a450add3e37 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Tue, 31 Mar 2026 18:22:49 +0300 Subject: [PATCH 27/41] Update composer.lock --- projects/plugins/wpcloud-sso/composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/plugins/wpcloud-sso/composer.lock b/projects/plugins/wpcloud-sso/composer.lock index dfae5f40db80..82d191392f28 100644 --- a/projects/plugins/wpcloud-sso/composer.lock +++ b/projects/plugins/wpcloud-sso/composer.lock @@ -66,7 +66,7 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { "automattic/jetpack-plans": "@dev", From 0b0781956690bde96f527b412eae6f04a4511575 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Tue, 31 Mar 2026 18:49:03 +0300 Subject: [PATCH 28/41] Satisfy Phan --- projects/packages/admin-ui/src/class-admin-menu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index 0f186c88f41e..17297fc09289 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -332,7 +332,7 @@ private static function maybe_add_upgrade_menu_item() { $menu_title, 'manage_options', esc_url( $upgrade_url ), - null, + '__return_null', 999 ); From bda9b5276378b86ed159f8616df839272f636220 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Tue, 31 Mar 2026 18:59:09 +0300 Subject: [PATCH 29/41] Ran ./tools/composer-update-monorepo.sh --- .../composer.lock | 68 ++- projects/plugins/backup/composer.lock | 5 +- projects/plugins/beta/composer.lock | 511 +++++++++++++++++- projects/plugins/boost/composer.lock | 5 +- .../classic-theme-helper-plugin/composer.lock | 68 ++- projects/plugins/inspect/composer.lock | 68 ++- projects/plugins/jetpack/composer.lock | 5 +- .../plugins/mu-wpcom-plugin/composer.lock | 5 +- .../paypal-payment-buttons/composer.lock | 5 +- projects/plugins/protect/composer.lock | 5 +- projects/plugins/search/composer.lock | 5 +- projects/plugins/social/composer.lock | 5 +- projects/plugins/starter-plugin/composer.lock | 5 +- projects/plugins/videopress/composer.lock | 5 +- projects/plugins/wpcomsh/composer.lock | 5 +- 15 files changed, 755 insertions(+), 15 deletions(-) diff --git a/projects/plugins/automattic-for-agencies-client/composer.lock b/projects/plugins/automattic-for-agencies-client/composer.lock index 3a586b7c54f8..f462bcfa844d 100644 --- a/projects/plugins/automattic-for-agencies-client/composer.lock +++ b/projects/plugins/automattic-for-agencies-client/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { @@ -650,6 +653,69 @@ "relative": true } }, + { + "name": "automattic/jetpack-plans", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/plans", + "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" + }, + "require": { + "automattic/jetpack-connection": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-status": "@dev", + "automattic/jetpack-test-environment": "@dev", + "automattic/phpunit-select-config": "@dev", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-plans", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "0.11.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ], + "build-production": [ + "echo 'Add your build step to composer.json, please!'" + ], + "build-development": [ + "echo 'Add your build step to composer.json, please!'" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Fetch information about Jetpack Plans from wpcom", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-plugin-deactivation", "version": "dev-trunk", diff --git a/projects/plugins/backup/composer.lock b/projects/plugins/backup/composer.lock index e8c33adec3dc..d2a75a583306 100644 --- a/projects/plugins/backup/composer.lock +++ b/projects/plugins/backup/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/beta/composer.lock b/projects/plugins/beta/composer.lock index ae4af27ca3d3..d2bee5861f83 100644 --- a/projects/plugins/beta/composer.lock +++ b/projects/plugins/beta/composer.lock @@ -6,15 +6,72 @@ ], "content-hash": "54669aaf7f3a079394b2b7d11bdb6f8e", "packages": [ + { + "name": "automattic/jetpack-a8c-mc-stats", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/a8c-mc-stats", + "reference": "68b92cc77ac41309dbf2f7a16eecd4e0c9cb03a9" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/phpunit-select-config": "@dev", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-a8c-mc-stats", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-a8c-mc-stats/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Used to record internal usage stats for Automattic. Not visible to site owners.", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-admin-ui", "version": "dev-trunk", "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { @@ -66,6 +123,77 @@ "relative": true } }, + { + "name": "automattic/jetpack-assets", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/assets", + "reference": "116afa785e69beb00f93503b12e0b0f4a0753ebb" + }, + "require": { + "automattic/jetpack-constants": "@dev", + "automattic/jetpack-status": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/phpunit-select-config": "@dev", + "brain/monkey": "^2.6.2", + "wikimedia/testing-access-wrapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-assets", + "textdomain": "jetpack-assets", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-assets/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "4.3.x-dev" + } + }, + "autoload": { + "files": [ + "actions.php" + ], + "classmap": [ + "src/" + ] + }, + "scripts": { + "build-development": [ + "pnpm run build" + ], + "build-production": [ + "pnpm run build-production" + ], + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "pnpm concurrently --names php,js 'php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"' 'pnpm:test-coverage'" + ], + "test-js": [ + "pnpm run test" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Asset management utilities for Jetpack ecosystem packages", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-autoloader", "version": "dev-trunk", @@ -135,6 +263,148 @@ "relative": true } }, + { + "name": "automattic/jetpack-connection", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/connection", + "reference": "f996ae5caff6b5b1980d0eba9c3b6fca03f590ab" + }, + "require": { + "automattic/jetpack-a8c-mc-stats": "@dev", + "automattic/jetpack-admin-ui": "@dev", + "automattic/jetpack-assets": "@dev", + "automattic/jetpack-constants": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-roles": "@dev", + "automattic/jetpack-status": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-licensing": "@dev", + "automattic/jetpack-sync": "@dev", + "automattic/jetpack-test-environment": "@dev", + "automattic/phpunit-select-config": "@dev", + "brain/monkey": "^2.6.2", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-connection", + "textdomain": "jetpack-connection", + "version-constants": { + "::PACKAGE_VERSION": "src/class-package-version.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-connection/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "8.1.x-dev" + }, + "dependencies": { + "test-only": [ + "packages/licensing", + "packages/sync" + ] + } + }, + "autoload": { + "files": [ + "actions.php" + ], + "classmap": [ + "legacy", + "src/", + "src/webhooks", + "src/identity-crisis" + ] + }, + "scripts": { + "build-production": [ + "pnpm run build-production" + ], + "build-development": [ + "pnpm run build" + ], + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Everything needed to connect to the Jetpack infrastructure", + "transport-options": { + "relative": true + } + }, + { + "name": "automattic/jetpack-constants", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/constants", + "reference": "378a5d122aedfc25d3aa42ab913803c85a8c857b" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/phpunit-select-config": "@dev", + "brain/monkey": "^2.6.2", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-constants", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-constants/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "A wrapper for defining constants in a more testable way.", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-logo", "version": "dev-trunk", @@ -189,6 +459,245 @@ "relative": true } }, + { + "name": "automattic/jetpack-plans", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/plans", + "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" + }, + "require": { + "automattic/jetpack-connection": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-status": "@dev", + "automattic/jetpack-test-environment": "@dev", + "automattic/phpunit-select-config": "@dev", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-plans", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "0.11.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ], + "build-production": [ + "echo 'Add your build step to composer.json, please!'" + ], + "build-development": [ + "echo 'Add your build step to composer.json, please!'" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Fetch information about Jetpack Plans from wpcom", + "transport-options": { + "relative": true + } + }, + { + "name": "automattic/jetpack-redirect", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/redirect", + "reference": "44d6ec93e4d3b3db6287bf82f316a294d7ef868d" + }, + "require": { + "automattic/jetpack-status": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/phpunit-select-config": "@dev", + "brain/monkey": "^2.6.2", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-redirect", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-redirect/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Utilities to build URLs to the jetpack.com/redirect/ service", + "transport-options": { + "relative": true + } + }, + { + "name": "automattic/jetpack-roles", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/roles", + "reference": "f7098eb11833c5fddfff032427d8576039aa3521" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/phpunit-select-config": "@dev", + "brain/monkey": "^2.6.2", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-roles", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-roles/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Utilities, related with user roles and capabilities.", + "transport-options": { + "relative": true + } + }, + { + "name": "automattic/jetpack-status", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/status", + "reference": "8ce7c4c3d0a7c4ec9fce7b3002ba635afd5bc952" + }, + "require": { + "automattic/jetpack-constants": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-connection": "@dev", + "automattic/jetpack-ip": "@dev", + "automattic/jetpack-plans": "@dev", + "automattic/phpunit-select-config": "@dev", + "brain/monkey": "^2.6.2", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "jetpack-library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-status", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "6.1.x-dev" + }, + "dependencies": { + "test-only": [ + "packages/connection", + "packages/plans" + ] + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Used to retrieve information about the current status of Jetpack and the site overall.", + "transport-options": { + "relative": true + } + }, { "name": "composer/semver", "version": "3.4.3", diff --git a/projects/plugins/boost/composer.lock b/projects/plugins/boost/composer.lock index 7ffcc67e72df..81a669a628f9 100644 --- a/projects/plugins/boost/composer.lock +++ b/projects/plugins/boost/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/classic-theme-helper-plugin/composer.lock b/projects/plugins/classic-theme-helper-plugin/composer.lock index 8422660ca786..c398afe538e5 100644 --- a/projects/plugins/classic-theme-helper-plugin/composer.lock +++ b/projects/plugins/classic-theme-helper-plugin/composer.lock @@ -130,9 +130,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { @@ -784,6 +787,69 @@ "relative": true } }, + { + "name": "automattic/jetpack-plans", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/plans", + "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" + }, + "require": { + "automattic/jetpack-connection": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-status": "@dev", + "automattic/jetpack-test-environment": "@dev", + "automattic/phpunit-select-config": "@dev", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-plans", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "0.11.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ], + "build-production": [ + "echo 'Add your build step to composer.json, please!'" + ], + "build-development": [ + "echo 'Add your build step to composer.json, please!'" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Fetch information about Jetpack Plans from wpcom", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-plugins-installer", "version": "dev-trunk", diff --git a/projects/plugins/inspect/composer.lock b/projects/plugins/inspect/composer.lock index f5c8aae66ef5..942e44310019 100644 --- a/projects/plugins/inspect/composer.lock +++ b/projects/plugins/inspect/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { @@ -535,6 +538,69 @@ "relative": true } }, + { + "name": "automattic/jetpack-plans", + "version": "dev-trunk", + "dist": { + "type": "path", + "url": "../../packages/plans", + "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" + }, + "require": { + "automattic/jetpack-connection": "@dev", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "@dev", + "automattic/jetpack-status": "@dev", + "automattic/jetpack-test-environment": "@dev", + "automattic/phpunit-select-config": "@dev", + "yoast/phpunit-polyfills": "^4.0.0" + }, + "suggest": { + "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." + }, + "type": "library", + "extra": { + "autotagger": true, + "mirror-repo": "Automattic/jetpack-plans", + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" + }, + "branch-alias": { + "dev-trunk": "0.11.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "scripts": { + "phpunit": [ + "phpunit-select-config phpunit.#.xml.dist --colors=always" + ], + "test-coverage": [ + "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" + ], + "test-php": [ + "@composer phpunit" + ], + "build-production": [ + "echo 'Add your build step to composer.json, please!'" + ], + "build-development": [ + "echo 'Add your build step to composer.json, please!'" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "description": "Fetch information about Jetpack Plans from wpcom", + "transport-options": { + "relative": true + } + }, { "name": "automattic/jetpack-redirect", "version": "dev-trunk", diff --git a/projects/plugins/jetpack/composer.lock b/projects/plugins/jetpack/composer.lock index 0f150ca434bf..35f8105760e6 100644 --- a/projects/plugins/jetpack/composer.lock +++ b/projects/plugins/jetpack/composer.lock @@ -199,9 +199,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/mu-wpcom-plugin/composer.lock b/projects/plugins/mu-wpcom-plugin/composer.lock index b612e27c683e..8c40a01cc2e1 100644 --- a/projects/plugins/mu-wpcom-plugin/composer.lock +++ b/projects/plugins/mu-wpcom-plugin/composer.lock @@ -130,9 +130,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/paypal-payment-buttons/composer.lock b/projects/plugins/paypal-payment-buttons/composer.lock index 2d360c6b4a50..0250a36af7b2 100644 --- a/projects/plugins/paypal-payment-buttons/composer.lock +++ b/projects/plugins/paypal-payment-buttons/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/protect/composer.lock b/projects/plugins/protect/composer.lock index 104a427dcb44..5a802489eb2b 100644 --- a/projects/plugins/protect/composer.lock +++ b/projects/plugins/protect/composer.lock @@ -135,9 +135,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/search/composer.lock b/projects/plugins/search/composer.lock index 03dfc8b9eaf1..d046429bc35e 100644 --- a/projects/plugins/search/composer.lock +++ b/projects/plugins/search/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/social/composer.lock b/projects/plugins/social/composer.lock index 4c686b4d8ac0..599d5818b6b2 100644 --- a/projects/plugins/social/composer.lock +++ b/projects/plugins/social/composer.lock @@ -130,9 +130,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/starter-plugin/composer.lock b/projects/plugins/starter-plugin/composer.lock index 577b09df6500..c6aa267fb6ee 100644 --- a/projects/plugins/starter-plugin/composer.lock +++ b/projects/plugins/starter-plugin/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/videopress/composer.lock b/projects/plugins/videopress/composer.lock index af52506f6ad2..7f23d0c356c0 100644 --- a/projects/plugins/videopress/composer.lock +++ b/projects/plugins/videopress/composer.lock @@ -66,9 +66,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/wpcomsh/composer.lock b/projects/plugins/wpcomsh/composer.lock index f9158080a6ad..02042b73aa71 100644 --- a/projects/plugins/wpcomsh/composer.lock +++ b/projects/plugins/wpcomsh/composer.lock @@ -198,9 +198,12 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "35c5547f0d22d865152761ac473e666767b59d70" + "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" }, "require": { + "automattic/jetpack-plans": "@dev", + "automattic/jetpack-redirect": "@dev", + "automattic/jetpack-status": "@dev", "php": ">=7.2" }, "require-dev": { From 25b78be98b71547de18d430f7b1c872c4cb8a10f Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 14:19:43 +0300 Subject: [PATCH 30/41] Remove circular dependency --- projects/packages/admin-ui/composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/packages/admin-ui/composer.json b/projects/packages/admin-ui/composer.json index 940dd96951a1..89057a36fc6c 100644 --- a/projects/packages/admin-ui/composer.json +++ b/projects/packages/admin-ui/composer.json @@ -5,7 +5,6 @@ "license": "GPL-2.0-or-later", "require": { "php": ">=7.2", - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev" }, From 0cecf4d29c6647afaacabc2eff19e5ba2efa3afe Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 14:38:32 +0300 Subject: [PATCH 31/41] Update composer locks after circular dependency fix --- projects/plugins/backup/composer.lock | 3 +- projects/plugins/beta/composer.lock | 333 +----------------- projects/plugins/boost/composer.lock | 3 +- .../classic-theme-helper-plugin/composer.lock | 66 +--- projects/plugins/inspect/composer.lock | 66 +--- projects/plugins/jetpack/composer.lock | 3 +- .../plugins/mu-wpcom-plugin/composer.lock | 3 +- .../paypal-payment-buttons/composer.lock | 3 +- projects/plugins/protect/composer.lock | 3 +- projects/plugins/search/composer.lock | 3 +- projects/plugins/social/composer.lock | 3 +- projects/plugins/starter-plugin/composer.lock | 3 +- projects/plugins/videopress/composer.lock | 3 +- projects/plugins/wpcloud-sso/composer.lock | 66 +--- projects/plugins/wpcomsh/composer.lock | 3 +- 15 files changed, 15 insertions(+), 549 deletions(-) diff --git a/projects/plugins/backup/composer.lock b/projects/plugins/backup/composer.lock index d2a75a583306..b70618c37c27 100644 --- a/projects/plugins/backup/composer.lock +++ b/projects/plugins/backup/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/beta/composer.lock b/projects/plugins/beta/composer.lock index d2bee5861f83..7ac3387f218a 100644 --- a/projects/plugins/beta/composer.lock +++ b/projects/plugins/beta/composer.lock @@ -6,70 +6,15 @@ ], "content-hash": "54669aaf7f3a079394b2b7d11bdb6f8e", "packages": [ - { - "name": "automattic/jetpack-a8c-mc-stats", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/a8c-mc-stats", - "reference": "68b92cc77ac41309dbf2f7a16eecd4e0c9cb03a9" - }, - "require": { - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/phpunit-select-config": "@dev", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "jetpack-library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-a8c-mc-stats", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-a8c-mc-stats/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Used to record internal usage stats for Automattic. Not visible to site owners.", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-admin-ui", "version": "dev-trunk", "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" @@ -123,77 +68,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-assets", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/assets", - "reference": "116afa785e69beb00f93503b12e0b0f4a0753ebb" - }, - "require": { - "automattic/jetpack-constants": "@dev", - "automattic/jetpack-status": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/phpunit-select-config": "@dev", - "brain/monkey": "^2.6.2", - "wikimedia/testing-access-wrapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "jetpack-library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-assets", - "textdomain": "jetpack-assets", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-assets/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "4.3.x-dev" - } - }, - "autoload": { - "files": [ - "actions.php" - ], - "classmap": [ - "src/" - ] - }, - "scripts": { - "build-development": [ - "pnpm run build" - ], - "build-production": [ - "pnpm run build-production" - ], - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "pnpm concurrently --names php,js 'php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"' 'pnpm:test-coverage'" - ], - "test-js": [ - "pnpm run test" - ], - "test-php": [ - "@composer phpunit" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Asset management utilities for Jetpack ecosystem packages", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-autoloader", "version": "dev-trunk", @@ -263,93 +137,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-connection", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/connection", - "reference": "f996ae5caff6b5b1980d0eba9c3b6fca03f590ab" - }, - "require": { - "automattic/jetpack-a8c-mc-stats": "@dev", - "automattic/jetpack-admin-ui": "@dev", - "automattic/jetpack-assets": "@dev", - "automattic/jetpack-constants": "@dev", - "automattic/jetpack-redirect": "@dev", - "automattic/jetpack-roles": "@dev", - "automattic/jetpack-status": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/jetpack-licensing": "@dev", - "automattic/jetpack-sync": "@dev", - "automattic/jetpack-test-environment": "@dev", - "automattic/phpunit-select-config": "@dev", - "brain/monkey": "^2.6.2", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "jetpack-library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-connection", - "textdomain": "jetpack-connection", - "version-constants": { - "::PACKAGE_VERSION": "src/class-package-version.php" - }, - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-connection/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "8.1.x-dev" - }, - "dependencies": { - "test-only": [ - "packages/licensing", - "packages/sync" - ] - } - }, - "autoload": { - "files": [ - "actions.php" - ], - "classmap": [ - "legacy", - "src/", - "src/webhooks", - "src/identity-crisis" - ] - }, - "scripts": { - "build-production": [ - "pnpm run build-production" - ], - "build-development": [ - "pnpm run build" - ], - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Everything needed to connect to the Jetpack infrastructure", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-constants", "version": "dev-trunk", @@ -459,69 +246,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-plans", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/plans", - "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" - }, - "require": { - "automattic/jetpack-connection": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/jetpack-status": "@dev", - "automattic/jetpack-test-environment": "@dev", - "automattic/phpunit-select-config": "@dev", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-plans", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "0.11.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ], - "build-production": [ - "echo 'Add your build step to composer.json, please!'" - ], - "build-development": [ - "echo 'Add your build step to composer.json, please!'" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Fetch information about Jetpack Plans from wpcom", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-redirect", "version": "dev-trunk", @@ -578,61 +302,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-roles", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/roles", - "reference": "f7098eb11833c5fddfff032427d8576039aa3521" - }, - "require": { - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/phpunit-select-config": "@dev", - "brain/monkey": "^2.6.2", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "jetpack-library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-roles", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-roles/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Utilities, related with user roles and capabilities.", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-status", "version": "dev-trunk", diff --git a/projects/plugins/boost/composer.lock b/projects/plugins/boost/composer.lock index 81a669a628f9..5348cdcdd5e7 100644 --- a/projects/plugins/boost/composer.lock +++ b/projects/plugins/boost/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/classic-theme-helper-plugin/composer.lock b/projects/plugins/classic-theme-helper-plugin/composer.lock index c398afe538e5..c5ba21934a8b 100644 --- a/projects/plugins/classic-theme-helper-plugin/composer.lock +++ b/projects/plugins/classic-theme-helper-plugin/composer.lock @@ -130,10 +130,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" @@ -787,69 +786,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-plans", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/plans", - "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" - }, - "require": { - "automattic/jetpack-connection": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/jetpack-status": "@dev", - "automattic/jetpack-test-environment": "@dev", - "automattic/phpunit-select-config": "@dev", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-plans", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "0.11.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ], - "build-production": [ - "echo 'Add your build step to composer.json, please!'" - ], - "build-development": [ - "echo 'Add your build step to composer.json, please!'" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Fetch information about Jetpack Plans from wpcom", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-plugins-installer", "version": "dev-trunk", diff --git a/projects/plugins/inspect/composer.lock b/projects/plugins/inspect/composer.lock index 942e44310019..1b84548d8fda 100644 --- a/projects/plugins/inspect/composer.lock +++ b/projects/plugins/inspect/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" @@ -538,69 +537,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-plans", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/plans", - "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" - }, - "require": { - "automattic/jetpack-connection": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/jetpack-status": "@dev", - "automattic/jetpack-test-environment": "@dev", - "automattic/phpunit-select-config": "@dev", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-plans", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "0.11.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ], - "build-production": [ - "echo 'Add your build step to composer.json, please!'" - ], - "build-development": [ - "echo 'Add your build step to composer.json, please!'" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Fetch information about Jetpack Plans from wpcom", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-redirect", "version": "dev-trunk", diff --git a/projects/plugins/jetpack/composer.lock b/projects/plugins/jetpack/composer.lock index 35f8105760e6..fc65a881c99d 100644 --- a/projects/plugins/jetpack/composer.lock +++ b/projects/plugins/jetpack/composer.lock @@ -199,10 +199,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/mu-wpcom-plugin/composer.lock b/projects/plugins/mu-wpcom-plugin/composer.lock index 8c40a01cc2e1..9325eccc007b 100644 --- a/projects/plugins/mu-wpcom-plugin/composer.lock +++ b/projects/plugins/mu-wpcom-plugin/composer.lock @@ -130,10 +130,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/paypal-payment-buttons/composer.lock b/projects/plugins/paypal-payment-buttons/composer.lock index 0250a36af7b2..db770a0656dc 100644 --- a/projects/plugins/paypal-payment-buttons/composer.lock +++ b/projects/plugins/paypal-payment-buttons/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/protect/composer.lock b/projects/plugins/protect/composer.lock index 5a802489eb2b..bdfd511ebb1d 100644 --- a/projects/plugins/protect/composer.lock +++ b/projects/plugins/protect/composer.lock @@ -135,10 +135,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/search/composer.lock b/projects/plugins/search/composer.lock index d046429bc35e..9c4dd6e99b80 100644 --- a/projects/plugins/search/composer.lock +++ b/projects/plugins/search/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/social/composer.lock b/projects/plugins/social/composer.lock index 599d5818b6b2..6528cb6b9b97 100644 --- a/projects/plugins/social/composer.lock +++ b/projects/plugins/social/composer.lock @@ -130,10 +130,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/starter-plugin/composer.lock b/projects/plugins/starter-plugin/composer.lock index c6aa267fb6ee..9c0e6b5bab6a 100644 --- a/projects/plugins/starter-plugin/composer.lock +++ b/projects/plugins/starter-plugin/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/videopress/composer.lock b/projects/plugins/videopress/composer.lock index 7f23d0c356c0..36f10c391027 100644 --- a/projects/plugins/videopress/composer.lock +++ b/projects/plugins/videopress/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" diff --git a/projects/plugins/wpcloud-sso/composer.lock b/projects/plugins/wpcloud-sso/composer.lock index 82d191392f28..46ae84b11c3f 100644 --- a/projects/plugins/wpcloud-sso/composer.lock +++ b/projects/plugins/wpcloud-sso/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" @@ -653,69 +652,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-plans", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/plans", - "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" - }, - "require": { - "automattic/jetpack-connection": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/jetpack-status": "@dev", - "automattic/jetpack-test-environment": "@dev", - "automattic/phpunit-select-config": "@dev", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-plans", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "0.11.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ], - "build-production": [ - "echo 'Add your build step to composer.json, please!'" - ], - "build-development": [ - "echo 'Add your build step to composer.json, please!'" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Fetch information about Jetpack Plans from wpcom", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-redirect", "version": "dev-trunk", diff --git a/projects/plugins/wpcomsh/composer.lock b/projects/plugins/wpcomsh/composer.lock index 02042b73aa71..9ba34a090da3 100644 --- a/projects/plugins/wpcomsh/composer.lock +++ b/projects/plugins/wpcomsh/composer.lock @@ -198,10 +198,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" From d40e4baf149229ec32f4513a24359b15947454f2 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 14:42:59 +0300 Subject: [PATCH 32/41] Update also A4A client --- .../composer.lock | 66 +------------------ 1 file changed, 1 insertion(+), 65 deletions(-) diff --git a/projects/plugins/automattic-for-agencies-client/composer.lock b/projects/plugins/automattic-for-agencies-client/composer.lock index f462bcfa844d..90838e1b8a05 100644 --- a/projects/plugins/automattic-for-agencies-client/composer.lock +++ b/projects/plugins/automattic-for-agencies-client/composer.lock @@ -66,10 +66,9 @@ "dist": { "type": "path", "url": "../../packages/admin-ui", - "reference": "902acd74b1533a2f28b411c6d7bd47f7a7b0504e" + "reference": "827d689e815ae1112f6823ed45a51739d78bac4f" }, "require": { - "automattic/jetpack-plans": "@dev", "automattic/jetpack-redirect": "@dev", "automattic/jetpack-status": "@dev", "php": ">=7.2" @@ -653,69 +652,6 @@ "relative": true } }, - { - "name": "automattic/jetpack-plans", - "version": "dev-trunk", - "dist": { - "type": "path", - "url": "../../packages/plans", - "reference": "26f4ed44e15ea1e285b6b80870c7b8f3da56e9f8" - }, - "require": { - "automattic/jetpack-connection": "@dev", - "php": ">=7.2" - }, - "require-dev": { - "automattic/jetpack-changelogger": "@dev", - "automattic/jetpack-status": "@dev", - "automattic/jetpack-test-environment": "@dev", - "automattic/phpunit-select-config": "@dev", - "yoast/phpunit-polyfills": "^4.0.0" - }, - "suggest": { - "automattic/jetpack-autoloader": "Allow for better interoperability with other plugins that use this package." - }, - "type": "library", - "extra": { - "autotagger": true, - "mirror-repo": "Automattic/jetpack-plans", - "changelogger": { - "link-template": "https://github.com/Automattic/jetpack-plans/compare/v${old}...v${new}" - }, - "branch-alias": { - "dev-trunk": "0.11.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "scripts": { - "phpunit": [ - "phpunit-select-config phpunit.#.xml.dist --colors=always" - ], - "test-coverage": [ - "php -dpcov.directory=. ./vendor/bin/phpunit-select-config phpunit.#.xml.dist --coverage-php \"$COVERAGE_DIR/php.cov\"" - ], - "test-php": [ - "@composer phpunit" - ], - "build-production": [ - "echo 'Add your build step to composer.json, please!'" - ], - "build-development": [ - "echo 'Add your build step to composer.json, please!'" - ] - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Fetch information about Jetpack Plans from wpcom", - "transport-options": { - "relative": true - } - }, { "name": "automattic/jetpack-plugin-deactivation", "version": "dev-trunk", From 7aab45fb347bb3a22e0476be35c2b17786493dbe Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 14:51:48 +0300 Subject: [PATCH 33/41] Changelogs --- .../changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../backup/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../beta/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../inspect/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../protect/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../search/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../social/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../videopress/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ .../wpcomsh/changelog/feature-upsell-to-pro-wp-admin-menu | 4 ++++ 13 files changed, 52 insertions(+) create mode 100644 projects/plugins/automattic-for-agencies-client/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/backup/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/beta/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/classic-theme-helper-plugin/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/inspect/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/mu-wpcom-plugin/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/paypal-payment-buttons/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/protect/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/search/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/social/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/starter-plugin/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/videopress/changelog/feature-upsell-to-pro-wp-admin-menu create mode 100644 projects/plugins/wpcomsh/changelog/feature-upsell-to-pro-wp-admin-menu diff --git a/projects/plugins/automattic-for-agencies-client/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/automattic-for-agencies-client/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/automattic-for-agencies-client/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/backup/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/backup/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/backup/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/beta/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/beta/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/beta/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/classic-theme-helper-plugin/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/classic-theme-helper-plugin/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/classic-theme-helper-plugin/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/inspect/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/inspect/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/inspect/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/mu-wpcom-plugin/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/mu-wpcom-plugin/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/mu-wpcom-plugin/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/paypal-payment-buttons/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/paypal-payment-buttons/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/paypal-payment-buttons/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/protect/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/protect/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/protect/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/search/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/search/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/search/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/social/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/social/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/social/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/starter-plugin/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/starter-plugin/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/starter-plugin/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/videopress/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/videopress/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/videopress/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. diff --git a/projects/plugins/wpcomsh/changelog/feature-upsell-to-pro-wp-admin-menu b/projects/plugins/wpcomsh/changelog/feature-upsell-to-pro-wp-admin-menu new file mode 100644 index 000000000000..c95ae24d87d1 --- /dev/null +++ b/projects/plugins/wpcomsh/changelog/feature-upsell-to-pro-wp-admin-menu @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Dependencies: Update lock file to keep root requirements in sync. From 345ad704a75e4dc69c027123e9d58a286be8da8d Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 14:59:45 +0300 Subject: [PATCH 34/41] Update Admin_Menu_Test.php --- projects/packages/admin-ui/tests/php/Admin_Menu_Test.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index 0dd9b4634761..f050c255dfa3 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -90,6 +90,7 @@ public function setUp(): void { global $submenu; $submenu = array(); delete_option( 'jetpack_active_plan' ); + delete_option( 'jetpack_site_products' ); $reflection = new \ReflectionClass( Admin_Menu::class ); @@ -330,7 +331,7 @@ public function test_upgrade_menu_item_styles_output_for_free_plan() { Admin_Menu::add_upgrade_menu_item_styles(); $output = ob_get_clean(); - $this->assertStringContainsString( 'jetpack-upgrade-menu__icon', $output ); + $this->assertStringContainsString( Admin_Menu::UPGRADE_MENU_SLUG, $output ); $this->assertStringContainsString( '#069e08', $output ); } From 676964e0f246cb5f7808448ff301632681e23e5d Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 15:19:35 +0300 Subject: [PATCH 35/41] Add legacy active_plan['class'] check Added backward-compatible paid-plan detection via jetpack_active_plan['class'] (non-free counts as paid). --- projects/packages/admin-ui/src/class-admin-menu.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index 17297fc09289..17ee6e353e39 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -284,6 +284,12 @@ private static function is_free_plan() { // Check the active plan - use the is_free field or product_slug. $plan = get_option( 'jetpack_active_plan', array() ); + // Back-compat: older plan payloads use class to indicate paid plans. + if ( isset( $plan['class'] ) && 'free' !== $plan['class'] ) { + $is_free = false; + return $is_free; + } + // If the plan explicitly says it's not free, trust that. if ( isset( $plan['is_free'] ) && false === $plan['is_free'] ) { $is_free = false; From 8f51d3304ded6989a8b5295256724902bccbc32b Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 15:20:20 +0300 Subject: [PATCH 36/41] Use true null but still suppress Phan --- projects/packages/admin-ui/src/class-admin-menu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index 17ee6e353e39..d0749e60c0e5 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -338,7 +338,7 @@ private static function maybe_add_upgrade_menu_item() { $menu_title, 'manage_options', esc_url( $upgrade_url ), - '__return_null', + null, // @phan-suppress-current-line PhanTypeMismatchArgumentProbablyReal -- Core should ideally document null for no-callback arg. https://core.trac.wordpress.org/ticket/52539. 999 ); From c27bfbcd422f7db3c47bac6eebc0393410a37303 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 15:34:51 +0300 Subject: [PATCH 37/41] Update tests --- .../admin-ui/tests/php/Admin_Menu_Test.php | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index f050c255dfa3..ffb21f20f00c 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -8,11 +8,18 @@ namespace Automattic\Jetpack\Admin_UI; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\PreserveGlobalState; +use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses; use PHPUnit\Framework\TestCase; /** * Connection Manager functionality testing. + * + * @runTestsInSeparateProcesses + * @preserveGlobalState disabled */ +#[RunTestsInSeparateProcesses] +#[PreserveGlobalState( false )] class Admin_Menu_Test extends TestCase { /** @@ -174,6 +181,8 @@ public static function page_suffix_matches_data() { * @return void */ public function test_first_menu() { + wp_set_current_user( self::$admin_user_id ); + Admin_Menu::init(); Admin_Menu::add_menu( 'Test', 'Test', 'edit_posts', 'menu_1', '__return_null', 3 ); Admin_Menu::add_menu( 'Test', 'Test', 'edit_posts', 'menu_2', '__return_null', 1 ); @@ -223,12 +232,48 @@ public function test_upgrade_menu_item_shown_when_is_free_true() { $this->assertUpgradeMenuItemPresent(); } + /** + * Upgrade item is shown for legacy plan format when class is free. + * + * @return void + */ + public function test_upgrade_menu_item_shown_for_legacy_free_class_plan() { + wp_set_current_user( self::$admin_user_id ); + update_option( 'jetpack_active_plan', array( 'class' => 'free' ) ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemPresent(); + } + /** * Upgrade item is absent when the site has a paid plan. * * @return void */ public function test_upgrade_menu_item_hidden_for_paid_plan() { + wp_set_current_user( self::$admin_user_id ); + update_option( + 'jetpack_active_plan', + array( + 'product_slug' => 'jetpack_security', + 'is_free' => false, + ) + ); + + Admin_Menu::init(); + do_action( 'admin_menu' ); + + $this->assertUpgradeMenuItemAbsent(); + } + + /** + * Upgrade item is absent for legacy plan format when class is paid. + * + * @return void + */ + public function test_upgrade_menu_item_hidden_for_legacy_paid_class_plan() { wp_set_current_user( self::$admin_user_id ); update_option( 'jetpack_active_plan', array( 'class' => 'security' ) ); @@ -342,7 +387,13 @@ public function test_upgrade_menu_item_styles_output_for_free_plan() { */ public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { wp_set_current_user( self::$admin_user_id ); - update_option( 'jetpack_active_plan', array( 'class' => 'premium' ) ); + update_option( + 'jetpack_active_plan', + array( + 'product_slug' => 'jetpack_complete', + 'is_free' => false, + ) + ); ob_start(); Admin_Menu::add_upgrade_menu_item_styles(); From c61136644a0dd0e094173ba67b598d982a1e9229 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 15:54:34 +0300 Subject: [PATCH 38/41] See if separate process for each test helps --- .../admin-ui/tests/php/Admin_Menu_Test.php | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index ffb21f20f00c..8c53e9101f72 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -8,18 +8,12 @@ namespace Automattic\Jetpack\Admin_UI; use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\Attributes\PreserveGlobalState; -use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses; +use PHPUnit\Framework\Attributes\RunInSeparateProcess; use PHPUnit\Framework\TestCase; /** * Connection Manager functionality testing. - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled */ -#[RunTestsInSeparateProcesses] -#[PreserveGlobalState( false )] class Admin_Menu_Test extends TestCase { /** @@ -201,7 +195,9 @@ public function test_first_menu() { * Upgrade item appears in the submenu for an administrator on a free plan. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_shown_for_free_plan_admin() { wp_set_current_user( self::$admin_user_id ); @@ -215,7 +211,9 @@ public function test_upgrade_menu_item_shown_for_free_plan_admin() { * Upgrade item is shown when is_free is explicitly true. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_shown_when_is_free_true() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -236,7 +234,9 @@ public function test_upgrade_menu_item_shown_when_is_free_true() { * Upgrade item is shown for legacy plan format when class is free. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_shown_for_legacy_free_class_plan() { wp_set_current_user( self::$admin_user_id ); update_option( 'jetpack_active_plan', array( 'class' => 'free' ) ); @@ -251,7 +251,9 @@ public function test_upgrade_menu_item_shown_for_legacy_free_class_plan() { * Upgrade item is absent when the site has a paid plan. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_paid_plan() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -272,7 +274,9 @@ public function test_upgrade_menu_item_hidden_for_paid_plan() { * Upgrade item is absent for legacy plan format when class is paid. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_legacy_paid_class_plan() { wp_set_current_user( self::$admin_user_id ); update_option( 'jetpack_active_plan', array( 'class' => 'security' ) ); @@ -289,7 +293,9 @@ public function test_upgrade_menu_item_hidden_for_legacy_paid_class_plan() { * Tests the real-world data structure where plan option includes is_free field. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_when_is_free_false() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -310,7 +316,9 @@ public function test_upgrade_menu_item_hidden_when_is_free_false() { * Upgrade item is absent when product_slug indicates a paid plan. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_paid_product_slug() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -330,7 +338,9 @@ public function test_upgrade_menu_item_hidden_for_paid_product_slug() { * Upgrade item is absent when site has products from attached licenses. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_when_site_has_products() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -352,7 +362,9 @@ public function test_upgrade_menu_item_hidden_when_site_has_products() { * Upgrade item is absent for users without manage_options capability. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_non_admin() { wp_set_current_user( self::$editor_user_id ); @@ -368,7 +380,9 @@ public function test_upgrade_menu_item_hidden_for_non_admin() { * The sidebar is visible everywhere in wp-admin, so styles must load globally. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_output_for_free_plan() { wp_set_current_user( self::$admin_user_id ); @@ -384,7 +398,9 @@ public function test_upgrade_menu_item_styles_output_for_free_plan() { * No CSS output when the site has a paid plan. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -406,7 +422,9 @@ public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { * No CSS output when is_free is false. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_no_output_when_is_free_false() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -428,7 +446,9 @@ public function test_upgrade_menu_item_styles_no_output_when_is_free_false() { * No CSS output when site has products. * * @return void + * @runInSeparateProcess */ + #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_no_output_when_site_has_products() { wp_set_current_user( self::$admin_user_id ); update_option( From ce1b5dce37122383052ad311ded1a61c8c2802b1 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 16:06:25 +0300 Subject: [PATCH 39/41] Run tests regularly, remove the static caching of $is_free --- .../admin-ui/src/class-admin-menu.php | 21 ++++----------- .../admin-ui/tests/php/Admin_Menu_Test.php | 27 ------------------- 2 files changed, 5 insertions(+), 43 deletions(-) diff --git a/projects/packages/admin-ui/src/class-admin-menu.php b/projects/packages/admin-ui/src/class-admin-menu.php index d0749e60c0e5..9261c79367fc 100644 --- a/projects/packages/admin-ui/src/class-admin-menu.php +++ b/projects/packages/admin-ui/src/class-admin-menu.php @@ -275,42 +275,31 @@ private static function should_show_upgrade_menu() { * @return bool True if the site has no paid plan. */ private static function is_free_plan() { - static $is_free = null; - - if ( null !== $is_free ) { - return $is_free; - } - // Check the active plan - use the is_free field or product_slug. $plan = get_option( 'jetpack_active_plan', array() ); // Back-compat: older plan payloads use class to indicate paid plans. if ( isset( $plan['class'] ) && 'free' !== $plan['class'] ) { - $is_free = false; - return $is_free; + return false; } // If the plan explicitly says it's not free, trust that. if ( isset( $plan['is_free'] ) && false === $plan['is_free'] ) { - $is_free = false; - return $is_free; + return false; } // Check if the product slug indicates a paid plan. if ( isset( $plan['product_slug'] ) && 'jetpack_free' !== $plan['product_slug'] ) { - $is_free = false; - return $is_free; + return false; } // Also check for site products (licenses can add products without changing plan). $products = get_option( 'jetpack_site_products', array() ); if ( ! empty( $products ) && is_array( $products ) ) { - $is_free = false; - return $is_free; + return false; } - $is_free = true; - return $is_free; + return true; } /** diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index 8c53e9101f72..3788a8f765f5 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -8,7 +8,6 @@ namespace Automattic\Jetpack\Admin_UI; use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\Attributes\RunInSeparateProcess; use PHPUnit\Framework\TestCase; /** @@ -195,9 +194,7 @@ public function test_first_menu() { * Upgrade item appears in the submenu for an administrator on a free plan. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_shown_for_free_plan_admin() { wp_set_current_user( self::$admin_user_id ); @@ -211,9 +208,7 @@ public function test_upgrade_menu_item_shown_for_free_plan_admin() { * Upgrade item is shown when is_free is explicitly true. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_shown_when_is_free_true() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -234,9 +229,7 @@ public function test_upgrade_menu_item_shown_when_is_free_true() { * Upgrade item is shown for legacy plan format when class is free. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_shown_for_legacy_free_class_plan() { wp_set_current_user( self::$admin_user_id ); update_option( 'jetpack_active_plan', array( 'class' => 'free' ) ); @@ -251,9 +244,7 @@ public function test_upgrade_menu_item_shown_for_legacy_free_class_plan() { * Upgrade item is absent when the site has a paid plan. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_paid_plan() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -274,9 +265,7 @@ public function test_upgrade_menu_item_hidden_for_paid_plan() { * Upgrade item is absent for legacy plan format when class is paid. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_legacy_paid_class_plan() { wp_set_current_user( self::$admin_user_id ); update_option( 'jetpack_active_plan', array( 'class' => 'security' ) ); @@ -293,9 +282,7 @@ public function test_upgrade_menu_item_hidden_for_legacy_paid_class_plan() { * Tests the real-world data structure where plan option includes is_free field. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_when_is_free_false() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -316,9 +303,7 @@ public function test_upgrade_menu_item_hidden_when_is_free_false() { * Upgrade item is absent when product_slug indicates a paid plan. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_paid_product_slug() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -338,9 +323,7 @@ public function test_upgrade_menu_item_hidden_for_paid_product_slug() { * Upgrade item is absent when site has products from attached licenses. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_when_site_has_products() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -362,9 +345,7 @@ public function test_upgrade_menu_item_hidden_when_site_has_products() { * Upgrade item is absent for users without manage_options capability. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_hidden_for_non_admin() { wp_set_current_user( self::$editor_user_id ); @@ -380,9 +361,7 @@ public function test_upgrade_menu_item_hidden_for_non_admin() { * The sidebar is visible everywhere in wp-admin, so styles must load globally. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_output_for_free_plan() { wp_set_current_user( self::$admin_user_id ); @@ -398,9 +377,7 @@ public function test_upgrade_menu_item_styles_output_for_free_plan() { * No CSS output when the site has a paid plan. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -422,9 +399,7 @@ public function test_upgrade_menu_item_styles_no_output_for_paid_plan() { * No CSS output when is_free is false. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_no_output_when_is_free_false() { wp_set_current_user( self::$admin_user_id ); update_option( @@ -446,9 +421,7 @@ public function test_upgrade_menu_item_styles_no_output_when_is_free_false() { * No CSS output when site has products. * * @return void - * @runInSeparateProcess */ - #[RunInSeparateProcess] public function test_upgrade_menu_item_styles_no_output_when_site_has_products() { wp_set_current_user( self::$admin_user_id ); update_option( From fa1702f5e0dbecf0c27b8b67ddacde4da6e46a3a Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 16:21:14 +0300 Subject: [PATCH 40/41] Remove deprecated setAccessible Warning was: > Method ReflectionProperty::setAccessible() is deprecated since 8.5, as it has no effect since PHP 8.1 --- projects/packages/admin-ui/tests/php/Admin_Menu_Test.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index 3788a8f765f5..2f2dc9d498cc 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -96,13 +96,11 @@ public function setUp(): void { if ( $reflection->hasProperty( 'menu_items' ) ) { $menu_items = $reflection->getProperty( 'menu_items' ); - $menu_items->setAccessible( true ); $menu_items->setValue( null, array() ); } if ( $reflection->hasProperty( 'initialized' ) ) { $initialized = $reflection->getProperty( 'initialized' ); - $initialized->setAccessible( true ); $initialized->setValue( null, false ); } } From f49f94360c4bf4df125a95c16d8bb296467bcd52 Mon Sep 17 00:00:00 2001 From: Mikael Korpela Date: Wed, 1 Apr 2026 16:37:40 +0300 Subject: [PATCH 41/41] Run deprecated method on older PHP versions --- projects/packages/admin-ui/tests/php/Admin_Menu_Test.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php index 2f2dc9d498cc..d22eb689ae73 100644 --- a/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php +++ b/projects/packages/admin-ui/tests/php/Admin_Menu_Test.php @@ -96,11 +96,19 @@ public function setUp(): void { if ( $reflection->hasProperty( 'menu_items' ) ) { $menu_items = $reflection->getProperty( 'menu_items' ); + // @todo Remove this call once we no longer need to support PHP <8.1. + if ( PHP_VERSION_ID < 80100 ) { + $menu_items->setAccessible( true ); + } $menu_items->setValue( null, array() ); } if ( $reflection->hasProperty( 'initialized' ) ) { $initialized = $reflection->getProperty( 'initialized' ); + // @todo Remove this call once we no longer need to support PHP <8.1. + if ( PHP_VERSION_ID < 80100 ) { + $initialized->setAccessible( true ); + } $initialized->setValue( null, false ); } }