Skip to content

v1.10.0#695

Open
aristath wants to merge 469 commits into
mainfrom
develop
Open

v1.10.0#695
aristath wants to merge 469 commits into
mainfrom
develop

Conversation

@aristath
Copy link
Copy Markdown
Member

No description provided.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Oct 30, 2025

Test on Playground
Test this pull request on the Playground
or download the zip

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Nov 4, 2025

Composer package changes
Dev Packages Operation Base Target
composer/ca-bundle New - 1.5.10
composer/class-map-generator New - 1.7.0
composer/composer New - 2.9.2
composer/metadata-minifier New - 1.0.0
composer/spdx-licenses New - 1.5.9
eftec/bladeone New - 3.52
gettext/gettext New - v4.8.12
gettext/languages New - 2.12.1
justinrainbow/json-schema New - 6.6.3
marc-mabe/php-enum New - v4.7.2
mck89/peast New - v1.17.4
nb/oxymel New - v0.1.0
seld/jsonlint New - 1.11.0
seld/phar-utils New - 1.2.1
seld/signal-handler New - 2.0.2
symfony/polyfill-php73 New - v1.33.0
wp-cli/cache-command New - v2.2.1
wp-cli/checksum-command New - v2.3.2
wp-cli/config-command New - v2.4.0
wp-cli/core-command New - v2.1.22
wp-cli/cron-command New - v2.3.2
wp-cli/db-command New - v2.1.3
wp-cli/embed-command New - v2.1.0
wp-cli/entity-command New - v2.8.4
wp-cli/eval-command New - v2.2.7
wp-cli/export-command New - v2.1.14
wp-cli/extension-command New - v2.1.24
wp-cli/i18n-command New - v2.6.6
wp-cli/import-command New - v2.0.15
wp-cli/language-command New - v2.0.25
wp-cli/maintenance-mode-command New - v2.1.3
wp-cli/media-command New - v2.2.2
wp-cli/mustache New - v2.14.99
wp-cli/mustangostang-spyc New - 0.6.3
wp-cli/package-command New - v2.6.1
wp-cli/php-cli-tools New - v0.12.6
wp-cli/rewrite-command New - v2.0.16
wp-cli/role-command New - v2.0.16
wp-cli/scaffold-command New - v2.5.1
wp-cli/search-replace-command New - v2.1.9
wp-cli/server-command New - v2.0.15
wp-cli/shell-command New - v2.0.16
wp-cli/super-admin-command New - v2.0.16
wp-cli/widget-command New - v2.1.12
wp-cli/wp-cli New - v2.12.0
wp-cli/wp-cli-bundle New - v2.11.0
wp-cli/wp-config-transformer New - v1.4.3

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Nov 4, 2025

✅ Code Coverage Report

Metric Value
Total Coverage 31.43% 📉
Base Coverage 0.00%
Difference 📈 31.43%

⚠️ Coverage below recommended 40% threshold

🎉 Great job maintaining/improving code coverage!

📊 File-level Coverage Changes (155 files)

🆕 New Files

