diff --git src/wp-admin/includes/plugin.php src/wp-admin/includes/plugin.php
index c898fc5169..5f8674b20e 100644
|
|
function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup |
189 | 189 | return $plugin_data; |
190 | 190 | } |
191 | 191 | |
| 192 | /** |
| 193 | * Query the Plugin API to get and return plugin data. |
| 194 | * |
| 195 | * @since 5.1.0 |
| 196 | * @see validate_plugin_requirements() |
| 197 | * |
| 198 | * @param string $plugin Path to the plugin file relative to the plugins directory. |
| 199 | * |
| 200 | * @return array $plugin_data Array of Plugin API data. |
| 201 | */ |
| 202 | function get_plugin_api_data( $plugin_file ) { |
| 203 | $plugin_data = null; |
| 204 | $url = 'https://api.wordpress.org/plugins/info/1.2/'; |
| 205 | $url = add_query_arg( |
| 206 | array( |
| 207 | 'action' => 'plugin_information', |
| 208 | rawurlencode( 'request[slug]' ) => dirname( $plugin_file ), |
| 209 | ), |
| 210 | $url |
| 211 | ); |
| 212 | $response = wp_remote_get( $url ); |
| 213 | if ( ! is_wp_error( $response ) ) { |
| 214 | $plugin_data = json_decode( wp_remote_retrieve_body( $response ) ); |
| 215 | } |
| 216 | |
| 217 | return $plugin_data; |
| 218 | } |
| 219 | |
192 | 220 | /** |
193 | 221 | * Get a list of a plugin's files. |
194 | 222 | * |
… |
… |
function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silen |
589 | 617 | return $valid; |
590 | 618 | } |
591 | 619 | |
| 620 | if ( validate_plugin_requirements( $plugin ) ) { |
| 621 | return new WP_Error( 'plugin_invalid', __( 'Plugin does not meet minimum WordPress and/or PHP requirements.' ) ); |
| 622 | } |
| 623 | |
592 | 624 | if ( ( $network_wide && ! isset( $current[ $plugin ] ) ) || ( ! $network_wide && ! in_array( $plugin, $current ) ) ) { |
593 | 625 | if ( ! empty( $redirect ) ) { |
594 | 626 | wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) ); // we'll override this later if the plugin can be included without fatal error |
… |
… |
function validate_plugin( $plugin ) { |
1023 | 1055 | return 0; |
1024 | 1056 | } |
1025 | 1057 | |
| 1058 | /** |
| 1059 | * Validate the plugin requirements for WP version and PHP version. |
| 1060 | * Plugin data retrieved from Plugin API call. |
| 1061 | * Default to true if data not available from Plugin API. |
| 1062 | * |
| 1063 | * @since 5.1.0 |
| 1064 | * @see activate_plugin() |
| 1065 | * |
| 1066 | * @param string $plugin Path to the plugin file relative to the plugins directory. |
| 1067 | * |
| 1068 | * @return bool |
| 1069 | */ |
| 1070 | function validate_plugin_requirements( $plugin ) { |
| 1071 | $plugin_data = get_plugin_api_data( $plugin ); |
| 1072 | $wp_requires = isset( $plugin_data->requires ) ? $plugin_data->requires : null; |
| 1073 | $php_requires = isset( $plugin_data->requires_php ) ? $plugin_data->requires_php : null; |
| 1074 | |
| 1075 | return ! ( is_compatible_wp( $wp_requires ) && is_compatible_php( $php_requires ) ); |
| 1076 | } |
| 1077 | |
1026 | 1078 | /** |
1027 | 1079 | * Whether the plugin can be uninstalled. |
1028 | 1080 | * |
diff --git src/wp-includes/functions.php src/wp-includes/functions.php
index 471fcbb5d6..d0652ea436 100644
|
|
function wp_privacy_delete_old_export_files() { |
6553 | 6553 | } |
6554 | 6554 | } |
6555 | 6555 | } |
| 6556 | |
| 6557 | /** |
| 6558 | * Check compatibility with current WordPress version. |
| 6559 | * |
| 6560 | * @since 5.1.0 |
| 6561 | * |
| 6562 | * @param string $requires Minimum WordPress version from API. |
| 6563 | * |
| 6564 | * @return bool Returns true if requirement met or empty. |
| 6565 | */ |
| 6566 | function is_compatible_wp( $requires ) { |
| 6567 | $wp_version = get_bloginfo( 'version' ); |
| 6568 | return ( empty( $requires ) || version_compare( substr( $wp_version, 0, strlen( $requires ) ), $requires, '>=' ) ); |
| 6569 | } |
| 6570 | |
| 6571 | // add to wp-includes/functions.php |
| 6572 | /** |
| 6573 | * Check compatibility with current PHP version. |
| 6574 | * |
| 6575 | * @since 5.1.0 |
| 6576 | * |
| 6577 | * @param string $requires Minimum PHP version from API. |
| 6578 | * |
| 6579 | * @return bool Returns true if requirement met or empty. |
| 6580 | */ |
| 6581 | function is_compatible_php( $requires ) { |
| 6582 | return ( empty( $requires ) || version_compare( substr( phpversion(), 0, strlen( $requires ) ), $requires, '>=' ) ); |
| 6583 | } |