119 lines
3.4 KiB
PHP
119 lines
3.4 KiB
PHP
<?php
|
|
/**
|
|
* PluginsInstaller
|
|
*
|
|
* Installer to allow plugin installation via URL query.
|
|
*/
|
|
|
|
namespace Automattic\WooCommerce\Admin;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
use Automattic\WooCommerce\Admin\API\Plugins;
|
|
use Automattic\WooCommerce\Admin\Features\TransientNotices;
|
|
|
|
/**
|
|
* Class PluginsInstaller
|
|
*/
|
|
class PluginsInstaller {
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public static function init() {
|
|
add_action( 'admin_init', array( __CLASS__, 'possibly_install_activate_plugins' ) );
|
|
}
|
|
|
|
/**
|
|
* Check if an install or activation is being requested via URL query.
|
|
*/
|
|
public static function possibly_install_activate_plugins() {
|
|
/* phpcs:disable WordPress.Security.NonceVerification.Recommended */
|
|
if (
|
|
! isset( $_GET['plugin_action'] ) ||
|
|
! isset( $_GET['plugins'] ) ||
|
|
! current_user_can( 'install_plugins' ) ||
|
|
! isset( $_GET['nonce'] )
|
|
) {
|
|
return;
|
|
}
|
|
|
|
$nonce = sanitize_text_field( wp_unslash( $_GET['nonce'] ) );
|
|
|
|
if ( ! wp_verify_nonce( $nonce, 'install-plugin' ) ) {
|
|
wp_nonce_ays( 'install-plugin' );
|
|
}
|
|
|
|
$plugins = sanitize_text_field( wp_unslash( $_GET['plugins'] ) );
|
|
$plugin_action = sanitize_text_field( wp_unslash( $_GET['plugin_action'] ) );
|
|
/* phpcs:enable WordPress.Security.NonceVerification.Recommended */
|
|
|
|
$plugins_api = new Plugins();
|
|
$install_result = null;
|
|
$activate_result = null;
|
|
|
|
switch ( $plugin_action ) {
|
|
case 'install':
|
|
$install_result = $plugins_api->install_plugins( array( 'plugins' => $plugins ) );
|
|
break;
|
|
case 'activate':
|
|
$activate_result = $plugins_api->activate_plugins( array( 'plugins' => $plugins ) );
|
|
break;
|
|
case 'install-activate':
|
|
$install_result = $plugins_api->install_plugins( array( 'plugins' => $plugins ) );
|
|
$activate_result = $plugins_api->activate_plugins( array( 'plugins' => implode( ',', $install_result['data']['installed'] ) ) );
|
|
break;
|
|
}
|
|
|
|
self::cache_results( $plugins, $install_result, $activate_result );
|
|
self::redirect_to_referer();
|
|
}
|
|
|
|
/**
|
|
* Display the results of installation and activation on the page.
|
|
*
|
|
* @param string $plugins Comma separated list of plugins.
|
|
* @param array $install_result Result of installation.
|
|
* @param array $activate_result Result of activation.
|
|
*/
|
|
public static function cache_results( $plugins, $install_result, $activate_result ) {
|
|
if ( ! $install_result && ! $activate_result ) {
|
|
return;
|
|
}
|
|
|
|
if ( is_wp_error( $install_result ) || is_wp_error( $activate_result ) ) {
|
|
$message = $activate_result ? $activate_result->get_error_message() : $install_result->get_error_message();
|
|
} else {
|
|
$message = $activate_result ? $activate_result['message'] : $install_result['message'];
|
|
}
|
|
|
|
TransientNotices::add(
|
|
array(
|
|
'user_id' => get_current_user_id(),
|
|
'id' => 'plugin-installer-' . str_replace( ',', '-', $plugins ),
|
|
'status' => 'success',
|
|
'content' => $message,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Redirect back to the referring page if one exists.
|
|
*/
|
|
public static function redirect_to_referer() {
|
|
$referer = wp_get_referer();
|
|
if ( $referer && 0 !== strpos( $referer, wp_login_url() ) ) {
|
|
wp_safe_redirect( $referer );
|
|
exit();
|
|
}
|
|
|
|
if ( ! isset( $_SERVER['REQUEST_URI'] ) ) {
|
|
return;
|
|
}
|
|
|
|
$url = remove_query_arg( 'plugin_action', wp_unslash( $_SERVER['REQUEST_URI'] ) ); // phpcs:ignore sanitization ok.
|
|
$url = remove_query_arg( 'plugins', $url );
|
|
wp_safe_redirect( $url );
|
|
exit();
|
|
}
|
|
}
|