Class Coverage Lines
🟢 Progress_Planner\Actions\Content 91.18% 93/102
🔴 Progress_Planner\Actions\Content_Scan 2.94% 1/34
🔴 Progress_Planner\Actions\Maintenance 30.77% 8/26
🔴 Progress_Planner\Activities\Activity 41.38% 12/29
🟢 Progress_Planner\Activities\Content 100.00% 19/19
🟡 Progress_Planner\Activities\Content_Helpers 62.50% 10/16
🔴 Progress_Planner\Activities\Maintenance 0.00% 0/22
🔴 Progress_Planner\Activities\Query 59.81% 128/214
🔴 Progress_Planner\Activities\Suggested_Task 50.00% 9/18
🔴 Progress_Planner\Admin\Dashboard_Widget 0.00% 0/6
🔴 Progress_Planner\Admin\Dashboard_Widget_Score 0.00% 0/44
🔴 Progress_Planner\Admin\Dashboard_Widget_Todo 0.00% 0/8
🔴 Progress_Planner\Admin\Editor 4.55% 1/22
🔴 Progress_Planner\Admin\Enqueue 11.59% 27/233
🔴 Progress_Planner\Admin\Page 30.95% 52/168
🔴 Progress_Planner\Admin\Page_Settings 38.71% 24/62
🔴 Progress_Planner\Admin\Tour 0.00% 0/87
🔴 Progress_Planner\Admin\Widgets\Activity_Scores 49.50% 50/101
🔴 Progress_Planner\Admin\Widgets\Badge_Streak 0.00% 0/11
🔴 Progress_Planner\Admin\Widgets\Challenge 0.00% 0/29
🔴 Progress_Planner\Admin\Widgets\Content_Activity 0.00% 0/33
🔴 Progress_Planner\Admin\Widgets\Monthly_Badges 0.00% 0/34
🔴 Progress_Planner\Admin\Widgets\Suggested_Tasks 0.00% 0/13
🔴 Progress_Planner\Admin\Widgets\ToDo 0.00% 0/58
🔴 Progress_Planner\Admin\Widgets\Whats_New 0.00% 0/144
🔴 Progress_Planner\Admin\Widgets\Widget 25.00% 4/16
🟡 Progress_Planner\Badges 67.21% 41/61
🟢 Progress_Planner\Badges\Badge 85.71% 6/7
🟢 Progress_Planner\Badges\Badge_Maintenance 97.06% 33/34
🟡 Progress_Planner\Badges\Content\Content_Curator 75.56% 34/45
🟢 Progress_Planner\Badges\Content\Purposeful_Publisher 96.15% 25/26
🟢 Progress_Planner\Badges\Content\Revision_Ranger 96.15% 25/26
🟢 Progress_Planner\Badges\Maintenance\Maintenance_Maniac 94.44% 17/18
🟢 Progress_Planner\Badges\Maintenance\Progress_Padawan 94.44% 17/18
🟢 Progress_Planner\Badges\Maintenance\Super_Site_Specialist 94.44% 17/18
🟡 Progress_Planner\Badges\Monthly 72.17% 83/115
🔴 Progress_Planner\Base 45.40% 74/163
🟢 Progress_Planner\Goals\Goal 100.00% 41/41
🟢 Progress_Planner\Goals\Goal_Recurring 91.49% 43/47
🔴 Progress_Planner\Lessons 0.00% 0/38
🔴 Progress_Planner\Page_Todos 5.00% 1/20
🔴 Progress_Planner\Page_Types 52.68% 118/224
🔴 Progress_Planner\Plugin_Deactivation 0.00% 0/112
🔴 Progress_Planner\Plugin_Installer 10.77% 14/130
🔴 Progress_Planner\Plugin_Migrations 20.00% 5/25
🔴 Progress_Planner\Plugin_Upgrade_Tasks 6.78% 4/59
🟢 Progress_Planner\Rest\Base 100.00% 34/34
🟡 Progress_Planner\Rest\Recommendations_Controller 66.67% 4/6
🟢 Progress_Planner\Rest\Stats 100.00% 19/19
🟢 Progress_Planner\Rest\Tasks 100.00% 22/22
🔴 Progress_Planner\Settings 42.11% 16/38
🔴 Progress_Planner\Suggested_Tasks 5.28% 13/246
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Archive_Format 94.12% 16/17
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Base_Data_Collector 100.00% 27/27
🟡 Progress_Planner\Suggested_Tasks\Data_Collector\Data_Collector_Manager 64.29% 18/28
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Hello_World 94.12% 16/17
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Inactive_Plugins 81.25% 13/16
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Last_Published_Post 88.46% 23/26
🟡 Progress_Planner\Suggested_Tasks\Data_Collector\Post_Author 76.92% 10/13
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Post_Tag_Count 80.00% 8/10
🟡 Progress_Planner\Suggested_Tasks\Data_Collector\Published_Post_Count 71.43% 5/7
🔴 Progress_Planner\Suggested_Tasks\Data_Collector\SEO_Plugin 0.00% 0/13
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Sample_Page 94.12% 16/17
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Terms_Without_Description 100.00% 29/29
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Terms_Without_Posts 97.06% 33/34
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Uncategorized_Category 88.24% 15/17
🟢 Progress_Planner\Suggested_Tasks\Data_Collector\Unpublished_Content 88.46% 23/26
🔴 Progress_Planner\Suggested_Tasks\Data_Collector\Yoast_Orphaned_Content 0.00% 0/35
🔴 Progress_Planner\Suggested_Tasks\Providers\Blog_Description 33.33% 8/24
🔴 Progress_Planner\Suggested_Tasks\Providers\Collaborator 0.00% 0/31
🔴 Progress_Planner\Suggested_Tasks\Providers\Content_Create 0.00% 0/16
🔴 Progress_Planner\Suggested_Tasks\Providers\Content_Review 0.00% 0/212
🔴 Progress_Planner\Suggested_Tasks\Providers\Core_Update 0.00% 0/22
🔴 Progress_Planner\Suggested_Tasks\Providers\Debug_Display 0.00% 0/2
🔴 Progress_Planner\Suggested_Tasks\Providers\Disable_Comment_Pagination 0.00% 0/21
🔴 Progress_Planner\Suggested_Tasks\Providers\Disable_Comments 20.00% 10/50
🔴 Progress_Planner\Suggested_Tasks\Providers\Email_Sending 0.00% 0/82
🔴 Progress_Planner\Suggested_Tasks\Providers\Fewer_Tags 32.26% 10/31
🔴 Progress_Planner\Suggested_Tasks\Providers\Hello_World 0.00% 0/40
🔴 Progress_Planner\Suggested_Tasks\Providers\Improve_Pdf_Handling 0.00% 0/39
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Add_AIOSEO_Providers 0.00% 0/14
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Archive_Author 0.00% 0/23
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Archive_Date 0.00% 0/26
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Crawl_Settings_Feed_Authors 0.00% 0/23
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Crawl_Settings_Feed_Comments 0.00% 0/24
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Media_Pages 0.00% 0/23
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\AIOSEO\Organization_Logo 0.00% 0/23
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Add_Yoast_Providers 0.00% 0/51
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Archive_Author 0.00% 0/22
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Archive_Date 0.00% 0/24
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Archive_Format 0.00% 0/22
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Cornerstone_Workout 0.00% 0/27
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Crawl_Settings_Emoji_Scripts 0.00% 0/24
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Crawl_Settings_Feed_Authors 0.00% 0/27
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Crawl_Settings_Feed_Global_Comments 0.00% 0/24
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Fix_Orphaned_Content 0.00% 0/56
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Media_Pages 0.00% 0/20
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Organization_Logo 0.00% 0/86
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Orphaned_Content_Workout 0.00% 0/25
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Yoast_Interactive_Provider 0.00% 0/1
🔴 Progress_Planner\Suggested_Tasks\Providers\Integrations\Yoast\Yoast_Provider 0.00% 0/1
🔴 Progress_Planner\Suggested_Tasks\Providers\Permalink_Structure 8.93% 10/112
🔴 Progress_Planner\Suggested_Tasks\Providers\Php_Version 0.00% 0/2
🔴 Progress_Planner\Suggested_Tasks\Providers\Reduce_Autoloaded_Options 0.00% 0/39
🔴 Progress_Planner\Suggested_Tasks\Providers\Remove_Inactive_Plugins 0.00% 0/8
🔴 Progress_Planner\Suggested_Tasks\Providers\Remove_Terms_Without_Posts 4.93% 7/142
🔴 Progress_Planner\Suggested_Tasks\Providers\Rename_Uncategorized_Category 7.14% 4/56
🔴 Progress_Planner\Suggested_Tasks\Providers\SEO_Plugin 0.00% 0/58
🔴 Progress_Planner\Suggested_Tasks\Providers\Sample_Page 0.00% 0/39
🔴 Progress_Planner\Suggested_Tasks\Providers\Search_Engine_Visibility 30.43% 7/23
🔴 Progress_Planner\Suggested_Tasks\Providers\Select_Locale 23.40% 22/94
🔴 Progress_Planner\Suggested_Tasks\Providers\Select_Timezone 19.70% 13/66
🔴 Progress_Planner\Suggested_Tasks\Providers\Set_Date_Format 0.00% 0/115
🔴 Progress_Planner\Suggested_Tasks\Providers\Set_Page_About 0.00% 0/7
🔴 Progress_Planner\Suggested_Tasks\Providers\Set_Page_Contact 0.00% 0/7
🔴 Progress_Planner\Suggested_Tasks\Providers\Set_Page_FAQ 0.00% 0/7
🔴 Progress_Planner\Suggested_Tasks\Providers\Set_Page_Task 0.00% 0/58
🔴 Progress_Planner\Suggested_Tasks\Providers\Set_Valuable_Post_Types 0.00% 0/74
🔴 Progress_Planner\Suggested_Tasks\Providers\Site_Icon 20.00% 8/40
🔴 Progress_Planner\Suggested_Tasks\Providers\Tasks 36.59% 60/164
🔴 Progress_Planner\Suggested_Tasks\Providers\Tasks_Interactive 6.73% 7/104
🔴 Progress_Planner\Suggested_Tasks\Providers\Traits\Ajax_Security_AIOSEO 50.00% 2/4
🟢 Progress_Planner\Suggested_Tasks\Providers\Traits\Ajax_Security_Base 100.00% 8/8
🔴 Progress_Planner\Suggested_Tasks\Providers\Traits\Ajax_Security_Yoast 50.00% 2/4
🔴 Progress_Planner\Suggested_Tasks\Providers\Traits\Dismissable_Task 0.00% 0/66
🟢 Progress_Planner\Suggested_Tasks\Providers\Traits\Task_Action_Builder 100.00% 11/11
🔴 Progress_Planner\Suggested_Tasks\Providers\Unpublished_Content 5.62% 5/89
🔴 Progress_Planner\Suggested_Tasks\Providers\Update_Term_Description 5.30% 8/151
🔴 Progress_Planner\Suggested_Tasks\Providers\User 4.55% 1/22
🔴 Progress_Planner\Suggested_Tasks\Task 20.00% 6/30
🔴 Progress_Planner\Suggested_Tasks\Task_Factory 0.00% 0/2
🟡 Progress_Planner\Suggested_Tasks\Tasks_Manager 62.83% 71/113
🟢 Progress_Planner\Suggested_Tasks_DB 90.11% 164/182
🟢 Progress_Planner\Todo 100.00% 37/37
🔴 Progress_Planner\UI\Branding 31.82% 35/110
🟢 Progress_Planner\UI\Chart 89.29% 50/56
🔴 Progress_Planner\UI\Popover 0.00% 0/12
🔴 Progress_Planner\Update\Update_1100 0.00% 0/7
🟡 Progress_Planner\Update\Update_111 79.35% 123/155
🟢 Progress_Planner\Update\Update_130 88.16% 67/76
🔴 Progress_Planner\Update\Update_140 0.00% 0/14
🔴 Progress_Planner\Update\Update_161 0.00% 0/53
🔴 Progress_Planner\Update\Update_170 0.00% 0/20
🔴 Progress_Planner\Update\Update_172 0.00% 0/2
🟡 Progress_Planner\Update\Update_190 71.77% 89/124
🟢 Progress_Planner\Utils\Cache 100.00% 16/16
🟢 Progress_Planner\Utils\Date 100.00% 31/31
🔴 Progress_Planner\Utils\Debug_Tools 0.00% 0/327
🔴 Progress_Planner\Utils\Onboard 4.30% 4/93
🔴 Progress_Planner\Utils\Playground 0.00% 0/132
🟢 Progress_Planner\Utils\Plugin_Migration_Helpers 97.37% 37/38
🟢 Progress_Planner\Utils\System_Status 91.95% 80/87
🟢 Progress_Planner\Utils\Traits\Input_Sanitizer 100.00% 21/21
🔴 Progress_Planner\WP_CLI\Get_Stats_Command 0.00% 0/3
🟢 Progress_Planner\WP_CLI\Task_Command 83.78% 93/111
ℹ️ About this report
  • All tests run in a single job with Xdebug coverage
  • Security tests excluded from coverage to prevent output issues
  • Coverage calculated from line coverage percentages

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 28, 2026

🔍 WordPress Plugin Check Report

⚠️ Status: Passed with warnings

📊 Report

🎯 Total Issues ❌ Errors ⚠️ Warnings
10 0 10

⚠️ Warnings (10)

📁 classes/suggested-tasks/data-collector/class-unpublished-content.php (1 warning)
📍 Line 🔖 Check 💬 Message
103 WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in Using exclusionary parameters, like post__not_in, in calls to get_posts() should be done with caution, see https://wpvip.com/documentation/performance-improvements-by-removing-usage-of-post__not_in/ for more information.
📁 classes/suggested-tasks/providers/class-content-review.php (4 warnings)
📍 Line 🔖 Check 💬 Message
232 WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in Using exclusionary parameters, like post__not_in, in calls to get_posts() should be done with caution, see https://wpvip.com/documentation/performance-improvements-by-removing-usage-of-post__not_in/ for more information.
377 WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in Using exclusionary parameters, like post__not_in, in calls to get_posts() should be done with caution, see https://wpvip.com/documentation/performance-improvements-by-removing-usage-of-post__not_in/ for more information.
381 WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in Using exclusionary parameters, like post__not_in, in calls to get_posts() should be done with caution, see https://wpvip.com/documentation/performance-improvements-by-removing-usage-of-post__not_in/ for more information.
388 WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in Using exclusionary parameters, like post__not_in, in calls to get_posts() should be done with caution, see https://wpvip.com/documentation/performance-improvements-by-removing-usage-of-post__not_in/ for more information.
📁 classes/suggested-tasks/data-collector/class-yoast-orphaned-content.php (1 warning)
📍 Line 🔖 Check 💬 Message
111 PluginCheck.Security.DirectDB.UnescapedDBParameter Unescaped parameter $query used in $wpdb->get_row()\n$query assigned unsafely at line 98.
📁 classes/suggested-tasks/data-collector/class-terms-without-description.php (1 warning)
📍 Line 🔖 Check 💬 Message
108 PluginCheck.Security.DirectDB.UnescapedDBParameter Unescaped parameter $query used in $wpdb->get_results()\n$query assigned unsafely at line 106.
📁 classes/suggested-tasks/data-collector/class-terms-without-posts.php (1 warning)
📍 Line 🔖 Check 💬 Message
120 PluginCheck.Security.DirectDB.UnescapedDBParameter Unescaped parameter $query used in $wpdb->get_results()\n$query assigned unsafely at line 118.
📁 classes/activities/class-query.php (2 warnings)
📍 Line 🔖 Check 💬 Message
71 PluginCheck.Security.DirectDB.UnescapedDBParameter Unescaped parameter $table_name used in $wpdb->query()\n$table_name assigned unsafely at line 58.
163 PluginCheck.Security.DirectDB.UnescapedDBParameter Unescaped parameter $where_args used in $wpdb->get_results()\n$where_args assigned unsafely at line 153.

🤖 Generated by WordPress Plugin Check Action • Learn more about Plugin Check

Copilot AI review requested due to automatic review settings February 4, 2026 09:05
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

ilicfilip and others added 6 commits February 4, 2026 10:20
Resolve conflict in onboarding e2e test: develop reverted to old
onboarding system, so update the refactored TypeScript test to match
the old form-based onboarding flow.
Add get_per_page() helper to Suggested_Tasks widget that returns
PER_PAGE_DASHBOARD (3) on the WP Dashboard screen and PER_PAGE_DEFAULT (5)
on all other screens.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* WIP

* filter out the activity category

* tweak when onboarding tasks should show, pp-hosts compat

* Replace hardcoded Ravi icon with branding system icon

Use get_admin_menu_icon() from the branding system instead of
hardcoded icon_progress_planner.svg references, so hosts with
custom branding automatically get their own icon everywhere.

Closes #51

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix coding standards: add backslash prefix to global functions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix e2e onboarding test: remove pre-set license key and mock remote API

The blueprint was pre-setting progress_planner_license_key, which made
is_privacy_policy_accepted() return true and the welcome screen never
appeared. The onboarding test couldn't find .prpl-welcome.

Fix: remove the license key from the blueprint so the fresh install
onboarding screen shows, and mock the remote progressplanner.com API
calls (get-nonce + onboard) since Playground can't reach them.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix onboarding test: wait for page reload after form submission

After the form submit triggers the JS flow (remote API → save license key
→ window.location.reload()), explicitly wait for the page load event
before checking for the dashboard widget.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix onboarding test: bypass remote API with direct AJAX call

Previous approaches using page.route() failed because Playwright's
route mocking doesn't intercept XMLHttpRequest in WP Playground.
Instead, use page.evaluate() to call the local WP AJAX save endpoint
directly, then reload the page to verify the dashboard appears.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix onboarding test: use XMLHttpRequest instead of fetch

The fetch() API fails in Playground's service worker environment
with "TypeError: Failed to fetch". Use XMLHttpRequest instead,
which is the same mechanism the actual onboarding JS uses.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix e2e onboarding test for WP Playground environment

The onboarding test was broken since the Docker→Playground migration:
1. Blueprint pre-set the license key, hiding the welcome screen
2. page.route() cannot intercept requests handled by Playground's
   service worker, so the remote API (progressplanner.com) calls
   in the JS onboarding flow silently fail

Fix by:
- Removing pre-set license key from blueprint (keep demo_data_generated
  to prevent Playground class from auto-generating one)
- Using Playwright's page.request.post() to call the local WP AJAX
  endpoint directly — this bypasses the service worker entirely while
  sharing the page's auth cookies

Works in both Playground (e2e-tests) and Docker (yoast-premium-tests).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* apply branding to dashboard widget titles

