Update WordPress to 5.2
This commit is contained in:
parent
489b5a5914
commit
e00f87f2f5
599 changed files with 119573 additions and 55990 deletions
|
@ -468,12 +468,14 @@ function get_dropins() {
|
|||
*/
|
||||
function _get_dropins() {
|
||||
$dropins = array(
|
||||
'advanced-cache.php' => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE
|
||||
'db.php' => array( __( 'Custom database class.' ), true ), // auto on load
|
||||
'db-error.php' => array( __( 'Custom database error message.' ), true ), // auto on error
|
||||
'install.php' => array( __( 'Custom installation script.' ), true ), // auto on installation
|
||||
'maintenance.php' => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance
|
||||
'object-cache.php' => array( __( 'External object cache.' ), true ), // auto on load
|
||||
'advanced-cache.php' => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE
|
||||
'db.php' => array( __( 'Custom database class.' ), true ), // auto on load
|
||||
'db-error.php' => array( __( 'Custom database error message.' ), true ), // auto on error
|
||||
'install.php' => array( __( 'Custom installation script.' ), true ), // auto on installation
|
||||
'maintenance.php' => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance
|
||||
'object-cache.php' => array( __( 'External object cache.' ), true ), // auto on load
|
||||
'php-error.php' => array( __( 'Custom PHP error message.' ), true ), // auto on error
|
||||
'fatal-error-handler.php' => array( __( 'Custom PHP fatal error handler.' ), true ), // auto on error
|
||||
);
|
||||
|
||||
if ( is_multisite() ) {
|
||||
|
@ -595,6 +597,7 @@ function is_network_only_plugin( $plugin ) {
|
|||
* ensure that the success redirection will update the error redirection.
|
||||
*
|
||||
* @since 2.5.0
|
||||
* @since 5.2.0 Test for WordPress version and PHP version compatibility.
|
||||
*
|
||||
* @param string $plugin Path to the plugin file relative to the plugins directory.
|
||||
* @param string $redirect Optional. URL to redirect to.
|
||||
|
@ -619,13 +622,22 @@ function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silen
|
|||
return $valid;
|
||||
}
|
||||
|
||||
$requirements = validate_plugin_requirements( $plugin );
|
||||
if ( is_wp_error( $requirements ) ) {
|
||||
return $requirements;
|
||||
}
|
||||
|
||||
if ( ( $network_wide && ! isset( $current[ $plugin ] ) ) || ( ! $network_wide && ! in_array( $plugin, $current ) ) ) {
|
||||
if ( ! empty( $redirect ) ) {
|
||||
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
|
||||
}
|
||||
|
||||
ob_start();
|
||||
wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );
|
||||
$_wp_plugin_file = $plugin;
|
||||
if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
|
||||
define( 'WP_SANDBOX_SCRAPING', true );
|
||||
}
|
||||
include_once( WP_PLUGIN_DIR . '/' . $plugin );
|
||||
$plugin = $_wp_plugin_file; // Avoid stomping of the $plugin variable in a plugin.
|
||||
|
||||
|
@ -758,6 +770,11 @@ function deactivate_plugins( $plugins, $silent = false, $network_wide = null ) {
|
|||
}
|
||||
}
|
||||
|
||||
if ( $do_blog && wp_is_recovery_mode() ) {
|
||||
list( $extension ) = explode( '/', $plugin );
|
||||
wp_paused_plugins()->delete( $extension );
|
||||
}
|
||||
|
||||
if ( ! $silent ) {
|
||||
/**
|
||||
* Fires as a specific plugin is being deactivated.
|
||||
|
@ -1058,6 +1075,67 @@ function validate_plugin( $plugin ) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the plugin requirements for WP version and PHP version.
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param string $plugin Path to the plugin file relative to the plugins directory.
|
||||
* @return true|WP_Error True if requirements are met, WP_Error on failure.
|
||||
*/
|
||||
function validate_plugin_requirements( $plugin ) {
|
||||
$readme_file = WP_PLUGIN_DIR . '/' . dirname( $plugin ) . '/readme.txt';
|
||||
|
||||
if ( file_exists( $readme_file ) ) {
|
||||
$plugin_data = get_file_data(
|
||||
$readme_file,
|
||||
array(
|
||||
'requires' => 'Requires at least',
|
||||
'requires_php' => 'Requires PHP',
|
||||
),
|
||||
'plugin'
|
||||
);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
$plugin_data['wp_compatible'] = is_wp_version_compatible( $plugin_data['requires'] );
|
||||
$plugin_data['php_compatible'] = is_php_version_compatible( $plugin_data['requires_php'] );
|
||||
|
||||
$plugin_data = array_merge( $plugin_data, get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ) );
|
||||
|
||||
if ( ! $plugin_data['wp_compatible'] && ! $plugin_data['php_compatible'] ) {
|
||||
return new WP_Error(
|
||||
'plugin_wp_php_incompatible',
|
||||
sprintf(
|
||||
/* translators: %s: plugin name */
|
||||
__( '<strong>Error:</strong> Current WordPress and PHP versions do not meet minimum requirements for %s.' ),
|
||||
$plugin_data['Name']
|
||||
)
|
||||
);
|
||||
} elseif ( ! $plugin_data['php_compatible'] ) {
|
||||
return new WP_Error(
|
||||
'plugin_php_incompatible',
|
||||
sprintf(
|
||||
/* translators: %s: plugin name */
|
||||
__( '<strong>Error:</strong> Current PHP version does not meet minimum requirements for %s.' ),
|
||||
$plugin_data['Name']
|
||||
)
|
||||
);
|
||||
} elseif ( ! $plugin_data['wp_compatible'] ) {
|
||||
return new WP_Error(
|
||||
'plugin_wp_incompatible',
|
||||
sprintf(
|
||||
/* translators: %s: plugin name */
|
||||
__( '<strong>Error:</strong> Current WordPress version does not meet minimum requirements for %s.' ),
|
||||
$plugin_data['Name']
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the plugin can be uninstalled.
|
||||
*
|
||||
|
@ -1285,8 +1363,8 @@ function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability,
|
|||
$_registered_pages[ $hookname ] = true;
|
||||
|
||||
/*
|
||||
* Backward-compatibility for plugins using add_management page.
|
||||
* See wp-admin/admin.php for redirect from edit.php to tools.php
|
||||
* Backward-compatibility for plugins using add_management_page().
|
||||
* See wp-admin/admin.php for redirect from edit.php to tools.php.
|
||||
*/
|
||||
if ( 'tools.php' == $parent_slug ) {
|
||||
$_registered_pages[ get_plugin_page_hookname( $menu_slug, 'edit.php' ) ] = true;
|
||||
|
@ -1644,6 +1722,8 @@ function menu_page_url( $menu_slug, $echo = true ) {
|
|||
* @global array $_wp_real_parent_file
|
||||
* @global array $_wp_menu_nopriv
|
||||
* @global array $_wp_submenu_nopriv
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_admin_page_parent( $parent = '' ) {
|
||||
global $parent_file, $menu, $submenu, $pagenow, $typenow,
|
||||
|
@ -1714,6 +1794,8 @@ function get_admin_page_parent( $parent = '' ) {
|
|||
* @global string $pagenow
|
||||
* @global string $plugin_page
|
||||
* @global string $typenow
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_admin_page_title() {
|
||||
global $title, $menu, $submenu, $pagenow, $plugin_page, $typenow;
|
||||
|
@ -1790,9 +1872,10 @@ function get_admin_page_title() {
|
|||
/**
|
||||
* @since 2.3.0
|
||||
*
|
||||
* @param string $plugin_page
|
||||
* @param string $parent_page
|
||||
* @return string|null
|
||||
* @param string $plugin_page The slug name of the plugin page.
|
||||
* @param string $parent_page The slug name for the parent menu (or the file name of a standard
|
||||
* WordPress admin page).
|
||||
* @return string|null Hook attached to the plugin page, null otherwise.
|
||||
*/
|
||||
function get_plugin_page_hook( $plugin_page, $parent_page ) {
|
||||
$hook = get_plugin_page_hookname( $plugin_page, $parent_page );
|
||||
|
@ -1805,8 +1888,11 @@ function get_plugin_page_hook( $plugin_page, $parent_page ) {
|
|||
|
||||
/**
|
||||
* @global array $admin_page_hooks
|
||||
* @param string $plugin_page
|
||||
* @param string $parent_page
|
||||
*
|
||||
* @param string $plugin_page The slug name of the plugin page.
|
||||
* @param string $parent_page The slug name for the parent menu (or the file name of a standard
|
||||
* WordPress admin page).
|
||||
* @return string Hook name for the plugin page.
|
||||
*/
|
||||
function get_plugin_page_hookname( $plugin_page, $parent_page ) {
|
||||
global $admin_page_hooks;
|
||||
|
@ -1837,6 +1923,8 @@ function get_plugin_page_hookname( $plugin_page, $parent_page ) {
|
|||
* @global array $_wp_submenu_nopriv
|
||||
* @global string $plugin_page
|
||||
* @global array $_registered_pages
|
||||
*
|
||||
* @return bool Whether the current user can access the current admin page.
|
||||
*/
|
||||
function user_can_access_admin_page() {
|
||||
global $pagenow, $menu, $submenu, $_wp_menu_nopriv, $_wp_submenu_nopriv,
|
||||
|
@ -2046,6 +2134,9 @@ function wp_clean_plugins_cache( $clear_update_cache = true ) {
|
|||
* @param string $plugin Path to the plugin file relative to the plugins directory.
|
||||
*/
|
||||
function plugin_sandbox_scrape( $plugin ) {
|
||||
if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
|
||||
define( 'WP_SANDBOX_SCRAPING', true );
|
||||
}
|
||||
wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );
|
||||
include( WP_PLUGIN_DIR . '/' . $plugin );
|
||||
}
|
||||
|
@ -2101,3 +2192,132 @@ function wp_add_privacy_policy_content( $plugin_name, $policy_text ) {
|
|||
|
||||
WP_Privacy_Policy_Content::add( $plugin_name, $policy_text );
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a plugin is technically active but was paused while
|
||||
* loading.
|
||||
*
|
||||
* For more information on this and similar theme functions, check out
|
||||
* the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
|
||||
* Conditional Tags} article in the Theme Developer Handbook.
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param string $plugin Path to the plugin file relative to the plugins directory.
|
||||
* @return bool True, if in the list of paused plugins. False, not in the list.
|
||||
*/
|
||||
function is_plugin_paused( $plugin ) {
|
||||
if ( ! isset( $GLOBALS['_paused_plugins'] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! is_plugin_active( $plugin ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
list( $plugin ) = explode( '/', $plugin );
|
||||
|
||||
return array_key_exists( $plugin, $GLOBALS['_paused_plugins'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the error that was recorded for a paused plugin.
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param string $plugin Path to the plugin file relative to the plugins
|
||||
* directory.
|
||||
* @return array|false Array of error information as it was returned by
|
||||
* `error_get_last()`, or false if none was recorded.
|
||||
*/
|
||||
function wp_get_plugin_error( $plugin ) {
|
||||
if ( ! isset( $GLOBALS['_paused_plugins'] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
list( $plugin ) = explode( '/', $plugin );
|
||||
|
||||
if ( ! array_key_exists( $plugin, $GLOBALS['_paused_plugins'] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $GLOBALS['_paused_plugins'][ $plugin ];
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to resume a single plugin.
|
||||
*
|
||||
* If a redirect was provided, we first ensure the plugin does not throw fatal
|
||||
* errors anymore.
|
||||
*
|
||||
* The way it works is by setting the redirection to the error before trying to
|
||||
* include the plugin file. If the plugin fails, then the redirection will not
|
||||
* be overwritten with the success message and the plugin will not be resumed.
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param string $plugin Single plugin to resume.
|
||||
* @param string $redirect Optional. URL to redirect to. Default empty string.
|
||||
* @return bool|WP_Error True on success, false if `$plugin` was not paused,
|
||||
* `WP_Error` on failure.
|
||||
*/
|
||||
function resume_plugin( $plugin, $redirect = '' ) {
|
||||
/*
|
||||
* We'll override this later if the plugin could be resumed without
|
||||
* creating a fatal error.
|
||||
*/
|
||||
if ( ! empty( $redirect ) ) {
|
||||
wp_redirect(
|
||||
add_query_arg(
|
||||
'_error_nonce',
|
||||
wp_create_nonce( 'plugin-resume-error_' . $plugin ),
|
||||
$redirect
|
||||
)
|
||||
);
|
||||
|
||||
// Load the plugin to test whether it throws a fatal error.
|
||||
ob_start();
|
||||
plugin_sandbox_scrape( $plugin );
|
||||
ob_clean();
|
||||
}
|
||||
|
||||
list( $extension ) = explode( '/', $plugin );
|
||||
|
||||
$result = wp_paused_plugins()->delete( $extension );
|
||||
|
||||
if ( ! $result ) {
|
||||
return new WP_Error(
|
||||
'could_not_resume_plugin',
|
||||
__( 'Could not resume the plugin.' )
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders an admin notice in case some plugins have been paused due to errors.
|
||||
*
|
||||
* @since 5.2.0
|
||||
*/
|
||||
function paused_plugins_notice() {
|
||||
if ( 'plugins.php' === $GLOBALS['pagenow'] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! current_user_can( 'resume_plugins' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! isset( $GLOBALS['_paused_plugins'] ) || empty( $GLOBALS['_paused_plugins'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
printf(
|
||||
'<div class="notice notice-error"><p><strong>%s</strong><br>%s</p><p><a href="%s">%s</a></p></div>',
|
||||
__( 'One or more plugins failed to load properly.' ),
|
||||
__( 'You can find more details and make changes on the Plugins screen.' ),
|
||||
esc_url( admin_url( 'plugins.php?plugin_status=paused' ) ),
|
||||
__( 'Go to the Plugins screen' )
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue