* @copyright Copyright (c) 2020 Samuel Marshall / JCH Optimize * @license GNU/GPLv3, or later. See LICENSE file * * If LICENSE file missing, see . */ namespace JchOptimize\WordPress\Admin\Settings; use JchOptimize\Core\FeatureHelpers\ResponsiveImages; use function __; use function array_keys; abstract class FieldCallbacks { ## General Tab /* General Section */ public static function pro_downloadid(): void { ControlRenderer::render('text.pro', __FUNCTION__, ''); } public static function debug(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function order_plugin(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function disable_logged_in_users(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } /* Elements Above Fold */ public static function elements_above_fold_home(): void { ControlRenderer::render('text', __FUNCTION__, '300'); } public static function elements_above_fold(): void { ControlRenderer::render('text', __FUNCTION__, '300'); } public static function elements_above_fold_per_page(): void { $subfields = [ [ 'name' => 'elements', 'type' => 'text', /*'header' => 'Number of elements',*/ 'defaultValue' => '300', 'class' => 'small-text bg-white' ] ]; ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'url', 'file', 'url', $subfields); } public static function elements_above_fold_marker(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Exclude Menu Urls Section */ public static function menuexcludedurl(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'url', 'file'); } /* Cache Storage Section */ public static function pro_cache_storage_adapter(): void { $options = [ 'filesystem' => __('Filesystem', 'jch-optimize'), 'apcu' => __('APCu', 'jch-optimize'), 'memcached' => __('Memcached', 'jch-optimize'), 'redis' => __('Redis', 'jch-optimize') ]; $class = CacheStorageSupport::class; $conditions = [ 'apcu' => [$class, 'isApcuSupported'], 'memcached' => [$class, 'isMemcachedSupported'], 'redis' => [$class, 'isRedisSupported'] ]; ControlRenderer::render('select.pro', __FUNCTION__, 'filesystem', $options, '', $conditions); } public static function cache_lifetime(): void { $aOptions = [ '1800' => __('30 min', 'jch-optimize'), '3600' => __('1 hour', 'jch-optimize'), '10800' => __('3 hours', 'jch-optimize'), '21600' => __('6 hours', 'jch-optimize'), '43200' => __('12 hours', 'jch-optimize'), '86400' => __('1 day', 'jch-optimize'), '172800' => __('2 days', 'jch-optimize'), '604800' => __('7 days', 'jch-optimize'), '1209600' => __('2 weeks', 'jch-optimize') ]; ControlRenderer::render('select', __FUNCTION__, '1800', $aOptions); } public static function memcached_server_host(): void { ControlRenderer::render('text.pro', __FUNCTION__, '127.0.0.1'); } public static function memcached_server_port(): void { ControlRenderer::render('text.pro', __FUNCTION__, '11211'); } public static function redis_server_host(): void { ControlRenderer::render('text.pro', __FUNCTION__, '127.0.0.1'); } public static function redis_server_port(): void { ControlRenderer::render('text.pro', __FUNCTION__, '6379'); } public static function redis_server_password(): void { ControlRenderer::render('input.pro', __FUNCTION__, '', 'password'); } public static function redis_server_database(): void { ControlRenderer::render('text.pro', __FUNCTION__, '0'); } public static function delete_expiry(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } /* Recache Section */ public static function recache_base_url(): void { ControlRenderer::render('text.pro', __FUNCTION__, ''); } public static function recache_crawl_limit(): void { ControlRenderer::render('text.pro', __FUNCTION__, '100'); } public static function recache_concurrency(): void { ControlRenderer::render('text.pro', __FUNCTION__, '10'); } public static function recache_max_depth(): void { ControlRenderer::render('text.pro', __FUNCTION__, '3'); } public static function recache_delete_cache(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function recache_frequency(): void { $options = [ '0' => __('Disabled', 'jch-optimize'), '1' => __('On save only', 'jch-optimize'), 'hourly' => __('Hourly', 'jch-optimize'), 'twicedaily' => __('Twice Daily', 'jch-optimize'), 'daily' => __('Daily', 'jch-optimize'), ]; ControlRenderer::render('select.pro', __FUNCTION__, '1', $options); } ## Combine Files tab /* Combine CSS/Js Section */ public static function combine_files_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function combine_files(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function smart_combine(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function try_catch(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function html_minify_level(): void { $aOptions = [ '0' => __('Basic', 'jch-optimize'), '1' => __('Advanced', 'jch-optimize'), '2' => __('Ultra', 'jch-optimize') ]; ControlRenderer::render('select', __FUNCTION__, '0', $aOptions); } public static function htaccess(): void { $aOptions = [ '2' => __('Static css and js files', 'jch-optimize'), '0' => __('PHP file with query', 'jch-optimize'), '1' => __('PHP using url re-write', 'jch-optimize'), '3' => __('PHP using url re-write (Without Options +FollowSymLinks)', 'jch-optimize'), ]; ControlRenderer::render('select', __FUNCTION__, '2', $aOptions); } /* Combine Files Automatic Section */ public static function gzip(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function html_minify(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function includeAllExtensions(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function phpAndExternal(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } ## CSS Tab /* CSS Automatic Settings Section */ public static function css(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function css_minify(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function replaceImports(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function inlineStyle(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Exclude CSS Files section */ public static function excludeCss(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'file'); } public static function excludeCssComponents(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'extension'); } public static function excludeStyles(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'style'); } public static function excludeAllStyles(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Remove CSS Files section */ public static function remove_css(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'file'); } /* Custom CSS section */ public static function custom_css_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function custom_css(): void { ControlRenderer::render('textarea', __FUNCTION__, ''); } public static function mobile_css(): void { ControlRenderer::render('textarea', __FUNCTION__, ''); } public static function desktop_css(): void { ControlRenderer::render('textarea', __FUNCTION__, ''); } /* Optimize CSS Delivery Section */ public static function optimizeCssDelivery_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function pro_reduce_unused_css(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_dynamic_selectors(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'selectors', 'style'); } public static function dynamic_css_selectors(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'selectors', 'style'); } public static function critical_css_configure_helper(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } ## JavaScript Tab /* JavaScript Automatic Settings Section */ public static function javascript(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function js_minify(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function inlineScripts(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function bottom_js(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function loadAsynchronous(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Exclude JavaScript Files */ public static function excludeJs_peo(): void { $subfields = [ ['name' => 'ieo', 'type' => 'checkbox', 'header' => 'Ignore execution order',], ['name' => 'dontmove', 'type' => 'checkbox', 'header' => 'Don\'t move to bottom',] ]; ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'js', 'file', 'url', $subfields); } public static function excludeJsComponents_peo(): void { $subfields = [ ['name' => 'ieo', 'type' => 'checkbox', 'header' => 'Ignore execution order',], ['name' => 'dontmove', 'type' => 'checkbox', 'header' => 'Don\'t move to bottom',] ]; ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'js', 'extension', 'url', $subfields); } public static function excludeScripts_peo(): void { $subfields = [ ['name' => 'ieo', 'type' => 'checkbox', 'header' => 'Ignore execution order',], ['name' => 'dontmove', 'type' => 'checkbox', 'header' => 'Don\'t move to bottom',] ]; ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'js', 'script', 'script', $subfields); } public static function excludeAllScripts(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Remove JavaScript Files Section */ public static function remove_js(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'js', 'file'); } /* Reduce Unused JavaScript Section */ public static function pro_reduce_unused_js_enable(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_criticalJs(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'criticaljs', 'file'); } public static function pro_criticalScripts(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'js', 'script'); } public static function pro_criticalModules(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'modules', 'file'); } public static function pro_criticalModulesScripts(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'modulesScripts', 'script'); } public static function critical_js_configure_helper(): void { ControlRenderer::render('criticaljsmodalbutton.pro', __FUNCTION__, ''); } ## Page Cache Tab /* Page Cache Section */ public static function cache_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function pro_cache_platform(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function page_cache_exclude_form_users(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function page_cache_browser_caching(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function page_cache_lifetime(): void { $aOptions = [ '900' => __('15 min', 'jch-optimize'), '1800' => __('30 min', 'jch-optimize'), '3600' => __('1 hour', 'jch-optimize'), '10800' => __('3 hours', 'jch-optimize'), '21600' => __('6 hours', 'jch-optimize'), '43200' => __('12 hours', 'jch-optimize'), '86400' => __('1 day', 'jch-optimize'), '172800' => __('2 days', 'jch-optimize'), '604800' => __('1 week', 'jch-optimize') ]; ControlRenderer::render('select', __FUNCTION__, '900', $aOptions); } public static function cache_exclude(): void { //We're using class as the last argument to be able to include '?' in the multiselect box ControlRenderer::render('multiselect', __FUNCTION__, [], 'url', 'class'); } public static function page_cache_ignore_query_values(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'url', 'class'); } public static function pro_capture_cache_enable(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } /* Cloudflare Cache Purge Section */ public static function cf_enable(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function cf_api_token(): void { ControlRenderer::render('verifycftoken.pro', __FUNCTION__, ''); } public static function cf_zone_id(): void { ControlRenderer::render('text.pro', __FUNCTION__, ''); } public static function cf_mode_switcher_integration(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } ## Media Tab /* Add Image Attributes Section */ public static function img_attributes_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Sprite Generator Section */ public static function csg_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function csg_direction(): void { $aOptions = [ 'vertical' => __('vertical', 'jch-optimize'), 'horizontal' => __('horizontal', 'jch-optimize') ]; ControlRenderer::render('select', __FUNCTION__, 'vertical', $aOptions); } public static function csg_wrap_images(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function csg_exclude_images(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'images', 'file'); } public static function csg_include_images(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'images', 'file'); } /* Lazy Load Images Section */ public static function lazyload_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function pro_lazyload_iframe(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_lazyload_audiovideo(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_lazyload_bgimages(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function excludeLazyLoad(): void { ControlRenderer::render('multiselect', __FUNCTION__, [], 'lazyload', 'file'); } public static function pro_excludeLazyLoadFolders(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'folder'); } public static function pro_excludeLazyLoadClass(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'class'); } public static function includeLazyLoad(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file'); } public static function includeLazyLoadFolders(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'folder'); } public static function includeLazyLoadClass(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'class'); } ## Preloads Tab /* HTTP/2 Preload */ public static function http2_push_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function pro_http2_preload_modules(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function pro_http2_file_types(): void { $aOptions = [ 'style' => 'style', 'script' => 'script', 'font' => 'font', 'image' => 'image' ]; ControlRenderer::render('checkboxes', __FUNCTION__, array_keys($aOptions), $aOptions); } public static function pro_http2_include(): void { $subfields = [ [ 'name' => 'crossorigin', 'type' => 'select', 'header' => 'Crossorigin', 'options' => [ ['value' => '', 'text' => '- None -'], ['value' => 'anonymous', 'text' => 'anonymous'], ['value' => 'use-credentials', 'text' => 'use-credentials'], ], 'legacy' => ['anonymous', 'use-credentials'], 'class' => 'bg-white' ] /* ['name' => 'anonymous', 'type' => 'checkbox', 'header' => 'Crossorigin: \'anonymous\''], ['name' => 'use-credentials', 'type' => 'checkbox', 'header' => '\'use-credentials\''] */ ]; ControlRenderer::render( 'multiselectjs.pro', __FUNCTION__, [], 'http2', 'file', 'url', $subfields, 'only-one' ); } public static function pro_http2_exclude(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'http2', 'file'); } /* Largest Contentful Paint Images */ public static function pro_lcp_images_enable(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_lcp_images(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file'); } public static function pro_lcp_identifiers(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file'); } public static function lcp_images_mobile(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file'); } public static function lcp_images_desktop(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file'); } /* Optimize Fonts Section */ public static function pro_optimizeFonts_enable(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_force_swap_policy(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function pro_optimize_font_files(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'css', 'file'); } /* Preconnect Third-party */ public static function pro_preconnect_domains_enable(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_preconnect_domains(): void { $subfields = [ [ 'name' => 'crossorigin', 'type' => 'select', 'header' => 'Crossorigin', 'options' => [ ['value' => '', 'text' => '- None -'], ['value' => 'anonymous', 'text' => 'anonymous'], ['value' => 'use-credentials', 'text' => 'use-credentials'], ], 'legacy' => ['anonymous', 'use-credentials'], 'class' => 'bg-white' ], /* ['name' => 'anonymous', 'type' => 'checkbox', 'header' => 'Crossorigin: \'anonymous\''], ['name' => 'use-credentials', 'type' => 'checkbox', 'header' => '\'use-credentials\'']*/ ]; ControlRenderer::render( 'multiselectjs.pro', __FUNCTION__, [], 'origin', 'origin', 'url', $subfields, 'only-one' ); } public static function dns_prefetch_domains(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'origin', 'origin'); } ## CDN Tab /* CDN Section */ public static function cookielessdomain_enable(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } public static function cdn_scheme(): void { $aOptions = [ '0' => __('scheme relative', 'jch-optimize'), '1' => __('http', 'jch-optimize'), '2' => __('https', 'jch-optimize') ]; ControlRenderer::render('select', __FUNCTION__, '0', $aOptions); } public static function cookielessdomain(): void { ControlRenderer::render('text', __FUNCTION__, ''); } public static function staticfiles(): void { ControlRenderer::render('checkboxes', __FUNCTION__, array_keys(self::staticFilesArray()), self::staticFilesArray()); } /** * @return array */ private static function staticFilesArray(): array { return [ 'css' => 'css', 'png' => 'png', 'gif' => 'gif', 'ico' => 'ico', 'pdf' => 'pdf', 'js' => 'js', 'jpe?g' => 'jp(e)g', 'bmp' => 'bmp', 'webp' => 'webp', 'svg' => 'svg' ]; } public static function pro_customcdnextensions(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'url', 'file'); } public static function pro_cookielessdomain_2(): void { ControlRenderer::render('text.pro', __FUNCTION__, ''); } public static function pro_staticfiles_2(): void { ControlRenderer::render('checkboxes.pro', __FUNCTION__, array_keys(self::staticFilesArray()), self::staticFilesArray()); } public static function pro_cookielessdomain_3(): void { ControlRenderer::render('text.pro', __FUNCTION__, ''); } public static function pro_staticfiles_3(): void { ControlRenderer::render('checkboxes.pro', __FUNCTION__, array_keys(self::staticFilesArray()), self::staticFilesArray()); } ## Optimize Images Tab /* Global Options Section */ public static function ignore_optimized(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } /* Next Generation Images Section */ public static function pro_next_gen_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function gen_avif_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function load_avif_webp_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_web_old_browsers(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_load_webp_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function load_avif_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } /* Responsive Image Section */ public static function pro_gen_responsive_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '1'); } public static function pro_load_responsive_images(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function cropgravity(): void { if (JCH_PRO) { $subfields = [ [ 'name' => 'gravity', 'type' => 'select', 'header' => 'Position', 'options' => [ ['value' => 'West', 'text' => 'Left', 'selected' => false], ['value' => 'Center', 'text' => 'Center', 'selected' => true], ['value' => 'East', 'text' => 'Right', 'selected' => false], ], 'class' => 'bg-white' ], [ 'name' => 'cropwidth', 'type' => 'text', 'header' => 'Width (px)', 'defaultValue' => ResponsiveImages::$breakpoints[0], 'class' => 'small-text bg-white' ] ]; } else { $subfields = []; } ControlRenderer::render( 'multiselectjs.pro', __FUNCTION__, [], 'lazyload', 'file', 'url', $subfields ); } /* Optimization Configuration Section */ public static function lossy(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } public static function save_metadata(): void { ControlRenderer::render('switch', __FUNCTION__, '0'); } /* Upload Setting Section */ public static function pro_api_concurrency(): void { ControlRenderer::render('text.pro', __FUNCTION__, '2'); } public static function pro_api_num_files(): void { ControlRenderer::render('text.pro', __FUNCTION__, ''); } public static function pro_api_max_size(): void { ControlRenderer::render('text.pro', __FUNCTION__, '2M'); } public static function api_connection_timeout(): void { ControlRenderer::render('text.pro', __FUNCTION__, '30'); } /* Optimize Images By URLs Section */ public static function pro_api_resize_mode(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } /* Optimize Images By Folders Section */ public static function recursive(): void { ControlRenderer::render('switch', __FUNCTION__, '1'); } ## Miscellaneous Tab /* Reduce DOM Section */ public static function pro_reduce_dom(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } public static function pro_html_sections(): void { $options = [ 'header' => 'header', 'nav' => 'nav', 'main' => 'main', 'article' => 'article', 'section' => 'section', 'aside' => 'aside', 'footer' => 'footer', ]; ControlRenderer::render('checkboxes.pro', __FUNCTION__, array_keys($options), $options); } public static function reduce_dom_identifiers(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'reducedom', 'class'); } public static function reduce_dom_exclude_identifiers(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'reducedom', 'class'); } public static function reduce_dom_above_fold_identifiers(): void { ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'reducedom', 'class'); } /* Mode Switcher Menu Section */ public static function pro_disableModeSwitcher(): void { ControlRenderer::render('switch.pro', __FUNCTION__, '0'); } }