PHP 8.6 and WordPress plugins: which popular plugins log deprecation notices
PHP 8.6 comes out on 19 November 2026. We ran the 100 most popular WordPress.org plugins (55,760 PHP files, latest releases on 28 October 2026) on the PHP 8.6.0RC4 release candidate. 39 of them use something PHP 8.6 deprecates, and 12 log a notice on an ordinary front-end page load. Nothing stops working, but the notices fill logs and show on pages wherever errors are displayed. Below: every plugin, file and line, and the one-line fix for each.
What a PHP 8.6 deprecation notice does, and what it doesn't
- Nothing stops working on PHP 8.6. A deprecation is a warning that the code will break in a future major version (PHP 9, no date yet). The plugin keeps working.
- It lands in your logs. With
log_errorson (the usual hosting default) every notice goes to the PHP error log, and withWP_DEBUG_LOGtowp-content/debug.log. - It can show on the page. If
display_errorsis on, orWP_DEBUGis on withoutWP_DEBUG_DISPLAYset to false, the notice is printed into the page. That breaks AJAX/JSON responses and can cause "headers already sent" warnings. Keep display off on live sites. - Compile-time notices are logged when PHP compiles the file. With OPcache that happens once after a restart or
cache reset, so you see a few lines, not one per visit. Function notices (
spl_object_hash(),is_integer()…) are logged every time that code runs.
The 39 plugins with PHP 8.6 findings
"On a normal page load" means our WordPress 7.1.1 test site logged a PHP 8.6 deprecation from that plugin when we opened the home page or a post, with only that plugin active and its default settings.
| Plugin | Installs | Version tested | Notice in our test? | What PHP 8.6 flags |
|---|---|---|---|---|
| Elementor Website Builder | 10,000,000+ | 4.3.5 | Yes: logged on a normal page load | returns a value from a constructor; class constant named NAMESPACE; calls spl_object_hash() |
| Yoast SEO | 10,000,000+ | 28.8 | Not on the pages we opened | calls spl_object_hash(); bundled Guzzle Promises Is class |
| LiteSpeed Cache | 7,000,000+ | 7.9.2 | Not on the pages we opened | calls spl_object_hash() |
| WooCommerce | 7,000,000+ | 11.2.1 | In wp-admin / on activation | calls is_a() with a string; returns a value from a constructor; calls is_integer() / is_long(); calls spl_object_hash() |
| Site Kit by Google | 5,000,000+ | 1.190.0 | Not on the pages we opened | calls is_integer() / is_long(); calls spl_object_hash(); bundled Guzzle Promises Is class |
| Wordfence Security | 5,000,000+ | 9.0.2 | Yes: logged on a normal page load | class constant named NAMESPACE; returns a value from a constructor |
| Rank Math SEO | 4,000,000+ | 1.0.280 | Not on the pages we opened | class constant named NAMESPACE; calls spl_object_hash() |
| UpdraftPlus | 4,000,000+ | 1.26.14 | Not on the pages we opened | calls is_integer() / is_long(); returns a value from a constructor; calls spl_object_hash(); bundled Guzzle Promises Is class |
| WP Mail SMTP by WPForms | 4,000,000+ | 4.10.3 | Not on the pages we opened | calls spl_object_hash(); bundled Guzzle Promises Is class |
| Really Simple Security | 3,000,000+ | 9.8.4 | Not on the pages we opened | class constant named NAMESPACE |
| All in One SEO | 2,000,000+ | 5.0.4 | Yes: logged on a normal page load | returns a value from a constructor; calls is_a() with a string |
| MonsterInsights | 2,000,000+ | 11.3.0 | Yes: logged on a normal page load | returns a value from a constructor |
| Complianz GDPR/CCPA Cookie Consent Banner | 1,000,000+ | 7.5.6 | Not on the pages we opened | calls mbregex functions (mb_ereg_*); calls strcoll(); calls spl_object_hash() |
| Duplicator | 1,000,000+ | 5.1.0 | Not on the pages we opened | calls spl_object_hash(); bundled Guzzle Promises Is class |
| ElementsKit Elementor Addons | 1,000,000+ | 4.0.9 | Not on the pages we opened | class constant named NAMESPACE |
| EWWW Image Optimizer | 1,000,000+ | 8.9.0 | Yes: logged on a normal page load | returns a value from a constructor |
| Smash Balloon Social Photo Feed | 1,000,000+ | 6.14.0 | Yes: logged on a normal page load | returns a value from a constructor; calls spl_object_hash() |
| Limit Login Attempts Security | 1,000,000+ | 3.3.10 | Not on the pages we opened | calls spl_object_hash(); returns a value from a constructor |
| Safe SVG | 1,000,000+ | 2.5.2 | Not on the pages we opened | calls spl_object_hash() |
| Speed Optimizer | 1,000,000+ | 7.8.5 | Yes: logged on a normal page load | returns a value from a constructor |
| ManageWP Worker | 1,000,000+ | 4.9.38 | Not on the pages we opened | calls is_integer() / is_long(); calls spl_object_hash(); returns a value from a constructor |
| Smush | 1,000,000+ | 4.3.5 | Not on the pages we opened | calls spl_object_hash(); bundled Guzzle Promises Is class |
| Redux Framework | 900,000+ | 4.5.16 | Not on the pages we opened | calls is_integer() / is_long() |
| W3 Total Cache | 900,000+ | 2.11.0 | Yes: logged on a normal page load | returns a value from a constructor; returns a value from a destructor; calls spl_object_hash(); bundled Guzzle Promises Is class; calls is_double() |
| WPvivid | 900,000+ | 0.9.136 | Not on the pages we opened | calls is_integer() / is_long(); calls spl_object_hash() |
| Fluent Forms | 800,000+ | 6.2.16 | Not on the pages we opened | calls spl_object_hash(); calls is_double() |
| Google for WooCommerce | 800,000+ | 3.10.0 | Not run (needs WooCommerce active) | calls spl_object_hash(); calls is_integer() / is_long(); calls is_double(); bundled Guzzle Promises Is class |
| WooCommerce PayPal Payments | 800,000+ | 4.2.0 | Not run (needs WooCommerce active) | class constant named NAMESPACE |
| Kadence Security | 700,000+ | 10.0.6 | Not on the pages we opened | returns a value from a constructor |
| Joinchat | 700,000+ | 6.4.2 | Yes: logged on a normal page load | class constant named NAMESPACE |
| GTM4WP | 700,000+ | 2.0.6 | Not on the pages we opened | class constant named NAMESPACE |
| FluentSMTP | 700,000+ | 2.4.1 | Not on the pages we opened | returns a value from a constructor; calls spl_object_hash(); bundled Guzzle Promises Is class |
| MainWP Child | 700,000+ | 6.3 | Not on the pages we opened | calls mbregex functions (mb_ereg_*); calls spl_object_hash() |
| Backuply | 600,000+ | 1.6.0 | Not on the pages we opened | returns a value from a constructor; calls is_integer() / is_long() |
| Website Builder by SeedProd | 600,000+ | 6.20.10 | Yes: logged on a normal page load | returns a value from a constructor |
| Enable Media Replace | 600,000+ | 4.2.3 | Not on the pages we opened | returns a value from a constructor |
| Forminator Forms | 600,000+ | 1.58.3 | Not on the pages we opened | calls spl_object_hash(); bundled Guzzle Promises Is class |
| Post Types Order | 600,000+ | 2.5.9 | Yes: logged on a normal page load | returns a value from a constructor |
| The Events Calendar | 600,000+ | 6.18.2 | Yes: logged on a normal page load | class constant named NAMESPACE; returns a value from a constructor; calls is_integer() / is_long(); calls spl_object_hash() |
One shared cause: Guzzle Promises' Is class
PHP 8.6 deprecates is as a class name. The Guzzle HTTP library's promises package has a class called
Is, and its own code uses it, so PHP logs Deprecated: Using "is" as a class name is deprecated since 8.6
whenever a plugin makes an HTTP request through a bundled Guzzle. Guzzle fixed this on 18 October 2026: guzzlehttp/promises
2.6.0 and 3.1.0 use a new State class instead. These plugins still bundle an older copy: Yoast SEO, Site Kit by Google, UpdraftPlus, WP Mail SMTP by WPForms, Duplicator, Smush, W3 Total Cache, Google for WooCommerce, FluentSMTP, Forminator Forms. The fix for
their authors is to update the bundled guzzlehttp/promises. Site owners can't patch it themselves; wait for the plugin update.
What PHP 8.6 deprecates that these plugins use
| PHP 8.6 message | Fix in the plugin's code |
|---|---|
Returning a value from a constructor is deprecated | Use a bare return; in __construct(). new always returns the object. |
Declaring class constant called 'namespace' is deprecated | Rename the constant (NAMESPACE counts: PHP compares keywords case-insensitively). |
Using "is" as a class name is deprecated since 8.6 | Update bundled guzzlehttp/promises to 2.6.0 or 3.1.0. |
Calling is_a() with a string when $allow_string is false | $value instanceof ClassName, or pass true as the third argument |
Function spl_object_hash() is deprecated since 8.6 | spl_object_id() |
Function is_integer() is deprecated since 8.6 (also is_long()) | is_int() |
Function is_double() is deprecated since 8.6 | is_float() |
mb_ereg_replace(), mb_regex_encoding()… (mbregex) | preg_* with the /u flag |
Function strcoll() is deprecated since 8.6 | Collator::compare() |
Smaller plugins: details
Redux Framework 4.5.16 (900,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
redux-core/inc/extensions/repeater/repeater/class-redux-repeater.php:238 | calls is_integer() / is_long()if ( isset( $this->field['limit'] ) && is_integer( $this->field['limit'] ) ) { | When this code runs | not on the pages we opened |
redux-core/inc/extensions/repeater/repeater/class-redux-repeater.php:405 | calls is_integer() / is_long()if ( isset( $field['limit'] ) && is_integer( $field['limit'] ) ) { | When this code runs | not on the pages we opened |
- calls
is_integer()/is_long(): Useis_int().
W3 Total Cache 2.11.0 (900,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
w3-total-cache-api.php:608 | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
Cache_Memcache.php:71 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Memcache.php:80 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Memcached.php:63 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Memcached.php:65 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Memcached.php:69 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Nginx_Memcached.php:54 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Nginx_Memcached.php:56 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
Cache_Nginx_Memcached.php:60 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/Db/mssql.php:567 (bundled library) | returns a value from a destructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/lib/requestcore/requestcore.class.php:225 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/lib/requestcore/requestcore.class.php:245 (bundled library) | returns a value from a destructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/lib/requestcore/requestcore.class.php:1005 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/sdk.class.php:386 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/sdk.class.php:393 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/services/sns.class.php:141 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/services/sns.class.php:144 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/utilities/request.class.php:62 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/SNS/utilities/utilities.class.php:61 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php:24 (bundled library) | calls spl_object_hash()self::$resources[spl_object_hash($this)] = 1; | When this code runs | not on the pages we opened |
vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php:40 (bundled library) | calls spl_object_hash()unset(self::$resources[spl_object_hash($this)]); | When this code runs | not on the pages we opened |
vendor/aws/aws-sdk-php/src/HandlerList.php:373 (bundled library) | calls spl_object_hash()return 'callable(' . spl_object_hash($fn) . ')'; | When this code runs | not on the pages we opened |
vendor/aws/aws-sdk-php/src/TraceMiddleware.php:160 (bundled library) | calls spl_object_hash()'instance' => spl_object_hash($cmd), | When this code runs | not on the pages we opened |
vendor/aws/aws-sdk-php/src/TraceMiddleware.php:171 (bundled library) | calls spl_object_hash()'instance' => spl_object_hash($request), | When this code runs | not on the pages we opened |
vendor/aws/aws-sdk-php/src/TraceMiddleware.php:185 (bundled library) | calls spl_object_hash()'instance' => spl_object_hash($response), | When this code runs | not on the pages we opened |
vendor/aws/aws-sdk-php/src/TraceMiddleware.php:196 (bundled library) | calls spl_object_hash()'instance' => spl_object_hash($value), | When this code runs | not on the pages we opened |
vendor/aws/aws-sdk-php/src/TraceMiddleware.php:208 (bundled library) | calls spl_object_hash()'instance' => spl_object_hash($e), | When this code runs | not on the pages we opened |
vendor/guzzlehttp/promises/src/Is.php:7 (bundled library) | bundled Guzzle Promises Is class | Compile time: logged when PHP loads the file | not on the pages we opened |
vendor/microsoft/azure-storage-common/src/Common/Internal/Utilities.php:879 (bundled library) | calls is_double()return is_numeric($value) && is_double($value + 0); | When this code runs | not on the pages we opened |
vendor/sebastian/recursion-context/src/Context.php:129 (bundled library) | calls spl_object_hash()return @spl_object_hash($object); | When this code runs | not on the pages we opened |
vendor/sebastian/recursion-context/src/Context.php:152 (bundled library) | calls spl_object_hash()return @spl_object_hash($value); | When this code runs | not on the pages we opened |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used. - returns a value from a destructor: Change
return …;inside__destruct()to a barereturn;. - calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it. - bundled Guzzle Promises
Isclass: This is the bundled Guzzle Promises library'sIsclass. Update the bundledguzzlehttp/promisesto 2.6.0 or 3.1.0 (released 18 October 2026), which use the newStateclass internally. - calls
is_double(): Useis_float().
WPvivid 0.9.136 (900,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
includes/zip/class-wpvivid-pclzip.php:299 | calls is_integer() / is_long()if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { | When this code runs | not on the pages we opened |
includes/zip/class-wpvivid-pclzip.php:482 | calls is_integer() / is_long()if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { | When this code runs | not on the pages we opened |
includes/zip/class-wpvivid-pclzip.php:735 | calls is_integer() / is_long()if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { | When this code runs | not on the pages we opened |
includes/zip/class-wpvivid-pclzip.php:896 | calls is_integer() / is_long()if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { | When this code runs | not on the pages we opened |
includes/zip/class-wpvivid-pclzip.php:1482 | calls is_integer() / is_long()if ((!is_integer($v_value)) || ($v_value<0)) { | When this code runs | not on the pages we opened |
includes/zip/class-wpvivid-pclzip.php:1649 | calls is_integer() / is_long()else if (is_integer($p_options_list[$i+1])) { | When this code runs | not on the pages we opened |
includes/zip/class-wpvivid-pclzip.php:1947 | calls is_integer() / is_long()if (!is_integer($v_value)) { | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php:67 (bundled library) | calls spl_object_hash()->exceptionForRequest[spl_object_hash($request)] = $exception; | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php:81 (bundled library) | calls spl_object_hash()$oid = spl_object_hash($request); | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php:196 (bundled library) | calls is_integer() / is_long()if ($this->castIntegerToStringType && $param->getType() == 'string' && is_integer($value)) { | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php:274 (bundled library) | calls is_integer() / is_long()} elseif ($t == 'integer' && is_integer($value)) { | When this code runs | not on the pages we opened |
vendor/guzzlehttp/guzzle/src/HandlerStack.php:271 (bundled library) | calls spl_object_hash()return 'callable(' . spl_object_hash($fn) . ')'; | When this code runs | not on the pages we opened |
vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:5554 (bundled library) | calls spl_object_hash()return '{' . spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
- calls
is_integer()/is_long(): Useis_int(). - calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it.
Fluent Forms 6.2.16 (800,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
vendor/wpfluent/framework/src/WPFluent/Database/Orm/Concerns/HasGlobalScopes.php:26 (bundled library) | calls spl_object_hash()return static::$globalScopes[static::class][spl_object_hash($scope)] = $scope; | When this code runs | not on the pages we opened |
vendor/wpfluent/framework/src/WPFluent/Database/Query/WPDBConnection.php:496 (bundled library) | calls is_double()} elseif (is_double($binding)) { | When this code runs | not on the pages we opened |
vendor/wpfluent/framework/src/WPFluent/Support/Once.php:45 (bundled library) | calls spl_object_hash()return is_object($argument) ? spl_object_hash($argument) : $argument; | When this code runs | not on the pages we opened |
- calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it. - calls
is_double(): Useis_float().
Google for WooCommerce 3.10.0 (800,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
vendor/google/gax/src/Testing/MessageAwareExporter.php:42 (bundled library) | calls spl_object_hash()\spl_object_hash($value) | When this code runs | not on the pages we opened |
vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php:122 (bundled library) | calls is_integer() / is_long()is_integer($var) || | When this code runs | not on the pages we opened |
vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php:853 (bundled library) | calls is_integer() / is_long()if (is_integer($value)) { | When this code runs | not on the pages we opened |
vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php:1183 (bundled library) | calls is_double()} elseif (is_double($array) || is_integer($array)) { | When this code runs | not on the pages we opened |
vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php:1183 (bundled library) | calls is_integer() / is_long()} elseif (is_double($array) || is_integer($array)) { | When this code runs | not on the pages we opened |
vendor/guzzlehttp/promises/src/Is.php:7 (bundled library) | bundled Guzzle Promises Is class | Compile time: logged when PHP loads the file | not on the pages we opened |
vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:5554 (bundled library) | calls spl_object_hash()return '{' . spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
vendor/symfony/validator/Context/ExecutionContext.php:362 (bundled library) | calls spl_object_hash()$this->cachedObjectsRefs[$object] = spl_object_hash($object); | When this code runs | not on the pages we opened |
vendor/symfony/validator/Validator/RecursiveContextualValidator.php:773 (bundled library) | calls spl_object_hash()$cacheKey = spl_object_hash($object); | When this code runs | not on the pages we opened |
- calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it. - calls
is_integer()/is_long(): Useis_int(). - calls
is_double(): Useis_float(). - bundled Guzzle Promises
Isclass: This is the bundled Guzzle Promises library'sIsclass. Update the bundledguzzlehttp/promisesto 2.6.0 or 3.1.0 (released 18 October 2026), which use the newStateclass internally.
WooCommerce PayPal Payments 4.2.0 (800,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
modules/ppcp-settings/src/Endpoint/RestEndpoint.php:21 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | not on the pages we opened |
modules/ppcp-store-sync/src/Endpoint/AgenticRestEndpoint.php:39 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | not on the pages we opened |
modules/ppcp-wc-gateway/src/Endpoint/ShippingCallbackEndpoint.php:19 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | not on the pages we opened |
modules/ppcp-webhooks/src/IncomingWebhookEndpoint.php:27 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | not on the pages we opened |
- class constant named NAMESPACE: Rename the class constant (for example
NAMESPACEtoREST_NAMESPACE) and update the places that read it. PHP treats the name case-insensitively, soNAMESPACEcounts.
Kadence Security 10.0.6 (700,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
core/modules/two-factor/providers/class.two-factor-backup-codes.php:53 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
core/modules/two-factor/providers/class.two-factor-email.php:39 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used.
Joinchat 6.4.2 (700,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
includes/class-joinchat-abilities.php:25 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | on every front-end page load |
- class constant named NAMESPACE: Rename the class constant (for example
NAMESPACEtoREST_NAMESPACE) and update the places that read it. PHP treats the name case-insensitively, soNAMESPACEcounts.
GTM4WP 2.0.6 (700,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
src/Modules/WooCommerce/StoreApiData.php:35 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | not on the pages we opened |
- class constant named NAMESPACE: Rename the class constant (for example
NAMESPACEtoREST_NAMESPACE) and update the places that read it. PHP treats the name case-insensitively, soNAMESPACEcounts.
FluentSMTP 2.4.1 (700,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
app/Services/Html2Text.php:241 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
includes/libs/google-api-client/build/vendor/guzzlehttp/guzzle/src/HandlerStack.php:236 (bundled library) | calls spl_object_hash()return 'callable(' . \spl_object_hash($fn) . ')'; | When this code runs | not on the pages we opened |
includes/libs/google-api-client/build/vendor/guzzlehttp/promises/src/Is.php:6 (bundled library) | bundled Guzzle Promises Is class | Compile time: logged when PHP loads the file | not on the pages we opened |
includes/libs/google-api-client/build/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:4670 (bundled library) | calls spl_object_hash()return '{' . \spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used. - calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it. - bundled Guzzle Promises
Isclass: This is the bundled Guzzle Promises library'sIsclass. Update the bundledguzzlehttp/promisesto 2.6.0 or 3.1.0 (released 18 October 2026), which use the newStateclass internally.
MainWP Child 6.3 (700,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
class/class-mainwp-helper.php:905 | calls mbregex functions (mb_ereg_*)$filename = mb_ereg_replace( '([^\w\s\d\-_~,;:\[\]\(\).])', '', $filename ); | When this code runs | not on the pages we opened |
class/class-mainwp-helper.php:907 | calls mbregex functions (mb_ereg_*)$filename = mb_ereg_replace( '([\.]{2,})', '', $filename ); | When this code runs | not on the pages we opened |
libs/phpseclib/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:5554 (bundled library) | calls spl_object_hash()return '{' . spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
- calls mbregex functions (
mb_ereg_*): Usepreg_replace()/preg_split()with the/uflag; mbregex is deprecated. - calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it.
Backuply 1.6.0 (600,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
backuplytar.php:66 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
backuplytar.php:83 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
restore_ins.php:295 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
restore_ins.php:312 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
lib/ftp.php:262 (bundled library) | calls is_integer() / is_long()if(!is_long($port)) { | When this code runs | not on the pages we opened |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used. - calls
is_integer()/is_long(): Useis_int().
Website Builder by SeedProd 6.20.10 (600,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
app/render-csp-mm.php:34 | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
app/render-csp-mm.php:45 | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used.
Enable Media Replace 4.2.3 (600,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
build/shortpixel/filesystem/src/Model/File/FileModel.php:62 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
build/shortpixel/replacer2/src/Modules/SmartSlider.php:34 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used.
Forminator Forms 1.58.3 (600,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
addons/pro/googlesheet/lib/external/vendor-prefixed/guzzlehttp/guzzle/src/HandlerStack.php:236 (bundled library) | calls spl_object_hash()return 'callable(' . \spl_object_hash($fn) . ')'; | When this code runs | not on the pages we opened |
addons/pro/googlesheet/lib/external/vendor-prefixed/guzzlehttp/promises/src/Is.php:6 (bundled library) | bundled Guzzle Promises Is class | Compile time: logged when PHP loads the file | not on the pages we opened |
addons/pro/googlesheet/lib/external/vendor-prefixed/phpseclib/phpseclib/phpseclib/Net/SSH2.php:4558 (bundled library) | calls spl_object_hash()return '{' . \spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
library/lib/hub-connector/lib/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:4746 (bundled library) | calls spl_object_hash()return '{' . spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
- calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it. - bundled Guzzle Promises
Isclass: This is the bundled Guzzle Promises library'sIsclass. Update the bundledguzzlehttp/promisesto 2.6.0 or 3.1.0 (released 18 October 2026), which use the newStateclass internally.
Post Types Order 2.5.9 (600,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
compatibility/LiteSpeed_Cache.php:20 | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
compatibility/formidable.php:21 | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
- returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used.
The Events Calendar 6.18.2 (600,000+ installs)
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
common/src/Common/REST/Controller.php:32 | class constant named NAMESPACE | Compile time: logged when PHP loads the file | on every front-end page load |
common/vendor/phpqrcode/qrencode.php:82 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
common/vendor/phpqrcode/qrinput.php:50 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
common/vendor/phpqrcode/qrinput.php:288 (bundled library) | returns a value from a constructor | Compile time: logged when PHP loads the file | on every front-end page load |
src/Tribe/Venue.php:928 | calls is_integer() / is_long()if ( is_integer( $event ) ) { | When this code runs | not on the pages we opened |
src/Tribe/Views/V2/Views/Traits/HTML_Cache.php:204 | calls spl_object_hash()$key = spl_object_hash( $context ) . '_cache_html_key'; | When this code runs | not on the pages we opened |
common/vendor/vendor-prefixed/lucatume/di52/src/Container.php:685 (bundled library) | calls spl_object_hash()$callbackIdPrefix = is_object($id) ? spl_object_hash($id) : $id; | When this code runs | not on the pages we opened |
- class constant named NAMESPACE: Rename the class constant (for example
NAMESPACEtoREST_NAMESPACE) and update the places that read it. PHP treats the name case-insensitively, soNAMESPACEcounts. - returns a value from a constructor: Change
return …;inside__construct()to a barereturn;.newalways returns the object, so the value was never used. - calls
is_integer()/is_long(): Useis_int(). - calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it.
No PHP 8.6 findings (61 plugins)
Contact Form 7, Classic Editor, Akismet Anti-spam, All-in-One WP Migration and Backup, WPForms, Duplicate Page, Yoast Duplicate Post, Hostinger Tools, WPCode, Jetpack, Advanced Custom Fields, Classic Widgets, Ultimate Addons for Elementor, Redirection, WordPress Importer, WPS Hide Login, All-In-One Security, Starter Templates, Better Search Replace, Code Snippets, CookieYes, Custom Post Type UI, Disable Comments, Essential Addons for Elementor, XML Sitemap Generator for Google, Hostinger Reach, Image Optimizer, Loco Translate, Loginizer, MC4WP, Maintenance, One Click Demo Import, Popup Builder & Popup Maker for WordPress, Regenerate Thumbnails, AI Agent by SiteGround, Security Optimizer, SVG Support, Advanced Editor Tools, Spectra Legacy, WP Fastest Cache, File Manager, WP Multibyte Patch, WP-Optimize, Widgets for Google Reviews, WP Super Cache, Translate WordPress with GTranslate, Imagify Image Optimization, Polylang, Autoptimize, Breadcrumb NavXT, Cookie Compliance for WordPress, Flamingo, Smart Slider 3, WooPayments, Antispam Bee, User Role Editor, WooCommerce Stripe Payment Gateway, Click to Chat, Popup Maker, Premium Addons for Elementor, TablePress.
The full data (every finding with file, line and when it fires, as CSV and JSON) is on GitHub: php86-wordpress-plugin-deprecations (CC BY 4.0).
Check your own site
Free plugin: PHP Upgrade Readiness (zip, 21 KB). Install it on
the site you want to check (Plugins → Add New → Upload Plugin), then open Tools → PHP Upgrade Readiness. It runs on your current
PHP (7.4 or newer) and lists every plugin and theme with code that PHP 8.1 to 8.6 deprecate: file, line, the message PHP
prints and the fix, plus a Site Health check and a CSV export. It reads files only and sends nothing anywhere. On these 100
plugins it reported every one of the 1,171 places the real PHP 8.6 flagged, and nothing else. Some notices only appear while
code runs (for example is_a() called with a string), so also test on a staging copy:
Still on PHP 7.4, 8.0 or 8.1? The two critical flaws fixed on 21 October 2026 (CVE-2026-109618 and CVE-2026-109619) got new releases only for PHP 8.2 and newer; for older versions the PHP project points to your vendor or an upgrade (php.net advisory). Go to a patched 8.3 or 8.4 (8.2.35 is patched too, but PHP 8.2 ends on 31 December 2026). The plugin also checks the PHP 8.1, 8.2 and 8.3 deprecations you cross on the way.
- When your host offers PHP 8.6, switch a staging copy first, with
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );in wp-config.php. - Click through the front end and wp-admin, then list the PHP 8.6 notices:
grep "PHP Deprecated" wp-content/debug.log | grep -E "since 8\.6|from a constructor|called 'namespace'" | sort | uniq -c - Each line names the plugin folder. Look it up in the table above; if the plugin is not listed, send its author the line.
- On the live site keep
display_errorsoff; deprecations are warnings, not a reason to stay on old PHP.
How we tested (and what we didn't)
- The official PHP 8.6.0RC4 Windows build from php.net (checksum matched the page) and the current release of each plugin from WordPress.org on 28 October 2026.
php -lon every PHP file finds compile-time deprecations wherever the file is. PHP 8.6's own tokenizer finds calls to deprecated functions; those only fire when that code runs (for example only during a backup, or only with one setting on).- WordPress 7.1.1 with each plugin active alone and default settings: home page, a post, the wp-admin dashboard and plugins page as admin. Premium features, setup wizards, cron jobs and other admin screens were not exercised.
- RC4 is a release candidate; the final 8.6.0 on 19 November can still change. Deprecations from PHP 8.4 and 8.5 (already released) are not counted here.
- WordPress 7.1.1 core itself logged no PHP 8.6 deprecation on these pages.
Sources
- PHP 8.6 release schedule (GA 19 November 2026)
- php-src PHP-8.6 UPGRADING, section 4: Deprecated functionality
- RFC: Deprecations for PHP 8.6
- RFC: Deprecate returning a value from __construct()
- php.net pre-release builds (8.6.0RC4 used for this test)
- guzzlehttp/promises 2.6.0 / 3.1.0 changelog: Is deprecated, State added (18 October 2026)
- WordPress.org: popular plugins