* Pin dist-archive-command to v3.1.0 for WP-CLI 2.12 compat

dist-archive-command v3.2.0 requires wp-cli ^2.13 but the CI runner
(shivammathur/setup-php) provides 2.12.0, causing plugin-check to fail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…andle (#762)

Allows external integrations (e.g. pp-hosts guided tour, which runs on
the block editor, site editor, frontend, and non-PP admin screens) to
apply the partner branding custom CSS to their own stylesheets, instead
of being limited to the PP admin pages where Page::enqueue_styles()
runs.

The new method is idempotent per style handle, so the per-request
dedupe that previously lived on Page (via the
$branding_inline_styles_added static — needed because dashboard
widgets call enqueue_styles() multiple times per request) now lives
with the branding class itself and works for any handle.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Fix PHPStan errors and phpunit CVE on main

Brings main's static analysis and dependency security checks back to green:

- Static Analysis: clear 25 pre-existing PHPStan errors. Ports develop's
  typed @return on Date::get_periods()/get_range() (which also resolves the
  Chart modify() errors), takes develop's exact versions of class-page-settings,
  class-activity-scores, class-chart and class-update-140, converts the WP-core
  require_once ignores to the @phpstan-ignore-next-line form that suppresses
  under PHPStan 2.1.x, and adds inline ignores elsewhere.
- Security check: bump phpunit/phpunit 9.6.30 -> 9.6.34 in composer.lock to
  resolve CVE-2026-24765 (unsafe deserialization in PHPT code coverage).

* Fix abstract method fatal in test-class-security.php

The anonymous classes extending the abstract Tasks_Interactive did not
implement the abstract Tasks::should_add_task() method. phpunit 9.6.30
did not surface this, but 9.6.34 (the CVE-2026-24765 fix) does, causing
a fatal when the test class loads. Implement should_add_task() in all 8
anonymous task providers.

* v1.9.1 (#763)

* Sanitize and escape prpl_recommendations title

An authenticated Editor (or higher) could create a recommendation via
POST /wp/v2/prpl_recommendations with an HTML payload in the `title`
field (e.g. `<img src=x onerror=alert(1)>`). The dashboard JS template
(views/js-templates/suggested-task.html) renders `title.rendered` with
Underscore's unescaped `{{{ }}}` syntax, so the payload executed when an
admin loaded the dashboard.

Defense in depth:

- Input: add a `rest_pre_insert_prpl_recommendations` filter that strips
  tags from `post_title` on every REST insert/update, regardless of the
  user's `unfiltered_html` capability. Recommendation titles are plain
  text, so this neutralizes the payload at the source.
- Output (JS): route the two raw `{{{ }}}` title sinks through a new
  `prplSuggestedTask.sanitizeTitle()` helper, which inert-parses the
  value with DOMParser (no script/resource side effects) and re-escapes
  it, preserving legitimate entities like `&amp;` without double-encoding
  the server-side `esc_html`'d provider titles.
- Output (admin bar): the PRPL debug tool printed `post_title` unescaped
  into a `WP_Admin_Bar` node id (an HTML attribute) and title (rendered
  as raw HTML), firing the payload on every admin page in debug mode.
  Escape the title with `esc_html()`, use the post ID for the node id,
  and escape the activities node title too.
- Also switch `updateTaskTitle` to set `.textContent` instead of
  `.innerHTML` for the screen-reader label, closing a self-XSS sink.

Adds tests/phpunit/test-class-rest-recommendations-xss.php covering
Editor and Administrator payloads plus a plain-text regression check.

* Bump version to 1.9.1

* add migration script and revert JS title escaping

* add inline comment, cc @tacoverdo

* Delete recommendation when sanitized title is empty

A title that is pure markup strips to an empty string. wp_update_post()
rejects an update that would leave the title, content, and excerpt all
empty, so the malicious title was left in the DB. The plugin never stores
title-less recommendations, so delete such rows instead.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* update readme.txt

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fix plain-text title test to pass on multisite

On multisite, editors lack the unfiltered_html capability, so core's kses
encodes the ampersand in the test title and the byte-for-byte assertion
fails. Grant the capability (via super admin on multisite) so the test
isolates our XSS sanitization rather than core's kses behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Grant unfiltered_html before switching user in title test

kses_init() runs on the set_current_user hook and decides whether to
attach the kses filters at switch time. The capability must be granted
before wp_set_current_user(), otherwise the filters are already attached
and the multisite assertion still sees the ampersand encoded.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Bump composer/composer 2.9.2 -> 2.10.0 to clear dev-dependency CVEs

Resolves the Security check failure: composer/composer 2.9.2 (pulled in
transitively via wp-cli/wp-cli-bundle in require-dev) carried CVE-2026-40176,
CVE-2026-40261, and CVE-2026-45793. Targeted `composer update composer/composer
--with-dependencies`; composer.json (runtime deps) unchanged. `composer audit`
now reports no advisories.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Joost de Valk <joost@altha.nl>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants