/wp-content/plugins/wysija-newsletters/classes/WJ_Upgrade.php
PHP | 406 lines | 291 code | 91 blank | 24 comment | 63 complexity | 810efaebd1b668cb33e54f85165adf05 MD5 | raw file
- <?php
- defined('WYSIJA') or die('Restricted access');
- class WJ_Upgrade extends WYSIJA_object {
- /**
- * A static variable that holds a dinamic instance of the class
- * @var [object||null]
- */
- public static $instance = null;
- public static $plugins = array( 'wysija-newsletters/index.php', 'wysija-newsletters-premium/index.php' );
- public static $baseurl = array(
- 'core' => 'https://downloads.wordpress.org/plugin/',
- 'packager' => 'http://packager.mailpoet.com/release/',
- );
- public static function hook(){
- null === self::$instance and self::$instance = new self;
- if ( ! is_admin() ) {
- return;
- }
- self::$baseurl = (object) self::$baseurl;
- add_action( 'current_screen', array( self::$instance, 'setup_bulk_screen' ) );
- add_action( 'shutdown', array( self::$instance, 'setup_bulk_screen_footer' ) );
- add_action( 'current_screen', array( self::$instance, 'iframe_intercept' ) );
- add_action( 'init', array( self::$instance, 'update_warning' ) );
- add_filter( 'pre_set_site_transient_update_plugins', array( self::$instance, 'pre_set_site_transient_update_plugins' ), 100 );
- }
- public function update_warning() {
- if ( ! is_admin() ){
- return;
- }
- if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
- return;
- }
- if ( ! ( ( is_multisite() && current_user_can( 'manage_network' ) ) || current_user_can( 'update_plugins' ) ) ){
- return;
- }
- if ( ! function_exists( 'get_plugin_data' ) ){
- include_once ABSPATH . 'wp-admin/includes/plugin.php';
- }
- $current = get_site_transient( 'update_plugins' );
- foreach ( self::$plugins as $plugin ){
- if ( isset( $current->response[ $plugin ] ) ){
- $data = self::get_plugin_data( $plugin );
- if ( version_compare( $current->response[ $plugin ]->new_version, $data->info->Version, '<=' ) ){
- continue;
- }
- $this->notice(
- sprintf(
- __( 'Hey! %1$s has an update (version %2$s), <a href="%3$s">click here to update</a>.', WYSIJA ),
- '<strong>' . esc_attr( $data->info->Name ) . '</strong>',
- $current->response[ $plugin ]->new_version,
- wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $plugin, 'upgrade-plugin_' . $plugin )
- ),
- true,
- true
- );
- }
- }
- }
- public function update_plugin_complete_actions( $update_actions, $mixed = null, $plugin = null ){
- $actions = array(
- 'refresh_page' => '<a href="#" onclick="window.parent.location.reload(true);return false;" title="' . esc_attr__( 'Refresh the page you current are!', WYSIJA ) . '" target="_parent">' . __( 'Return to MailPoet', WYSIJA ) . '</a>'
- );
- return $actions;
- }
- public function iframe_intercept( $current_screen ) {
- if ( $current_screen->base !== 'mailpoet_page_wysija_config' ){
- return;
- }
- if ( ! isset( $_GET['action'] ) || $_GET['action'] !== 'packager-switch' ){
- return;
- }
- // Verify if it's has been created within the last 12 hours (nonce)
- if ( wp_verify_nonce( $_GET['_wpnonce'], $_GET['action'] ) !== 1 ){
- return;
- }
- // Require the Updater classes
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
- $to = (isset($_GET['stable']) && $_GET['stable']?'stable':'beta');
- add_filter( 'pre_site_transient_update_plugins', array( $this, 'pre_site_transient_update_plugins' ) );
- $plugins = array();
- // Check for the action, it might be upgrading or installing
- $action = 'upgrade';
- if ( isset( $_GET['_mp_action'] ) && in_array( $_GET['_mp_action'], array( 'upgrade', 'install' ) ) ){
- $action = strtolower( $_GET['_mp_action'] );
- }
- foreach ( self::$plugins as $k => $plugin ) {
- if ( is_plugin_active( $plugin ) ){
- $plugins[] = $plugin;
- }
- }
- // Ajust the Padding/margin of the iFrame
- define( 'IFRAME_REQUEST', true );
- echo "<div style='margin: 0 20px;'>";
- // Thats how WordPress calls for an iFrame page
- wp_enqueue_script( 'jquery' );
- iframe_header();
- if ( $action === 'upgrade' ) {
- add_filter( 'update_bulk_plugins_complete_actions', array( $this, 'update_plugin_complete_actions' ), 10, 2 );
- $upgrader = new Plugin_Upgrader( new Bulk_Plugin_Upgrader_Skin( compact( 'nonce', 'url' ) ) );
- $upgrader->bulk_upgrade( $plugins );
- } elseif ( $action === 'install' ) {
- // If the action is install, it will only happen if it's the Premium
- add_filter( 'install_plugin_complete_actions', array( $this, 'update_plugin_complete_actions' ), 10, 3 );
- $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin() );
- $result = $upgrader->install( self::get_url( self::$plugins[1], WYSIJA::is_beta(), 'zip' ) );
- }
- iframe_footer();
- echo '</div>';
- remove_filter( 'pre_site_transient_update_plugins', array( $this, 'pre_site_transient_update_plugins' ) );
- $model_config = WYSIJA::get( 'config', 'model' );
- $model_config->save( array( 'beta_mode' => ( $to === 'stable' ? false : true ) ) );
- set_site_transient( 'update_plugins', '' );
- exit();
- }
- /**
- * A static method to grab the url from the packager to grab the ZIP
- * or the version of the plugin there.
- *
- * @uses bool_from_yn
- * @uses esc_url
- * @uses add_query_arg
- *
- * @param string $package Which package you want to grab
- * @param boolean|string $beta Beta URL or not
- * @param string $action Which kind of URL you need? [zip|check]
- * @param string $version The version you want the URL to be related to
- * @return string|null It will return the URL from the packager related to the asked action
- */
- public static function get_url( $package = null, $beta = false, $action = 'zip', $version = null ){
- if ( is_string( $beta ) ){
- if ( $beta === 'beta' ) {
- $beta = true;
- } else {
- $beta = bool_from_yn( $beta );
- }
- } else {
- $beta = (bool) $beta;
- }
- if ( ! in_array( $action, array( 'zip', 'check' ) ) ) {
- return null;
- }
- $slug = self::get_slug( $package );
- if ( true === $beta || 'wysija-newsletters-premium' === $slug ) {
- $url = self::$baseurl->packager . $action;
- $params = array(
- 'key' => self::get_slug( $package ),
- );
- if ( $beta === true ){
- $params['beta'] = 'true';
- }
- $url = add_query_arg( $params, $url );
- return (string) $url;
- } else {
- return (string) self::$baseurl->core . $slug . '.zip';
- }
- }
- public static function get_version( $package = null, $beta = false ){
- $request = wp_remote_get( self::get_url( $package, $beta, 'check' ) );
- if ( is_wp_error( $request ) ){
- return false;
- }
- $version = wp_remote_retrieve_body( $request );
- return $version;
- }
- public static function get_slug( $package = null ){
- switch ( $package ) {
- case self::$plugins[1]:
- case 'premium':
- case 'wysija-newsletters-premium':
- return 'wysija-newsletters-premium';
- break;
- case self::$plugins[0]:
- case 'base':
- case 'wysija-newsletters':
- default:
- return 'wysija-newsletters';
- break;
- }
- }
- public static function get_plugin_data( $package = null, $beta = false, $new_version = false ){
- $data = (object) array();
- if ( is_null( $package ) ){
- return $data;
- }
- $data->id = 27505;
- $data->slug = self::get_slug( $package );
- $data->package = self::get_url( $package, $beta, 'zip' );
- if ( function_exists( 'get_plugin_data' ) ){
- $data->info = (object) get_plugin_data( plugin_dir_path( dirname( dirname( __FILE__ ) ) ) . $package );
- }
- if ( $data->slug === 'wysija-newsletters' ){
- $data->url = "https://wordpress.org/plugins/{$data->slug}/";
- } else {
- $data->url = 'http://www.mailpoet.com/wordpress-newsletter-plugin-premium/';
- }
- $data->url = esc_url( $data->url );
- if ( $new_version !== false ){
- $data->new_version = (string) $new_version;
- }
- return $data;
- }
- public function pre_set_site_transient_update_plugins( $update_data ){
- if ( ! function_exists( 'get_plugin_data' ) ){
- return (object) array();
- }
- if ( ! is_object( $update_data ) && strlen( trim( $update_data ) ) === 0 ){
- return (object) array();
- }
- if ( ! isset( $update_data->last_checked ) ){
- $update_data->last_checked = 0;
- }
- if ( ( time() - ( 60 * 60 * 12 ) ) > ( $update_data->last_checked ) ) { // Just check once every 12 hours
- return $update_data;
- }
- foreach ( self::$plugins as $plugin ){
- if ( ! function_exists( 'is_plugin_active' ) ) {
- include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
- }
- if ( ! is_plugin_active( $plugin ) ){
- continue;
- }
- if ( ! WYSIJA::is_beta() && $plugin === 'wysija-newsletters/index.php' ) {
- continue;
- }
- $version = self::get_version( $plugin, WYSIJA::is_beta() );
- $update_data->last_checked = time();
- if ( version_compare( WYSIJA::get_version( $plugin ), $version, '>=' ) ){
- continue;
- }
- $update_data->response[ $plugin ] = self::get_plugin_data( $plugin, WYSIJA::is_beta(), $version );
- }
- return $update_data;
- }
- public function pre_site_transient_update_plugins( $transient ) {
- $update_data = (object) array(
- 'last_checked' => time() - 10,
- 'response' => array()
- );
- $to = (isset($_GET['stable']) && $_GET['stable']?'stable':'beta');
- foreach ( self::$plugins as $plugin ) {
- if ( ! function_exists( 'is_plugin_active' ) ){
- include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
- }
- if ( ! is_plugin_active( $plugin ) ) {
- continue;
- }
- $update_data->response[ $plugin ] = self::get_plugin_data( $plugin, $to, self::get_version( $plugin, $to ) );
- }
- return $update_data;
- }
- public function setup_bulk_screen( $current_screen ) {
- global $title, $parent_file, $submenu_file;
- if ( strtoupper( $_SERVER['REQUEST_METHOD'] ) === 'POST' && in_array( $current_screen->id, array( 'update-core', 'plugins' ) ) ) {
- if ( ! isset( $_POST['checked'] ) ){
- return;
- }
- $plugins = (array) $_POST['checked'];
- $plugins = array_map( 'urldecode', $plugins );
- $__intersection = array_intersect( $plugins, self::$plugins );
- if ( empty( $__intersection ) ){
- return;
- }
- $action = (isset($_POST['action']) ? $_POST['action'] : null);
- switch($action) {
- case 'delete-selected':
- break;
- case 'deactivate-selected':
- if ( in_array( self::$plugins[0], $plugins ) && ! in_array( self::$plugins[1], $plugins ) && is_plugin_active( self::$plugins[1] ) ){
- $plugins[] = self::$plugins[1];
- }
- break;
- case 'update-selected':
- case 'activate-selected':
- if ( in_array( self::$plugins[1], $plugins ) && ! in_array( self::$plugins[0], $plugins ) ){
- $plugins[] = self::$plugins[0];
- }
- break;
- }
- $_POST['checked'] = $plugins;
- return;
- }
- if ( $current_screen->id !== 'update' ){
- return;
- }
- if ( $_GET['action'] !== 'upgrade-plugin' ){
- return;
- }
- if ( $_GET['action'] === 'upgrade-plugin' && ! in_array( $_GET['plugin'], self::$plugins ) ){
- return;
- }
- foreach ( self::$plugins as $plugin ) {
- if ( ! is_plugin_active( $plugin ) ) {
- return;
- }
- }
- $_GET['action'] = $_REQUEST['action'] = 'update-selected';
- $_GET['plugins'] = $_REQUEST['plugins'] = implode( ',', array_map( 'urlencode', self::$plugins ) );
- $_GET['_wpnonce'] = $_REQUEST['_wpnonce'] = wp_create_nonce( 'bulk-update-plugins' );
- $_GET['_wysija_bulk_screen'] = $_REQUEST['_wysija_bulk_screen'] = true;
- $title = esc_attr__( 'Update Plugin' );
- $parent_file = 'plugins.php';
- $submenu_file = 'plugins.php';
- require_once(ABSPATH . 'wp-admin/admin-header.php');
- echo
- "<div class='wrap'>" .
- '<h2>' . esc_attr( $title ) . '</h2>';
- }
- public function setup_bulk_screen_footer(){
- if ( ! isset( $_GET['_wysija_bulk_screen'] ) ){
- return;
- }
- echo '</div>';
- include(ABSPATH . 'wp-admin/admin-footer.php');
- }
- }