# jch-optimize/trunk/src/Controller/Main.php

JCH Optimize, version trunk. 135 lines.

- Page: https://pluginprobe.com/plugins/jch-optimize/trunk/code/src/Controller/Main.php
- Raw: https://pluginprobe.com/plugins/jch-optimize/trunk/raw/src/Controller/Main.php
- Modified: 2026-07-11T15:21:38+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/jch-optimize/trunk/code/src/Controller/Main.php#L10-L20`.

```php
<?php

/**
 * JCH Optimize - Performs several front-end optimizations for fast downloads
 *
 * @package   jchoptimize/wordpress-platform
 * @author    Samuel Marshall <samuel@jch-optimize.net>
 * @copyright Copyright (c) 2020 Samuel Marshall / JCH Optimize
 * @license   GNU/GPLv3, or later. See LICENSE file
 *
 * If LICENSE file missing, see <http://www.gnu.org/licenses/>.
 */

namespace JchOptimize\WordPress\Controller;

use _JchOptimizeVendor\V91\Joomla\Input\Input;
use FilesystemIterator;
use JchOptimize\Core\Admin\AdminHelper;
use JchOptimize\Core\Admin\Icons;
use JchOptimize\Core\Model\CacheMaintainer;
use JchOptimize\Core\Mvc\Controller;
use JchOptimize\Core\PageCache\CaptureCache;
use JchOptimize\Core\Platform\PathsInterface;
use JchOptimize\Core\Registry;
use JchOptimize\Core\Settings;
use JchOptimize\WordPress\Contracts\WillEnqueueAssets;
use JchOptimize\WordPress\Model\NotificationIcons;
use JchOptimize\WordPress\Model\PageCache as PageCacheModel;
use JchOptimize\WordPress\View\MainHtml;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use UnexpectedValueException;

use function admin_url;
use function array_filter;
use function count;
use function get_option;
use function in_array;
use function is_dir;
use function pathinfo;
use function strtolower;

use const PATHINFO_EXTENSION;

class Main extends Controller implements WillEnqueueAssets
{
    use AuthorizesAdminRequestsTrait;

    public function __construct(
        private MainHtml $view,
        private Icons $icons,
        private NotificationIcons $notificationIcons,
        ?Input $input
    ) {
        parent::__construct($input);
    }

    public function execute(): bool
    {
        $this->authorizeManageOptions();
        if (JCH_PRO) {
            $this->getContainer()->get(CaptureCache::class)->updateHtaccess();
        }

        [$cacheSize, $cacheFiles] = $this->getContainer()->get(CacheMaintainer::class)->getCacheSize();
        $lastCleared = (int)get_option('jch_optimize_cache_last_cleared', 0);
        $pageCacheItems = $this->getContainer()->get(PageCacheModel::class)->getItems();
        $adminHelper = $this->getContainer()->get(AdminHelper::class);
        $paths = $this->getContainer()->get(PathsInterface::class);
        $params = $this->getContainer()->get(Registry::class);
        $optimizedImages = count(array_filter($adminHelper->getOptimizedFiles()));
        $webpImages = $this->countFilesByExtension($paths->nextGenImagesPath(), ['webp']);
        $avifImages = $this->countFilesByExtension($paths->nextGenImagesPath(), ['avif']);

        $this->view->setData([
            'tab'                  => 'main',
            'icons'                => $this->icons,
            'notifications'        => $this->notificationIcons->getNotificationIcons(),
            'optimizationSnapshot' => [
                'cacheSize'         => $cacheSize,
                'cacheFiles'        => $cacheFiles,
                'lastCleared'       => $lastCleared,
                'pageCacheCount'    => count($pageCacheItems),
                'optimizedImages'   => $optimizedImages,
                'webpImages'        => $webpImages,
                'avifImages'        => $avifImages,
                'webpAvifEnabled'   => $params->isEnabled(Settings::LOAD_AVIF_WEBP_IMAGES),
                'optimizeImagesUrl' => admin_url('options-general.php?page=jch_optimize&tab=optimizeimages'),
                'pageCacheUrl'      => admin_url('options-general.php?page=jch_optimize&tab=pagecache'),
                'configurationsUrl' => admin_url('options-general.php?page=jch_optimize&tab=configurations'),
            ],
        ]);

        echo $this->view->render();

        return true;
    }

    public function enqueueAssets(): void
    {
        $this->view->loadResources();
    }

    /**
     * @param string[] $extensions
     */
    private function countFilesByExtension(string $path, array $extensions): int
    {
        if (!is_dir($path)) {
            return 0;
        }

        try {
            $files = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)
            );
        } catch (UnexpectedValueException) {
            return 0;
        }

        $count = 0;

        foreach ($files as $file) {
            if (
                $file->isFile()
                && in_array(strtolower(pathinfo($file->getFilename(), PATHINFO_EXTENSION)), $extensions, true)
            ) {
                $count++;
            }
        }

        return $count;
    }
}

```
