Fixing the WP Activity Log Fatal TypeError on PHP 8.x (class-wp-helper.php)
If you recently upgraded your WordPress environment to PHP 8.0, 8.2, or 8.3 and noticed a "There has been a critical error on this website" screen when loading the WP Activity Log viewer (/wp-admin/admin.php?page=wsal-auditlog), you are likely running into an unhandled scalar type mismatch in modern PHP runtimes.
Tracked on the WordPress Support Forums: Fatal error 5.6.5 with WP 7.1: strtolower receives integer callback id (View Forum Hotfix Reply)
The Error Breakdown
Checking the site's debug.log file reveals a fatal TypeError originating from the plugin's notice-suppression helper:
[20-Aug-2026 05:28:54 UTC] PHP Fatal error: Uncaught TypeError: strtolower(): Argument #1 ($string) must be of type string, int given in /var/www/html/wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php:656
Stack trace:
#0 /var/www/html/wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php(656): strtolower(1243)
#1 /var/www/html/wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php(537): WSAL\Helpers\WP_Helper::remove_unrelated_actions('admin_notices')
#2 /var/www/html/wp-includes/class-wp-hook.php(353): WSAL\Helpers\WP_Helper::hide_unrelated_notices('')
#3 /var/www/html/wp-includes/class-wp-hook.php(377): WP_Hook->apply_filters(NULL, Array)
#4 /var/www/html/wp-includes/plugin.php(523): WP_Hook->do_action(Array)
#5 /var/www/html/wp-admin/admin-header.php(151): do_action('admin_print_scr...')
#6 /var/www/html/wp-admin/admin.php(244): require_once('/var/www/html/w...')
#7 {main}
thrown in /var/www/html/wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php on line 656
Why It Happens
To keep the activity log viewer interface clean, the plugin executes hide_unrelated_notices() on the admin_notices action hook. It scans registered callback functions and runs strtolower() against each callback identifier to determine whether the notice belongs to WP Activity Log or another plugin.
In PHP 7.x, passing non-string values (such as integer identifiers generated by dynamic hooks, anonymous functions, or closures) into strtolower() resulted in silent typecasting. In PHP 8.0+, scalar type checking is strictly enforced: passing an integer like 1242 or 1243 throws an uncaught TypeError and immediately crashes script execution.
The Workaround / Hotfix
Until an upstream update is released by the plugin developers, you can apply a one-line hotfix to cast the callback parameter explicitly to a string before evaluation.
Manual File Edit
Open /wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php and navigate to line 656:
// Original line:
strtolower( $callback )
// Updated line:
strtolower( (string) $callback )
Quick Docker / Shell Command
If you manage your WordPress instance in Docker or have SSH terminal access, you can run a non-destructive in-place sed substitution:
# Inside a standard Linux server / webroot:
sed -i 's/strtolower(\([^)]*\))/strtolower((string)\1)/g' wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php
# Or directly inside a running Docker container:
docker exec -it your-wordpress-container sed -i 's/strtolower(\([^)]*\))/strtolower((string)\1)/g' /var/www/html/wp-content/plugins/wp-security-audit-log/classes/Helpers/class-wp-helper.php
Once applied, refresh the WP Activity Log page in your admin dashboard. The activity audit log table will render immediately without triggering fatal errors.
Follow the community thread or submit further feedback on the official WordPress Support Forum topic.
No comments:
Post a Comment