From 04232883a71e25c296a18210c40c68b12d85cc65 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Sat, 9 Aug 2025 15:58:04 -0700 Subject: [PATCH 1/6] Add View Transitions to upgrade notice --- plugins/performance-lab/readme.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/performance-lab/readme.txt b/plugins/performance-lab/readme.txt index 404eacf413..d5c859b791 100644 --- a/plugins/performance-lab/readme.txt +++ b/plugins/performance-lab/readme.txt @@ -610,6 +610,10 @@ Contributions are always welcome! Learn more about how to get involved in the [C == Upgrade Notice == += n.e.x.t = + +This release introduces a new feature plugin called View Transitions which adds smooth transitions between navigations on your site. + = 3.2.0 = This release introduces a new feature plugin called Image Prioritizer which optimizes the loading of images to improve LCP. From 3296195a546e56b478d50bbe4a9510d1b8d94aa2 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Sat, 9 Aug 2025 16:10:31 -0700 Subject: [PATCH 2/6] Add admin pointers for new features --- .../performance-lab/includes/admin/load.php | 142 +++++++++++++----- .../tests/includes/admin/test-load.php | 48 +++++- 2 files changed, 152 insertions(+), 38 deletions(-) diff --git a/plugins/performance-lab/includes/admin/load.php b/plugins/performance-lab/includes/admin/load.php index 36675123ce..849ccb5170 100644 --- a/plugins/performance-lab/includes/admin/load.php +++ b/plugins/performance-lab/includes/admin/load.php @@ -67,6 +67,36 @@ function perflab_render_settings_page(): void { Admin pointer messages with the admin pointer IDs as the keys. + */ +function perflab_get_admin_pointers(): array { + return array( + 'perflab-admin-pointer' => __( 'You can now test upcoming WordPress performance features.', 'performance-lab' ), + 'perflab-feature-view-transitions' => __( 'New View Transitions feature now available.', 'performance-lab' ), + ); +} + /** * Initializes admin pointer. * @@ -84,18 +114,27 @@ function perflab_admin_pointer( ?string $hook_suffix = '' ): void { return; } $current_user = get_current_user_id(); - $dismissed = array_filter( explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ) ); + $pointers = array_keys( perflab_get_admin_pointers() ); + $dismissed = perflab_get_dismissed_admin_pointer_ids(); - if ( in_array( 'perflab-admin-pointer', $dismissed, true ) ) { + // All pointers have been dismissed already. + if ( count( array_diff( $pointers, $dismissed ) ) === 0 ) { return; } + // Do not show the admin pointer when not on the dashboard or plugins list table. if ( ! in_array( $hook_suffix, array( 'index.php', 'plugins.php' ), true ) ) { - // Do not show on the settings page and dismiss the pointer. - if ( isset( $_GET['page'] ) && PERFLAB_SCREEN === $_GET['page'] && ( ! in_array( 'perflab-admin-pointer', $dismissed, true ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $dismissed[] = 'perflab-admin-pointer'; - update_user_meta( $current_user, 'dismissed_wp_pointers', implode( ',', $dismissed ) ); + // And if we're on the Performance screen, automatically dismiss the pointers. + if ( isset( $_GET['page'] ) && PERFLAB_SCREEN === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + update_user_meta( + $current_user, + 'dismissed_wp_pointers', + implode( + ',', + array_unique( array_merge( $dismissed, $pointers ) ) + ) + ); } return; @@ -113,53 +152,84 @@ function perflab_admin_pointer( ?string $hook_suffix = '' ): void { * * Handles the rendering of the admin pointer. * + * @todo Eliminate this function in favor of putting it inside of perflab_admin_pointer() which attaches an inline script. + * * @since 1.0.0 * @since 2.4.0 Optional arguments were added to make the function reusable for different pointers. - * - * @param string $pointer_id Optional. ID of the pointer. Default 'perflab-admin-pointer'. - * @param array{heading?: string, content?: string} $args Optional. Pointer arguments. Supports 'heading' and 'content' entries. - * Defaults are the heading and content for the 'perflab-admin-pointer'. + * @since n.e.x.t Unused arguments removed. */ -function perflab_render_pointer( string $pointer_id = 'perflab-admin-pointer', array $args = array() ): void { - if ( ! isset( $args['heading'] ) ) { - $args['heading'] = __( 'Performance Lab', 'performance-lab' ); - } - if ( ! isset( $args['content'] ) ) { - $args['content'] = sprintf( - /* translators: %s: settings page link */ - esc_html__( 'You can now test upcoming WordPress performance features. Open %s to individually toggle the performance features.', 'performance-lab' ), - '' . esc_html__( 'Settings > Performance', 'performance-lab' ) . '' - ); +function perflab_render_pointer(): void { + $new_install_pointer_id = 'perflab-admin-pointer'; + $perflab_admin_pointers = perflab_get_admin_pointers(); + $dismissed_pointer_ids = perflab_get_dismissed_admin_pointer_ids(); + + if ( ! in_array( $new_install_pointer_id, $dismissed_pointer_ids, true ) ) { + $needed_pointer_ids = array( $new_install_pointer_id ); + } else { + $needed_pointer_ids = array_diff( array_keys( $perflab_admin_pointers ), $dismissed_pointer_ids ); } + $args = array( + 'heading' => __( 'Performance Lab', 'performance-lab' ), + ); + + $args['content'] = implode( + '', + array_map( + static function ( string $needed_pointer ) use ( $perflab_admin_pointers ): string { + return '

' . $perflab_admin_pointers[ $needed_pointer ] . '

'; + }, + $needed_pointer_ids + ) + ); + + $args['content'] .= '

' . sprintf( + /* translators: %s: settings page link */ + esc_html__( 'Open %s to individually toggle the performance features.', 'performance-lab' ), + '' . esc_html__( 'Settings > Performance', 'performance-lab' ) . '' + ) . '

'; + $wp_kses_options = array( - 'a' => array( + 'a' => array( 'href' => array(), ), + 'p' => array(), + 'strong' => array(), ); + $pointer_ids_to_dismiss = array_values( array_diff( array_keys( $perflab_admin_pointers ), $dismissed_pointer_ids ) ); ?> - next_tag( array( 'tag_name' => 'SCRIPT' ) ) ) { + wp_add_inline_script( 'wp-pointer', $processor->get_modifiable_text() ); + } } +add_action( 'admin_enqueue_scripts', 'perflab_admin_pointer' ); /** * Adds a link to the features page to the plugin's entry in the plugins list table. diff --git a/plugins/performance-lab/tests/includes/admin/test-load.php b/plugins/performance-lab/tests/includes/admin/test-load.php index ec823812e4..a533108974 100644 --- a/plugins/performance-lab/tests/includes/admin/test-load.php +++ b/plugins/performance-lab/tests/includes/admin/test-load.php @@ -208,7 +208,17 @@ public function test_perflab_admin_pointer( ?Closure $set_up, ?string $hook_suff } $this->assertFalse( is_network_admin() || is_user_admin() ); perflab_admin_pointer( $hook_suffix ); - $this->assertSame( $expected ? 10 : false, has_action( 'admin_print_footer_scripts', 'perflab_render_pointer' ) ); + + $after_script = ''; + $script_dependency = wp_scripts()->query( 'wp-pointer' ); + if ( $script_dependency instanceof _WP_Dependency ) { + $after_script = implode( "\n", array_filter( $script_dependency->extra['after'] ?? array() ) ); + } + if ( $expected ) { + $this->assertStringContainsString( 'pointerIdsToDismiss', $after_script ); + } else { + $this->assertStringNotContainsString( 'pointerIdsToDismiss', $after_script ); + } $this->assertSame( $expected, wp_script_is( 'wp-pointer', 'enqueued' ) ); $this->assertSame( $expected, wp_style_is( 'wp-pointer', 'enqueued' ) ); $this->assertSame( $dismissed_wp_pointers, get_user_meta( $user_id, 'dismissed_wp_pointers', true ) ); From 99dfe2d0bc7dd997cd713dc448ce27e0239b1e8c Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Mon, 11 Aug 2025 11:06:56 -0700 Subject: [PATCH 5/6] Remove re-obtaining pointer IDs Co-authored-by: Felix Arntz --- plugins/performance-lab/includes/admin/load.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/performance-lab/includes/admin/load.php b/plugins/performance-lab/includes/admin/load.php index 14bdccc0a3..b5025fced3 100644 --- a/plugins/performance-lab/includes/admin/load.php +++ b/plugins/performance-lab/includes/admin/load.php @@ -159,7 +159,7 @@ function perflab_admin_pointer( ?string $hook_suffix = '' ): void { if ( ! in_array( $new_install_pointer_id, $dismissed_pointer_ids, true ) ) { $needed_pointer_ids = array( $new_install_pointer_id ); } else { - $needed_pointer_ids = array_diff( array_keys( $admin_pointers ), $dismissed_pointer_ids ); + $needed_pointer_ids = array_diff( $admin_pointer_ids, $dismissed_pointer_ids ); } $args = array( @@ -190,7 +190,7 @@ static function ( string $needed_pointer ) use ( $admin_pointers ): string { 'strong' => array(), ); - $pointer_ids_to_dismiss = array_values( array_diff( array_keys( $admin_pointers ), $dismissed_pointer_ids ) ); + $pointer_ids_to_dismiss = array_values( array_diff( $admin_pointer_ids, $dismissed_pointer_ids ) ); ob_start(); ?> From 511d71ed4b4cbd87e99d57202d6c8f0cc0e6187f Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Mon, 11 Aug 2025 11:41:20 -0700 Subject: [PATCH 6/6] Improve pointer wording for reading flow. Co-authored-by: Weston Ruter --- plugins/performance-lab/includes/admin/load.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/performance-lab/includes/admin/load.php b/plugins/performance-lab/includes/admin/load.php index b5025fced3..4443e7ffb9 100644 --- a/plugins/performance-lab/includes/admin/load.php +++ b/plugins/performance-lab/includes/admin/load.php @@ -178,7 +178,7 @@ static function ( string $needed_pointer ) use ( $admin_pointers ): string { $args['content'] .= '

' . sprintf( /* translators: %s: settings page link */ - esc_html__( 'Open %s to individually toggle the performance features and access their settings (if any).', 'performance-lab' ), + esc_html__( 'Open %s to individually toggle the performance features and access any relevant settings.', 'performance-lab' ), '' . esc_html__( 'Settings > Performance', 'performance-lab' ) . '' ) . '

';