{"id":391146,"date":"2026-10-31T08:24:32","date_gmt":"2026-10-31T08:24:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/php-ready-php-compatibility-upgrade-check\/"},"modified":"2026-10-31T13:19:38","modified_gmt":"2026-10-31T13:19:38","slug":"upgravo","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/upgravo\/","author":23590854,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.7","stable_tag":"0.1.7","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Upgravo \u2013 PHP Compatibility Check","header_author":"Nicol\u00e1s Alejandro Salinas","header_description":"Scans your plugins and theme on your own server and tells you what will break before you upgrade PHP. No external service, no exec().","assets_banners_color":"787882","last_updated":"2026-10-31 13:19:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/nicolassalinas\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":49,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.6":{"tag":"0.1.6","author":"nicolassalinas","date":"2026-10-31 08:24:23","revision":3776478},"0.1.7":{"tag":"0.1.7","author":"nicolassalinas","date":"2026-10-31 13:19:38","revision":3776883}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3776478,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3776478,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3776478,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3776478,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3776900,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=phpready\",\"preferredVersions\":{\"php\":\"8.1\",\"wp\":\"latest\"},\"login\":true,\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"upgravo\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"all-in-one-wp-migration\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require_once '\\\/wordpress\\\/wp-load.php'; update_user_meta( 1, 'phpready_review', 'done' );\"}]}"}},"all_blocks":[],"tagged_versions":["0.1.6","0.1.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3776478,"resolution":"1","location":"assets","locale":"","width":995,"height":605},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3776478,"resolution":"2","location":"assets","locale":"","width":975,"height":755},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3776478,"resolution":"3","location":"assets","locale":"","width":990,"height":230},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3776478,"resolution":"4","location":"assets","locale":"","width":815,"height":153}},"screenshots":{"1":"The verdict at the top, one row per plugin and theme with breaks, notices and hidden findings, update available, CSV export.","2":"Detail grouped by rule, with file and line, bundled-library count and the hidden findings with their reason.","3":"The scan runs in short batches with a progress bar, safe on shared hosting.","4":"The verdict also shows up in Tools \u2192 Site Health."}},"plugin_section":[],"plugin_tags":[265092,219646,258141,284277,151481],"plugin_category":[],"plugin_contributors":[289890],"plugin_business_model":[],"class_list":["post-391146","plugin","type-plugin","status-publish","hentry","plugin_tags-compatibility-checker","plugin_tags-php-8","plugin_tags-php-compatibility","plugin_tags-php-upgrade","plugin_tags-site-health","plugin_contributors-nicolassalinas","plugin_committers-nicolassalinas"],"banners":{"banner":"https:\/\/ps.w.org\/upgravo\/assets\/banner-772x250.png?rev=3776478","banner_2x":"https:\/\/ps.w.org\/upgravo\/assets\/banner-1544x500.png?rev=3776478","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/upgravo\/assets\/icon-128x128.png?rev=3776478","icon_2x":"https:\/\/ps.w.org\/upgravo\/assets\/icon-256x256.png?rev=3776478","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/upgravo\/assets\/screenshot-1.png?rev=3776478","caption":"The verdict at the top, one row per plugin and theme with breaks, notices and hidden findings, update available, CSV export."},{"src":"https:\/\/ps.w.org\/upgravo\/assets\/screenshot-2.png?rev=3776478","caption":"Detail grouped by rule, with file and line, bundled-library count and the hidden findings with their reason."},{"src":"https:\/\/ps.w.org\/upgravo\/assets\/screenshot-3.png?rev=3776478","caption":"The scan runs in short batches with a progress bar, safe on shared hosting."},{"src":"https:\/\/ps.w.org\/upgravo\/assets\/screenshot-4.png?rev=3776478","caption":"The verdict also shows up in Tools \u2192 Site Health."}],"raw_content":"<!--section=description-->\n<p>Your hosting company says PHP 7.4 (or 8.0, 8.1\u2026) is going away and you have to upgrade. Which of your plugins will break?<\/p>\n\n<p><strong>Upgravo<\/strong> reads the code of every plugin and your theme, on your own server, and gives you a straight answer:<\/p>\n\n<ul>\n<li><strong>Ready for PHP 8.4: nothing breaks<\/strong> \u2014 or <strong>Not yet: something active breaks<\/strong>, with the exact plugin, file and line.<\/li>\n<li><strong>Breaks<\/strong> vs <strong>deprecation notices<\/strong>: a removed function stops the site; a deprecation only writes a line in the error log. Upgravo keeps the two apart so you know what is urgent.<\/li>\n<li><strong>What to do first<\/strong>: if the plugin that breaks has an update available, it says so. If it is inactive, it says it does not matter until you activate it.<\/li>\n<li><strong>No noise<\/strong>: code that is already guarded by <code>function_exists()<\/code> or a PHP version check is not reported, and findings that only apply to the PHP version you already run are hidden by default (you can still see them, with the reason).<\/li>\n<\/ul>\n\n<h4>Designed for any hosting<\/h4>\n\n<ul>\n<li><strong>Runs on shared hosting.<\/strong> The scan runs in short batches with a progress bar, so it never hits the 30-60 second request limit of shared hosts. Close the tab and come back: it resumes where it stopped.<\/li>\n<li><strong>No <code>exec()<\/code>, no shell, no external server.<\/strong> Your code never leaves your site. Nothing to sign up for, no license key to see results.<\/li>\n<li><strong>Covers the whole site:<\/strong> must-use plugins, drop-ins (<code>advanced-cache.php<\/code>, <code>object-cache.php<\/code>, <code>db.php<\/code>\u2026), the parent theme, and every class of WordPress core itself, so a plugin that extends <code>WP_Widget<\/code> or <code>WC_Payment_Gateway<\/code> is checked properly instead of ignored.<\/li>\n<li><strong>Any upgrade path from PHP 7.4 to 8.1, 8.2, 8.3 or 8.4<\/strong>: removed functions and extensions (<code>mysql_*<\/code>, <code>mcrypt<\/code>, <code>each()<\/code>, <code>create_function()<\/code>\u2026), PHP 8.0 fatal errors, PHP 8.1\/8.2\/8.3\/8.4 deprecations including dynamic properties and <code>'self::method'<\/code> callables. Everything that already applies to the PHP version you run today is shown as hidden, with the reason.<\/li>\n<li><strong>Site Health integration<\/strong>: the verdict shows up in Tools \u2192 Site Health.<\/li>\n<li><strong>WP-CLI<\/strong>: <code>wp upgravo scan --target=8.4 --format=json<\/code> returns exit code 1 if anything active breaks, so agencies can check 50 sites from a script.<\/li>\n<li><strong>CSV export<\/strong> of every finding, including the hidden ones and why they were hidden.<\/li>\n<\/ul>\n\n<h4>Built on PHPCompatibility<\/h4>\n\n<p>The analysis engine is <a href=\"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility\">PHPCompatibility<\/a> (176 rules maintained by the PHP community since 2012) running on PHP_CodeSniffer, bundled inside the plugin, plus Upgravo's own detectors for PHP 8.2 dynamic properties and relative callables. It reads code; it does not run it. A static scan cannot see problems that only appear at runtime, so treat \"nothing breaks\" as \"nothing we can see breaks\", and keep a backup before any upgrade.<\/p>\n\n<h4>Third-party libraries included<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer\">PHP_CodeSniffer<\/a> \u2014 BSD-3-Clause<\/li>\n<li><a href=\"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility\">PHPCompatibility<\/a> \u2014 LGPL-3.0-or-later<\/li>\n<li><a href=\"https:\/\/github.com\/PHPCSStandards\/PHPCSUtils\">PHPCSUtils<\/a> \u2014 LGPL-3.0-or-later<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install from Plugins \u2192 Add New, or upload the <code>upgravo<\/code> folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it.<\/li>\n<li>Go to <strong>Upgravo<\/strong> in the admin menu, pick the PHP version you plan to upgrade to, and click <strong>Scan plugins and theme<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20send%20my%20code%20anywhere%3F\"><h3>Does it send my code anywhere?<\/h3><\/dt>\n<dd><p>No. Everything runs on your server, inside WordPress. The plugin makes no external requests.<\/p><\/dd>\n<dt id=\"does%20it%20need%20%60exec%28%29%60%20or%20shell%20access%3F\"><h3>Does it need `exec()` or shell access?<\/h3><\/dt>\n<dd><p>No. That is why it works on SiteGround, Kinsta, WP Engine and other hosts that disable <code>exec()<\/code>.<\/p><\/dd>\n<dt id=\"how%20long%20does%20a%20scan%20take%3F\"><h3>How long does a scan take?<\/h3><\/dt>\n<dd><p>About 15 ms per PHP file. A site with WooCommerce and a dozen plugins (5,000 files) takes one to two minutes. The scan runs in batches of a few seconds each, so it is safe on any host.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20%22breaks%22%20and%20%22notices%22%3F\"><h3>What is the difference between \"Breaks\" and \"Notices\"?<\/h3><\/dt>\n<dd><p>\"Breaks\" means a fatal error on the target PHP version: a function that no longer exists, an argument order that is no longer accepted. \"Notices\" means the code still works but PHP marks it as deprecated and logs a message; it will break in a future version.<\/p><\/dd>\n<dt id=\"why%20are%20some%20findings%20hidden%3F\"><h3>Why are some findings hidden?<\/h3><\/dt>\n<dd><p>Because they would mislead you. Hidden findings are code that only runs on old PHP versions (guarded by <code>function_exists()<\/code> or <code>version_compare()<\/code>), things that already apply to the PHP version you run today, analyzer housekeeping, and style advice. You can expand them and see the reason for each one.<\/p><\/dd>\n<dt id=\"does%20it%20check%20inactive%20plugins%3F\"><h3>Does it check inactive plugins?<\/h3><\/dt>\n<dd><p>By default only active plugins, the active theme (and its parent), mu-plugins and drop-ins. Tick \"Include inactive plugins\" to scan everything.<\/p><\/dd>\n<dt id=\"can%20i%20run%20it%20from%20the%20command%20line%3F\"><h3>Can I run it from the command line?<\/h3><\/dt>\n<dd><p>Yes: <code>wp upgravo scan --target=8.4 --inactive --format=table<\/code>. Exit code 1 means something active breaks.<\/p><\/dd>\n<dt id=\"is%20there%20a%20pro%20version%3F\"><h3>Is there a Pro version?<\/h3><\/dt>\n<dd><p>Yes. Upgravo Pro adds scheduled scans with an email when an update introduces an incompatibility, a PDF report for clients, a whitelist of false positives per plugin, and multisite support. Everything in the free plugin stays free. Details at <a href=\"https:\/\/phpready.com\/#pro\">phpready.com<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>After a finished scan, the Upgravo screen asks once for a review on WordPress.org (Maybe later hides it for 14 days; Don't ask again hides it for good).<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Bundled PHP_CodeSniffer reduced to the parts the scanner runs (unused coding-style standards removed).<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Renamed to Upgravo. Same scanner and settings; the WP-CLI command is now <code>wp upgravo scan<\/code>.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Bundled PHP_CodeSniffer updated to 4.0.4.<\/li>\n<li>Development files (tests, docs, build scripts) removed from the bundled libraries.<\/li>\n<li>Translation files are no longer bundled; translations are delivered by translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Files under a plugin's <code>lib\/<\/code> folder are no longer assumed to be third-party libraries (in many plugins that folder holds the author's own code). Only <code>vendor\/<\/code>, <code>node_modules\/<\/code> and similar folders count as bundled libraries.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>A file that does not compile on the current PHP version is no longer analyzed (the analyzer produced false findings on such files); it is listed as not checked with the line and the parser message.<\/li>\n<li>If the analyzer aborts on a file, that file is listed as not checked instead of counting as clean.<\/li>\n<li>Very large files: the scanner now asks the server for the extra memory the file needs; if the host allows it, the file is analyzed instead of skipped.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>The scan lock now carries a per-request token, so a long request (for example a cron run) can never release a lock held by another request.<\/li>\n<li>Fixed a spurious \"no scan in progress\" message when another tab or process finished the last batch.<\/li>\n<li>WP-CLI respects the scan lock and reports clearly if the scan was cancelled from the admin screen.<\/li>\n<li>Hooks for extensions (classification filter, result groups, network mode); a \"Pro version\" link.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"Check PHP compatibility before you upgrade: scans plugins and theme on your own server and tells you what will break on PHP 8.x. No external service.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/391146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=391146"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nicolassalinas"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=391146"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=391146"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=391146"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=391146"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=391146"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=391146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}