255 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * File: Extensions_Plugin_Admin.php
 | |
|  *
 | |
|  * @package W3TC
 | |
|  */
 | |
| 
 | |
| namespace W3TC;
 | |
| 
 | |
| /**
 | |
|  * Class: Extensions_Plugin_Admin
 | |
|  */
 | |
| class Extensions_Plugin_Admin {
 | |
| 	/**
 | |
| 	 * Config.
 | |
| 	 *
 | |
| 	 * @var Config
 | |
| 	 */
 | |
| 	private $_config = null; // phpcs:ignore
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 		$this->_config = Dispatcher::config();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Runs plugin.
 | |
| 	 */
 | |
| 	public function run() {
 | |
| 		// Attach w3tc-bundled extensions.
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_CloudFlare_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_FragmentCache_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_Genesis_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions_hooks', array( '\W3TC\Extension_Genesis_Plugin_Admin', 'w3tc_extensions_hooks' ) );
 | |
| 		add_filter( 'w3tc_notes_genesis_theme', array( '\W3TC\Extension_Genesis_Plugin_Admin', 'w3tc_notes_genesis_theme' ) );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_NewRelic_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_Swarmify_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_WordPressSeo_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions_hooks', array( '\W3TC\Extension_WordPressSeo_Plugin_Admin', 'w3tc_extensions_hooks' ) );
 | |
| 		add_action( 'w3tc_notes_wordpress_seo', array( '\W3TC\Extension_WordPressSeo_Plugin_Admin', 'w3tc_notes_wordpress_seo' ) );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_Wpml_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_Amp_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_filter( 'w3tc_extensions_hooks', array( '\W3TC\Extension_Wpml_Plugin_Admin', 'w3tc_extensions_hooks' ) );
 | |
| 		add_action( 'w3tc_notes_wpml', array( '\W3TC\Extension_Wpml_Plugin_Admin', 'w3tc_notes_wpml' ) );
 | |
| 		add_filter( 'w3tc_extensions', array( '\W3TC\Extension_ImageService_Plugin_Admin', 'w3tc_extensions' ), 10, 2 );
 | |
| 		add_action( 'admin_init', array( $this, 'admin_init' ), 1 );
 | |
| 		add_filter( 'pre_update_option_active_plugins', array( $this, 'pre_update_option_active_plugins' ) );
 | |
| 		add_filter( 'w3tc_admin_menu', array( $this, 'w3tc_admin_menu' ), 10000 );
 | |
| 		add_action( 'w3tc_settings_page-w3tc_extensions', array( $this, 'w3tc_settings_page_w3tc_extensions' ) );
 | |
| 
 | |
| 		if ( Util_Admin::is_w3tc_admin_page() ) {
 | |
| 			add_action( 'admin_notices', array( $this, 'admin_notices' ) );
 | |
| 
 | |
| 			$action_val = Util_Request::get_string( 'action' );
 | |
| 			if ( ! empty( Util_Request::get_string( 'extension' ) ) && ! empty( $action_val ) ) {
 | |
| 				if ( in_array( $action_val, array( 'activate', 'deactivate' ), true ) ) {
 | |
| 					add_action( 'init', array( $this, 'change_extension_status' ) );
 | |
| 				}
 | |
| 			} elseif ( ! empty( Util_Request::get_array( 'checked' ) ) ) {
 | |
| 				add_action( 'admin_init', array( $this, 'change_extensions_status' ) );
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Adds menu.
 | |
| 	 *
 | |
| 	 * @param array $menu Menu.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function w3tc_admin_menu( $menu ) {
 | |
| 		$menu['w3tc_extensions'] = array(
 | |
| 			'page_title'     => __( 'Extensions', 'w3-total-cache' ),
 | |
| 			'menu_text'      => __( 'Extensions', 'w3-total-cache' ),
 | |
| 			'visible_always' => false,
 | |
| 			'order'          => 1900,
 | |
| 		);
 | |
| 
 | |
| 		return $menu;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Loads options page and corresponding view.
 | |
| 	 */
 | |
| 	public function w3tc_settings_page_w3tc_extensions() {
 | |
| 		$o = new Extensions_Page();
 | |
| 		$o->render_content();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Delete hooks option before updating active plugins option.
 | |
| 	 *
 | |
| 	 * @param mixed $o Option value.
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function pre_update_option_active_plugins( $o ) {
 | |
| 		delete_option( 'w3tc_extensions_hooks' );
 | |
| 
 | |
| 		return $o;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Admin init.
 | |
| 	 */
 | |
| 	public function admin_init() {
 | |
| 		// Used to load even inactive extensions if they want to.
 | |
| 		$s     = get_option( 'w3tc_extensions_hooks' );
 | |
| 		$hooks = @json_decode( $s, true ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
 | |
| 
 | |
| 		if ( ! isset( $hooks['next_check_date'] ) ||
 | |
| 			$hooks['next_check_date'] < time() ) {
 | |
| 			$hooks = array(
 | |
| 				'actions'         => array(),
 | |
| 				'filters'         => array(),
 | |
| 				'next_check_date' => time() + 24 * 60 * 60,
 | |
| 			);
 | |
| 
 | |
| 			$hooks = apply_filters( 'w3tc_extensions_hooks', $hooks );
 | |
| 
 | |
| 			update_option( 'w3tc_extensions_hooks', wp_json_encode( $hooks ) );
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $hooks['actions'] ) ) {
 | |
| 			foreach ( $hooks['actions'] as $hook => $actions_to_call ) {
 | |
| 				if ( is_array( $actions_to_call ) ) {
 | |
| 					add_action(
 | |
| 						$hook,
 | |
| 						function() use ( $actions_to_call ) {
 | |
| 							foreach ( $actions_to_call as $action ) {
 | |
| 								do_action( $action );
 | |
| 							}
 | |
| 						}
 | |
| 					);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $hooks['filters'] ) ) {
 | |
| 			foreach ( $hooks['filters'] as $hook => $filters_to_call ) {
 | |
| 				if ( is_array( $filters_to_call ) ) {
 | |
| 					add_filter(
 | |
| 						$hook,
 | |
| 						function( $v ) use ( $filters_to_call ) {
 | |
| 							foreach ( $filters_to_call as $filter ) {
 | |
| 								$v = apply_filters( $filter, $v );
 | |
| 							}
 | |
| 
 | |
| 							return $v;
 | |
| 						}
 | |
| 					);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Alters the active state of multiple extensions.
 | |
| 	 */
 | |
| 	public function change_extensions_status() {
 | |
| 		$message    = '';
 | |
| 		$extensions = Util_Request::get_array( 'checked' );
 | |
| 		$action     = Util_Request::get( 'action' );
 | |
| 
 | |
| 		if ( '-1' === $action ) {
 | |
| 			$action = Util_Request::get( 'action2' );   // Dropdown at bottom.
 | |
| 		}
 | |
| 
 | |
| 		if ( 'activate-selected' === $action ) {
 | |
| 			foreach ( $extensions as $extension ) {
 | |
| 				if ( Extensions_Util::activate_extension( $extension, $this->_config ) ) {
 | |
| 					$message .= '&activated=' . $extension;
 | |
| 				}
 | |
| 			}
 | |
| 			wp_safe_redirect( Util_Ui::admin_url( sprintf( 'admin.php?page=w3tc_extensions%s', $message ) ) );
 | |
| 			exit;
 | |
| 		} elseif ( 'deactivate-selected' === $action ) {
 | |
| 			foreach ( $extensions as $extension ) {
 | |
| 				if ( Extensions_Util::deactivate_extension( $extension, $this->_config ) ) {
 | |
| 					$message .= '&deactivated=' . $extension;
 | |
| 				}
 | |
| 			}
 | |
| 			wp_safe_redirect( Util_Ui::admin_url( sprintf( 'admin.php?page=w3tc_extensions%s', $message ) ) );
 | |
| 			exit;
 | |
| 		} else {
 | |
| 			wp_safe_redirect( Util_Ui::admin_url( 'admin.php?page=w3tc_extensions' ) );
 | |
| 			exit;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Alters the active state of an extension.
 | |
| 	 */
 | |
| 	public function change_extension_status() {
 | |
| 		$action = Util_Request::get_string( 'action' );
 | |
| 
 | |
| 		if ( in_array( $action, array( 'activate', 'deactivate' ), true ) ) {
 | |
| 			$extension = Util_Request::get_string( 'extension' );
 | |
| 
 | |
| 			if ( 'activate' === $action ) {
 | |
| 				Extensions_Util::activate_extension( $extension, $this->_config );
 | |
| 				wp_safe_redirect( Util_Ui::admin_url( sprintf( 'admin.php?page=w3tc_extensions&activated=%s', $extension ) ) );
 | |
| 				exit;
 | |
| 			} elseif ( 'deactivate' === $action ) {
 | |
| 				Extensions_Util::deactivate_extension( $extension, $this->_config );
 | |
| 				wp_safe_redirect( Util_Ui::admin_url( sprintf( 'admin.php?page=w3tc_extensions&deactivated=%s', $extension ) ) );
 | |
| 				exit;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Display admin notices.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @see Extensions_Util::get_active_extensions()
 | |
| 	 */
 | |
| 	public function admin_notices() {
 | |
| 		$extensions_active = Extensions_Util::get_active_extensions( $this->_config );
 | |
| 
 | |
| 		foreach ( $extensions_active as $id => $info ) {
 | |
| 			$transient_name = 'w3tc_activation_' . $id;
 | |
| 			$action_name    = 'w3tc_' . $id . '_action';
 | |
| 			$action_val     = Util_Request::get_string( $action_name );
 | |
| 
 | |
| 			if ( ! empty( $action_val ) && 'dismiss_activation_notice' === $action_val ) {
 | |
| 				delete_transient( $transient_name );
 | |
| 			}
 | |
| 
 | |
| 			if ( isset( $info['notice'] ) && get_transient( $transient_name ) ) {
 | |
| 				?>
 | |
| 				<div class="notice notice-warning inline is-dismissible">
 | |
| 					<p>
 | |
| 				<?php
 | |
| 				echo wp_kses(
 | |
| 					$info['notice'],
 | |
| 					array(
 | |
| 						'a' => array(
 | |
| 							'class'  => array(),
 | |
| 							'href'   => array(),
 | |
| 							'target' => array(),
 | |
| 						),
 | |
| 					)
 | |
| 				);
 | |
| 				?>
 | |
| 						</p>
 | |
| 				</div>
 | |
| 				<?php
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |