=== Leaplens - Upgrade Advisor for PHP ===
Contributors: maksymkotenko
Tags: php compatibility, php 8.5, php version, compatibility checker, php upgrade
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Before you switch PHP, scan every plugin and theme for PHP 8.5 problems and get one verdict each: update, replace, report or keep.

== Description ==

Your host wants you on PHP 8.4 or 8.5, and you want to know what breaks first. Leaplens reads the code of your plugins and themes, finds what a newer PHP removes or deprecates, and tells you what to do about each one.

**One verdict per plugin and theme**

* **Ready** - nothing changes for it on the PHP version you picked.
* **Notices** - it keeps working; it only logs deprecation notices that its author should fix before the next major PHP.
* **Update** - the version you have breaks, a newer one is available. With "Also check available updates" on, Leaplens downloads that update to a temporary folder, scans it and tells you whether updating fixes the problem. Nothing is installed.
* **Fix needed** - no update fixes it yet: report it to the author (the support forum link is right there), or, for premium and custom code, send the exact lines to the vendor or developer.
* **Replace** - it breaks, and it is closed on WordPress.org or has not been updated for two years.

**Only what is new for your site**

A problem that already applies to the PHP version the site runs today is not counted: the site already works with it, so that code is either guarded or never runs. You can still show those lines with one click. This keeps the list short and the verdicts honest.

**PHP 7.4 to 8.5**

Pick the target version: 7.4, 8.0, 8.1, 8.2, 8.3, 8.4 or 8.5. The checks come from the PHPCompatibility rules for PHP_CodeSniffer, development version, which already cover PHP 8.5: the backtick operator, `(boolean)`, `(integer)`, `(double)` and `(binary)` casts, `case` ending with a semicolon, `curl_close()`, `imagedestroy()`, `mysqli_execute()` and the other 8.5 deprecations, along with everything removed in PHP 8.0 and deprecated in 8.1 to 8.4.

**Built for shared hosting**

* Runs inside WordPress: does not need `exec()`, a command line or an external scanning service.
* Scans in short steps of a few seconds, so it never hits the PHP time limit. Pause, resume or cancel at any time.
* Leave the page and the scan goes on in the background through WP-Cron.
* A file that would exhaust memory is skipped and listed, and the scan moves on. Files larger than 1 MB are skipped and listed.

**Exact lines**

Every finding names the file, the line, what changed and in which PHP version, with the suggested replacement where one exists. The Plugins screen shows a short note under each plugin the last scan found problems in.

**Limits of static analysis**

Leaplens reads code without running it. It cannot see code built at run time, and it can flag code that checks the PHP version before using an old function. Treat the verdicts as a checklist, and test the switch on a staging copy first.

== Frequently Asked Questions ==

= Does scanning slow down my site? =

The scan runs only while you or WP-Cron ask for it, a few seconds at a time, and reads files without running them. Visitors are not affected. A typical site with 20 plugins takes a few minutes.

= Does it send my code anywhere? =

No. All analysis happens on your server and no code leaves it. The plugin talks to WordPress.org only, the same way WordPress's own update checks do: for a plugin or theme with errors it asks the WordPress.org directory whether that project is closed and when it was last updated (the request names the plugin or theme), and, when "Also check available updates" is on, it downloads the update WordPress already found for it. Like every request WordPress makes, these carry WordPress's standard user agent with your site address.

= Why does it say a problem "already applies" to my PHP? =

If the site runs PHP 8.3 today and a plugin still calls a function removed in PHP 8.0, that line never runs on your site, or the site would already be broken. Such findings are not counted for the target version and are hidden by default.

= My host disables exec(). Will it work? =

Yes. The scanner runs PHP_CodeSniffer inside the WordPress request and needs only the standard tokenizer extension. The bundled libraries make no calls to exec(), shell_exec() or proc_open(): the few command-line code paths of PHP_CodeSniffer that used them are removed when the libraries are bundled.

= Can I scan inactive plugins and themes? =

Yes. Active ones are selected by default; use "Select all" to include the rest.

= Who can use it? =

Administrators. On multisite, network administrators only, because plugins and themes are shared by the whole network.

== Screenshots ==

1. Pick the target PHP version and what to scan.
2. One verdict per plugin and theme, and what to do about it.
3. The exact files and lines, with the PHP version that changed each one.

== Changelog ==

= 0.1.0 =
* First release: PHP 7.4 to 8.5, verdicts per plugin and theme, update checks, background scanning, Plugins screen notes.

== Third-party code ==

The `vendor` folder is the scanning engine, not a development tool: Leaplens loads these libraries at run time to read the code of your plugins and themes.

* PHP_CodeSniffer 4.0.4 - BSD-3-Clause - https://github.com/PHPCSStandards/PHP_CodeSniffer
* PHPCSUtils 1.2.3 - LGPL-3.0-or-later - https://github.com/PHPCSStandards/PHPCSUtils
* PHPCompatibility 10 development version - LGPL-3.0-or-later - https://github.com/PHPCompatibility/PHPCompatibility (commit 4b1ac835)

Tests, documentation and command-line-only files are left out. PHPCSUtils and PHPCompatibility are otherwise unchanged; in PHP_CodeSniffer the command-line code paths that call exec(), shell_exec() and proc_open() are removed, so the plugin ships no such calls. Their license files are in the `vendor` folder.
