* @copyright Copyright (c) 2020 Samuel Marshall / JCH Optimize * @license GNU/GPLv3, or later. See LICENSE file * * If LICENSE file missing, see . */ namespace JchOptimize\WordPress\Plugin; use _JchOptimizeVendor\V91\Joomla\DI\Container; use _JchOptimizeVendor\V91\Joomla\DI\ContainerAwareInterface; use _JchOptimizeVendor\V91\Joomla\DI\ContainerAwareTrait; use _JchOptimizeVendor\V91\Joomla\Filesystem\File; use _JchOptimizeVendor\V91\Joomla\Filesystem\Folder; use Exception; use JchOptimize\Core\Admin\AdminHelper; use JchOptimize\Core\Admin\AdminTasks; use JchOptimize\Core\Model\CacheMaintainer; use JchOptimize\Core\Registry; use JchOptimize\WordPress\Model\ReCache; use function defined; use function delete_option; use function dirname; use function file_exists; use function file_get_contents; use function is_dir; use function json_decode; use function md5_file; use function update_option; use const ABSPATH; use const JCH_PLUGIN_DIR; use const JCH_PRO; use const JCH_VERSION; use const WPMU_PLUGIN_DIR; class Installer implements ContainerAwareInterface { use ContainerAwareTrait; private ?ReCache $recache = null; public function __construct( private Registry $params, private AdminTasks $tasks, private AdminHelper $helper, private CacheMaintainer $cacheMaintainer, Container $container ) { $this->setContainer($container); if (JCH_PRO) { $this->recache = $this->getContainer()->get(ReCache::class); } } /** * Fires when plugin is activated and create a dir.php file in plugin root containing * absolute path of plugin install */ public function activate(): void { $file = JCH_PLUGIN_DIR . 'dir.php'; $absPath = ABSPATH; $code = <<tasks->leverageBrowserCaching(); $this->installMUPlugin(); $this->rescheduleRecacheCron(); } public function installMUPlugin(): void { if (JCH_PRO) { // Copy the mu-plugins in the correct folder $mu_folder = $this->getMUPluginDir(); if (!is_dir($mu_folder)) { Folder::create($mu_folder); } $src = JCH_PLUGIN_DIR . 'mu-plugins/jch-optimize-mode-switcher.php'; $target = $mu_folder . '/jch-optimize-mode-switcher.php'; $header = <<cacheMaintainer->cleanCache(); $this->tasks->cleanHtaccess(); $this->deleteMUPlugin(); $this->clearRecacheCron(); } public function deleteMUPlugin(): void { if (JCH_PRO) { $mu_folder = $this->getMUPluginDir(); if (defined('WPMU_PLUGIN_DIR') && WPMU_PLUGIN_DIR) { $mu_folder = WPMU_PLUGIN_DIR; } try { File::delete($mu_folder . '/jch-optimize-mode-switcher.php'); } catch (Exception $e) { } } } public function updateSettings(): void { //Update new Load WEBP setting /** @var string|null $loadWebp */ $loadWebp = $this->params->get('pro_load_webp_images'); /** @var string|null $nextGenImages */ $nextGenImages = $this->params->get('pro_next_gen_images'); if (is_null($loadWebp) && $nextGenImages) { $this->params->set('pro_load_webp_images', '1'); } //Update Exclude JavaScript settings $oldJsSettings = [ 'excludeJs_peo', 'excludeJsComponents_peo', 'excludeScripts_peo', 'excludeJs', 'excludeJsComponents', 'excludeScripts', 'dontmoveJs', 'dontmoveScripts', ]; $updateJsSettings = false; foreach ($oldJsSettings as $oldJsSetting) { /** @var array $oldJsSettingValue */ $oldJsSettingValue = json_decode(json_encode($this->params->get($oldJsSetting)), true); if ($oldJsSettingValue) { $firstValue = array_shift($oldJsSettingValue); if (!isset($firstValue['url']) && !isset($firstValue['script'])) { $updateJsSettings = true; } break; } } if ($updateJsSettings) { $dontMoveJs = (array)$this->params->get('excludeJs'); $dontMoveScripts = (array)$this->params->get('dontmoveScripts'); $this->params->remove('dontmoveJs'); $this->params->remove('dontmoveScripts'); /** @var array}> $excludeJsPeoSettingsMap */ $excludeJsPeoSettingsMap = [ 'excludeJs_peo' => [ 'ieo' => 'excludeJs', 'valueType' => 'url', 'dontmove' => $dontMoveJs ], 'excludeJsComponents_peo' => [ 'ieo' => 'excludeJsComponents', 'valueType' => 'url', 'dontmove' => $dontMoveJs ], 'excludeScripts_peo' => [ 'ieo' => 'excludeScripts', 'valueType' => 'script', 'dontmove' => $dontMoveScripts ] ]; foreach ($excludeJsPeoSettingsMap as $excludeJsPeoSettingName => $settingsMap) { /** @var string[] $excludeJsPeoSetting */ $excludeJsPeoSetting = (array)$this->params->get($excludeJsPeoSettingName); $this->params->remove($excludeJsPeoSettingName); $newExcludeJs_peo = []; $i = 0; foreach ($excludeJsPeoSetting as $excludeJsPeoSettingValue) { $newExcludeJs_peo[$i][$settingsMap['valueType']] = $excludeJsPeoSettingValue; foreach ($settingsMap['dontmove'] as $dontMoveValue) { if (str_contains($excludeJsPeoSettingValue, $dontMoveValue)) { $newExcludeJs_peo[$i]['dontmove'] = 'on'; } } $i++; } /** @var string[] $excludeJsIeoSetting */ $excludeJsIeoSetting = $this->params->get($settingsMap['ieo']); $this->params->remove($settingsMap['ieo']); foreach ($excludeJsIeoSetting as $excludeJsIeoSettingValue) { $i++; $newExcludeJs_peo[$i][$settingsMap['valueType']] = $excludeJsIeoSettingValue; $newExcludeJs_peo[$i]['ieo'] = 'on'; foreach ($settingsMap['dontmove'] as $dontMoveValue) { if (str_contains($excludeJsIeoSettingValue, $dontMoveValue)) { $newExcludeJs_peo[$i]['dontmove'] = 'on'; } } } $this->params->set($excludeJsPeoSettingName, $newExcludeJs_peo); } update_option('jch-optimize_settings', $this->params->toArray()); } } public function updateMUPlugins(): void { $mu_folder = $this->getMUPluginDir(); $installedMU = $mu_folder . '/jch-optimize-mode-switcher.php'; if ( file_exists($installedMU) && md5_file( JCH_PLUGIN_DIR . 'mu-plugins/jch-optimize-mode-switcher.php' ) !== md5_file($installedMU) ) { $this->installMUPlugin(); } } public function fixMetaFileSecurity(): void { $metaFile = $this->helper->getMetaFile(); $metaFileDir = dirname($metaFile); if ( file_exists($metaFile) && (!file_exists($metaFileDir . '/index.html') || !file_exists($metaFileDir . '/.htaccess')) ) { $optimizedFiles = $this->helper->getOptimizedFiles(); File::delete($metaFile); foreach ($optimizedFiles as $files) { $this->helper->markOptimized($files); } } } private function rescheduleRecacheCron(): void { $this->recache?->reSchedule(); } private function clearRecacheCron(): void { $this->recache?->clearSchedule(); } }