{"id":347931,"date":"2026-08-11T02:43:18","date_gmt":"2026-08-11T02:43:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/robart-update-guard\/"},"modified":"2026-10-26T04:56:53","modified_gmt":"2026-10-26T04:56:53","slug":"robart-update-guard","status":"publish","type":"plugin","link":"https:\/\/lv.wordpress.org\/plugins\/robart-update-guard\/","author":14135334,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.2","stable_tag":"0.3.2","tested":"7.1.3","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"RobArt Update Guard","header_author":"robword","header_description":"See which plugins still call a retired WordPress function, class, core file, hook or jQuery method \u2014 with the file, line and fix. No AI, no network.","assets_banners_color":"f7edd6","last_updated":"2026-10-26 04:56:53","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/robsnowcreative","header_plugin_uri":"https:\/\/robart-illustration.eu\/plugins-wordpress-development\/robart-update-guard\/","header_author_uri":"https:\/\/robart-illustration.eu","rating":0,"author_block_rating":0,"active_installs":0,"downloads":438,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.0.2":{"tag":"0.0.2","author":"RobWord","date":"2026-08-11 02:43:04","revision":3641283},"0.1.0":{"tag":"0.1.0","author":"RobWord","date":"2026-08-13 13:39:07","revision":3645486},"0.2.0":{"tag":"0.2.0","author":"RobWord","date":"2026-08-31 04:38:35","revision":3673367},"0.3.0":{"tag":"0.3.0","author":"RobWord","date":"2026-09-04 08:32:52","revision":3680895},"0.3.1":{"tag":"0.3.1","author":"RobWord","date":"2026-10-26 04:56:53","revision":3765559},"0.3.2":{"tag":"0.3.2","author":"RobWord","date":"2026-10-26 04:56:53","revision":3765559}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3641283,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3641283,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3765559,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3765559,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.0.2","0.1.0","0.2.0","0.3.0","0.3.1","0.3.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3765559,"resolution":"1","location":"assets","locale":"","width":3936,"height":2992},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3765559,"resolution":"2","location":"assets","locale":"","width":3936,"height":3992},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3765559,"resolution":"3","location":"assets","locale":"","width":3936,"height":16384},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3765559,"resolution":"4","location":"assets","locale":"","width":3936,"height":16384}},"screenshots":{"1":"The Dashboard \u2014 an at-a-glance summary of your last scan, with a heads-up when WordPress has an update waiting or has moved on since you last scanned.","2":"The Report \u2014 WordPress and PHP findings with file, line, severity, ownership and suggested replacement where available.","3":"Appearance exposure \u2014 where your plugins lean on WordPress's own admin styling.","4":"The Lexicon \u2014 a searchable reference of known WordPress deprecations and PHP 8.0\u20138.4 removals and deprecations."}},"plugin_section":[262246],"plugin_tags":[2679,288563,732,258141,242693],"plugin_category":[52],"plugin_contributors":[267814],"plugin_business_model":[],"class_list":["post-347931","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-debugging","plugin_tags-deprecated-code","plugin_tags-maintenance","plugin_tags-php-compatibility","plugin_tags-plugin-scanner","plugin_category-performance","plugin_contributors-robword","plugin_committers-robword"],"banners":{"banner":"https:\/\/ps.w.org\/robart-update-guard\/assets\/banner-772x250.png?rev=3765559","banner_2x":"https:\/\/ps.w.org\/robart-update-guard\/assets\/banner-1544x500.png?rev=3765559","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/robart-update-guard\/assets\/icon-128x128.png?rev=3641283","icon_2x":"https:\/\/ps.w.org\/robart-update-guard\/assets\/icon-256x256.png?rev=3641283","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/robart-update-guard\/assets\/screenshot-1.png?rev=3765559","caption":"The Dashboard \u2014 an at-a-glance summary of your last scan, with a heads-up when WordPress has an update waiting or has moved on since you last scanned."},{"src":"https:\/\/ps.w.org\/robart-update-guard\/assets\/screenshot-2.png?rev=3765559","caption":"The Report \u2014 WordPress and PHP findings with file, line, severity, ownership and suggested replacement where available."},{"src":"https:\/\/ps.w.org\/robart-update-guard\/assets\/screenshot-3.png?rev=3765559","caption":"Appearance exposure \u2014 where your plugins lean on WordPress's own admin styling."},{"src":"https:\/\/ps.w.org\/robart-update-guard\/assets\/screenshot-4.png?rev=3765559","caption":"The Lexicon \u2014 a searchable reference of known WordPress deprecations and PHP 8.0\u20138.4 removals and deprecations."}],"raw_content":"<!--section=description-->\n<p><strong>An update can break a site long after the problem first appeared. Find the warning signs before they become failures.<\/strong><\/p>\n\n<p>Your plugins may still rely on functions, classes, hooks or core files that WordPress has retired. A newer PHP version can also remove functions or reject coding patterns that used to work. These problems are easy to overlook until a WordPress or hosting update exposes them.<\/p>\n\n<p><strong>RobArt Update Guard scans your installed plugins for known WordPress deprecations and PHP 8.0\u20138.4 compatibility issues.<\/strong> It shows where a problem occurs, why it matters and, when known, what to use instead. No external service, no AI, no changes to your code.<\/p>\n\n<h4>Why use Update Guard?<\/h4>\n\n<ul>\n<li><strong>Find outdated code before your next update.<\/strong> Identify known retired WordPress APIs and PHP changes affecting installed plugins.<\/li>\n<li><strong>Know exactly where to look.<\/strong> Results include plugin, file path, line number and suggested replacement where available.<\/li>\n<li><strong>Prioritise the real risks.<\/strong> High, Medium and Low severity ratings explain the likely impact of each finding.<\/li>\n<li><strong>Separate your code from someone else's.<\/strong> Mark which plugins you maintain to see 'You fix it' and 'Theirs to fix' badges, with your own plugins listed first.<\/li>\n<li><strong>Tell plugin authors quickly.<\/strong> Copy a ready-made finding report for a third-party plugin and open its support forum.<\/li>\n<li><strong>Keep your code private.<\/strong> Scans run on your server, on demand, without sending code anywhere.<\/li>\n<\/ul>\n\n<h4>Three tools in one<\/h4>\n\n<p><strong>1. Deprecation and compatibility report<\/strong><\/p>\n\n<p>Scan installed plugins for known deprecated WordPress functions, classes, core files and hooks, alongside PHP functions, constants, directives and selected coding patterns affected by PHP 8.0\u20138.4. Results are organised into separate WordPress and PHP tabs, showing file and line information, severity, ownership and suggested next steps. Switch off PHP checks when you want a quicker WordPress-only scan.<\/p>\n\n<p><strong>2. Appearance exposure checks<\/strong><\/p>\n\n<p>See where plugins depend on WordPress admin styling. This is a heads-up for areas worth checking visually after a core design change, not a claim that those screens are broken.<\/p>\n\n<p><strong>3. Searchable deprecation lexicon<\/strong><\/p>\n\n<p>Explore APIs deprecated by your installed WordPress version and PHP changes grouped by release. Use the reference to understand an issue or research an alternative without leaving your dashboard.<\/p>\n\n<h4>Designed for developers and site maintainers<\/h4>\n\n<p>Whether you develop your own plugins, manage client sites or maintain an established WordPress installation, Update Guard helps turn a vague compatibility concern into a specific, reviewable finding. The scan is read-only, so you remain in control of any fixes.<\/p>\n\n<h4>How the scanning works<\/h4>\n\n<p>For WordPress, Update Guard reads deprecation markers from the WordPress core files installed on your own site and checks installed plugin PHP files for matching usage. That means its WordPress reference follows the core version you actually run.<\/p>\n\n<p>For PHP, it uses a bundled compatibility reference covering PHP 8.0 through 8.4, based on official migration guides. A bundled PHP parser (nikic\/php-parser, BSD-3-Clause) also identifies certain patterns that a plain text search would miss, while avoiding matches that appear only in comments or strings.<\/p>\n\n<p>No external lookups are needed. Scans run only when requested, with results cached for a day.<\/p>\n\n<h4>What it checks<\/h4>\n\n<ul>\n<li>WordPress deprecated functions and classes.<\/li>\n<li>Deprecated WordPress actions and filters.<\/li>\n<li>Retired WordPress core files referenced by plugins.<\/li>\n<li>PHP functions, constants and php.ini directives removed or deprecated across PHP 8.0\u20138.4.<\/li>\n<li>Selected PHP usage patterns, including reversed <code>implode()<\/code> arguments, no-argument <code>get_class()<\/code>, optional parameters before required parameters and implicitly nullable parameters.<\/li>\n<li>Plugin reliance on WordPress admin styling, reported separately as appearance exposure.<\/li>\n<\/ul>\n\n<p><strong>Scope note:<\/strong> The code report examines installed plugins and references deprecations found in WordPress core. It does not claim to perform a complete source scan of all theme files or all WordPress core code for defects.<\/p>\n\n<h4>Important limitations<\/h4>\n\n<p>Update Guard is a targeted static scanner, not a runtime debugger or a guarantee that an update will work. To avoid misleading results, it does not attempt to reliably identify deprecated class methods without runtime type information, or changes in behaviour where an API keeps the same name. jQuery matches are intentionally conservative. Minified or bundled code and third-party dependency folders such as <code>vendor\/<\/code> and <code>node_modules\/<\/code> are excluded.<\/p>\n\n<p>A clean report means the scanner found no <em>known issues within its supported checks<\/em>. It does not mean your plugins or site are guaranteed compatible with every future update.<\/p>\n\n<h4>Privacy and control<\/h4>\n\n<p><strong>Your code stays on your server.<\/strong> Scanning is local and read-only. Update Guard does not upload source files, use AI or automatically edit plugin code. The bundled PHP parser also runs locally. See the External services section for details of optional information and support links.<\/p>\n\n<h3>Uninstall<\/h3>\n\n<p>Update Guard cleans up after itself. When you delete the plugin from the Plugins screen, it removes everything it stored:<\/p>\n\n<ul>\n<li>Its options (install date, last-scan record, and onboarding state).<\/li>\n<li>Its cached scan reports (stored as transients).<\/li>\n<\/ul>\n\n<p>It creates no custom database tables, writes nothing outside your own site, and leaves no orphaned data behind. Deactivating the plugin keeps your settings and last report; only deleting the plugin runs the clean-up.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Update Guard performs all of its scanning locally on your own server. It makes no automatic network requests and sends no data anywhere.<\/p>\n\n<p>The plugin displays a few ordinary links to information pages for other Rob Art plugins, hosted at <code>robart-illustration.eu<\/code>. These are plain links you may choose to click; the plugin never contacts any external service on its own, and no data is transmitted unless you follow a link.<\/p>\n\n<p>Support and review links point to WordPress.org, which is governed by the WordPress.org privacy policy.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/robart-update-guard<\/code>, or install it from the Plugins screen in your WordPress admin.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Open the <strong>Update Guard<\/strong> menu in the admin sidebar and click <strong>Run a scan<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20a%20clean%20report%20mean%20it%20is%20safe%20to%20update%3F\"><h3>Does a clean report mean it is safe to update?<\/h3><\/dt>\n<dd><p>It means the scanner did not find any known retirements or removals within the checks it supports. It cannot promise an update is safe, because a function can change what it does while keeping its name \u2014 the commonest cause of breakage, and something no code reader can detect. Treat a clean report as \"no known retirements or removals,\" not \"guaranteed safe.\"<\/p><\/dd>\n<dt id=\"why%20didn%27t%20it%20flag%20a%20method%20i%20know%20is%20deprecated%3F\"><h3>Why didn't it flag a method I know is deprecated?<\/h3><\/dt>\n<dd><p>Class methods are excluded on purpose. Many share everyday names, and distinguishing a retired one from an unrelated method needs runtime type information a static scan doesn't have. Flagging them would produce more noise than signal.<\/p><\/dd>\n<dt id=\"what%20php%20versions%20does%20it%20check%3F\"><h3>What PHP versions does it check?<\/h3><\/dt>\n<dd><p>PHP 8.0 through 8.4. The report shows the highest version reached. The list is verified against the official PHP migration guides and travels with the plugin, so it works with no network access.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20the%20php%20checks%20off%3F\"><h3>Can I turn the PHP checks off?<\/h3><\/dt>\n<dd><p>Yes. The \"Include PHP compatibility checks\" tick-box sits next to the scan button. It's on by default; unticking it runs a faster WordPress-only scan and the choice is remembered.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>Nothing runs on the front end. Scans start only when you click the button, and results are cached for a day. Scanning can temporarily use server resources while it runs. The PHP checks parse every plugin file, so they add a few seconds to a scan \u2014 untick them for a quicker WordPress-only pass.<\/p><\/dd>\n<dt id=\"does%20it%20change%20any%20of%20my%20files%3F\"><h3>Does it change any of my files?<\/h3><\/dt>\n<dd><p>No. Update Guard only reads. It never edits a plugin \u2014 it points you to the file and line so you can decide.<\/p><\/dd>\n<dt id=\"does%20it%20send%20my%20code%20anywhere%20or%20use%20ai%3F\"><h3>Does it send my code anywhere or use AI?<\/h3><\/dt>\n<dd><p>No. It reads only the WordPress and plugin files already on your server. Nothing is sent to any external service and no AI is involved.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>New: after 14 days of use, a small notice asks administrators whether they would leave a review on WordPress.org. \"Remind me in 2 weeks\" asks again later; \"Already did\" hides it for good. Its settings are removed when you delete the plugin.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Hardened the built-in documentation renderer: all text is HTML-escaped before formatting and links are passed through esc_url(), so the bundled help docs cannot introduce unsafe markup. Defensive hardening \u2014 the renderer only ever processes the plugin's own documentation.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>New: \"Report to developer\" \u2014 on each third-party plugin in the report, a button reveals a ready-to-paste plain-text summary of its findings, with a \"Copy report\" button and an \"Open support forum\" button that opens that plugin's WordPress.org support forum in a new tab. A quick, courteous way to let an author know about a deprecation in their plugin.<\/li>\n<li>Fixed: the \"Choose which plugins are yours\" link could stop working after running a scan (the scan re-rendered the report and the button lost its handler). It now works reliably before and after any scan.<\/li>\n<li>Fixed: the \"Third-party plugin\" badge on the blue plugin header was hard to read (low contrast). It now shows as a legible white pill.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Every finding now carries a Severity badge \u2014 High, Medium or Low \u2014 coloured like a traffic light. It reflects real risk, not just age: a retired core file or class that fatals is High, a silently-failing hook or recently-deprecated function is Medium, and anything a shim keeps working (jQuery Migrate, the aliased Requests class) is Low. Each finding also gives a one-line reason for its band.<\/li>\n<li>Every finding now carries an Actionability badge \u2014 \"You fix it\" for your own plugins, \"Theirs to fix\" for third-party ones. No more mistaking a wall of Elementor or WooCommerce deprecations for your own problem.<\/li>\n<li>New roll-up headline on each tab summarising the findings at a glance \u2014 how many High\/Medium\/Low, and how many are in your code versus third-party plugins \u2014 so a report reassures before you read a single row.<\/li>\n<li>New \"Which plugins are yours?\" chooser: tick exactly which installed plugins you build and maintain, so the Actionability column is right for your site instead of guessing from author and name.<\/li>\n<li>Your own plugins are now listed first, so the findings you can act on are never buried under third-party ones.<\/li>\n<li>New on-screen legend explaining what every badge means, and a note on the safest step to take if a third-party deprecation is actually affecting your site (disable the plugin until its author fixes it \u2014 never edit their code).<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>PHP compatibility scanning is here. A single scan now checks your plugins for both retired WordPress APIs and code that a newer PHP version removes or deprecates \u2014 functions, constants, php.ini directives, and risky patterns like reversed implode() arguments or implicitly-nullable parameters.<\/li>\n<li>The Report is now tabbed: WordPress and PHP compatibility, each with its own count, file, line and fix. A clean report confirms both were checked.<\/li>\n<li>The Lexicon gains \"Removed in PHP\" and \"Deprecated in PHP\" sections, grouped by the PHP version that changed each one.<\/li>\n<li>New \"Include PHP compatibility checks\" toggle on the Report screen \u2014 on by default; turn it off for a faster WordPress-only scan.<\/li>\n<li>The Dashboard and its at-a-glance widget now show your PHP version alongside WordPress, and how far forward the PHP checks reach.<\/li>\n<li>Still entirely local: PHP breakage data ships with the plugin, nothing is fetched, and no AI is involved.<\/li>\n<\/ul>\n\n<h4>0.0.3<\/h4>\n\n<ul>\n<li>Groundwork for PHP-version compatibility scanning: the report will soon flag plugin code that breaks on newer PHP, not only retired WordPress APIs. Internal foundation only in this release \u2014 no change to the current scan yet.<\/li>\n<\/ul>\n\n<h4>0.0.2<\/h4>\n\n<ul>\n<li>The \"more plugins from Rob Art\" links now point to each plugin's information page rather than a purchase page.<\/li>\n<\/ul>\n\n<h4>0.0.1<\/h4>\n\n<ul>\n<li>Initial release. Report (deprecated function, class, core-file and hook scan), Appearance exposure, and Lexicon reference. Reads the site's own WordPress install; no network, no AI.<\/li>\n<\/ul>","raw_excerpt":"Find deprecated WordPress APIs and PHP compatibility risks in your plugins. Get the file, line, severity and suggested fix. Private, local scanning.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347931"}],"author":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/robword"}],"wp:attachment":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347931"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347931"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347931"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347931"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347931"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}