<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[51092] trunk/src: Upgrade/Install: Remove parsing of `readme.txt` files for plugin or theme requirements.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/51092">51092</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/51092","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>SergeyBiryukov</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2021-06-08 10:11:49 +0000 (Tue, 08 Jun 2021)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Upgrade/Install: Remove parsing of `readme.txt` files for plugin or theme requirements.

This affects:
* `validate_plugin_requirements()`
* `validate_theme_requirements()`

Historically, the `Requires PHP` header was introduced in #meta2952 for the Plugin Directory first, so at the time it made sense to have it defined in the same place as `Requires at least`, which only existed in `readme.txt`. 

Since parsing of PHP and WordPress requirements was later added to WordPress core, the core should retrieve all the necessary data from the main plugin or theme file and not from `readme.txt`, which only contains the data meant for the Plugin or Theme Directory.

The recommended place for `Requires PHP` and `Requires at least` headers is as follows:
* The plugin's main PHP file
* The theme's `style.css` file

The place for the `Tested up to` header remains in `readme.txt` for the time being, as it's not used by WordPress core.

Follow-up to <a href="https://core.trac.wordpress.org/changeset/44978">[44978]</a>, <a href="https://core.trac.wordpress.org/changeset/45546">[45546]</a>, <a href="https://core.trac.wordpress.org/changeset/47573">[47573]</a>, <a href="https://core.trac.wordpress.org/changeset/47574">[47574]</a>, [meta5841], [meta9050].

Props afragen, Otto42, joyously, williampatton, audrasjb.
Fixes <a href="https://core.trac.wordpress.org/ticket/48520">#48520</a>. See <a href="https://core.trac.wordpress.org/ticket/48515">#48515</a>, #meta2952, #meta4514, #meta4621.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludespluginphp">trunk/src/wp-admin/includes/plugin.php</a></li>
<li><a href="#trunksrcwpincludesthemephp">trunk/src/wp-includes/theme.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludespluginphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/plugin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/plugin.php    2021-06-08 08:26:23 UTC (rev 51091)
+++ trunk/src/wp-admin/includes/plugin.php      2021-06-08 10:11:49 UTC (rev 51092)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1119,12 +1119,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Uses the information from `Requires at least` and `Requires PHP` headers
</span><span class="cx" style="display: block; padding: 0 10px">  * defined in the plugin's main PHP file.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * If the headers are not present in the plugin's main PHP file,
- * `readme.txt` is also checked as a fallback.
- *
</del><span class="cx" style="display: block; padding: 0 10px">  * @since 5.2.0
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.3.0 Added support for reading the headers from the plugin's
</span><span class="cx" style="display: block; padding: 0 10px">  *              main PHP file, with `readme.txt` as a fallback.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 5.8.0 Removed support for using `readme.txt` as a fallback.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string $plugin Path to the plugin file relative to the plugins directory.
</span><span class="cx" style="display: block; padding: 0 10px">  * @return true|WP_Error True if requirements are met, WP_Error on failure.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1137,21 +1135,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'requires_php' => ! empty( $plugin_headers['RequiresPHP'] ) ? $plugin_headers['RequiresPHP'] : '',
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $readme_file = WP_PLUGIN_DIR . '/' . dirname( $plugin ) . '/readme.txt';
-
-       if ( file_exists( $readme_file ) ) {
-               $readme_headers = get_file_data(
-                       $readme_file,
-                       array(
-                               'requires'     => 'Requires at least',
-                               'requires_php' => 'Requires PHP',
-                       ),
-                       'plugin'
-               );
-
-               $requirements = array_merge( $readme_headers, $requirements );
-       }
-
</del><span class="cx" style="display: block; padding: 0 10px">         $compatible_wp  = is_wp_version_compatible( $requirements['requires'] );
</span><span class="cx" style="display: block; padding: 0 10px">        $compatible_php = is_php_version_compatible( $requirements['requires_php'] );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpincludesthemephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/theme.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/theme.php   2021-06-08 08:26:23 UTC (rev 51091)
+++ trunk/src/wp-includes/theme.php     2021-06-08 10:11:49 UTC (rev 51092)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -899,10 +899,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Uses the information from `Requires at least` and `Requires PHP` headers
</span><span class="cx" style="display: block; padding: 0 10px">  * defined in the theme's `style.css` file.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * If the headers are not present in the theme's stylesheet file,
- * `readme.txt` is also checked as a fallback.
- *
</del><span class="cx" style="display: block; padding: 0 10px">  * @since 5.5.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 5.8.0 Removed support for using `readme.txt` as a fallback.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string $stylesheet Directory name for the theme.
</span><span class="cx" style="display: block; padding: 0 10px">  * @return true|WP_Error True if requirements are met, WP_Error on failure.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -915,21 +913,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'requires_php' => ! empty( $theme->get( 'RequiresPHP' ) ) ? $theme->get( 'RequiresPHP' ) : '',
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $readme_file = $theme->theme_root . '/' . $stylesheet . '/readme.txt';
-
-       if ( file_exists( $readme_file ) ) {
-               $readme_headers = get_file_data(
-                       $readme_file,
-                       array(
-                               'requires'     => 'Requires at least',
-                               'requires_php' => 'Requires PHP',
-                       ),
-                       'theme'
-               );
-
-               $requirements = array_merge( $readme_headers, $requirements );
-       }
-
</del><span class="cx" style="display: block; padding: 0 10px">         $compatible_wp  = is_wp_version_compatible( $requirements['requires'] );
</span><span class="cx" style="display: block; padding: 0 10px">        $compatible_php = is_php_version_compatible( $requirements['requires_php'] );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>