Skip to content

Commit 450ec86

Browse files
authored
Add plugin header checking (#83)
* Add plugin header checking This patch will scan plugin headers for plugins declaring a requirement for WordPress 5.0 and above. * Update patch to use WP_PLUGIN_DIR * Fix a HTML typos, add Requires at least: header to plugin file, and extend plugin checking to screen plugin header and readme as well as listing plugins that don't contain the Requires at least: header * Improved logic to prevent duplicate issue warnings under different sections based on testing feedback * Avoid array use when collecting plugin names from API conflict data
1 parent 33e429e commit 450ec86

File tree

2 files changed

+75
-5
lines changed

2 files changed

+75
-5
lines changed

lib/admin-page.php

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -480,14 +480,63 @@ function classicpress_check_can_migrate() {
480480

481481
// Check: Conflicting Plugins
482482
$plugins = get_option( 'active_plugins' );
483-
if ( isset( $parameters['plugins'] ) && $plugins !== array_diff( $plugins, $parameters['plugins'] ) ) {
483+
$plugin_headers = array( 'Name' => 'Plugin Name', 'RequiresWP' => 'Requires at least' );
484+
$declared_incompatible_plugins = array();
485+
$undeclared_compatibility_plugins = array();
486+
487+
// Start by checking if plugins have declared they require WordPress 5.0 or higher
488+
foreach ( $plugins as $plugin ) {
489+
if ( isset( $parameters['plugins'] ) && in_array( $plugin, $parameters['plugins'] ) ) {
490+
continue;
491+
}
492+
493+
$plugin_data = get_file_data( WP_PLUGIN_DIR . '/' . $plugin, $plugin_headers );
494+
$plugin_name = $plugin_data['Name'];
495+
if ( version_compare( $plugin_data['RequiresWP'], '5.0' ) >= 0 ) {
496+
$declared_incompatible_plugins[ $plugin ] = $plugin_name;
497+
} else {
498+
$plugin_files = get_plugin_files( $plugin );
499+
$readmes = array_filter( $plugin_files, function( $files ) {
500+
return ( stripos( $files, 'readme') !== false );
501+
} );
502+
foreach( $readmes as $readme ) {
503+
if ( empty( $readme ) ) {
504+
continue;
505+
}
506+
$readme_data = get_file_data( WP_PLUGIN_DIR . '/' . $readme, $plugin_headers );
507+
if ( version_compare( $readme_data['RequiresWP'], '5.0' ) >= 0 ) {
508+
$declared_incompatible_plugins[ $plugin ] = $plugin_name;
509+
continue;
510+
}
511+
}
512+
}
513+
if (
514+
empty( $plugin_data['RequiresWP'] ) &&
515+
( empty( $readmes ) || empty( $readme_data['RequiresWP'] ) ) &&
516+
false === array_key_exists( $plugin, $declared_incompatible_plugins )
517+
) {
518+
$undeclared_compatibility_plugins[ $plugin ] = $plugin_name;
519+
}
520+
}
521+
522+
// Compare active plugins with API response of known conflicting plugins
523+
if (
524+
isset( $parameters['plugins'] ) && $plugins !== array_diff( $plugins, $parameters['plugins'] ) ||
525+
! empty( $declared_incompatible_plugins )
526+
) {
484527
$preflight_checks['plugins'] = false;
485528

486529
$conflicting_plugins = array_intersect( $parameters['plugins'], $plugins );
487530
$conflicting_plugin_names = array();
488531
foreach( $conflicting_plugins as $conflicting_plugin ) {
489-
$conflicting_plugin_data[] = get_plugin_data( WP_CONTENT_DIR . '/plugins/' . $conflicting_plugin );
490-
$conflicting_plugin_names[] = $conflicting_plugin_data[0]['Name'];
532+
$conflicting_plugin_data = get_plugin_data( WP_CONTENT_DIR . '/plugins/' . $conflicting_plugin );
533+
$conflicting_plugin_names[] = $conflicting_plugin_data['Name'];
534+
}
535+
536+
if ( ! empty( $declared_incompatible_plugins ) ) {
537+
foreach( $declared_incompatible_plugins as $slug => $name ) {
538+
$conflicting_plugin_names[] = $name;
539+
}
491540
}
492541

493542
echo "<tr>\n<td>$icon_preflight_fail</td>\n<td>\n";
@@ -503,7 +552,7 @@ function classicpress_check_can_migrate() {
503552
echo "<br>\n";
504553
/* translators: List of conflicting plugin names */
505554
printf( __(
506-
'<strong>%s<sttong>',
555+
'<strong>%s<strong>',
507556
'switch-to-classicpress'
508557
), implode( ', ', $conflicting_plugin_names ) );
509558
} else {
@@ -514,6 +563,27 @@ function classicpress_check_can_migrate() {
514563
'switch-to-classicpress'
515564
);
516565
}
566+
echo "</td></tr>\n";
567+
568+
if ( ! empty( $undeclared_compatibility_plugins ) ) {
569+
echo "<tr>\n<td>$icon_preflight_warn</td>\n<td>\n";
570+
_e(
571+
'We have detected one or more plugins that fail to declare a minimum compatible WordPress version. They may prevent or impact on migrating your site to ClassicPress.',
572+
'switch-to-classicpress'
573+
);
574+
echo "<br>\n";
575+
_e(
576+
'We would recommned deactivating the following plugins if you wish to continue migrating your site to ClassicPress:',
577+
'switch-to-classicpress'
578+
);
579+
echo "<br>\n";
580+
/* translators: List of conflicting plugin names */
581+
printf( __(
582+
'<strong>%s<strong>',
583+
'switch-to-classicpress'
584+
), implode( ', ', $undeclared_compatibility_plugins ) );
585+
echo "</td></tr>\n";
586+
}
517587

518588
// Check: Supported PHP version
519589
$php_version_min = '5.6';

switch-to-classicpress.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* License URI: https://www.gnu.org/licenses/gpl-2.0.txt
1111
* Domain Path: /languages
1212
* Text Domain: switch-to-classicpress
13-
*
13+
* Requires at least: 4.9
1414
* @package ClassicPress
1515
*/
1616

0 commit comments

Comments
 (0)