WordPress.org

Make WordPress Core

Ticket #43992: 43992.diff

File 43992.diff, 3.6 KB (added by afragen, 2 years ago)

Prevents plugin activation if either minimum WP or minimum PHP versions not met.

  • src/wp-admin/includes/plugin.php

    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 
    189189        return $plugin_data;
    190190}
    191191
     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 */
     202function 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
    192220/**
    193221 * Get a list of a plugin's files.
    194222 *
    function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silen 
    589617                return $valid;
    590618        }
    591619
     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
    592624        if ( ( $network_wide && ! isset( $current[ $plugin ] ) ) || ( ! $network_wide && ! in_array( $plugin, $current ) ) ) {
    593625                if ( ! empty( $redirect ) ) {
    594626                        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 ) { 
    10231055        return 0;
    10241056}
    10251057
     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 */
     1070function 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
    10261078/**
    10271079 * Whether the plugin can be uninstalled.
    10281080 *
  • src/wp-includes/functions.php

    diff --git src/wp-includes/functions.php src/wp-includes/functions.php
    index 471fcbb5d6..d0652ea436 100644
    function wp_privacy_delete_old_export_files() { 
    65536553                }
    65546554        }
    65556555}
     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 */
     6566function 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 */
     6581function is_compatible_php( $requires ) {
     6582        return ( empty( $requires ) || version_compare( substr( phpversion(), 0, strlen( $requires ) ), $requires, '>=' ) );
     6583}