120 lines
3.2 KiB
PHP
120 lines
3.2 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;
|
|
|
|
/**
|
|
* Class PluginsInstaller
|
|
*/
|
|
class PluginsInstaller {
|
|
/**
|
|
* Message option name.
|
|
*/
|
|
const MESSAGE_OPTION = 'woocommerce_admin_plugin_installer_message';
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public static function init() {
|
|
add_action( 'admin_init', array( __CLASS__, 'possibly_install_activate_plugins' ) );
|
|
add_action( 'admin_enqueue_scripts', array( __CLASS__, 'display_message' ) );
|
|
}
|
|
|
|
/**
|
|
* 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' ) ) {
|
|
return;
|
|
}
|
|
|
|
$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( $install_result, $activate_result );
|
|
self::redirect_to_referer();
|
|
}
|
|
|
|
/**
|
|
* Display the results of installation and activation on the page.
|
|
*
|
|
* @param array $install_result Result of installation.
|
|
* @param array $activate_result Result of activation.
|
|
*/
|
|
public static function cache_results( $install_result, $activate_result ) {
|
|
if ( ! $install_result && ! $activate_result ) {
|
|
return;
|
|
}
|
|
|
|
$message = $activate_result ? $activate_result['message'] : $install_result['message'];
|
|
|
|
// Show install error message if one exists.
|
|
if ( $install_result && ! $install_result['success'] ) {
|
|
$message = $install_result['message'];
|
|
}
|
|
|
|
update_option( self::MESSAGE_OPTION, $message );
|
|
}
|
|
|
|
/**
|
|
* Display the results of installation and activation on the page.
|
|
*/
|
|
public static function display_message() {
|
|
$message = get_option( self::MESSAGE_OPTION );
|
|
|
|
if ( ! $message ) {
|
|
return;
|
|
}
|
|
|
|
delete_option( self::MESSAGE_OPTION );
|
|
}
|
|
|
|
/**
|
|
* 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();
|
|
}
|
|
|
|
}
|