Plugin Directory

Changeset 3470504


Ignore:
Timestamp:
02/26/2026 04:30:18 PM (4 weeks ago)
Author:
quentinldd
Message:

Update to version 2.2.5 from GitHub

Location:
zenpress
Files:
100 edited
1 copied

Legend:

Unmodified
Added
Removed
  • zenpress/tags/2.2.5/assets/build/index.asset.php

    r3452689 r3470504  
    1 <?php return array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-notices'), 'version' => 'f3427795ee306bf33669');
     1<?php return array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-notices'), 'version' => 'e5c7f5bde89d8094a538');
  • zenpress/tags/2.2.5/assets/build/index.js

    r3452689 r3470504  
    1 (()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.domReady;var s=e.n(t);const n=window.wp.element,r=window.wp.apiFetch;var a=e.n(r);const i=window.wp.data,o=window.wp.notices,c=window.wp.i18n,l=[{key:"autoptimize",path:"/zenpress/v1/autoconfig/autoptimize",successMessage:(0,c.__)("Autoptimize has been configured.","zenpress"),errorMessage:(0,c.__)("Autoptimize autoconfig failed. Is Autoptimize installed and active?","zenpress"),buttonLabel:(0,c.__)("Setup Autoptimize","zenpress"),helpText:(0,c.__)("Apply recommended Autoptimize settings: Minify JS & CSS, aggregate CSS, static files, 404 fallbacks.","zenpress")},{key:"cache_enabler",path:"/zenpress/v1/autoconfig/cache-enabler",successMessage:(0,c.__)("Cache Enabler has been configured.","zenpress"),errorMessage:(0,c.__)("Cache Enabler autoconfig failed. Is Cache Enabler installed and active?","zenpress"),buttonLabel:(0,c.__)("Setup Cache Enabler","zenpress"),helpText:(0,c.__)("Apply recommended Cache Enabler settings: Clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS).","zenpress")},{key:"sqlite_object_cache",path:"/zenpress/v1/autoconfig/sqlite-object-cache",successMessage:(0,c.__)("SQLite Object Cache has been configured.","zenpress"),errorMessage:(0,c.__)("SQLite Object Cache autoconfig failed. Is SQLite Object Cache installed and active?","zenpress"),buttonLabel:(0,c.__)("Setup SQLite Object Cache","zenpress"),helpText:(0,c.__)('Apply recommended SQLite Object Cache settings. Enable "Use APCu" if APCu is available.',"zenpress")}],d=["core","gutenberg","woocommerce","ads-blocker","tools"];function p(e){return null==e||"string"!=typeof e?e:e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}const u=window.wp.components,b=window.ReactJSXRuntime,h=()=>{const{removeNotice:e}=(0,i.useDispatch)(o.store),t=(0,i.useSelect)(e=>e(o.store).getNotices(),[]);return t&&0!==t.length?(0,b.jsx)(u.NoticeList,{notices:t,onRemove:e}):null},g=(0,n.createContext)(),f=({selectedTabId:e,onSelect:t,orientation:s="horizontal",children:r})=>{const[a,i]=(0,n.useState)(),o=(0,n.useRef)(null),c=void 0!==e?e:a;return(0,b.jsx)(g.Provider,{value:{selectedTabId:c,onSelect:s=>{void 0===e&&i(s),t?.(s)},orientation:s,getOrderedTabIds:()=>o.current?Array.from(o.current.querySelectorAll('[role="tab"]')).map(e=>{const t=e.getAttribute("id");return t?t.replace("zenpress-tab-",""):null}).filter(Boolean):[],tabListRef:o},children:(0,b.jsx)("div",{className:`zenpress-tabs zenpress-tabs--${s}`,children:r})})};f.TabList=({children:e})=>{const{orientation:t,tabListRef:s}=(0,n.useContext)(g);return(0,b.jsx)("div",{ref:s,className:`zenpress-tabs__list zenpress-tabs__list--${t}`,role:"tablist","aria-orientation":t,children:e})},f.Tab=({tabId:e,title:t,className:s="",children:r})=>{const{selectedTabId:a,onSelect:i,orientation:o,getOrderedTabIds:c}=(0,n.useContext)(g),l=a===e,d=(0,n.useRef)(null);return(0,b.jsx)("button",{ref:d,className:`zenpress-tabs__tab ${l?"zenpress-tabs__tab--is-active":""} ${s}`.trim(),role:"tab","aria-selected":l,"aria-controls":`zenpress-tab-panel-${e}`,id:`zenpress-tab-${e}`,tabIndex:l?0:-1,onClick:()=>i(e),onKeyDown:t=>{const s=c();if(!s||0===s.length)return;const n=s.indexOf(e);if(-1===n)return;let r=n;if("vertical"===o?"ArrowDown"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowUp"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1):"ArrowRight"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowLeft"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1),"Home"===t.key?(t.preventDefault(),r=0):"End"===t.key&&(t.preventDefault(),r=s.length-1)," "===t.key||"Enter"===t.key)return t.preventDefault(),void i(e);if(r!==n&&r>=0&&r<s.length){const e=s[r],t=document.getElementById(`zenpress-tab-${e}`);t&&(t.focus(),i(e))}},onFocus:()=>{l||i(e)},children:t||r})},f.TabPanel=({tabId:e,children:t})=>{const{selectedTabId:s}=(0,n.useContext)(g),r=(0,n.useRef)(null),a=s===e;return(0,n.useEffect)(()=>{a&&r.current&&(0===r.current.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])').length?r.current.setAttribute("tabindex","0"):r.current.removeAttribute("tabindex"))},[a]),a?(0,b.jsx)("div",{ref:r,className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,children:t}):(0,b.jsx)("div",{className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,hidden:!0,children:t})};const m=({onClick:e,isBusy:t})=>(0,b.jsx)(u.Button,{variant:"primary",onClick:e,isBusy:t,__next40pxDefaultSize:!0,children:(0,c.__)("Save settings","zenpress")});function y({onEnableAll:e,onDisableAll:t,onSave:s,isSaving:n}){return(0,b.jsxs)("div",{className:"zenpress-actions",children:[(0,b.jsxs)("div",{className:"zenpress-actions-bulk",children:[(0,b.jsx)(u.Button,{variant:"tertiary",onClick:e,__next40pxDefaultSize:!0,children:(0,c.__)("Enable all actions","zenpress")}),(0,b.jsx)(u.Button,{isDestructive:!0,onClick:t,__next40pxDefaultSize:!0,children:(0,c.__)("Disable all actions","zenpress")})]}),(0,b.jsx)(m,{onClick:s,isBusy:n})]})}function _(){const e="undefined"!=typeof window?window.zenpressIntegrationsActive:null;return!e||"object"!=typeof e||Array.isArray(e)?{}:e}const z=({label:e,value:t,onChange:s,help:r})=>{const a=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>((e,t)=>{if(!e)return;const s=s=>{if("Enter"===s.key){const n=e.querySelector('input[type="checkbox"]'),r=e.ownerDocument||document;n&&(r.activeElement===n||e.contains(r.activeElement))&&(s.preventDefault(),s.stopPropagation(),t())}};return e.addEventListener("keydown",s),()=>{e.removeEventListener("keydown",s)}})(a.current,s),[s]),(0,b.jsx)("div",{ref:a,children:(0,b.jsx)(u.ToggleControl,{label:e,checked:t,onChange:s,help:r,__nextHasNoMarginBottom:!0})})};function v({subcategory:e,items:t,onToggle:s}){const n=e.toLowerCase().replace(/\s+/g,"-");return(0,b.jsxs)("div",{className:`zenpress-subcategory zenpress-subcategory-${n}`,children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:p(e)}),t.map(({name:e,data:t})=>(0,b.jsx)(z,{label:t.title||e,value:t?.["enable-snippet"]||!1,onChange:()=>s(e),help:t.description||""},e))]},e)}function x({integrationKey:e,buttonLabel:t,helpText:s,onClick:n,busyKey:r}){const a=r===e;return(0,b.jsxs)("div",{className:"zenpress-autoconfig-actions",children:[(0,b.jsx)(u.Button,{variant:"secondary",onClick:n,disabled:null!==r,__next40pxDefaultSize:!0,children:a?(0,c.__)("Applying…","zenpress"):t}),(0,b.jsx)("p",{className:"zenpress-autoconfig-help",children:s})]})}function j({adminBarEnabled:e,setAdminBarEnabled:t,autoconfigBusy:s,getAutoconfigHandler:n}){return(0,b.jsxs)("div",{className:"zenpress-subcategory zenpress-subcategory-integrations",children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:(0,c.__)("Integrations","zenpress")}),(0,b.jsx)(z,{label:(0,c.__)("Show ZenPress admin bar button","zenpress"),value:e,onChange:()=>t(!e),help:(0,c.__)('Show a ZenPress item in the admin bar with "Clear all caches" and sub-items for each active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, AutOptimize, or SQLite Object Cache is active. When enabled, those plugins\' own admin bar buttons are hidden.',"zenpress")}),l.filter(e=>_()[e.key]).map(e=>(0,b.jsx)(x,{integrationKey:e.key,buttonLabel:e.buttonLabel,helpText:e.helpText,onClick:n(e.key),busyKey:s},e.key))]})}function w({category:e,groupedSnippets:t,onToggle:s,showIntegrations:n=!1,adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:i,getAutoconfigHandler:o}){const c=Object.keys(t[e]||{}).sort();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("h2",{children:p(e)}),c.map(n=>(0,b.jsx)(v,{subcategory:n,items:t[e]?.[n]??[],onToggle:s},n)),n&&Object.values(_()).some(Boolean)&&(0,b.jsx)(j,{adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:i,getAutoconfigHandler:o})]})}function S({icon:e,title:t,description:s,presetId:n,onEnable:r}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("hr",{}),(0,b.jsxs)("h3",{children:[e," ",t]}),(0,b.jsx)("p",{children:s}),(0,b.jsx)(u.Button,{variant:"secondary",onClick:()=>r(n),__next40pxDefaultSize:!0,children:(0,c.__)("Enable","zenpress")})]})}const C=[{id:"corporate-website",icon:"🖼️",title:(0,c.__)("Corporate website","zenpress"),description:(0,c.__)("Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives.","zenpress")},{id:"blog",icon:"📰",title:(0,c.__)("Blog","zenpress"),description:(0,c.__)("Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds.","zenpress")},{id:"ecommerce",icon:"🛒",title:(0,c.__)("E-commerce","zenpress"),description:(0,c.__)("Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout.","zenpress")}];function E({onEnablePreset:e}){return(0,b.jsx)("div",{className:"zenpress-presets",children:(0,b.jsxs)("div",{className:"zenpress-presets-description",children:[(0,b.jsx)("h2",{children:(0,c.__)("Pick configuration preset","zenpress")}),(0,b.jsx)("p",{children:(0,c.__)("Don't know which features to enable? Quickly configure ZenPress by selecting a preset that matches your site type. Each preset enables optimized features for your specific use case.","zenpress")}),C.map(t=>(0,b.jsx)(S,{icon:t.icon,title:t.title,description:t.description,presetId:t.id,onEnable:e},t.id))]})})}const k=()=>{const{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:u,isSaving:g}=(()=>{const[e,t]=(0,n.useState)({}),[s,r]=(0,n.useState)(!1),[l,d]=(0,n.useState)(!1),{createSuccessNotice:p,createErrorNotice:u}=(0,i.useDispatch)(o.store);return(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{const s=await a()({path:"/wp/v2/settings"});if(e)return;const n=Array.isArray(s?.zenpress_active_snippets)?s.zenpress_active_snippets:[],i=window?.zenpressSnippetsMeta,o=i&&"object"==typeof i&&!Array.isArray(i)?i:{},c={};Object.keys(o).forEach(e=>{c[e]={...o[e],"enable-snippet":n.includes(e)}}),t(c),r(!0===s?.zenpress_admin_bar_enabled)}catch{e||u((0,c.__)("Failed to load settings.","zenpress"))}})(),()=>{e=!0}},[u]),{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:async()=>{d(!0);const t=Object.keys(e).filter(t=>e[t]?.["enable-snippet"]);try{await a()({path:"/wp/v2/settings",method:"POST",data:{zenpress_active_snippets:t,zenpress_admin_bar_enabled:s}}),p((0,c.__)("Settings saved.","zenpress"))}catch{u((0,c.__)("Failed to save settings.","zenpress"))}finally{d(!1)}},isSaving:l}})(),{autoconfigBusy:m,getHandler:_}=function(){const[e,t]=(0,n.useState)(null),{createSuccessNotice:s,createErrorNotice:r}=(0,i.useDispatch)(o.store),c=async(e,n,i,o)=>{if("string"==typeof n&&n.startsWith("/")){t(e);try{const e=await a()({path:n,method:"POST"});s(e?.message||i)}catch{r(o)}finally{t(null)}}else r(o)};return{autoconfigBusy:e,runAutoconfig:c,getHandler:e=>{const t=l.find(t=>t.key===e);return t?()=>c(t.key,t.path,t.successMessage,t.errorMessage):()=>{}}}}(),[z,v]=(0,n.useState)(),{grouped:x,sortedCategories:j}=(0,n.useMemo)(()=>function(e){const t={};if(!e||"object"!=typeof e||Array.isArray(e))return{grouped:t,sortedCategories:[]};Object.keys(e).forEach(s=>{const n=e[s],r=(n?.category||(0,c.__)("Uncategorized","zenpress")).toLowerCase(),a=(n?.subcategory||(0,c.__)("uncategorized","zenpress")).toLowerCase();t[r]||(t[r]={}),t[r][a]||(t[r][a]=[]),t[r][a].push({name:s,data:n})});const s=Object.keys(t).sort((e,t)=>{const s=d.indexOf(e.toLowerCase()),n=d.indexOf(t.toLowerCase());return-1!==s&&-1!==n?s-n:-1!==s?-1:-1!==n?1:e.localeCompare(t,void 0,{sensitivity:"base"})});return{grouped:t,sortedCategories:s}}(e),[e]),S=e=>{t(t=>({...t,[e]:{...t[e],"enable-snippet":!t[e]?.["enable-snippet"]}}))};return(0,n.useEffect)(()=>{!z&&j.length>0&&v(j[0])},[z,j]),(0,n.useEffect)(()=>{const e=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),g||u())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[u,g]),(0,b.jsxs)("article",{className:"zenpress-row",children:[(0,b.jsxs)("section",{className:"zenpress-main",children:[(0,b.jsx)("div",{className:"zenpress-notices",children:(0,b.jsx)(h,{})}),(0,b.jsxs)("div",{className:"zenpress-panel",children:[(0,b.jsxs)(f,{orientation:"vertical",selectedTabId:z,onSelect:v,children:[(0,b.jsx)(f.TabList,{children:j.map(e=>{const t=`zenpress-tabs__tab--category-${e.toLowerCase().replace(/\s+/g,"-")}`;return(0,b.jsx)(f.Tab,{tabId:e,title:p(e),className:t,children:p(e)},e)})}),j.map(e=>(0,b.jsx)(f.TabPanel,{tabId:e,children:(0,b.jsx)(w,{category:e,groupedSnippets:x,onToggle:S,showIntegrations:"tools"===e,adminBarEnabled:s,setAdminBarEnabled:r,autoconfigBusy:m,getAutoconfigHandler:_})},e))]}),(0,b.jsx)(y,{onEnableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!0}}),t})},onDisableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!1}}),t})},onSave:u,isSaving:g})]})]}),(0,b.jsx)("aside",{className:"zenpress-sidebar",children:(0,b.jsx)(E,{onEnablePreset:e=>{t(t=>{const s={};return Object.entries(t).forEach(([t,n])=>{const r=(Array.isArray(n?.preset)?n.preset:[]).includes(e);s[t]={...n,"enable-snippet":r}}),s})}})})]})};s()(()=>{const e=document.getElementById("zenpress-settings");e&&e instanceof HTMLElement&&(0,n.createRoot)(e).render((0,b.jsx)(k,{}))})})();
     1(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.domReady;var s=e.n(t);const n=window.wp.element,r=window.wp.apiFetch;var a=e.n(r);const o=window.wp.data,i=window.wp.notices,c=window.wp.i18n,l=[{key:"autoptimize",path:"/zenpress/v1/autoconfig/autoptimize",successMessage:(0,c.__)("Autoptimize configured.","zenpress"),errorMessage:(0,c.__)("Autoptimize setup failed. Is Autoptimize installed and active?","zenpress"),buttonLabel:(0,c.__)("Set up Autoptimize","zenpress"),helpText:(0,c.__)("Apply recommended settings: minify JS and CSS, combine CSS, static file caching, 404 fallbacks.","zenpress")},{key:"cache_enabler",path:"/zenpress/v1/autoconfig/cache-enabler",successMessage:(0,c.__)("Cache Enabler configured.","zenpress"),errorMessage:(0,c.__)("Cache Enabler setup failed. Is Cache Enabler installed and active?","zenpress"),buttonLabel:(0,c.__)("Set up Cache Enabler","zenpress"),helpText:(0,c.__)("Apply recommended settings: clear cache on content changes, WebP, compression, minify HTML.","zenpress")},{key:"sqlite_object_cache",path:"/zenpress/v1/autoconfig/sqlite-object-cache",successMessage:(0,c.__)("SQLite Object Cache configured.","zenpress"),errorMessage:(0,c.__)("SQLite Object Cache setup failed. Is it installed and active?","zenpress"),buttonLabel:(0,c.__)("Set up SQLite Object Cache","zenpress"),helpText:(0,c.__)('Apply recommended settings. Enable "Use APCu" in the plugin if available.',"zenpress")}],p=["core","gutenberg","woocommerce","ads-blocker","tools"];function d(e){return null==e||"string"!=typeof e?e:e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}const u=window.wp.components,b=window.ReactJSXRuntime,h=()=>{const{removeNotice:e}=(0,o.useDispatch)(i.store),t=(0,o.useSelect)(e=>e(i.store).getNotices(),[]);return t&&0!==t.length?(0,b.jsx)(u.NoticeList,{notices:t,onRemove:e}):null},g=(0,n.createContext)(),f=({selectedTabId:e,onSelect:t,orientation:s="horizontal",children:r})=>{const[a,o]=(0,n.useState)(),i=(0,n.useRef)(null),c=void 0!==e?e:a;return(0,b.jsx)(g.Provider,{value:{selectedTabId:c,onSelect:s=>{void 0===e&&o(s),t?.(s)},orientation:s,getOrderedTabIds:()=>i.current?Array.from(i.current.querySelectorAll('[role="tab"]')).map(e=>{const t=e.getAttribute("id");return t?t.replace("zenpress-tab-",""):null}).filter(Boolean):[],tabListRef:i},children:(0,b.jsx)("div",{className:`zenpress-tabs zenpress-tabs--${s}`,children:r})})};f.TabList=({children:e})=>{const{orientation:t,tabListRef:s}=(0,n.useContext)(g);return(0,b.jsx)("div",{ref:s,className:`zenpress-tabs__list zenpress-tabs__list--${t}`,role:"tablist","aria-orientation":t,children:e})},f.Tab=({tabId:e,title:t,className:s="",children:r})=>{const{selectedTabId:a,onSelect:o,orientation:i,getOrderedTabIds:c}=(0,n.useContext)(g),l=a===e,p=(0,n.useRef)(null);return(0,b.jsx)("button",{ref:p,className:`zenpress-tabs__tab ${l?"zenpress-tabs__tab--is-active":""} ${s}`.trim(),role:"tab","aria-selected":l,"aria-controls":`zenpress-tab-panel-${e}`,id:`zenpress-tab-${e}`,tabIndex:l?0:-1,onClick:()=>o(e),onKeyDown:t=>{const s=c();if(!s||0===s.length)return;const n=s.indexOf(e);if(-1===n)return;let r=n;if("vertical"===i?"ArrowDown"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowUp"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1):"ArrowRight"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowLeft"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1),"Home"===t.key?(t.preventDefault(),r=0):"End"===t.key&&(t.preventDefault(),r=s.length-1)," "===t.key||"Enter"===t.key)return t.preventDefault(),void o(e);if(r!==n&&r>=0&&r<s.length){const e=s[r],t=document.getElementById(`zenpress-tab-${e}`);t&&(t.focus(),o(e))}},onFocus:()=>{l||o(e)},children:t||r})},f.TabPanel=({tabId:e,children:t})=>{const{selectedTabId:s}=(0,n.useContext)(g),r=(0,n.useRef)(null),a=s===e;return(0,n.useEffect)(()=>{a&&r.current&&(0===r.current.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])').length?r.current.setAttribute("tabindex","0"):r.current.removeAttribute("tabindex"))},[a]),a?(0,b.jsx)("div",{ref:r,className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,children:t}):(0,b.jsx)("div",{className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,hidden:!0,children:t})};const m=({onClick:e,isBusy:t})=>(0,b.jsx)(u.Button,{variant:"primary",onClick:e,isBusy:t,__next40pxDefaultSize:!0,children:(0,c.__)("Save","zenpress")});function y({onEnableAll:e,onDisableAll:t,onSave:s,isSaving:n}){return(0,b.jsxs)("div",{className:"zenpress-actions",children:[(0,b.jsxs)("div",{className:"zenpress-actions-bulk",children:[(0,b.jsx)(u.Button,{variant:"tertiary",onClick:e,__next40pxDefaultSize:!0,children:(0,c.__)("Enable all","zenpress")}),(0,b.jsx)(u.Button,{isDestructive:!0,onClick:t,__next40pxDefaultSize:!0,children:(0,c.__)("Disable all","zenpress")})]}),(0,b.jsx)(m,{onClick:s,isBusy:n})]})}function _(){const e="undefined"!=typeof window?window.zenpressIntegrationsActive:null;return!e||"object"!=typeof e||Array.isArray(e)?{}:e}const z=({label:e,value:t,onChange:s,help:r})=>{const a=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>((e,t)=>{if(!e)return;const s=s=>{if("Enter"===s.key){const n=e.querySelector('input[type="checkbox"]'),r=e.ownerDocument||document;n&&(r.activeElement===n||e.contains(r.activeElement))&&(s.preventDefault(),s.stopPropagation(),t())}};return e.addEventListener("keydown",s),()=>{e.removeEventListener("keydown",s)}})(a.current,s),[s]),(0,b.jsx)("div",{ref:a,children:(0,b.jsx)(u.ToggleControl,{label:e,checked:t,onChange:s,help:r,__nextHasNoMarginBottom:!0})})};function v({subcategory:e,items:t,onToggle:s}){const n=e.toLowerCase().replace(/\s+/g,"-");return(0,b.jsxs)("div",{className:`zenpress-subcategory zenpress-subcategory-${n}`,children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:d(e)}),t.map(({name:e,data:t})=>(0,b.jsx)(z,{label:t.title||e,value:t?.["enable-snippet"]||!1,onChange:()=>s(e),help:t.description||""},e))]},e)}function x({integrationKey:e,buttonLabel:t,helpText:s,onClick:n,busyKey:r}){const a=r===e;return(0,b.jsxs)("div",{className:"zenpress-autoconfig-actions",children:[(0,b.jsx)(u.Button,{variant:"secondary",onClick:n,disabled:null!==r,__next40pxDefaultSize:!0,children:a?(0,c.__)("Applying…","zenpress"):t}),(0,b.jsx)("p",{className:"zenpress-autoconfig-help",children:s})]})}function j({adminBarEnabled:e,setAdminBarEnabled:t,autoconfigBusy:s,getAutoconfigHandler:n}){return(0,b.jsxs)("div",{className:"zenpress-subcategory zenpress-subcategory-integrations",children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:(0,c.__)("Integrations","zenpress")}),(0,b.jsx)(z,{label:(0,c.__)("Show cache actions in admin bar","zenpress"),value:e,onChange:()=>t(!e),help:(0,c.__)('Adds a ZenPress menu to the admin bar with "Clear all caches" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins\' own admin bar buttons.',"zenpress")}),l.filter(e=>_()[e.key]).map(e=>(0,b.jsx)(x,{integrationKey:e.key,buttonLabel:e.buttonLabel,helpText:e.helpText,onClick:n(e.key),busyKey:s},e.key))]})}function w({category:e,groupedSnippets:t,onToggle:s,showIntegrations:n=!1,adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:o,getAutoconfigHandler:i}){const c=Object.keys(t[e]||{}).sort();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("h2",{children:d(e)}),c.map(n=>(0,b.jsx)(v,{subcategory:n,items:t[e]?.[n]??[],onToggle:s},n)),n&&Object.values(_()).some(Boolean)&&(0,b.jsx)(j,{adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:o,getAutoconfigHandler:i})]})}function S({icon:e,title:t,description:s,presetId:n,onEnable:r}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("hr",{}),(0,b.jsxs)("h3",{children:[e," ",t]}),(0,b.jsx)("p",{children:s}),(0,b.jsx)(u.Button,{variant:"secondary",onClick:()=>r(n),__next40pxDefaultSize:!0,children:(0,c.__)("Apply preset","zenpress")})]})}const E=[{id:"corporate-website",icon:"🖼️",title:(0,c.__)("Corporate website","zenpress"),description:(0,c.__)("For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives.","zenpress")},{id:"blog",icon:"📰",title:(0,c.__)("Blog","zenpress"),description:(0,c.__)("For content-focused blogs. Keeps RSS and other blog features while improving performance and security.","zenpress")},{id:"ecommerce",icon:"🛒",title:(0,c.__)("E-commerce","zenpress"),description:(0,c.__)("For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout.","zenpress")}];function A({onEnablePreset:e}){return(0,b.jsx)("div",{className:"zenpress-presets",children:(0,b.jsxs)("div",{className:"zenpress-presets-description",children:[(0,b.jsx)("h2",{children:(0,c.__)("Choose a preset","zenpress")}),(0,b.jsx)("p",{children:(0,c.__)("Not sure what to enable? Choose a preset that matches your site. Each preset turns on a set of features for that type of site.","zenpress")}),E.map(t=>(0,b.jsx)(S,{icon:t.icon,title:t.title,description:t.description,presetId:t.id,onEnable:e},t.id))]})})}const C=()=>{const{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:u,isSaving:g}=(()=>{const[e,t]=(0,n.useState)({}),[s,r]=(0,n.useState)(!1),[l,p]=(0,n.useState)(!1),{createSuccessNotice:d,createErrorNotice:u}=(0,o.useDispatch)(i.store);return(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{const s=await a()({path:"/wp/v2/settings"});if(e)return;const n=Array.isArray(s?.zenpress_active_snippets)?s.zenpress_active_snippets:[],o=window?.zenpressSnippetsMeta,i=o&&"object"==typeof o&&!Array.isArray(o)?o:{},c={};Object.keys(i).forEach(e=>{c[e]={...i[e],"enable-snippet":n.includes(e)}}),t(c),r(!0===s?.zenpress_admin_bar_enabled)}catch{e||u((0,c.__)("Settings could not be loaded. Refresh the page.","zenpress"))}})(),()=>{e=!0}},[u]),{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:async()=>{p(!0);const t=Object.keys(e).filter(t=>e[t]?.["enable-snippet"]);try{await a()({path:"/wp/v2/settings",method:"POST",data:{zenpress_active_snippets:t,zenpress_admin_bar_enabled:s}}),d((0,c.__)("Settings saved.","zenpress"))}catch{u((0,c.__)("Settings could not be saved. Try again.","zenpress"))}finally{p(!1)}},isSaving:l}})(),{autoconfigBusy:m,getHandler:_}=function(){const[e,t]=(0,n.useState)(null),{createSuccessNotice:s,createErrorNotice:r}=(0,o.useDispatch)(i.store),c=async(e,n,o,i)=>{if("string"==typeof n&&n.startsWith("/")){t(e);try{const e=await a()({path:n,method:"POST"});s(e?.message||o)}catch{r(i)}finally{t(null)}}else r(i)};return{autoconfigBusy:e,runAutoconfig:c,getHandler:e=>{const t=l.find(t=>t.key===e);return t?()=>c(t.key,t.path,t.successMessage,t.errorMessage):()=>{}}}}(),[z,v]=(0,n.useState)(),{grouped:x,sortedCategories:j}=(0,n.useMemo)(()=>function(e){const t={};if(!e||"object"!=typeof e||Array.isArray(e))return{grouped:t,sortedCategories:[]};Object.keys(e).forEach(s=>{const n=e[s],r=(n?.category||(0,c.__)("Uncategorized","zenpress")).toLowerCase(),a=(n?.subcategory||(0,c.__)("Uncategorized","zenpress")).toLowerCase();t[r]||(t[r]={}),t[r][a]||(t[r][a]=[]),t[r][a].push({name:s,data:n})});const s=Object.keys(t).sort((e,t)=>{const s=p.indexOf(e.toLowerCase()),n=p.indexOf(t.toLowerCase());return-1!==s&&-1!==n?s-n:-1!==s?-1:-1!==n?1:e.localeCompare(t,void 0,{sensitivity:"base"})});return{grouped:t,sortedCategories:s}}(e),[e]),S=e=>{t(t=>({...t,[e]:{...t[e],"enable-snippet":!t[e]?.["enable-snippet"]}}))};return(0,n.useEffect)(()=>{!z&&j.length>0&&v(j[0])},[z,j]),(0,n.useEffect)(()=>{const e=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),g||u())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[u,g]),(0,b.jsxs)("article",{className:"zenpress-row",children:[(0,b.jsxs)("section",{className:"zenpress-main",children:[(0,b.jsx)("div",{className:"zenpress-notices",children:(0,b.jsx)(h,{})}),(0,b.jsxs)("div",{className:"zenpress-panel",children:[(0,b.jsxs)(f,{orientation:"vertical",selectedTabId:z,onSelect:v,children:[(0,b.jsx)(f.TabList,{children:j.map(e=>{const t=`zenpress-tabs__tab--category-${e.toLowerCase().replace(/\s+/g,"-")}`;return(0,b.jsx)(f.Tab,{tabId:e,title:d(e),className:t,children:d(e)},e)})}),j.map(e=>(0,b.jsx)(f.TabPanel,{tabId:e,children:(0,b.jsx)(w,{category:e,groupedSnippets:x,onToggle:S,showIntegrations:"tools"===e,adminBarEnabled:s,setAdminBarEnabled:r,autoconfigBusy:m,getAutoconfigHandler:_})},e))]}),(0,b.jsx)(y,{onEnableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!0}}),t})},onDisableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!1}}),t})},onSave:u,isSaving:g})]})]}),(0,b.jsx)("aside",{className:"zenpress-sidebar",children:(0,b.jsx)(A,{onEnablePreset:e=>{t(t=>{const s={};return Object.entries(t).forEach(([t,n])=>{const r=(Array.isArray(n?.preset)?n.preset:[]).includes(e);s[t]={...n,"enable-snippet":r}}),s})}})})]})};s()(()=>{const e=document.getElementById("zenpress-settings");e&&e instanceof HTMLElement&&(0,n.createRoot)(e).render((0,b.jsx)(C,{}))})})();
  • zenpress/tags/2.2.5/assets/src/js/components/BulkSnippetActions.js

    r3452689 r3470504  
    2727                    __next40pxDefaultSize
    2828                >
    29                     {__('Enable all actions', 'zenpress')}
     29                    {__('Enable all', 'zenpress')}
    3030                </Button>
    3131                <Button
     
    3434                    __next40pxDefaultSize
    3535                >
    36                     {__('Disable all actions', 'zenpress')}
     36                    {__('Disable all', 'zenpress')}
    3737                </Button>
    3838            </div>
  • zenpress/tags/2.2.5/assets/src/js/components/IntegrationsBlock.js

    r3452689 r3470504  
    2626            <h3>{__('Integrations', 'zenpress')}</h3>
    2727            <SnippetToggleControl
    28                 label={__('Show ZenPress admin bar button', 'zenpress')}
     28                label={__('Show cache actions in admin bar', 'zenpress')}
    2929                value={adminBarEnabled}
    3030                onChange={() => setAdminBarEnabled(!adminBarEnabled)}
    3131                help={__(
    32                     'Show a ZenPress item in the admin bar with "Clear all caches" and sub-items for each active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, AutOptimize, or SQLite Object Cache is active. When enabled, those plugins\' own admin bar buttons are hidden.',
     32                    'Adds a ZenPress menu to the admin bar with "Clear all caches" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins\' own admin bar buttons.',
    3333                    'zenpress'
    3434                )}
  • zenpress/tags/2.2.5/assets/src/js/components/PresetCard.js

    r3452689 r3470504  
    2626                __next40pxDefaultSize
    2727            >
    28                 {__('Enable', 'zenpress')}
     28                {__('Apply preset', 'zenpress')}
    2929            </Button>
    3030        </>
  • zenpress/tags/2.2.5/assets/src/js/components/PresetsSidebar.js

    r3452689 r3470504  
    88        title: __('Corporate website', 'zenpress'),
    99        description: __(
    10             'Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives.',
     10            'For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives.',
    1111            'zenpress'
    1212        ),
     
    1717        title: __('Blog', 'zenpress'),
    1818        description: __(
    19             'Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds.',
     19            'For content-focused blogs. Keeps RSS and other blog features while improving performance and security.',
    2020            'zenpress'
    2121        ),
     
    2626        title: __('E-commerce', 'zenpress'),
    2727        description: __(
    28             'Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout.',
     28            'For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout.',
    2929            'zenpress'
    3030        ),
     
    4343        <div className="zenpress-presets">
    4444            <div className="zenpress-presets-description">
    45                 <h2>{__('Pick configuration preset', 'zenpress')}</h2>
     45                <h2>{__('Choose a preset', 'zenpress')}</h2>
    4646                <p>
    4747                    {__(
    48                         "Don't know which features to enable? Quickly configure ZenPress by selecting a preset that matches your site type. Each preset enables optimized features for your specific use case.",
     48                        'Not sure what to enable? Choose a preset that matches your site. Each preset turns on a set of features for that type of site.',
    4949                        'zenpress'
    5050                    )}
  • zenpress/tags/2.2.5/assets/src/js/components/SaveButton.js

    r3448585 r3470504  
    1818            __next40pxDefaultSize
    1919        >
    20             {__('Save settings', 'zenpress')}
     20            {__('Save', 'zenpress')}
    2121        </Button>
    2222    );
  • zenpress/tags/2.2.5/assets/src/js/config/integrations.js

    r3452689 r3470504  
    99        key: 'autoptimize',
    1010        path: '/zenpress/v1/autoconfig/autoptimize',
    11         successMessage: __('Autoptimize has been configured.', 'zenpress'),
     11        successMessage: __('Autoptimize configured.', 'zenpress'),
    1212        errorMessage: __(
    13             'Autoptimize autoconfig failed. Is Autoptimize installed and active?',
     13            'Autoptimize setup failed. Is Autoptimize installed and active?',
    1414            'zenpress'
    1515        ),
    16         buttonLabel: __('Setup Autoptimize', 'zenpress'),
     16        buttonLabel: __('Set up Autoptimize', 'zenpress'),
    1717        helpText: __(
    18             'Apply recommended Autoptimize settings: Minify JS & CSS, aggregate CSS, static files, 404 fallbacks.',
     18            'Apply recommended settings: minify JS and CSS, combine CSS, static file caching, 404 fallbacks.',
    1919            'zenpress'
    2020        ),
     
    2323        key: 'cache_enabler',
    2424        path: '/zenpress/v1/autoconfig/cache-enabler',
    25         successMessage: __('Cache Enabler has been configured.', 'zenpress'),
     25        successMessage: __('Cache Enabler configured.', 'zenpress'),
    2626        errorMessage: __(
    27             'Cache Enabler autoconfig failed. Is Cache Enabler installed and active?',
     27            'Cache Enabler setup failed. Is Cache Enabler installed and active?',
    2828            'zenpress'
    2929        ),
    30         buttonLabel: __('Setup Cache Enabler', 'zenpress'),
     30        buttonLabel: __('Set up Cache Enabler', 'zenpress'),
    3131        helpText: __(
    32             'Apply recommended Cache Enabler settings: Clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS).',
     32            'Apply recommended settings: clear cache on content changes, WebP, compression, minify HTML.',
    3333            'zenpress'
    3434        ),
     
    3737        key: 'sqlite_object_cache',
    3838        path: '/zenpress/v1/autoconfig/sqlite-object-cache',
    39         successMessage: __(
    40             'SQLite Object Cache has been configured.',
     39        successMessage: __('SQLite Object Cache configured.', 'zenpress'),
     40        errorMessage: __(
     41            'SQLite Object Cache setup failed. Is it installed and active?',
    4142            'zenpress'
    4243        ),
    43         errorMessage: __(
    44             'SQLite Object Cache autoconfig failed. Is SQLite Object Cache installed and active?',
    45             'zenpress'
    46         ),
    47         buttonLabel: __('Setup SQLite Object Cache', 'zenpress'),
     44        buttonLabel: __('Set up SQLite Object Cache', 'zenpress'),
    4845        helpText: __(
    49             'Apply recommended SQLite Object Cache settings. Enable "Use APCu" if APCu is available.',
     46            'Apply recommended settings. Enable "Use APCu" in the plugin if available.',
    5047            'zenpress'
    5148        ),
  • zenpress/tags/2.2.5/assets/src/js/hooks/useSettings.js

    r3452689 r3470504  
    5656                if (!cancelled) {
    5757                    createErrorNotice(
    58                         __('Failed to load settings.', 'zenpress')
     58                        __(
     59                            'Settings could not be loaded. Refresh the page.',
     60                            'zenpress'
     61                        )
    5962                    );
    6063                }
     
    8588            createSuccessNotice(__('Settings saved.', 'zenpress'));
    8689        } catch {
    87             createErrorNotice(__('Failed to save settings.', 'zenpress'));
     90            createErrorNotice(
     91                __('Settings could not be saved. Try again.', 'zenpress')
     92            );
    8893        } finally {
    8994            setIsSaving(false);
  • zenpress/tags/2.2.5/assets/src/js/utils/snippets.js

    r3452689 r3470504  
    4444        ).toLowerCase();
    4545        const subcategory = (
    46             snippet?.subcategory || __('uncategorized', 'zenpress')
     46            snippet?.subcategory || __('Uncategorized', 'zenpress')
    4747        ).toLowerCase();
    4848
  • zenpress/tags/2.2.5/inc/admin/links.php

    r3452689 r3470504  
    1717        '<a href="%s" aria-label="%s">%s</a>',
    1818        esc_url($url),
    19         esc_attr__('Go to ZenPress settings page', 'zenpress'),
     19        esc_attr__('Go to ZenPress settings', 'zenpress'),
    2020        esc_html__('Settings', 'zenpress')
    2121    );
     
    3838                '<a href="%s" target="_blank" rel="noopener noreferrer" aria-label="%s">%s</a>',
    3939                esc_url('https://wordpress.org/plugins/zenpress/#developers'),
    40                 esc_attr__('View ZenPress changelog on WordPress.org (opens in a new tab)', 'zenpress'),
     40                esc_attr__('View ZenPress changelog on WordPress.org (opens in new tab)', 'zenpress'),
    4141                esc_html__('Changelog', 'zenpress')
    4242            ),
     
    4444                '<a href="%s" target="_blank" rel="noopener noreferrer" aria-label="%s">%s</a>',
    4545                esc_url('https://holdmywp.com/zenpress/'),
    46                 esc_attr__('Read ZenPress documentation (opens in a new tab)', 'zenpress'),
    47                 esc_html__('Docs', 'zenpress')
     46                esc_attr__('Read ZenPress documentation (opens in new tab)', 'zenpress'),
     47                esc_html__('Documentation', 'zenpress')
    4848            ),
    4949            sprintf(
    5050                '<a href="%s" target="_blank" rel="noopener noreferrer" aria-label="%s">%s</a>',
    5151                esc_url('https://buymeacoffee.com/quentinld'),
    52                 esc_attr__('Support ZenPress by buying a coffee (opens in a new tab)', 'zenpress'),
    53                 esc_html__('Support ☕', 'zenpress')
     52                esc_attr__('Support ZenPress: Buy me a coffee (opens in new tab)', 'zenpress'),
     53                esc_html__('Support', 'zenpress')
    5454            )
    5555        ];
  • zenpress/tags/2.2.5/inc/admin/menu.php

    r3451904 r3470504  
    1111function zenpress_add_option_page(): void {
    1212    add_options_page(
    13         __('ZenPress options', 'zenpress'),
     13        __('Settings', 'zenpress'),
    1414        __('ZenPress', 'zenpress'),
    1515        'manage_options',
     
    3636                           target="_blank"
    3737                           rel="noopener noreferrer"
    38                            aria-label="<?php echo esc_attr__('View ZenPress changelog on WordPress.org (opens in a new tab)', 'zenpress'); ?>">
    39                             <?php echo esc_html__('What\'s new ?', 'zenpress'); ?>
     38                           aria-label="<?php echo esc_attr__('View ZenPress changelog on WordPress.org (opens in new tab)', 'zenpress'); ?>">
     39                            <?php echo esc_html__('What\'s new', 'zenpress'); ?>
    4040                        </a>
    4141                    </p>
     
    4646                   target="_blank"
    4747                   rel="noopener noreferrer"
    48                    aria-label="<?php echo esc_attr__('Read the ZenPress documentation (opens in a new tab)', 'zenpress'); ?>">
     48                   aria-label="<?php echo esc_attr__('Read ZenPress documentation (opens in new tab)', 'zenpress'); ?>">
    4949                    <?php echo esc_html__('Documentation', 'zenpress'); ?>
    5050                </a>
     
    5252                   target="_blank"
    5353                   rel="noopener noreferrer"
    54                    aria-label="<?php echo esc_attr__('Leave a review for ZenPress on WordPress.org (opens in a new tab)', 'zenpress'); ?>">
    55                     <?php echo esc_html__('Leave a review (helps a lot)', 'zenpress'); ?>
     54                   aria-label="<?php echo esc_attr__('Leave a review for ZenPress on WordPress.org (opens in new tab)', 'zenpress'); ?>">
     55                    <?php echo esc_html__('Leave a review', 'zenpress'); ?>
    5656                </a>
    5757                <a href="https://buymeacoffee.com/quentinld"
     
    5959                   rel="noopener noreferrer"
    6060                   class="components-button is-next-40px-default-size is-tertiary"
    61                    aria-label="<?php echo esc_attr__('Support development: Buy me a coffee (opens in a new tab)', 'zenpress'); ?>">
     61                   aria-label="<?php echo esc_attr__('Support development: Buy me a coffee (opens in new tab)', 'zenpress'); ?>">
    6262                    <?php echo esc_html__('Buy me a coffee', 'zenpress'); ?> <span aria-hidden="true">☕</span>
    6363                </a>
     
    6868                <div class="zenpress-loading-body">
    6969                    <p class="zenpress-loading-text">
    70                         <?php echo esc_html__('Loading your ZenPress settings…', 'zenpress'); ?>
     70                        <?php echo esc_html__('Loading settings…', 'zenpress'); ?>
    7171                    </p>
    7272                </div>
     
    7575        <footer class="zenpress-footer">
    7676            <div class="zenpress-footer-title">
    77                 <p>
    78                     <?php echo esc_html__('Made ', 'zenpress'); ?>
    79                     <span aria-hidden="true"> x ❤️ </span>
    80                     <?php echo esc_html__(' by Quentin Le Duff - Your WordPress Partner', 'zenpress'); ?>
    81                 </p>
     77            <?php
     78                    echo wp_kses_post(sprintf(
     79                        /* translators: 1: decorative heart emoji, 2: author name */
     80                        __('Made with %1$s by %2$s', 'zenpress'),
     81                        '<span aria-hidden="true">❤️</span>',
     82                        'Quentin Le Duff'
     83                    ));
     84    ?>
    8285            </div>
    8386            <div class="zenpress-footer-navigation">
     
    8588                   target="_blank"
    8689                   rel="noopener noreferrer"
    87                    aria-label="<?php echo esc_attr__('Visite the developper website', 'zenpress'); ?>">
    88                     <?php echo esc_html__('My place', 'zenpress'); ?>
     90                   aria-label="<?php echo esc_attr__('Visit the developer website (opens in new tab)', 'zenpress'); ?>">
     91                    <?php echo esc_html__('Developer website', 'zenpress'); ?>
    8992                </a>
    9093                <a href="https://github.com/quentin-ld/zenpress"
    9194                   target="_blank"
    9295                   rel="noopener noreferrer"
    93                    aria-label="<?php echo esc_attr__('Review the code on Github', 'zenpress'); ?>">
    94                     <?php echo esc_html__('ZenPress code repository', 'zenpress'); ?>
     96                   aria-label="<?php echo esc_attr__('View ZenPress source code on GitHub (opens in new tab)', 'zenpress'); ?>">
     97                    <?php echo esc_html__('Source code', 'zenpress'); ?>
    9598                </a>
    9699            </div>
  • zenpress/tags/2.2.5/inc/classes/integrations.php

    r3452689 r3470504  
    134134        return self::run_rest_autoconfig(
    135135            [ZenPress_Autoptimize::class, 'autoconfig'],
    136             __('Autoptimize has been configured.', 'zenpress'),
     136            __('Autoptimize configured.', 'zenpress'),
    137137            __('Autoptimize configuration failed.', 'zenpress')
    138138        );
     
    145145        return self::run_rest_autoconfig(
    146146            [ZenPress_Cache_Enabler::class, 'autoconfig'],
    147             __('Cache Enabler has been configured.', 'zenpress'),
     147            __('Cache Enabler configured.', 'zenpress'),
    148148            __('Cache Enabler configuration failed.', 'zenpress')
    149149        );
     
    156156        return self::run_rest_autoconfig(
    157157            [ZenPress_Sqlite_Object_Cache::class, 'autoconfig'],
    158             __('SQLite Object Cache has been configured.', 'zenpress'),
     158            __('SQLite Object Cache configured.', 'zenpress'),
    159159            __('SQLite Object Cache configuration failed.', 'zenpress')
    160160        );
     
    204204            'href' => wp_nonce_url(add_query_arg('clear', 'all', $base_url), 'zenpress_clear_caches'),
    205205            'meta' => [
    206                 'title' => __('Clear all caches (page cache, static assets, object cache).', 'zenpress'),
     206                'title' => __('Clear page cache, static assets cache, and object cache.', 'zenpress'),
    207207            ],
    208208        ]);
     
    212212                'id' => 'zenpress-clear-cache-enabler',
    213213                'parent' => 'zenpress',
    214                 'title' => __('Clear pages caches', 'zenpress'),
     214                'title' => __('Clear page cache', 'zenpress'),
    215215                'href' => wp_nonce_url(add_query_arg('clear', 'cache_enabler', $base_url), 'zenpress_clear_caches'),
    216216                'meta' => [
     
    224224                'id' => 'zenpress-clear-autoptimize',
    225225                'parent' => 'zenpress',
    226                 'title' => __('Clear static assets caches (CSS/JS)', 'zenpress'),
     226                'title' => __('Clear static assets cache (CSS/JS)', 'zenpress'),
    227227                'href' => wp_nonce_url(add_query_arg('clear', 'autoptimize', $base_url), 'zenpress_clear_caches'),
    228228                'meta' => [
     
    263263    private static function get_single_cleared_message(string $slug): string {
    264264        /* translators: 1: cache type (e.g. Page cache), 2: plugin name (e.g. Cache Enabler) */
    265         $format = __('%1$s (Managed by %2$s) has been cleared successfully.', 'zenpress');
     265        $format = __('%1$s (managed by %2$s) cleared successfully.', 'zenpress');
    266266        switch ($slug) {
    267267            case 'cache_enabler':
     
    315315            return sprintf(
    316316                /* translators: %s: cache type (e.g. Page cache) */
    317                 __('%s has been cleared successfully.', 'zenpress'),
     317                __('%s cleared successfully.', 'zenpress'),
    318318                $types[0]
    319319            );
     
    324324        return sprintf(
    325325            /* translators: %s: comma-separated list of cache types */
    326             __('%s have been cleared successfully.', 'zenpress'),
     326            __('%s cleared successfully.', 'zenpress'),
    327327            $list
    328328        );
     
    351351    public static function ajax_clear_caches(): void {
    352352        if (!current_user_can('manage_options')) {
    353             wp_die(esc_html__('Forbidden', 'zenpress'), '', ['response' => 403]);
     353            wp_die(esc_html__('You don\'t have permission to do that.', 'zenpress'), '', ['response' => 403]);
    354354        }
    355355        $nonce = isset($_REQUEST['_wpnonce']) ? sanitize_text_field(wp_unslash((string) $_REQUEST['_wpnonce'])) : '';
    356356        if (!wp_verify_nonce($nonce, 'zenpress_clear_caches')) {
    357             wp_die(esc_html__('Forbidden', 'zenpress'), '', ['response' => 403]);
     357            wp_die(esc_html__('You don\'t have permission to do that.', 'zenpress'), '', ['response' => 403]);
    358358        }
    359359
     
    363363                do_action('zenpress_caches_clear');
    364364            } catch (\Throwable $e) {
    365                 wp_die(esc_html__('Cache clear failed.', 'zenpress'), '', ['response' => 500]);
     365                wp_die(esc_html__('Clearing cache failed. Try again.', 'zenpress'), '', ['response' => 500]);
    366366            }
    367367            $message = self::get_all_cleared_message();
     
    373373                }
    374374            } catch (\Throwable $e) {
    375                 wp_die(esc_html__('Cache clear failed.', 'zenpress'), '', ['response' => 500]);
     375                wp_die(esc_html__('Clearing cache failed. Try again.', 'zenpress'), '', ['response' => 500]);
    376376            }
    377377            $message = self::get_single_cleared_message($clear);
    378378        } else {
    379             wp_die(esc_html__('Invalid request.', 'zenpress'), '', ['response' => 400]);
     379            wp_die(esc_html__('Invalid request. Please refresh and try again.', 'zenpress'), '', ['response' => 400]);
    380380        }
    381381
  • zenpress/tags/2.2.5/inc/snippets/functions/block-user-enumeration.php

    r3448604 r3470504  
    99    $zenpress_query_string = isset($_SERVER['QUERY_STRING']) ? sanitize_text_field(wp_unslash($_SERVER['QUERY_STRING'])) : '';
    1010    if (preg_match('/author=([0-9]+)/i', $zenpress_query_string)) {
    11         wp_die(esc_html__('Access denied.', 'zenpress'), '', ['response' => 403]);
     11        wp_die(esc_html__('You don\'t have permission to view this.', 'zenpress'), '', ['response' => 403]);
    1212    }
    1313
     
    1717        static function (string|false $redirect, string $request): string|false {
    1818            if (preg_match('/\?author=([0-9]+)(\/*)/i', sanitize_text_field(wp_unslash($request)))) {
    19                 wp_die(esc_html__('Access denied.', 'zenpress'), '', ['response' => 403]);
     19                wp_die(esc_html__('You don\'t have permission to view this.', 'zenpress'), '', ['response' => 403]);
    2020            }
    2121
  • zenpress/tags/2.2.5/inc/snippets/functions/disable-rest-api.php

    r3448604 r3470504  
    5454    add_filter('rest_authentication_errors', static function (WP_Error|bool|null $access) use ($zenpress_disable_wp_rest_api_allow_access): WP_Error|bool|null {
    5555        if (!is_user_logged_in() && !$zenpress_disable_wp_rest_api_allow_access()) {
    56             $message = apply_filters('zenpress_disable_wp_rest_api_error', __('REST API restricted to authenticated users.', 'zenpress'));
     56            $message = apply_filters('zenpress_disable_wp_rest_api_error', __('You must be logged in to use this.', 'zenpress'));
    5757
    5858            return new WP_Error('rest_login_required', $message, ['status' => rest_authorization_required_code()]);
  • zenpress/tags/2.2.5/inc/snippets/functions/protect-wp-login.php

    r3451904 r3470504  
    77// Remove detailed login errors
    88add_filter('login_errors', static function (): string {
    9     return __('Login error.', 'zenpress');
     9    return __('Something went wrong. Try again.', 'zenpress');
    1010});
    1111
     
    3636    if (get_transient($blockKey)) {
    3737        wp_die(
    38             esc_html__('Too many failed login attempts. Try again later.', 'zenpress'),
     38            esc_html__('Too many failed attempts. Try again in a few minutes.', 'zenpress'),
    3939            '',
    4040            ['response' => 403]
     
    5050        set_transient($blockKey, true, $BLOCK_DURATION);
    5151        wp_die(
    52             esc_html__('Too many failed login attempts. Try again later.', 'zenpress'),
     52            esc_html__('Too many failed attempts. Try again in a few minutes.', 'zenpress'),
    5353            '',
    5454            ['response' => 403]
  • zenpress/tags/2.2.5/inc/snippets/meta/block-user-enumeration.meta.php

    r3412245 r3470504  
    1313    'title' => __('Block user enumeration', 'zenpress'),
    1414    'description' => __(
    15         'Prevents attackers from guessing WordPress usernames by blocking requests with the `author` parameter in query strings or permalinks. Reduces exposure to brute-force and user-targeted attacks.',
     15        'Stops visitors from discovering usernames via author URLs. Reduces brute-force risk.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/clean-admin-bar.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Clean up the WordPress admin bar', 'zenpress'),
     13    'title' => __('Clean up the admin bar', 'zenpress'),
    1414    'description' => __(
    1515        'Removes unnecessary items from the admin bar in both backend and frontend. Reduces clutter and simplifies the interface.',
  • zenpress/tags/2.2.5/inc/snippets/meta/clean-dashboard-items.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Clean up the WordPress Dashboard', 'zenpress'),
     13    'title' => __('Clean up the Dashboard', 'zenpress'),
    1414    'description' => __(
    15         'Removes unnecessary and ad widgets from the dashboard. Declutters the admin area and improves usability.',
     15        'Removes unnecessary and promotional widgets from the Dashboard.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-adjacent-posts.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable adjacent posts link tags', 'zenpress'),
     13    'title' => __('Disable prev/next post links in head', 'zenpress'),
    1414    'description' => __(
    1515        'Removes rel="prev" and rel="next" tags from wp_head. Reduces unnecessary HTML output and slightly improves performance.',
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-application-passwords.meta.php

    r3448585 r3470504  
    1313    'title' => __('Disable application passwords', 'zenpress'),
    1414    'description' => __(
    15         'Disables WordPress application passwords for all users. Improves security; do not enable if you need API or app-based authentication (e.g. mobile apps, REST clients).',
     15        'Turns off application passwords for everyone. Turn this off if you use mobile apps or other apps that log in to WordPress.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-author-archives.meta.php

    r3412245 r3470504  
    1313    'title' => __('Disable author archives', 'zenpress'),
    1414    'description' => __(
    15         'Forces author archive pages to return a 404 error. Prevents user enumeration and hides unnecessary author pages.',
     15        'Author archive URLs show "Page not found." Helps prevent listing usernames.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-autosave.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable autosave', 'zenpress'),
     13    'title' => __('Disable autosave (classic editor)', 'zenpress'),
    1414    'description' => __(
    1515        'Stops the classic editor from autosaving drafts periodically. Reduces database writes and heartbeat traffic. The block editor may still use its own autosave; this targets the legacy post editor.',
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-capital-p-dangit.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Disable capital_P_dangit filter', 'zenpress'),
     13    'title' => __('Disable "WordPress" spelling correction', 'zenpress'),
    1414    'description' => __(
    15         'Removes the filter that forces "Wordpress" to "WordPress" in titles, content, comments, and widget text. Saves a small amount of processing on each page load.',
     15        'Stops WordPress from changing "Wordpress" to "WordPress" in content. Saves a small amount of work on each page.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-dashicons.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable dashicons', 'zenpress'),
     13    'title' => __('Disable Dashicons (admin icons)', 'zenpress'),
    1414    'description' => __(
    15         'Prevents WordPress from loading the Dashicons CSS for visitors who are not logged in. Improves frontend performance by reducing unnecessary styles.',
     15        'Stops Dashicons (admin icons) from loading for visitors. Logged-in users still see them.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-default-pattern-categories.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable default pattern categories in site editor', 'zenpress'),
    14     'description' => __('Removes default pattern categories from the block pattern inserter in the site editor (e.g. featured, about, audio, banner, buttons, call-to-action, columns, contact, footer, gallery, header, media, portfolio, posts, query, services, team, testimonials, text, videos) and any custom ones. Simplifies the interface; patterns remain accessible.', 'zenpress'),
     13    'title' => __('Disable default pattern categories in Site Editor', 'zenpress'),
     14    'description' => __('Removes default pattern categories from the block inserter. Patterns are still available; the list is simpler.', 'zenpress'),
    1515    'category' => __('gutenberg', 'zenpress'),
    1616    'subcategory' => __('user-interface', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-jquery-migrate.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable jQuery migrate', 'zenpress'),
     13    'title' => __('Disable jQuery Migrate script', 'zenpress'),
    1414    'description' => __(
    15         'Removes jQuery Migrate from loading on the frontend while keeping it enabled in the admin. Improves frontend performance and reduces legacy overhead.',
     15        'Loads jQuery Migrate only in the admin, not on the front. Improves front-end performance.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-login-language-selector.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable the login language selector', 'zenpress'),
     13    'title' => __('Disable login language selector', 'zenpress'),
    1414    'description' => __('Removes the language dropdown from the WordPress login page. Simplifies login screen and reduces distractions.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-password-strength-meter.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Disable Password Strength Meter', 'zenpress'),
     13    'title' => __('Disable password strength meter', 'zenpress'),
    1414    'description' => __(
    15         'Prevents the password strength meter and zxcvbn scripts from loading on profile, login, and similar pages. Saves roughly 400KB and reduces script parsing. Users will not see the strength indicator when choosing passwords.',
     15        'Stops the password strength meter from loading on login and profile pages. Saves about 400KB. Users won\'t see how strong their password is.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-pingback-trackback.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable pingback and trackback', 'zenpress'),
     13    'title' => __('Disable pingbacks and trackbacks', 'zenpress'),
    1414    'description' => __('Removes the X-Pingback header, disables pingbacks and trackbacks on new posts, and prevents self-pingbacks. Reduces spam, blocks potential DDoS vectors, and slightly improves performance by avoiding useless requests.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-rest-api.meta.php

    r3448585 r3470504  
    1212
    1313return [
    14     'title' => __('Disable REST API for visitors not logged into WordPress', 'zenpress'),
     14    'title' => __('Limit REST API to logged-in users', 'zenpress'),
    1515    'description' => __(
    16         'Restricts the WP REST API to logged-in users only; unauthenticated requests receive an error. Bypass filters (zenpress_disable_wp_rest_api_post_var, zenpress_disable_wp_rest_api_server_var) allow specific integrations (e.g. webhooks); use non-guessable values only.',
     16        'Only logged-in users can use the REST API. Visitors get an error. Advanced: filters let you allow specific tools; use with care.',
    1717        'zenpress'
    1818    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-rss.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable all WordPress feeds (RDF, RSS, RSS2, Atom, and comments)', 'zenpress'),
     13    'title' => __('Disable all feeds (RSS, Atom, comments)', 'zenpress'),
    1414    'description' => __('Prevents access to all default feeds (RDF, RSS, RSS2, Atom, and comments). Also removes feed links from head, and redirects feed requests to the homepage. Reduces unnecessary requests and improves SEO consistency.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-shortlink.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WordPress shortlink', 'zenpress'),
     13    'title' => __('Disable shortlink', 'zenpress'),
    1414    'description' => __('Removes shortlink functionality from both the HTML head and HTTP headers. Reduces unnecessary output, improves performance and SEO clarity.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-wlw-manifest.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WLW link', 'zenpress'),
    14     'description' => __('Removes the WLW manifest link from the head, which was only used by the deprecated Windows Live Writer app. Reduces unnecessary metadata and improves performance.', 'zenpress'),
     13    'title' => __('Disable Windows Live Writer link', 'zenpress'),
     14    'description' => __('Removes the old Windows Live Writer link from the page. Safe to disable.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
    1616    'subcategory' => __('performance', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-woocommerce-cart-fragments.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WooCommerce cart fragments script', 'zenpress'),
    14     'description' => __('Removes the WooCommerce cart fragments JavaScript (wc-cart-fragments), which is responsible for dynamically updating the cart contents without a page reload. Disabling this can improve performance on stores that do not require live cart updates.', 'zenpress'),
     13    'title' => __('Disable WooCommerce cart fragments', 'zenpress'),
     14    'description' => __('Stops the script that updates the cart without reloading the page. Turn off if you don\'t need live cart updates.', 'zenpress'),
    1515    'category' => __('woocommerce', 'zenpress'),
    1616    'subcategory' => __('performance', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-woocommerce-scripts-styles.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WooCommerce scripts and styles on non-WooCommerce pages', 'zenpress'),
     13    'title' => __('Disable WooCommerce scripts and styles on non-shop pages', 'zenpress'),
    1414    'description' => __('Dequeues WooCommerce assets on pages where WooCommerce functionality is not required, such as homepage, blog posts, or custom pages. Helps improve performance by preventing unnecessary asset loading.', 'zenpress'),
    1515    'category' => __('woocommerce', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-woocommerce-stripe-scripts.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable unnecessary Stripe scripts on WooCommerce pages', 'zenpress'),
     13    'title' => __('Disable Stripe scripts on product and cart pages', 'zenpress'),
    1414    'description' => __('Prevents loading of Stripe-related scripts on the product and cart pages when the "Payment Request Button Support" (PRBS) is disabled. Helps improve performance by avoiding unnecessary JavaScript loading.', 'zenpress'),
    1515    'category' => __('woocommerce', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-wordpress-default-lazy-loading.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WordPress default lazy loading', 'zenpress'),
     13    'title' => __('Disable default lazy loading for images', 'zenpress'),
    1414    'description' => __(
    1515        'Stops WordPress from adding loading="lazy" to images and iframes. Use only if you rely on a theme, plugin, or CDN for lazy loading, or if you prefer to load all media immediately.',
  • zenpress/tags/2.2.5/inc/snippets/meta/disable-xmlrpc-rsdlink.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable XML-RPC and remove RSD link', 'zenpress'),
     13    'title' => __('Disable XML-RPC and RSD link', 'zenpress'),
    1414    'description' => __('Disables XML-RPC (often targeted by brute force or DDoS attacks) and removes the RSD link from the HTML head to reduce exposure.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/limit-post-revisions.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Limit post revision to 10', 'zenpress'),
     13    'title' => __('Limit post revisions to 10', 'zenpress'),
    1414    'description' => __(
    1515        'Keeps at most 10 revisions per post (or page). Older revisions are deleted when new ones are created. Reduces database size and improves performance.',
  • zenpress/tags/2.2.5/inc/snippets/meta/protect-wp-login.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Protect the wp-login form from brute force attacks', 'zenpress'),
    14     'description' => __('Removes detailed login error messages and limits failed login attempts per IP. Blocks further attempts for 5 minutes after 5 failed tries. Mitigates brute-force attacks.', 'zenpress'),
     13    'title' => __('Protect login from brute force', 'zenpress'),
     14    'description' => __('Hides detailed login errors and limits failed attempts per IP. After 5 failed tries, blocks that IP for 5 minutes.', 'zenpress'),
    1515    'category' => __('tools', 'zenpress'),
    1616    'subcategory' => __('security', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/remove-gutenberg-unwanted-block-patterns.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Remove WordPress default remote block patterns', 'zenpress'),
     13    'title' => __('Remove WordPress default block patterns', 'zenpress'),
    1414    'description' => __('Prevents WordPress from loading remote block patterns and removes the built-in core block patterns. Reduces editor clutter and improves performance by avoiding unnecessary data loading.', 'zenpress'),
    1515    'category' => __('gutenberg', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/remove-help-button.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Remove "Help" button', 'zenpress'),
     13    'title' => __('Remove Help tab', 'zenpress'),
    1414    'description' => __(
    15         'Hides the Help tab and panel on all admin screens. Reduces clutter for users who do not use the in-app help.',
     15        'Hides the Help tab on all admin screens. Reduces clutter if you don\'t use in-app help.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/remove-rest-api-link.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Remove REST API links', 'zenpress'),
     13    'title' => __('Remove REST API links from page source', 'zenpress'),
    1414    'description' => __('Prevents WordPress from adding REST API discovery links to the head section of the site. Reduces unnecessary HTML output and slightly improves performance while keeping REST API functionality available.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/tags/2.2.5/inc/snippets/meta/remove-thanks-for-using-wordpress-in-footer.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Remove "Thanks for using WordPress" in footer', 'zenpress'),
     13    'title' => __('Remove "Thanks for using WordPress" from footer', 'zenpress'),
    1414    'description' => __(
    15         'Removes the "Thank you for creating with WordPress" message from the admin footer.',
     15        'Removes the "Thanks for using WordPress" message from the admin footer.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/remove-wordpress-logo.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Remove WordPress logo', 'zenpress'),
     13    'title' => __('Remove WordPress logo from admin bar', 'zenpress'),
    1414    'description' => __(
    15         'Removes the WordPress logo and its dropdown from the admin bar.',
     15        'Removes the WordPress logo and its menu from the admin bar.',
    1616        'zenpress'
    1717    ),
  • zenpress/tags/2.2.5/inc/snippets/meta/separate-gutenberg-core-block-styles.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Separate loading of core block styles', 'zenpress'),
     13    'title' => __('Load block styles separately', 'zenpress'),
    1414    'description' => __('Forces WordPress to load core block styles separately, improving performance by only loading the styles required for the blocks used on a page.', 'zenpress'),
    1515    'category' => __('gutenberg', 'zenpress'),
  • zenpress/tags/2.2.5/languages/zenpress.pot

    r3452689 r3470504  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: ZenPress - Optimize & Secure 2.2.4\n"
     5"Project-Id-Version: ZenPress 2.2.5\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/zenpress\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-02-03T08:48:39+00:00\n"
     12"POT-Creation-Date: 2026-02-26T16:25:36+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
     
    1717#. Plugin Name of the plugin
    1818#: zenpress.php
    19 msgid "ZenPress - Optimize & Secure"
     19#: inc/admin/menu.php:14
     20#: inc/admin/menu.php:31
     21msgid "ZenPress"
    2022msgstr ""
    2123
     
    2729#. Description of the plugin
    2830#: zenpress.php
    29 msgid "Easily speed up and strengthen your WordPress site in one click: clean out unnecessary features, protect weak points, autoconfigure cache integrations."
     31msgid "Speed up and harden your site with a single click: cleans up unused features, protects security gaps, and configures cache integrations automatically."
    3032msgstr ""
    3133
     
    4143
    4244#: inc/admin/links.php:19
    43 msgid "Go to ZenPress settings page"
     45msgid "Go to ZenPress settings"
    4446msgstr ""
    4547
    4648#: inc/admin/links.php:20
     49#: inc/admin/menu.php:13
    4750msgid "Settings"
    4851msgstr ""
     
    5053#: inc/admin/links.php:40
    5154#: inc/admin/menu.php:38
    52 msgid "View ZenPress changelog on WordPress.org (opens in a new tab)"
     55msgid "View ZenPress changelog on WordPress.org (opens in new tab)"
    5356msgstr ""
    5457
     
    5861
    5962#: inc/admin/links.php:46
    60 msgid "Read ZenPress documentation (opens in a new tab)"
     63#: inc/admin/menu.php:48
     64msgid "Read ZenPress documentation (opens in new tab)"
    6165msgstr ""
    6266
    6367#: inc/admin/links.php:47
    64 msgid "Docs"
     68#: inc/admin/menu.php:49
     69msgid "Documentation"
    6570msgstr ""
    6671
    6772#: inc/admin/links.php:52
    68 msgid "Support ZenPress by buying a coffee (opens in a new tab)"
     73msgid "Support ZenPress: Buy me a coffee (opens in new tab)"
    6974msgstr ""
    7075
    7176#: inc/admin/links.php:53
    72 msgid "Support ☕"
    73 msgstr ""
    74 
    75 #: inc/admin/menu.php:13
    76 msgid "ZenPress options"
    77 msgstr ""
    78 
    79 #: inc/admin/menu.php:14
    80 #: inc/admin/menu.php:31
    81 msgid "ZenPress"
     77msgid "Support"
    8278msgstr ""
    8379
     
    8783
    8884#: inc/admin/menu.php:39
    89 msgid "What's new ?"
    90 msgstr ""
    91 
    92 #: inc/admin/menu.php:48
    93 msgid "Read the ZenPress documentation (opens in a new tab)"
    94 msgstr ""
    95 
    96 #: inc/admin/menu.php:49
    97 msgid "Documentation"
     85msgid "What's new"
    9886msgstr ""
    9987
    10088#: inc/admin/menu.php:54
    101 msgid "Leave a review for ZenPress on WordPress.org (opens in a new tab)"
     89msgid "Leave a review for ZenPress on WordPress.org (opens in new tab)"
    10290msgstr ""
    10391
    10492#: inc/admin/menu.php:55
    105 msgid "Leave a review (helps a lot)"
     93msgid "Leave a review"
    10694msgstr ""
    10795
    10896#: inc/admin/menu.php:61
    109 msgid "Support development: Buy me a coffee (opens in a new tab)"
     97msgid "Support development: Buy me a coffee (opens in new tab)"
    11098msgstr ""
    11199
     
    115103
    116104#: inc/admin/menu.php:70
    117 msgid "Loading your ZenPress settings…"
    118 msgstr ""
    119 
    120 #: inc/admin/menu.php:78
    121 msgid "Made "
    122 msgstr ""
    123 
     105msgid "Loading settings…"
     106msgstr ""
     107
     108#. translators: 1: decorative heart emoji, 2: author name
    124109#: inc/admin/menu.php:80
    125 msgid " by Quentin Le Duff - Your WordPress Partner"
    126 msgstr ""
    127 
    128 #: inc/admin/menu.php:87
    129 msgid "Visite the developper website"
    130 msgstr ""
    131 
    132 #: inc/admin/menu.php:88
    133 msgid "My place"
    134 msgstr ""
    135 
    136 #: inc/admin/menu.php:93
    137 msgid "Review the code on Github"
    138 msgstr ""
    139 
    140 #: inc/admin/menu.php:94
    141 msgid "ZenPress code repository"
     110#, php-format
     111msgid "Made with %1$s by %2$s"
     112msgstr ""
     113
     114#: inc/admin/menu.php:90
     115msgid "Visit the developer website (opens in new tab)"
     116msgstr ""
     117
     118#: inc/admin/menu.php:91
     119msgid "Developer website"
     120msgstr ""
     121
     122#: inc/admin/menu.php:96
     123msgid "View ZenPress source code on GitHub (opens in new tab)"
     124msgstr ""
     125
     126#: inc/admin/menu.php:97
     127msgid "Source code"
    142128msgstr ""
    143129
    144130#: inc/classes/integrations.php:136
    145 #: assets/build/index.js:1
    146131#: assets/src/js/config/integrations.js:11
    147 msgid "Autoptimize has been configured."
     132msgid "Autoptimize configured."
    148133msgstr ""
    149134
     
    153138
    154139#: inc/classes/integrations.php:147
    155 #: assets/build/index.js:1
    156140#: assets/src/js/config/integrations.js:25
    157 msgid "Cache Enabler has been configured."
     141msgid "Cache Enabler configured."
    158142msgstr ""
    159143
     
    163147
    164148#: inc/classes/integrations.php:158
    165 #: assets/build/index.js:1
    166149#: assets/src/js/config/integrations.js:39
    167 msgid "SQLite Object Cache has been configured."
     150msgid "SQLite Object Cache configured."
    168151msgstr ""
    169152
     
    177160
    178161#: inc/classes/integrations.php:206
    179 msgid "Clear all caches (page cache, static assets, object cache)."
     162msgid "Clear page cache, static assets cache, and object cache."
    180163msgstr ""
    181164
    182165#: inc/classes/integrations.php:214
    183 msgid "Clear pages caches"
     166msgid "Clear page cache"
    184167msgstr ""
    185168
     
    189172
    190173#: inc/classes/integrations.php:226
    191 msgid "Clear static assets caches (CSS/JS)"
     174msgid "Clear static assets cache (CSS/JS)"
    192175msgstr ""
    193176
     
    207190#: inc/classes/integrations.php:265
    208191#, php-format
    209 msgid "%1$s (Managed by %2$s) has been cleared successfully."
     192msgid "%1$s (managed by %2$s) cleared successfully."
    210193msgstr ""
    211194
     
    246229
    247230#. translators: %s: cache type (e.g. Page cache)
     231#. translators: %s: comma-separated list of cache types
    248232#: inc/classes/integrations.php:317
     233#: inc/classes/integrations.php:326
    249234#, php-format
    250 msgid "%s has been cleared successfully."
     235msgid "%s cleared successfully."
    251236msgstr ""
    252237
     
    255240msgstr ""
    256241
    257 #. translators: %s: comma-separated list of cache types
    258 #: inc/classes/integrations.php:326
    259 #, php-format
    260 msgid "%s have been cleared successfully."
    261 msgstr ""
    262 
    263242#: inc/classes/integrations.php:353
    264243#: inc/classes/integrations.php:357
    265 msgid "Forbidden"
     244msgid "You don't have permission to do that."
    266245msgstr ""
    267246
    268247#: inc/classes/integrations.php:365
    269248#: inc/classes/integrations.php:375
    270 msgid "Cache clear failed."
     249msgid "Clearing cache failed. Try again."
    271250msgstr ""
    272251
    273252#: inc/classes/integrations.php:379
    274 msgid "Invalid request."
     253msgid "Invalid request. Please refresh and try again."
    275254msgstr ""
    276255
    277256#: inc/snippets/functions/block-user-enumeration.php:11
    278257#: inc/snippets/functions/block-user-enumeration.php:19
    279 msgid "Access denied."
     258msgid "You don't have permission to view this."
    280259msgstr ""
    281260
    282261#: inc/snippets/functions/disable-rest-api.php:56
    283 msgid "REST API restricted to authenticated users."
     262msgid "You must be logged in to use this."
    284263msgstr ""
    285264
    286265#: inc/snippets/functions/protect-wp-login.php:9
    287 msgid "Login error."
     266msgid "Something went wrong. Try again."
    288267msgstr ""
    289268
    290269#: inc/snippets/functions/protect-wp-login.php:38
    291270#: inc/snippets/functions/protect-wp-login.php:52
    292 msgid "Too many failed login attempts. Try again later."
     271msgid "Too many failed attempts. Try again in a few minutes."
    293272msgstr ""
    294273
     
    298277
    299278#: inc/snippets/meta/block-user-enumeration.meta.php:14
    300 msgid "Prevents attackers from guessing WordPress usernames by blocking requests with the `author` parameter in query strings or permalinks. Reduces exposure to brute-force and user-targeted attacks."
     279msgid "Stops visitors from discovering usernames via author URLs. Reduces brute-force risk."
    301280msgstr ""
    302281
     
    345324
    346325#: inc/snippets/meta/clean-admin-bar.meta.php:13
    347 msgid "Clean up the WordPress admin bar"
     326msgid "Clean up the admin bar"
    348327msgstr ""
    349328
     
    363342
    364343#: inc/snippets/meta/clean-dashboard-items.meta.php:13
    365 msgid "Clean up the WordPress Dashboard"
     344msgid "Clean up the Dashboard"
    366345msgstr ""
    367346
    368347#: inc/snippets/meta/clean-dashboard-items.meta.php:14
    369 msgid "Removes unnecessary and ad widgets from the dashboard. Declutters the admin area and improves usability."
     348msgid "Removes unnecessary and promotional widgets from the Dashboard."
    370349msgstr ""
    371350
     
    375354
    376355#: inc/snippets/meta/disable-adjacent-posts.meta.php:13
    377 msgid "Disable adjacent posts link tags"
     356msgid "Disable prev/next post links in head"
    378357msgstr ""
    379358
     
    413392
    414393#: inc/snippets/meta/disable-application-passwords.meta.php:14
    415 msgid "Disables WordPress application passwords for all users. Improves security; do not enable if you need API or app-based authentication (e.g. mobile apps, REST clients)."
     394msgid "Turns off application passwords for everyone. Turn this off if you use mobile apps or other apps that log in to WordPress."
    416395msgstr ""
    417396
     
    421400
    422401#: inc/snippets/meta/disable-author-archives.meta.php:14
    423 msgid "Forces author archive pages to return a 404 error. Prevents user enumeration and hides unnecessary author pages."
     402msgid "Author archive URLs show \"Page not found.\" Helps prevent listing usernames."
    424403msgstr ""
    425404
    426405#: inc/snippets/meta/disable-autosave.meta.php:13
    427 msgid "Disable autosave"
     406msgid "Disable autosave (classic editor)"
    428407msgstr ""
    429408
     
    433412
    434413#: inc/snippets/meta/disable-capital-p-dangit.meta.php:13
    435 msgid "Disable capital_P_dangit filter"
     414msgid "Disable \"WordPress\" spelling correction"
    436415msgstr ""
    437416
    438417#: inc/snippets/meta/disable-capital-p-dangit.meta.php:14
    439 msgid "Removes the filter that forces \"Wordpress\" to \"WordPress\" in titles, content, comments, and widget text. Saves a small amount of processing on each page load."
     418msgid "Stops WordPress from changing \"Wordpress\" to \"WordPress\" in content. Saves a small amount of work on each page."
    440419msgstr ""
    441420
    442421#: inc/snippets/meta/disable-dashicons.meta.php:13
    443 msgid "Disable dashicons"
     422msgid "Disable Dashicons (admin icons)"
    444423msgstr ""
    445424
    446425#: inc/snippets/meta/disable-dashicons.meta.php:14
    447 msgid "Prevents WordPress from loading the Dashicons CSS for visitors who are not logged in. Improves frontend performance by reducing unnecessary styles."
     426msgid "Stops Dashicons (admin icons) from loading for visitors. Logged-in users still see them."
    448427msgstr ""
    449428
    450429#: inc/snippets/meta/disable-default-pattern-categories.meta.php:13
    451 msgid "Disable default pattern categories in site editor"
     430msgid "Disable default pattern categories in Site Editor"
    452431msgstr ""
    453432
    454433#: inc/snippets/meta/disable-default-pattern-categories.meta.php:14
    455 msgid "Removes default pattern categories from the block pattern inserter in the site editor (e.g. featured, about, audio, banner, buttons, call-to-action, columns, contact, footer, gallery, header, media, portfolio, posts, query, services, team, testimonials, text, videos) and any custom ones. Simplifies the interface; patterns remain accessible."
     434msgid "Removes default pattern categories from the block inserter. Patterns are still available; the list is simpler."
    456435msgstr ""
    457436
     
    479458
    480459#: inc/snippets/meta/disable-jquery-migrate.meta.php:13
    481 msgid "Disable jQuery migrate"
     460msgid "Disable jQuery Migrate script"
    482461msgstr ""
    483462
    484463#: inc/snippets/meta/disable-jquery-migrate.meta.php:14
    485 msgid "Removes jQuery Migrate from loading on the frontend while keeping it enabled in the admin. Improves frontend performance and reduces legacy overhead."
     464msgid "Loads jQuery Migrate only in the admin, not on the front. Improves front-end performance."
    486465msgstr ""
    487466
    488467#: inc/snippets/meta/disable-login-language-selector.meta.php:13
    489 msgid "Disable the login language selector"
     468msgid "Disable login language selector"
    490469msgstr ""
    491470
     
    503482
    504483#: inc/snippets/meta/disable-password-strength-meter.meta.php:13
    505 msgid "Disable Password Strength Meter"
     484msgid "Disable password strength meter"
    506485msgstr ""
    507486
    508487#: inc/snippets/meta/disable-password-strength-meter.meta.php:14
    509 msgid "Prevents the password strength meter and zxcvbn scripts from loading on profile, login, and similar pages. Saves roughly 400KB and reduces script parsing. Users will not see the strength indicator when choosing passwords."
     488msgid "Stops the password strength meter from loading on login and profile pages. Saves about 400KB. Users won't see how strong their password is."
    510489msgstr ""
    511490
     
    519498
    520499#: inc/snippets/meta/disable-pingback-trackback.meta.php:13
    521 msgid "Disable pingback and trackback"
     500msgid "Disable pingbacks and trackbacks"
    522501msgstr ""
    523502
     
    527506
    528507#: inc/snippets/meta/disable-rest-api.meta.php:14
    529 msgid "Disable REST API for visitors not logged into WordPress"
     508msgid "Limit REST API to logged-in users"
    530509msgstr ""
    531510
    532511#: inc/snippets/meta/disable-rest-api.meta.php:15
    533 msgid "Restricts the WP REST API to logged-in users only; unauthenticated requests receive an error. Bypass filters (zenpress_disable_wp_rest_api_post_var, zenpress_disable_wp_rest_api_server_var) allow specific integrations (e.g. webhooks); use non-guessable values only."
     512msgid "Only logged-in users can use the REST API. Visitors get an error. Advanced: filters let you allow specific tools; use with care."
    534513msgstr ""
    535514
    536515#: inc/snippets/meta/disable-rss.meta.php:13
    537 msgid "Disable all WordPress feeds (RDF, RSS, RSS2, Atom, and comments)"
     516msgid "Disable all feeds (RSS, Atom, comments)"
    538517msgstr ""
    539518
     
    543522
    544523#: inc/snippets/meta/disable-shortlink.meta.php:13
    545 msgid "Disable WordPress shortlink"
     524msgid "Disable shortlink"
    546525msgstr ""
    547526
     
    551530
    552531#: inc/snippets/meta/disable-wlw-manifest.meta.php:13
    553 msgid "Disable WLW link"
     532msgid "Disable Windows Live Writer link"
    554533msgstr ""
    555534
    556535#: inc/snippets/meta/disable-wlw-manifest.meta.php:14
    557 msgid "Removes the WLW manifest link from the head, which was only used by the deprecated Windows Live Writer app. Reduces unnecessary metadata and improves performance."
     536msgid "Removes the old Windows Live Writer link from the page. Safe to disable."
    558537msgstr ""
    559538
    560539#: inc/snippets/meta/disable-woocommerce-cart-fragments.meta.php:13
    561 msgid "Disable WooCommerce cart fragments script"
     540msgid "Disable WooCommerce cart fragments"
    562541msgstr ""
    563542
    564543#: inc/snippets/meta/disable-woocommerce-cart-fragments.meta.php:14
    565 msgid "Removes the WooCommerce cart fragments JavaScript (wc-cart-fragments), which is responsible for dynamically updating the cart contents without a page reload. Disabling this can improve performance on stores that do not require live cart updates."
     544msgid "Stops the script that updates the cart without reloading the page. Turn off if you don't need live cart updates."
    566545msgstr ""
    567546
     
    576555
    577556#: inc/snippets/meta/disable-woocommerce-scripts-styles.meta.php:13
    578 msgid "Disable WooCommerce scripts and styles on non-WooCommerce pages"
     557msgid "Disable WooCommerce scripts and styles on non-shop pages"
    579558msgstr ""
    580559
     
    584563
    585564#: inc/snippets/meta/disable-woocommerce-stripe-scripts.meta.php:13
    586 msgid "Disable unnecessary Stripe scripts on WooCommerce pages"
     565msgid "Disable Stripe scripts on product and cart pages"
    587566msgstr ""
    588567
     
    600579
    601580#: inc/snippets/meta/disable-wordpress-default-lazy-loading.meta.php:13
    602 msgid "Disable WordPress default lazy loading"
     581msgid "Disable default lazy loading for images"
    603582msgstr ""
    604583
     
    608587
    609588#: inc/snippets/meta/disable-xmlrpc-rsdlink.meta.php:13
    610 msgid "Disable XML-RPC and remove RSD link"
     589msgid "Disable XML-RPC and RSD link"
    611590msgstr ""
    612591
     
    632611
    633612#: inc/snippets/meta/limit-post-revisions.meta.php:13
    634 msgid "Limit post revision to 10"
     613msgid "Limit post revisions to 10"
    635614msgstr ""
    636615
     
    640619
    641620#: inc/snippets/meta/protect-wp-login.meta.php:13
    642 msgid "Protect the wp-login form from brute force attacks"
     621msgid "Protect login from brute force"
    643622msgstr ""
    644623
    645624#: inc/snippets/meta/protect-wp-login.meta.php:14
    646 msgid "Removes detailed login error messages and limits failed login attempts per IP. Blocks further attempts for 5 minutes after 5 failed tries. Mitigates brute-force attacks."
     625msgid "Hides detailed login errors and limits failed attempts per IP. After 5 failed tries, blocks that IP for 5 minutes."
    647626msgstr ""
    648627
     
    652631
    653632#: inc/snippets/meta/remove-gutenberg-unwanted-block-patterns.meta.php:13
    654 msgid "Remove WordPress default remote block patterns"
     633msgid "Remove WordPress default block patterns"
    655634msgstr ""
    656635
     
    660639
    661640#: inc/snippets/meta/remove-help-button.meta.php:13
    662 msgid "Remove \"Help\" button"
     641msgid "Remove Help tab"
    663642msgstr ""
    664643
    665644#: inc/snippets/meta/remove-help-button.meta.php:14
    666 msgid "Hides the Help tab and panel on all admin screens. Reduces clutter for users who do not use the in-app help."
     645msgid "Hides the Help tab on all admin screens. Reduces clutter if you don't use in-app help."
    667646msgstr ""
    668647
    669648#: inc/snippets/meta/remove-rest-api-link.meta.php:13
    670 msgid "Remove REST API links"
     649msgid "Remove REST API links from page source"
    671650msgstr ""
    672651
     
    676655
    677656#: inc/snippets/meta/remove-thanks-for-using-wordpress-in-footer.meta.php:13
    678 msgid "Remove \"Thanks for using WordPress\" in footer"
     657msgid "Remove \"Thanks for using WordPress\" from footer"
    679658msgstr ""
    680659
    681660#: inc/snippets/meta/remove-thanks-for-using-wordpress-in-footer.meta.php:14
    682 msgid "Removes the \"Thank you for creating with WordPress\" message from the admin footer."
     661msgid "Removes the \"Thanks for using WordPress\" message from the admin footer."
    683662msgstr ""
    684663
     
    692671
    693672#: inc/snippets/meta/remove-wordpress-logo.meta.php:13
    694 msgid "Remove WordPress logo"
     673msgid "Remove WordPress logo from admin bar"
    695674msgstr ""
    696675
    697676#: inc/snippets/meta/remove-wordpress-logo.meta.php:14
    698 msgid "Removes the WordPress logo and its dropdown from the admin bar."
     677msgid "Removes the WordPress logo and its menu from the admin bar."
    699678msgstr ""
    700679
    701680#: inc/snippets/meta/separate-gutenberg-core-block-styles.meta.php:13
    702 msgid "Separate loading of core block styles"
     681msgid "Load block styles separately"
    703682msgstr ""
    704683
     
    707686msgstr ""
    708687
    709 #: assets/build/index.js:1
    710 #: assets/src/js/config/integrations.js:12
    711 msgid "Autoptimize autoconfig failed. Is Autoptimize installed and active?"
    712 msgstr ""
    713 
    714 #: assets/build/index.js:1
    715 #: assets/src/js/config/integrations.js:16
    716 msgid "Setup Autoptimize"
    717 msgstr ""
    718 
    719 #: assets/build/index.js:1
    720 #: assets/src/js/config/integrations.js:17
    721 msgid "Apply recommended Autoptimize settings: Minify JS & CSS, aggregate CSS, static files, 404 fallbacks."
    722 msgstr ""
    723 
    724 #: assets/build/index.js:1
    725 #: assets/src/js/config/integrations.js:26
    726 msgid "Cache Enabler autoconfig failed. Is Cache Enabler installed and active?"
    727 msgstr ""
    728 
    729 #: assets/build/index.js:1
    730 #: assets/src/js/config/integrations.js:30
    731 msgid "Setup Cache Enabler"
    732 msgstr ""
    733 
    734 #: assets/build/index.js:1
    735 #: assets/src/js/config/integrations.js:31
    736 msgid "Apply recommended Cache Enabler settings: Clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS)."
    737 msgstr ""
    738 
    739 #: assets/build/index.js:1
    740 #: assets/src/js/config/integrations.js:43
    741 msgid "SQLite Object Cache autoconfig failed. Is SQLite Object Cache installed and active?"
    742 msgstr ""
    743 
    744 #: assets/build/index.js:1
    745 #: assets/src/js/config/integrations.js:47
    746 msgid "Setup SQLite Object Cache"
    747 msgstr ""
    748 
    749 #: assets/build/index.js:1
    750 #: assets/src/js/config/integrations.js:48
    751 msgid "Apply recommended SQLite Object Cache settings. Enable \"Use APCu\" if APCu is available."
    752 msgstr ""
    753 
    754 #: assets/build/index.js:1
    755 #: assets/src/js/components/SaveButton.js:20
    756 msgid "Save settings"
    757 msgstr ""
    758 
    759 #: assets/build/index.js:1
    760 #: assets/src/js/components/BulkSnippetActions.js:29
    761 msgid "Enable all actions"
    762 msgstr ""
    763 
    764 #: assets/build/index.js:1
    765 #: assets/src/js/components/BulkSnippetActions.js:36
    766 msgid "Disable all actions"
    767 msgstr ""
    768 
    769 #: assets/build/index.js:1
    770688#: assets/src/js/components/AutoconfigButton.js:32
    771689msgid "Applying…"
    772690msgstr ""
    773691
    774 #: assets/build/index.js:1
     692#: assets/src/js/components/BulkSnippetActions.js:29
     693msgid "Enable all"
     694msgstr ""
     695
     696#: assets/src/js/components/BulkSnippetActions.js:36
     697msgid "Disable all"
     698msgstr ""
     699
    775700#: assets/src/js/components/IntegrationsBlock.js:26
    776701msgid "Integrations"
    777702msgstr ""
    778703
    779 #: assets/build/index.js:1
    780704#: assets/src/js/components/IntegrationsBlock.js:28
    781 msgid "Show ZenPress admin bar button"
    782 msgstr ""
    783 
    784 #: assets/build/index.js:1
     705msgid "Show cache actions in admin bar"
     706msgstr ""
     707
    785708#: assets/src/js/components/IntegrationsBlock.js:31
    786 msgid "Show a ZenPress item in the admin bar with \"Clear all caches\" and sub-items for each active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, AutOptimize, or SQLite Object Cache is active. When enabled, those plugins' own admin bar buttons are hidden."
    787 msgstr ""
    788 
    789 #: assets/build/index.js:1
     709msgid "Adds a ZenPress menu to the admin bar with \"Clear all caches\" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins' own admin bar buttons."
     710msgstr ""
     711
    790712#: assets/src/js/components/PresetCard.js:28
    791 msgid "Enable"
    792 msgstr ""
    793 
    794 #: assets/build/index.js:1
     713msgid "Apply preset"
     714msgstr ""
     715
    795716#: assets/src/js/components/PresetsSidebar.js:8
    796717msgid "Corporate website"
    797718msgstr ""
    798719
    799 #: assets/build/index.js:1
    800720#: assets/src/js/components/PresetsSidebar.js:9
    801 msgid "Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives."
    802 msgstr ""
    803 
    804 #: assets/build/index.js:1
     721msgid "For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives."
     722msgstr ""
     723
    805724#: assets/src/js/components/PresetsSidebar.js:17
    806725msgid "Blog"
    807726msgstr ""
    808727
    809 #: assets/build/index.js:1
    810728#: assets/src/js/components/PresetsSidebar.js:18
    811 msgid "Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds."
    812 msgstr ""
    813 
    814 #: assets/build/index.js:1
     729msgid "For content-focused blogs. Keeps RSS and other blog features while improving performance and security."
     730msgstr ""
     731
    815732#: assets/src/js/components/PresetsSidebar.js:26
    816733msgid "E-commerce"
    817734msgstr ""
    818735
    819 #: assets/build/index.js:1
    820736#: assets/src/js/components/PresetsSidebar.js:27
    821 msgid "Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout."
    822 msgstr ""
    823 
    824 #: assets/build/index.js:1
     737msgid "For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout."
     738msgstr ""
     739
    825740#: assets/src/js/components/PresetsSidebar.js:45
    826 msgid "Pick configuration preset"
    827 msgstr ""
    828 
    829 #: assets/build/index.js:1
     741msgid "Choose a preset"
     742msgstr ""
     743
    830744#: assets/src/js/components/PresetsSidebar.js:47
    831 msgid "Don't know which features to enable? Quickly configure ZenPress by selecting a preset that matches your site type. Each preset enables optimized features for your specific use case."
    832 msgstr ""
    833 
    834 #: assets/build/index.js:1
     745msgid "Not sure what to enable? Choose a preset that matches your site. Each preset turns on a set of features for that type of site."
     746msgstr ""
     747
     748#: assets/src/js/components/SaveButton.js:20
     749msgid "Save"
     750msgstr ""
     751
     752#: assets/src/js/config/integrations.js:12
     753msgid "Autoptimize setup failed. Is Autoptimize installed and active?"
     754msgstr ""
     755
     756#: assets/src/js/config/integrations.js:16
     757msgid "Set up Autoptimize"
     758msgstr ""
     759
     760#: assets/src/js/config/integrations.js:17
     761msgid "Apply recommended settings: minify JS and CSS, combine CSS, static file caching, 404 fallbacks."
     762msgstr ""
     763
     764#: assets/src/js/config/integrations.js:26
     765msgid "Cache Enabler setup failed. Is Cache Enabler installed and active?"
     766msgstr ""
     767
     768#: assets/src/js/config/integrations.js:30
     769msgid "Set up Cache Enabler"
     770msgstr ""
     771
     772#: assets/src/js/config/integrations.js:31
     773msgid "Apply recommended settings: clear cache on content changes, WebP, compression, minify HTML."
     774msgstr ""
     775
     776#: assets/src/js/config/integrations.js:40
     777msgid "SQLite Object Cache setup failed. Is it installed and active?"
     778msgstr ""
     779
     780#: assets/src/js/config/integrations.js:44
     781msgid "Set up SQLite Object Cache"
     782msgstr ""
     783
     784#: assets/src/js/config/integrations.js:45
     785msgid "Apply recommended settings. Enable \"Use APCu\" in the plugin if available."
     786msgstr ""
     787
    835788#: assets/src/js/hooks/useSettings.js:58
    836 msgid "Failed to load settings."
    837 msgstr ""
    838 
    839 #: assets/build/index.js:1
    840 #: assets/src/js/hooks/useSettings.js:85
     789msgid "Settings could not be loaded. Refresh the page."
     790msgstr ""
     791
     792#: assets/src/js/hooks/useSettings.js:88
    841793msgid "Settings saved."
    842794msgstr ""
    843795
    844 #: assets/build/index.js:1
    845 #: assets/src/js/hooks/useSettings.js:87
    846 msgid "Failed to save settings."
    847 msgstr ""
    848 
    849 #: assets/build/index.js:1
     796#: assets/src/js/hooks/useSettings.js:91
     797msgid "Settings could not be saved. Try again."
     798msgstr ""
     799
    850800#: assets/src/js/utils/snippets.js:43
     801#: assets/src/js/utils/snippets.js:46
    851802msgid "Uncategorized"
    852803msgstr ""
    853 
    854 #: assets/build/index.js:1
    855 #: assets/src/js/utils/snippets.js:46
    856 msgid "uncategorized"
    857 msgstr ""
  • zenpress/tags/2.2.5/readme.txt

    r3452689 r3470504  
    1 === ZenPress - Optimize & Secure ===
     1=== ZenPress ===
    22Contributors: @quentinldd
    33Donate link: https://github.com/sponsors/quentin-ld/
     
    55Requires at least: 6.0
    66Tested up to: 6.9
    7 Stable tag: 2.2.4
     7Stable tag: 2.2.5
    88Requires PHP: 8.1
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html/
    1111
    12 Easily speed up and strengthen your website in one click: clean out unnecessary features, protect weak points, autoconfigure cache integrations.
     12Speed up and harden your site with a single click: cleans up unused features, protects security gaps, and configures cache integrations automatically.
    1313
    1414== Description ==
    1515
    16 ZenPress is a lightweight, super-fast plugin that boosts your WordPress & WooCommerce website through a wide range of solid actions.
    17 Combined with [Cache Enabler](https://wordpress.org/plugins/cache-enabler/), [Autoptimize](https://wordpress.org/plugins/autoptimize/) and [SQLite Object Cache](https://wordpress.org/plugins/sqlite-object-cache/), ZenPress is a free alternative to major premium performance plugins.
    18 This is a simple solution for improving your WordPress website's performance and security while enjoying a simpler and lighter UI without breaking the bank.
    19 No database clutter, no ads, no pro version. Just install, activate, select what you need or pick up your settings preset and you are ready to go !
     16ZenPress is a lightweight, high-performance plugin that improves your WordPress and WooCommerce sites through a range of supportive actions.
     17Combined with [Cache Enabler](https://wordpress.org/plugins/cache-enabler/), [Autoptimize](https://wordpress.org/plugins/autoptimize/) and [SQLite Object Cache](https://wordpress.org/plugins/sqlite-object-cache/), you can use ZenPress as a reliable, free alternative to major premium performance plugins.
     18By integrating directly into the WordPress core interface, ZenPress provides a simpler experience without the need for complex custom dashboards. You can improve your site's performance and security without ads, pro versions, or database clutter.
    2019
    2120= Why choose ZenPress? =
    22 * Curated settings presets included to help you.
    23 * Deep integration with the native WordPress interface: no bloat, no extra options page, no weird custom dashboard : only what you need.
    24 * Free alternative to major premium performance plugin for everyone.
    25 * Make your WordPress website fast & clean by disabling unwanted features.
    26 * Improve security by turning off features you don’t use and hardening weak spots.
    27 * Eliminate third-party plugin bloat (actually hunting them down).
    28 * Ultra lightweight.
    29 * Future proof.
     21* Use curated settings presets to help you optimize your site instantly.
     22* Experience deep integration with the WordPress core interface for a lightweight, familiar experience.
     23* Choose a free, reliable alternative to premium performance plugins.
     24* Keep your site fast and clean by disabling unused features.
     25* Harden your security by turning off unused features and protecting weak spots.
     26* Reduce bloat from third-party plugins.
     27* Enjoy an ultra-lightweight and future-proof design.
    3028
    3129== Features ==
    3230
    33 Following features are included :
    34 
    35 = Settings subpage 🧰 =
    36 * Organized interface with vertical tabs for easy navigation between categories (Core, Gutenberg, WooCommerce, Ads-blocker, Tools).
    37 * Features grouped by subcategories (Performance, Security, User Interface) with visual icons for quick identification.
    38 * Three ready-to-use presets: Corporate website, Blog, and E-commerce - each optimized for specific site types.
    39 * Every action is documented with descriptions so that you understand what you are doing and the benefits.
    40 * Fully accessible interface with ARIA-compliant tabs and complete keyboard navigation support.
    41 * Native WordPress interface, benefits from Gutenberg's new features and the site editor.
    42 
    43 = Core =
    44 
     31ZenPress includes the following features:
     32
     33= Dashboard Settings =
     34* Navigate easily between categories like Core, Gutenberg, and WooCommerce using a structured tabbed interface.
     35* Identify features quickly with visual icons organized by Performance, Security, and User Interface.
     36* Select from three ready-to-use presets: Corporate, Blog, or E-commerce: each optimized for your specific site type.
     37* Understand every choice with concise descriptions that explain the benefits to your site.
     38* Use a fully accessible interface that includes ARIA-compliant tabs and full keyboard navigation support.
     39* Benefit from a design that matches the WordPress core look and feel, supporting the latest block editor features.
     40
     41= Core Settings =
    4542* Block user enumeration.
    46 * Clean up the WordPress admin bar.
    47 * Disable adjacent posts link tags.
    48 * Disable all WordPress feeds (RDF, RSS, RSS2, Atom, and comments).
     43* Clean up the admin bar.
     44* Disable "WordPress" spelling correction.
     45* Disable all feeds (RSS, Atom, comments).
    4946* Disable application passwords.
    5047* Disable author archives.
    51 * Disable autosave.
    52 * Disable capital_P_dangit filter.
    53 * Disable dashicons.
     48* Disable autosave (classic editor).
     49* Disable Dashicons (admin icons).
     50* Disable default lazy loading for images.
    5451* Disable DNS prefetch.
    55 * Disable jQuery migrate.
     52* Disable jQuery Migrate script.
     53* Disable login language selector.
    5654* Disable oEmbed.
    57 * Disable Password Strength Meter.
     55* Disable password strength meter.
    5856* Disable PDF thumbnails.
    59 * Disable pingback and trackback.
    60 * Disable REST API for visitors not logged into WordPress.
    61 * Disable the login language selector.
    62 * Disable WLW link.
    63 * Disable WordPress default lazy loading.
     57* Disable pingbacks and trackbacks.
     58* Disable prev/next post links in head.
     59* Disable shortlink.
     60* Disable Windows Live Writer link.
    6461* Disable WordPress emoji scripts and styles.
    65 * Disable WordPress shortlink.
    66 * Disable XML-RPC and remove RSD link.
     62* Disable XML-RPC and RSD link.
    6763* Hide WordPress version.
    68 * Limit post revision to 10.
    69 * Remove "Help" button.
    70 * Remove "Thanks for using WordPress" in footer.* Remove REST API links.
    71 * Remove WordPress logo.
    72 
    73 = WooCommerce  =
    74 * Disable unnecessary Stripe scripts on WooCommerce pages.
    75 * Disable WooCommerce cart fragments script.
    76 * Disable WooCommerce scripts and styles on non-WooCommerce pages.
     64* Limit post revisions to 10.
     65* Limit REST API to logged-in users.
     66* Remove "Thanks for using WordPress" from footer.
     67* Remove Help tab.
     68* Remove REST API links from page source.
     69* Remove WordPress logo from admin bar.
     70
     71= Gutenberg Settings =
     72* Disable default pattern categories in Site Editor.
     73* Load block styles separately.
     74* Remove WordPress default block patterns.
     75
     76= WooCommerce Settings =
     77* Disable Stripe scripts on product and cart pages.
     78* Disable WooCommerce cart fragments.
     79* Disable WooCommerce scripts and styles on non-shop pages.
    7780* Disable WooCommerce widgets.
    78 * Hide WooCommerce version.* Remove WooCommerce default block patterns.
    79 
    80 = Gutenberg  =
    81 * Disable default pattern categories in site editor.
    82 * Remove WordPress default remote block patterns.
    83 * Separate loading of core block styles.
    84 
    85 = Ads-blocker =
    86 * Clean up the WordPress Dashboard.
    87 
    88 = Tools =
    89 * Protect the wp-login form from brute force attacks.
    90 * Toggle "Show ZenPress admin bar button": ZenPress item in the admin bar with "Clear all caches" and sub-items per active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, Autoptimize, or SQLite Object Cache is active. When enabled, those plugins' own admin bar buttons are hidden. Toggle via Settings > ZenPress > Tools.
     81* Hide WooCommerce version.
     82* Remove WooCommerce default block patterns.
     83
     84= Ads-blocker Settings =
     85* Clean up the Dashboard.
     86
     87= Tools Settings =
     88* Protect login from brute force.
     89* Show cache actions in admin bar.
    9190
    9291= Integrations =
     
    9493ZenPress integrates with Cache Enabler, Autoptimize, and SQLite Object Cache. When any of these plugins is active, the Tools tab shows integration status and one-click autoconfig actions.
    9594
    96 * Admin bar: One "Clear all caches" button (dashicon) in the admin bar, with sub-items to clear page cache (Cache Enabler), static assets (Autoptimize), or object cache (SQLite Object Cache) separately. When the ZenPress admin bar is enabled, the third-party cache buttons (Cache Enabler, Autoptimize, SQLite Object Cache) are hidden. You can hide the ZenPress admin bar via Settings > ZenPress > Tools.
    97 * Autoptimize: One-click autoconfig enables recommended options (JS/CSS/aggregate/nogzip/fallback on; defer/HTML/logged-in/meta off).
    98 * Cache Enabler: One-click autoconfig enables clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS).
    99 * SQLite Object Cache: One-click autoconfig enables the "Use APCu" option in the plugin settings when the APCu extension is available.
     95* Admin bar: Adds a ZenPress menu to the admin bar with "Clear all caches" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins' own admin bar buttons.
     96* Autoptimize: Minify JS and CSS, combine CSS, static file caching, 404 fallbacks.
     97* Cache Enabler: Clear cache on content changes, WebP, compression, minify HTML.
     98* SQLite Object Cache: Enable "Use APCu" in the plugin if available.
    10099
    101100= Presets =
    102 * Corporate website / Portfolio: Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives.
    103 * Blog: Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds.
    104 * E-commerce: Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout.
     101* Corporate website: For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives.
     102* Blog: For content-focused blogs. Keeps RSS and other blog features while improving performance and security.
     103* E-commerce: For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout.
    105104
    106105= Accessibility =
    107 * Fully ARIA-compliant tab interface following W3C ARIA Authoring Practices Guide.
    108 * Complete keyboard navigation: Arrow keys, Home, End, Space, Enter, and Tab keys fully supported.
    109 * Automatic tab activation on focus for improved user experience.
    110 * Proper focus management with visible focus indicators.
    111 * Screen reader friendly with proper ARIA labels and roles.
     106* You can navigate the dashboard with confidence using an interface built to WCAG 2.1 AA accessibility standards.
     107* Move through settings efficiently using only your keyboard; we fully support the use of Tab, Arrow keys, Home, End, and Enter for all interactions.
     108* Experience faster navigation with automatic tab activation, which displays panels immediately as you move focus between sections.
     109* Always identify your position on the page through highly visible focus indicators on every interactive button and link.
     110* Every element is optimized for screen readers and assistive technologies with descriptive ARIA labels to provide clear context for every setting.
    112111
    113112== Roadmap ==
    114113
     114* Use new Gutenberg Icon component for categories & subcategories icons instead of Dashicons.
    115115* Additional presets for specific use cases.
    116116* Documentation pages with detailed guides.
     
    165165= Does ZenPress work with my existing caching / optimization plugins? =
    166166
    167 Yes. ZenPress focuses on disabling unnecessary core features and plugin bloat; it does not handle page caching, minification, or image optimization. It is designed to work alongside plugins like Cache Enabler, Autoptimize, and most object-cache solutions. If a performance feature overlaps, simply disable it in one of the tools.
    168 
    169 = Can ZenPress break my theme or plugins? =
    170 
    171 Potentially, yes—especially if your theme or plugins rely on features you disable (RSS feeds, oEmbed, REST API, emojis, WooCommerce assets, etc.). That’s why each snippet includes clear descriptions and categories (performance, security, UI). Always test changes on a staging site first and enable snippets gradually.
     167Yes. You can use ZenPress alongside tools like Cache Enabler or Autoptimize. Because ZenPress focuses on disabling unused core features and reducing bloat, it does not interfere with page caching or image optimization. If you notice overlapping features, you can easily toggle them off in either tool.
    172168
    173169= How do I know which snippets are safe to enable? =
    174170
    175 If you are unsure, start with a preset (Corporate, Blog, E‑commerce) and then adjust. For manual tuning, prefer UI and performance snippets first (dashicons, emojis, dashboard/admin-bar cleanup) before more invasive ones (REST API, XML‑RPC, RSS). After each change, check: frontend pages, login, editor, and (if used) WooCommerce flows.
     171If you are new to optimization, you can safely start with a curated preset (Corporate, Blog, or E‑commerce). For manual changes, we suggest starting with User Interface (UI) and performance settings, such as cleaning up the Admin Bar, before moving to more advanced core settings.
    176172
    177173= What happens if I disable the REST API? =
    178174
    179 Unauthenticated REST requests will be blocked except for any explicit bypasses configured via the filters documented in the snippet (`zenpress_disable_wp_rest_api_post_var`, `zenpress_disable_wp_rest_api_server_var`). Core features and plugins that depend on public REST endpoints (some blocks, headless/front-end apps, third-party integrations) may stop working until you whitelist the required routes.
    180 
    181 **Important**: If you don't know how to configure bypass filters or whitelist specific routes, don't activate this snippet. It can break functionality that relies on public REST API access.
     175The REST API allows different applications to communicate with your site. If you disable it, ZenPress will block unauthenticated requests to keep your site secure. However, some blocks or third-party integrations may require this to be active. If a feature stops working, you can simply use our documented filters to allow specific routes.
    182176
    183177= Does ZenPress store any personal data or phone home? =
     
    187181= Is ZenPress multisite compatible? =
    188182
    189 ZenPress can be network‑activated or activated per site. Settings are stored per site, so each site in a network can have different snippets enabled. As with any optimization/security plugin, test network‑wide changes carefully, especially REST API and XML‑RPC related snippets.
     183ZenPress is fully compatible with multisite networks. You can activate it across the entire network or on individual sites. Only Network Administrators have the capability to manage these settings across the network to ensure consistent performance and security policies.
    190184
    191185= I have a suggestion =
    192186
    193 Nice ! If you can't find anything in the roadmap, feel free to submit your suggestion on the support page! If you know how to code, you can even contribute on GitHub.
    194 
    195 == Hooks & filters ==
    196 
    197 For developers: ZenPress exposes the following action and filters for extending or bypassing behavior.
    198 
    199 = Action =
    200 * `zenpress_caches_clear` – Fired when the user clears caches from the ZenPress admin bar. Integrations (e.g. Autoptimize) hook into this to clear their own caches. You can add custom cache clear logic with `add_action('zenpress_caches_clear', 'your_callback');`.
    201 
    202 = Filters (Disable REST API snippet) =
    203 * `zenpress_disable_wp_rest_api_post_var` – Allow unauthenticated REST access when a specific POST key is present (e.g. for webhooks). Return a string or array of key names. Use non-guessable values only.
    204 * `zenpress_disable_wp_rest_api_server_var` – Allow unauthenticated REST access when `REQUEST_URI` matches a specific value. Return a string or array. Use non-guessable values only.
     187I welcome your ideas! If you have a suggestion for the roadmap, please visit the official support forum. If you are a developer, you can also contribute directly to the project on GitHub.
    205188
    206189== Changelog ==
    207190
     191= 2.2.5 =
     192- Linguistic improvements : Align to WordPress [Style, voice, and tone](https://make.wordpress.org/docs/style-guide/general-guidelines/style-voice-tone/).
     193- Accessibility improvements : Align to WordPress [accessibility guidelines](https://make.wordpress.org/docs/style-guide/general-guidelines/accessibility/).
     194
    208195= 2.2.4 =
    209 - Fix: Admin bar “Clear all caches” is now off by default; user turns it on if they want.
     196- Fix : Admin bar “Clear all caches” is now off by default; user turns it on if they want.
    210197- Code quality : Split Settings page into smaller, modular piece.
    211198- Interface : After clearing cache from the admin bar, show a WordPress success notice on the next admin load.
  • zenpress/tags/2.2.5/zenpress.php

    r3452689 r3470504  
    1010 * @license   GPL v2 or later
    1111 *
    12  * Plugin Name: ZenPress - Optimize & Secure
    13  * Description: Easily speed up and strengthen your WordPress site in one click: clean out unnecessary features, protect weak points, autoconfigure cache integrations.
    14  * Version: 2.2.4
     12 * Plugin Name: ZenPress
     13 * Description: Speed up and harden your site with a single click: cleans up unused features, protects security gaps, and configures cache integrations automatically.
     14 * Version: 2.2.5
    1515 * Plugin URI: https://wordpress.org/plugins/zenpress/
    1616 * Author: Quentin Le Duff
  • zenpress/trunk/assets/build/index.asset.php

    r3452689 r3470504  
    1 <?php return array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-notices'), 'version' => 'f3427795ee306bf33669');
     1<?php return array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-notices'), 'version' => 'e5c7f5bde89d8094a538');
  • zenpress/trunk/assets/build/index.js

    r3452689 r3470504  
    1 (()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.domReady;var s=e.n(t);const n=window.wp.element,r=window.wp.apiFetch;var a=e.n(r);const i=window.wp.data,o=window.wp.notices,c=window.wp.i18n,l=[{key:"autoptimize",path:"/zenpress/v1/autoconfig/autoptimize",successMessage:(0,c.__)("Autoptimize has been configured.","zenpress"),errorMessage:(0,c.__)("Autoptimize autoconfig failed. Is Autoptimize installed and active?","zenpress"),buttonLabel:(0,c.__)("Setup Autoptimize","zenpress"),helpText:(0,c.__)("Apply recommended Autoptimize settings: Minify JS & CSS, aggregate CSS, static files, 404 fallbacks.","zenpress")},{key:"cache_enabler",path:"/zenpress/v1/autoconfig/cache-enabler",successMessage:(0,c.__)("Cache Enabler has been configured.","zenpress"),errorMessage:(0,c.__)("Cache Enabler autoconfig failed. Is Cache Enabler installed and active?","zenpress"),buttonLabel:(0,c.__)("Setup Cache Enabler","zenpress"),helpText:(0,c.__)("Apply recommended Cache Enabler settings: Clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS).","zenpress")},{key:"sqlite_object_cache",path:"/zenpress/v1/autoconfig/sqlite-object-cache",successMessage:(0,c.__)("SQLite Object Cache has been configured.","zenpress"),errorMessage:(0,c.__)("SQLite Object Cache autoconfig failed. Is SQLite Object Cache installed and active?","zenpress"),buttonLabel:(0,c.__)("Setup SQLite Object Cache","zenpress"),helpText:(0,c.__)('Apply recommended SQLite Object Cache settings. Enable "Use APCu" if APCu is available.',"zenpress")}],d=["core","gutenberg","woocommerce","ads-blocker","tools"];function p(e){return null==e||"string"!=typeof e?e:e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}const u=window.wp.components,b=window.ReactJSXRuntime,h=()=>{const{removeNotice:e}=(0,i.useDispatch)(o.store),t=(0,i.useSelect)(e=>e(o.store).getNotices(),[]);return t&&0!==t.length?(0,b.jsx)(u.NoticeList,{notices:t,onRemove:e}):null},g=(0,n.createContext)(),f=({selectedTabId:e,onSelect:t,orientation:s="horizontal",children:r})=>{const[a,i]=(0,n.useState)(),o=(0,n.useRef)(null),c=void 0!==e?e:a;return(0,b.jsx)(g.Provider,{value:{selectedTabId:c,onSelect:s=>{void 0===e&&i(s),t?.(s)},orientation:s,getOrderedTabIds:()=>o.current?Array.from(o.current.querySelectorAll('[role="tab"]')).map(e=>{const t=e.getAttribute("id");return t?t.replace("zenpress-tab-",""):null}).filter(Boolean):[],tabListRef:o},children:(0,b.jsx)("div",{className:`zenpress-tabs zenpress-tabs--${s}`,children:r})})};f.TabList=({children:e})=>{const{orientation:t,tabListRef:s}=(0,n.useContext)(g);return(0,b.jsx)("div",{ref:s,className:`zenpress-tabs__list zenpress-tabs__list--${t}`,role:"tablist","aria-orientation":t,children:e})},f.Tab=({tabId:e,title:t,className:s="",children:r})=>{const{selectedTabId:a,onSelect:i,orientation:o,getOrderedTabIds:c}=(0,n.useContext)(g),l=a===e,d=(0,n.useRef)(null);return(0,b.jsx)("button",{ref:d,className:`zenpress-tabs__tab ${l?"zenpress-tabs__tab--is-active":""} ${s}`.trim(),role:"tab","aria-selected":l,"aria-controls":`zenpress-tab-panel-${e}`,id:`zenpress-tab-${e}`,tabIndex:l?0:-1,onClick:()=>i(e),onKeyDown:t=>{const s=c();if(!s||0===s.length)return;const n=s.indexOf(e);if(-1===n)return;let r=n;if("vertical"===o?"ArrowDown"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowUp"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1):"ArrowRight"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowLeft"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1),"Home"===t.key?(t.preventDefault(),r=0):"End"===t.key&&(t.preventDefault(),r=s.length-1)," "===t.key||"Enter"===t.key)return t.preventDefault(),void i(e);if(r!==n&&r>=0&&r<s.length){const e=s[r],t=document.getElementById(`zenpress-tab-${e}`);t&&(t.focus(),i(e))}},onFocus:()=>{l||i(e)},children:t||r})},f.TabPanel=({tabId:e,children:t})=>{const{selectedTabId:s}=(0,n.useContext)(g),r=(0,n.useRef)(null),a=s===e;return(0,n.useEffect)(()=>{a&&r.current&&(0===r.current.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])').length?r.current.setAttribute("tabindex","0"):r.current.removeAttribute("tabindex"))},[a]),a?(0,b.jsx)("div",{ref:r,className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,children:t}):(0,b.jsx)("div",{className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,hidden:!0,children:t})};const m=({onClick:e,isBusy:t})=>(0,b.jsx)(u.Button,{variant:"primary",onClick:e,isBusy:t,__next40pxDefaultSize:!0,children:(0,c.__)("Save settings","zenpress")});function y({onEnableAll:e,onDisableAll:t,onSave:s,isSaving:n}){return(0,b.jsxs)("div",{className:"zenpress-actions",children:[(0,b.jsxs)("div",{className:"zenpress-actions-bulk",children:[(0,b.jsx)(u.Button,{variant:"tertiary",onClick:e,__next40pxDefaultSize:!0,children:(0,c.__)("Enable all actions","zenpress")}),(0,b.jsx)(u.Button,{isDestructive:!0,onClick:t,__next40pxDefaultSize:!0,children:(0,c.__)("Disable all actions","zenpress")})]}),(0,b.jsx)(m,{onClick:s,isBusy:n})]})}function _(){const e="undefined"!=typeof window?window.zenpressIntegrationsActive:null;return!e||"object"!=typeof e||Array.isArray(e)?{}:e}const z=({label:e,value:t,onChange:s,help:r})=>{const a=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>((e,t)=>{if(!e)return;const s=s=>{if("Enter"===s.key){const n=e.querySelector('input[type="checkbox"]'),r=e.ownerDocument||document;n&&(r.activeElement===n||e.contains(r.activeElement))&&(s.preventDefault(),s.stopPropagation(),t())}};return e.addEventListener("keydown",s),()=>{e.removeEventListener("keydown",s)}})(a.current,s),[s]),(0,b.jsx)("div",{ref:a,children:(0,b.jsx)(u.ToggleControl,{label:e,checked:t,onChange:s,help:r,__nextHasNoMarginBottom:!0})})};function v({subcategory:e,items:t,onToggle:s}){const n=e.toLowerCase().replace(/\s+/g,"-");return(0,b.jsxs)("div",{className:`zenpress-subcategory zenpress-subcategory-${n}`,children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:p(e)}),t.map(({name:e,data:t})=>(0,b.jsx)(z,{label:t.title||e,value:t?.["enable-snippet"]||!1,onChange:()=>s(e),help:t.description||""},e))]},e)}function x({integrationKey:e,buttonLabel:t,helpText:s,onClick:n,busyKey:r}){const a=r===e;return(0,b.jsxs)("div",{className:"zenpress-autoconfig-actions",children:[(0,b.jsx)(u.Button,{variant:"secondary",onClick:n,disabled:null!==r,__next40pxDefaultSize:!0,children:a?(0,c.__)("Applying…","zenpress"):t}),(0,b.jsx)("p",{className:"zenpress-autoconfig-help",children:s})]})}function j({adminBarEnabled:e,setAdminBarEnabled:t,autoconfigBusy:s,getAutoconfigHandler:n}){return(0,b.jsxs)("div",{className:"zenpress-subcategory zenpress-subcategory-integrations",children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:(0,c.__)("Integrations","zenpress")}),(0,b.jsx)(z,{label:(0,c.__)("Show ZenPress admin bar button","zenpress"),value:e,onChange:()=>t(!e),help:(0,c.__)('Show a ZenPress item in the admin bar with "Clear all caches" and sub-items for each active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, AutOptimize, or SQLite Object Cache is active. When enabled, those plugins\' own admin bar buttons are hidden.',"zenpress")}),l.filter(e=>_()[e.key]).map(e=>(0,b.jsx)(x,{integrationKey:e.key,buttonLabel:e.buttonLabel,helpText:e.helpText,onClick:n(e.key),busyKey:s},e.key))]})}function w({category:e,groupedSnippets:t,onToggle:s,showIntegrations:n=!1,adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:i,getAutoconfigHandler:o}){const c=Object.keys(t[e]||{}).sort();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("h2",{children:p(e)}),c.map(n=>(0,b.jsx)(v,{subcategory:n,items:t[e]?.[n]??[],onToggle:s},n)),n&&Object.values(_()).some(Boolean)&&(0,b.jsx)(j,{adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:i,getAutoconfigHandler:o})]})}function S({icon:e,title:t,description:s,presetId:n,onEnable:r}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("hr",{}),(0,b.jsxs)("h3",{children:[e," ",t]}),(0,b.jsx)("p",{children:s}),(0,b.jsx)(u.Button,{variant:"secondary",onClick:()=>r(n),__next40pxDefaultSize:!0,children:(0,c.__)("Enable","zenpress")})]})}const C=[{id:"corporate-website",icon:"🖼️",title:(0,c.__)("Corporate website","zenpress"),description:(0,c.__)("Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives.","zenpress")},{id:"blog",icon:"📰",title:(0,c.__)("Blog","zenpress"),description:(0,c.__)("Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds.","zenpress")},{id:"ecommerce",icon:"🛒",title:(0,c.__)("E-commerce","zenpress"),description:(0,c.__)("Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout.","zenpress")}];function E({onEnablePreset:e}){return(0,b.jsx)("div",{className:"zenpress-presets",children:(0,b.jsxs)("div",{className:"zenpress-presets-description",children:[(0,b.jsx)("h2",{children:(0,c.__)("Pick configuration preset","zenpress")}),(0,b.jsx)("p",{children:(0,c.__)("Don't know which features to enable? Quickly configure ZenPress by selecting a preset that matches your site type. Each preset enables optimized features for your specific use case.","zenpress")}),C.map(t=>(0,b.jsx)(S,{icon:t.icon,title:t.title,description:t.description,presetId:t.id,onEnable:e},t.id))]})})}const k=()=>{const{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:u,isSaving:g}=(()=>{const[e,t]=(0,n.useState)({}),[s,r]=(0,n.useState)(!1),[l,d]=(0,n.useState)(!1),{createSuccessNotice:p,createErrorNotice:u}=(0,i.useDispatch)(o.store);return(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{const s=await a()({path:"/wp/v2/settings"});if(e)return;const n=Array.isArray(s?.zenpress_active_snippets)?s.zenpress_active_snippets:[],i=window?.zenpressSnippetsMeta,o=i&&"object"==typeof i&&!Array.isArray(i)?i:{},c={};Object.keys(o).forEach(e=>{c[e]={...o[e],"enable-snippet":n.includes(e)}}),t(c),r(!0===s?.zenpress_admin_bar_enabled)}catch{e||u((0,c.__)("Failed to load settings.","zenpress"))}})(),()=>{e=!0}},[u]),{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:async()=>{d(!0);const t=Object.keys(e).filter(t=>e[t]?.["enable-snippet"]);try{await a()({path:"/wp/v2/settings",method:"POST",data:{zenpress_active_snippets:t,zenpress_admin_bar_enabled:s}}),p((0,c.__)("Settings saved.","zenpress"))}catch{u((0,c.__)("Failed to save settings.","zenpress"))}finally{d(!1)}},isSaving:l}})(),{autoconfigBusy:m,getHandler:_}=function(){const[e,t]=(0,n.useState)(null),{createSuccessNotice:s,createErrorNotice:r}=(0,i.useDispatch)(o.store),c=async(e,n,i,o)=>{if("string"==typeof n&&n.startsWith("/")){t(e);try{const e=await a()({path:n,method:"POST"});s(e?.message||i)}catch{r(o)}finally{t(null)}}else r(o)};return{autoconfigBusy:e,runAutoconfig:c,getHandler:e=>{const t=l.find(t=>t.key===e);return t?()=>c(t.key,t.path,t.successMessage,t.errorMessage):()=>{}}}}(),[z,v]=(0,n.useState)(),{grouped:x,sortedCategories:j}=(0,n.useMemo)(()=>function(e){const t={};if(!e||"object"!=typeof e||Array.isArray(e))return{grouped:t,sortedCategories:[]};Object.keys(e).forEach(s=>{const n=e[s],r=(n?.category||(0,c.__)("Uncategorized","zenpress")).toLowerCase(),a=(n?.subcategory||(0,c.__)("uncategorized","zenpress")).toLowerCase();t[r]||(t[r]={}),t[r][a]||(t[r][a]=[]),t[r][a].push({name:s,data:n})});const s=Object.keys(t).sort((e,t)=>{const s=d.indexOf(e.toLowerCase()),n=d.indexOf(t.toLowerCase());return-1!==s&&-1!==n?s-n:-1!==s?-1:-1!==n?1:e.localeCompare(t,void 0,{sensitivity:"base"})});return{grouped:t,sortedCategories:s}}(e),[e]),S=e=>{t(t=>({...t,[e]:{...t[e],"enable-snippet":!t[e]?.["enable-snippet"]}}))};return(0,n.useEffect)(()=>{!z&&j.length>0&&v(j[0])},[z,j]),(0,n.useEffect)(()=>{const e=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),g||u())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[u,g]),(0,b.jsxs)("article",{className:"zenpress-row",children:[(0,b.jsxs)("section",{className:"zenpress-main",children:[(0,b.jsx)("div",{className:"zenpress-notices",children:(0,b.jsx)(h,{})}),(0,b.jsxs)("div",{className:"zenpress-panel",children:[(0,b.jsxs)(f,{orientation:"vertical",selectedTabId:z,onSelect:v,children:[(0,b.jsx)(f.TabList,{children:j.map(e=>{const t=`zenpress-tabs__tab--category-${e.toLowerCase().replace(/\s+/g,"-")}`;return(0,b.jsx)(f.Tab,{tabId:e,title:p(e),className:t,children:p(e)},e)})}),j.map(e=>(0,b.jsx)(f.TabPanel,{tabId:e,children:(0,b.jsx)(w,{category:e,groupedSnippets:x,onToggle:S,showIntegrations:"tools"===e,adminBarEnabled:s,setAdminBarEnabled:r,autoconfigBusy:m,getAutoconfigHandler:_})},e))]}),(0,b.jsx)(y,{onEnableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!0}}),t})},onDisableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!1}}),t})},onSave:u,isSaving:g})]})]}),(0,b.jsx)("aside",{className:"zenpress-sidebar",children:(0,b.jsx)(E,{onEnablePreset:e=>{t(t=>{const s={};return Object.entries(t).forEach(([t,n])=>{const r=(Array.isArray(n?.preset)?n.preset:[]).includes(e);s[t]={...n,"enable-snippet":r}}),s})}})})]})};s()(()=>{const e=document.getElementById("zenpress-settings");e&&e instanceof HTMLElement&&(0,n.createRoot)(e).render((0,b.jsx)(k,{}))})})();
     1(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.domReady;var s=e.n(t);const n=window.wp.element,r=window.wp.apiFetch;var a=e.n(r);const o=window.wp.data,i=window.wp.notices,c=window.wp.i18n,l=[{key:"autoptimize",path:"/zenpress/v1/autoconfig/autoptimize",successMessage:(0,c.__)("Autoptimize configured.","zenpress"),errorMessage:(0,c.__)("Autoptimize setup failed. Is Autoptimize installed and active?","zenpress"),buttonLabel:(0,c.__)("Set up Autoptimize","zenpress"),helpText:(0,c.__)("Apply recommended settings: minify JS and CSS, combine CSS, static file caching, 404 fallbacks.","zenpress")},{key:"cache_enabler",path:"/zenpress/v1/autoconfig/cache-enabler",successMessage:(0,c.__)("Cache Enabler configured.","zenpress"),errorMessage:(0,c.__)("Cache Enabler setup failed. Is Cache Enabler installed and active?","zenpress"),buttonLabel:(0,c.__)("Set up Cache Enabler","zenpress"),helpText:(0,c.__)("Apply recommended settings: clear cache on content changes, WebP, compression, minify HTML.","zenpress")},{key:"sqlite_object_cache",path:"/zenpress/v1/autoconfig/sqlite-object-cache",successMessage:(0,c.__)("SQLite Object Cache configured.","zenpress"),errorMessage:(0,c.__)("SQLite Object Cache setup failed. Is it installed and active?","zenpress"),buttonLabel:(0,c.__)("Set up SQLite Object Cache","zenpress"),helpText:(0,c.__)('Apply recommended settings. Enable "Use APCu" in the plugin if available.',"zenpress")}],p=["core","gutenberg","woocommerce","ads-blocker","tools"];function d(e){return null==e||"string"!=typeof e?e:e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}const u=window.wp.components,b=window.ReactJSXRuntime,h=()=>{const{removeNotice:e}=(0,o.useDispatch)(i.store),t=(0,o.useSelect)(e=>e(i.store).getNotices(),[]);return t&&0!==t.length?(0,b.jsx)(u.NoticeList,{notices:t,onRemove:e}):null},g=(0,n.createContext)(),f=({selectedTabId:e,onSelect:t,orientation:s="horizontal",children:r})=>{const[a,o]=(0,n.useState)(),i=(0,n.useRef)(null),c=void 0!==e?e:a;return(0,b.jsx)(g.Provider,{value:{selectedTabId:c,onSelect:s=>{void 0===e&&o(s),t?.(s)},orientation:s,getOrderedTabIds:()=>i.current?Array.from(i.current.querySelectorAll('[role="tab"]')).map(e=>{const t=e.getAttribute("id");return t?t.replace("zenpress-tab-",""):null}).filter(Boolean):[],tabListRef:i},children:(0,b.jsx)("div",{className:`zenpress-tabs zenpress-tabs--${s}`,children:r})})};f.TabList=({children:e})=>{const{orientation:t,tabListRef:s}=(0,n.useContext)(g);return(0,b.jsx)("div",{ref:s,className:`zenpress-tabs__list zenpress-tabs__list--${t}`,role:"tablist","aria-orientation":t,children:e})},f.Tab=({tabId:e,title:t,className:s="",children:r})=>{const{selectedTabId:a,onSelect:o,orientation:i,getOrderedTabIds:c}=(0,n.useContext)(g),l=a===e,p=(0,n.useRef)(null);return(0,b.jsx)("button",{ref:p,className:`zenpress-tabs__tab ${l?"zenpress-tabs__tab--is-active":""} ${s}`.trim(),role:"tab","aria-selected":l,"aria-controls":`zenpress-tab-panel-${e}`,id:`zenpress-tab-${e}`,tabIndex:l?0:-1,onClick:()=>o(e),onKeyDown:t=>{const s=c();if(!s||0===s.length)return;const n=s.indexOf(e);if(-1===n)return;let r=n;if("vertical"===i?"ArrowDown"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowUp"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1):"ArrowRight"===t.key?(t.preventDefault(),r=n<s.length-1?n+1:0):"ArrowLeft"===t.key&&(t.preventDefault(),r=n>0?n-1:s.length-1),"Home"===t.key?(t.preventDefault(),r=0):"End"===t.key&&(t.preventDefault(),r=s.length-1)," "===t.key||"Enter"===t.key)return t.preventDefault(),void o(e);if(r!==n&&r>=0&&r<s.length){const e=s[r],t=document.getElementById(`zenpress-tab-${e}`);t&&(t.focus(),o(e))}},onFocus:()=>{l||o(e)},children:t||r})},f.TabPanel=({tabId:e,children:t})=>{const{selectedTabId:s}=(0,n.useContext)(g),r=(0,n.useRef)(null),a=s===e;return(0,n.useEffect)(()=>{a&&r.current&&(0===r.current.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])').length?r.current.setAttribute("tabindex","0"):r.current.removeAttribute("tabindex"))},[a]),a?(0,b.jsx)("div",{ref:r,className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,children:t}):(0,b.jsx)("div",{className:"zenpress-tabs__panel",role:"tabpanel",id:`zenpress-tab-panel-${e}`,"aria-labelledby":`zenpress-tab-${e}`,hidden:!0,children:t})};const m=({onClick:e,isBusy:t})=>(0,b.jsx)(u.Button,{variant:"primary",onClick:e,isBusy:t,__next40pxDefaultSize:!0,children:(0,c.__)("Save","zenpress")});function y({onEnableAll:e,onDisableAll:t,onSave:s,isSaving:n}){return(0,b.jsxs)("div",{className:"zenpress-actions",children:[(0,b.jsxs)("div",{className:"zenpress-actions-bulk",children:[(0,b.jsx)(u.Button,{variant:"tertiary",onClick:e,__next40pxDefaultSize:!0,children:(0,c.__)("Enable all","zenpress")}),(0,b.jsx)(u.Button,{isDestructive:!0,onClick:t,__next40pxDefaultSize:!0,children:(0,c.__)("Disable all","zenpress")})]}),(0,b.jsx)(m,{onClick:s,isBusy:n})]})}function _(){const e="undefined"!=typeof window?window.zenpressIntegrationsActive:null;return!e||"object"!=typeof e||Array.isArray(e)?{}:e}const z=({label:e,value:t,onChange:s,help:r})=>{const a=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>((e,t)=>{if(!e)return;const s=s=>{if("Enter"===s.key){const n=e.querySelector('input[type="checkbox"]'),r=e.ownerDocument||document;n&&(r.activeElement===n||e.contains(r.activeElement))&&(s.preventDefault(),s.stopPropagation(),t())}};return e.addEventListener("keydown",s),()=>{e.removeEventListener("keydown",s)}})(a.current,s),[s]),(0,b.jsx)("div",{ref:a,children:(0,b.jsx)(u.ToggleControl,{label:e,checked:t,onChange:s,help:r,__nextHasNoMarginBottom:!0})})};function v({subcategory:e,items:t,onToggle:s}){const n=e.toLowerCase().replace(/\s+/g,"-");return(0,b.jsxs)("div",{className:`zenpress-subcategory zenpress-subcategory-${n}`,children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:d(e)}),t.map(({name:e,data:t})=>(0,b.jsx)(z,{label:t.title||e,value:t?.["enable-snippet"]||!1,onChange:()=>s(e),help:t.description||""},e))]},e)}function x({integrationKey:e,buttonLabel:t,helpText:s,onClick:n,busyKey:r}){const a=r===e;return(0,b.jsxs)("div",{className:"zenpress-autoconfig-actions",children:[(0,b.jsx)(u.Button,{variant:"secondary",onClick:n,disabled:null!==r,__next40pxDefaultSize:!0,children:a?(0,c.__)("Applying…","zenpress"):t}),(0,b.jsx)("p",{className:"zenpress-autoconfig-help",children:s})]})}function j({adminBarEnabled:e,setAdminBarEnabled:t,autoconfigBusy:s,getAutoconfigHandler:n}){return(0,b.jsxs)("div",{className:"zenpress-subcategory zenpress-subcategory-integrations",children:[(0,b.jsx)("hr",{}),(0,b.jsx)("h3",{children:(0,c.__)("Integrations","zenpress")}),(0,b.jsx)(z,{label:(0,c.__)("Show cache actions in admin bar","zenpress"),value:e,onChange:()=>t(!e),help:(0,c.__)('Adds a ZenPress menu to the admin bar with "Clear all caches" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins\' own admin bar buttons.',"zenpress")}),l.filter(e=>_()[e.key]).map(e=>(0,b.jsx)(x,{integrationKey:e.key,buttonLabel:e.buttonLabel,helpText:e.helpText,onClick:n(e.key),busyKey:s},e.key))]})}function w({category:e,groupedSnippets:t,onToggle:s,showIntegrations:n=!1,adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:o,getAutoconfigHandler:i}){const c=Object.keys(t[e]||{}).sort();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("h2",{children:d(e)}),c.map(n=>(0,b.jsx)(v,{subcategory:n,items:t[e]?.[n]??[],onToggle:s},n)),n&&Object.values(_()).some(Boolean)&&(0,b.jsx)(j,{adminBarEnabled:r,setAdminBarEnabled:a,autoconfigBusy:o,getAutoconfigHandler:i})]})}function S({icon:e,title:t,description:s,presetId:n,onEnable:r}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("hr",{}),(0,b.jsxs)("h3",{children:[e," ",t]}),(0,b.jsx)("p",{children:s}),(0,b.jsx)(u.Button,{variant:"secondary",onClick:()=>r(n),__next40pxDefaultSize:!0,children:(0,c.__)("Apply preset","zenpress")})]})}const E=[{id:"corporate-website",icon:"🖼️",title:(0,c.__)("Corporate website","zenpress"),description:(0,c.__)("For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives.","zenpress")},{id:"blog",icon:"📰",title:(0,c.__)("Blog","zenpress"),description:(0,c.__)("For content-focused blogs. Keeps RSS and other blog features while improving performance and security.","zenpress")},{id:"ecommerce",icon:"🛒",title:(0,c.__)("E-commerce","zenpress"),description:(0,c.__)("For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout.","zenpress")}];function A({onEnablePreset:e}){return(0,b.jsx)("div",{className:"zenpress-presets",children:(0,b.jsxs)("div",{className:"zenpress-presets-description",children:[(0,b.jsx)("h2",{children:(0,c.__)("Choose a preset","zenpress")}),(0,b.jsx)("p",{children:(0,c.__)("Not sure what to enable? Choose a preset that matches your site. Each preset turns on a set of features for that type of site.","zenpress")}),E.map(t=>(0,b.jsx)(S,{icon:t.icon,title:t.title,description:t.description,presetId:t.id,onEnable:e},t.id))]})})}const C=()=>{const{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:u,isSaving:g}=(()=>{const[e,t]=(0,n.useState)({}),[s,r]=(0,n.useState)(!1),[l,p]=(0,n.useState)(!1),{createSuccessNotice:d,createErrorNotice:u}=(0,o.useDispatch)(i.store);return(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{const s=await a()({path:"/wp/v2/settings"});if(e)return;const n=Array.isArray(s?.zenpress_active_snippets)?s.zenpress_active_snippets:[],o=window?.zenpressSnippetsMeta,i=o&&"object"==typeof o&&!Array.isArray(o)?o:{},c={};Object.keys(i).forEach(e=>{c[e]={...i[e],"enable-snippet":n.includes(e)}}),t(c),r(!0===s?.zenpress_admin_bar_enabled)}catch{e||u((0,c.__)("Settings could not be loaded. Refresh the page.","zenpress"))}})(),()=>{e=!0}},[u]),{snippets:e,setSnippets:t,adminBarEnabled:s,setAdminBarEnabled:r,saveSettings:async()=>{p(!0);const t=Object.keys(e).filter(t=>e[t]?.["enable-snippet"]);try{await a()({path:"/wp/v2/settings",method:"POST",data:{zenpress_active_snippets:t,zenpress_admin_bar_enabled:s}}),d((0,c.__)("Settings saved.","zenpress"))}catch{u((0,c.__)("Settings could not be saved. Try again.","zenpress"))}finally{p(!1)}},isSaving:l}})(),{autoconfigBusy:m,getHandler:_}=function(){const[e,t]=(0,n.useState)(null),{createSuccessNotice:s,createErrorNotice:r}=(0,o.useDispatch)(i.store),c=async(e,n,o,i)=>{if("string"==typeof n&&n.startsWith("/")){t(e);try{const e=await a()({path:n,method:"POST"});s(e?.message||o)}catch{r(i)}finally{t(null)}}else r(i)};return{autoconfigBusy:e,runAutoconfig:c,getHandler:e=>{const t=l.find(t=>t.key===e);return t?()=>c(t.key,t.path,t.successMessage,t.errorMessage):()=>{}}}}(),[z,v]=(0,n.useState)(),{grouped:x,sortedCategories:j}=(0,n.useMemo)(()=>function(e){const t={};if(!e||"object"!=typeof e||Array.isArray(e))return{grouped:t,sortedCategories:[]};Object.keys(e).forEach(s=>{const n=e[s],r=(n?.category||(0,c.__)("Uncategorized","zenpress")).toLowerCase(),a=(n?.subcategory||(0,c.__)("Uncategorized","zenpress")).toLowerCase();t[r]||(t[r]={}),t[r][a]||(t[r][a]=[]),t[r][a].push({name:s,data:n})});const s=Object.keys(t).sort((e,t)=>{const s=p.indexOf(e.toLowerCase()),n=p.indexOf(t.toLowerCase());return-1!==s&&-1!==n?s-n:-1!==s?-1:-1!==n?1:e.localeCompare(t,void 0,{sensitivity:"base"})});return{grouped:t,sortedCategories:s}}(e),[e]),S=e=>{t(t=>({...t,[e]:{...t[e],"enable-snippet":!t[e]?.["enable-snippet"]}}))};return(0,n.useEffect)(()=>{!z&&j.length>0&&v(j[0])},[z,j]),(0,n.useEffect)(()=>{const e=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),g||u())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[u,g]),(0,b.jsxs)("article",{className:"zenpress-row",children:[(0,b.jsxs)("section",{className:"zenpress-main",children:[(0,b.jsx)("div",{className:"zenpress-notices",children:(0,b.jsx)(h,{})}),(0,b.jsxs)("div",{className:"zenpress-panel",children:[(0,b.jsxs)(f,{orientation:"vertical",selectedTabId:z,onSelect:v,children:[(0,b.jsx)(f.TabList,{children:j.map(e=>{const t=`zenpress-tabs__tab--category-${e.toLowerCase().replace(/\s+/g,"-")}`;return(0,b.jsx)(f.Tab,{tabId:e,title:d(e),className:t,children:d(e)},e)})}),j.map(e=>(0,b.jsx)(f.TabPanel,{tabId:e,children:(0,b.jsx)(w,{category:e,groupedSnippets:x,onToggle:S,showIntegrations:"tools"===e,adminBarEnabled:s,setAdminBarEnabled:r,autoconfigBusy:m,getAutoconfigHandler:_})},e))]}),(0,b.jsx)(y,{onEnableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!0}}),t})},onDisableAll:()=>{t(e=>{const t={};return Object.keys(e).forEach(s=>{t[s]={...e[s],"enable-snippet":!1}}),t})},onSave:u,isSaving:g})]})]}),(0,b.jsx)("aside",{className:"zenpress-sidebar",children:(0,b.jsx)(A,{onEnablePreset:e=>{t(t=>{const s={};return Object.entries(t).forEach(([t,n])=>{const r=(Array.isArray(n?.preset)?n.preset:[]).includes(e);s[t]={...n,"enable-snippet":r}}),s})}})})]})};s()(()=>{const e=document.getElementById("zenpress-settings");e&&e instanceof HTMLElement&&(0,n.createRoot)(e).render((0,b.jsx)(C,{}))})})();
  • zenpress/trunk/assets/src/js/components/BulkSnippetActions.js

    r3452689 r3470504  
    2727                    __next40pxDefaultSize
    2828                >
    29                     {__('Enable all actions', 'zenpress')}
     29                    {__('Enable all', 'zenpress')}
    3030                </Button>
    3131                <Button
     
    3434                    __next40pxDefaultSize
    3535                >
    36                     {__('Disable all actions', 'zenpress')}
     36                    {__('Disable all', 'zenpress')}
    3737                </Button>
    3838            </div>
  • zenpress/trunk/assets/src/js/components/IntegrationsBlock.js

    r3452689 r3470504  
    2626            <h3>{__('Integrations', 'zenpress')}</h3>
    2727            <SnippetToggleControl
    28                 label={__('Show ZenPress admin bar button', 'zenpress')}
     28                label={__('Show cache actions in admin bar', 'zenpress')}
    2929                value={adminBarEnabled}
    3030                onChange={() => setAdminBarEnabled(!adminBarEnabled)}
    3131                help={__(
    32                     'Show a ZenPress item in the admin bar with "Clear all caches" and sub-items for each active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, AutOptimize, or SQLite Object Cache is active. When enabled, those plugins\' own admin bar buttons are hidden.',
     32                    'Adds a ZenPress menu to the admin bar with "Clear all caches" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins\' own admin bar buttons.',
    3333                    'zenpress'
    3434                )}
  • zenpress/trunk/assets/src/js/components/PresetCard.js

    r3452689 r3470504  
    2626                __next40pxDefaultSize
    2727            >
    28                 {__('Enable', 'zenpress')}
     28                {__('Apply preset', 'zenpress')}
    2929            </Button>
    3030        </>
  • zenpress/trunk/assets/src/js/components/PresetsSidebar.js

    r3452689 r3470504  
    88        title: __('Corporate website', 'zenpress'),
    99        description: __(
    10             'Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives.',
     10            'For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives.',
    1111            'zenpress'
    1212        ),
     
    1717        title: __('Blog', 'zenpress'),
    1818        description: __(
    19             'Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds.',
     19            'For content-focused blogs. Keeps RSS and other blog features while improving performance and security.',
    2020            'zenpress'
    2121        ),
     
    2626        title: __('E-commerce', 'zenpress'),
    2727        description: __(
    28             'Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout.',
     28            'For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout.',
    2929            'zenpress'
    3030        ),
     
    4343        <div className="zenpress-presets">
    4444            <div className="zenpress-presets-description">
    45                 <h2>{__('Pick configuration preset', 'zenpress')}</h2>
     45                <h2>{__('Choose a preset', 'zenpress')}</h2>
    4646                <p>
    4747                    {__(
    48                         "Don't know which features to enable? Quickly configure ZenPress by selecting a preset that matches your site type. Each preset enables optimized features for your specific use case.",
     48                        'Not sure what to enable? Choose a preset that matches your site. Each preset turns on a set of features for that type of site.',
    4949                        'zenpress'
    5050                    )}
  • zenpress/trunk/assets/src/js/components/SaveButton.js

    r3448585 r3470504  
    1818            __next40pxDefaultSize
    1919        >
    20             {__('Save settings', 'zenpress')}
     20            {__('Save', 'zenpress')}
    2121        </Button>
    2222    );
  • zenpress/trunk/assets/src/js/config/integrations.js

    r3452689 r3470504  
    99        key: 'autoptimize',
    1010        path: '/zenpress/v1/autoconfig/autoptimize',
    11         successMessage: __('Autoptimize has been configured.', 'zenpress'),
     11        successMessage: __('Autoptimize configured.', 'zenpress'),
    1212        errorMessage: __(
    13             'Autoptimize autoconfig failed. Is Autoptimize installed and active?',
     13            'Autoptimize setup failed. Is Autoptimize installed and active?',
    1414            'zenpress'
    1515        ),
    16         buttonLabel: __('Setup Autoptimize', 'zenpress'),
     16        buttonLabel: __('Set up Autoptimize', 'zenpress'),
    1717        helpText: __(
    18             'Apply recommended Autoptimize settings: Minify JS & CSS, aggregate CSS, static files, 404 fallbacks.',
     18            'Apply recommended settings: minify JS and CSS, combine CSS, static file caching, 404 fallbacks.',
    1919            'zenpress'
    2020        ),
     
    2323        key: 'cache_enabler',
    2424        path: '/zenpress/v1/autoconfig/cache-enabler',
    25         successMessage: __('Cache Enabler has been configured.', 'zenpress'),
     25        successMessage: __('Cache Enabler configured.', 'zenpress'),
    2626        errorMessage: __(
    27             'Cache Enabler autoconfig failed. Is Cache Enabler installed and active?',
     27            'Cache Enabler setup failed. Is Cache Enabler installed and active?',
    2828            'zenpress'
    2929        ),
    30         buttonLabel: __('Setup Cache Enabler', 'zenpress'),
     30        buttonLabel: __('Set up Cache Enabler', 'zenpress'),
    3131        helpText: __(
    32             'Apply recommended Cache Enabler settings: Clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS).',
     32            'Apply recommended settings: clear cache on content changes, WebP, compression, minify HTML.',
    3333            'zenpress'
    3434        ),
     
    3737        key: 'sqlite_object_cache',
    3838        path: '/zenpress/v1/autoconfig/sqlite-object-cache',
    39         successMessage: __(
    40             'SQLite Object Cache has been configured.',
     39        successMessage: __('SQLite Object Cache configured.', 'zenpress'),
     40        errorMessage: __(
     41            'SQLite Object Cache setup failed. Is it installed and active?',
    4142            'zenpress'
    4243        ),
    43         errorMessage: __(
    44             'SQLite Object Cache autoconfig failed. Is SQLite Object Cache installed and active?',
    45             'zenpress'
    46         ),
    47         buttonLabel: __('Setup SQLite Object Cache', 'zenpress'),
     44        buttonLabel: __('Set up SQLite Object Cache', 'zenpress'),
    4845        helpText: __(
    49             'Apply recommended SQLite Object Cache settings. Enable "Use APCu" if APCu is available.',
     46            'Apply recommended settings. Enable "Use APCu" in the plugin if available.',
    5047            'zenpress'
    5148        ),
  • zenpress/trunk/assets/src/js/hooks/useSettings.js

    r3452689 r3470504  
    5656                if (!cancelled) {
    5757                    createErrorNotice(
    58                         __('Failed to load settings.', 'zenpress')
     58                        __(
     59                            'Settings could not be loaded. Refresh the page.',
     60                            'zenpress'
     61                        )
    5962                    );
    6063                }
     
    8588            createSuccessNotice(__('Settings saved.', 'zenpress'));
    8689        } catch {
    87             createErrorNotice(__('Failed to save settings.', 'zenpress'));
     90            createErrorNotice(
     91                __('Settings could not be saved. Try again.', 'zenpress')
     92            );
    8893        } finally {
    8994            setIsSaving(false);
  • zenpress/trunk/assets/src/js/utils/snippets.js

    r3452689 r3470504  
    4444        ).toLowerCase();
    4545        const subcategory = (
    46             snippet?.subcategory || __('uncategorized', 'zenpress')
     46            snippet?.subcategory || __('Uncategorized', 'zenpress')
    4747        ).toLowerCase();
    4848
  • zenpress/trunk/inc/admin/links.php

    r3452689 r3470504  
    1717        '<a href="%s" aria-label="%s">%s</a>',
    1818        esc_url($url),
    19         esc_attr__('Go to ZenPress settings page', 'zenpress'),
     19        esc_attr__('Go to ZenPress settings', 'zenpress'),
    2020        esc_html__('Settings', 'zenpress')
    2121    );
     
    3838                '<a href="%s" target="_blank" rel="noopener noreferrer" aria-label="%s">%s</a>',
    3939                esc_url('https://wordpress.org/plugins/zenpress/#developers'),
    40                 esc_attr__('View ZenPress changelog on WordPress.org (opens in a new tab)', 'zenpress'),
     40                esc_attr__('View ZenPress changelog on WordPress.org (opens in new tab)', 'zenpress'),
    4141                esc_html__('Changelog', 'zenpress')
    4242            ),
     
    4444                '<a href="%s" target="_blank" rel="noopener noreferrer" aria-label="%s">%s</a>',
    4545                esc_url('https://holdmywp.com/zenpress/'),
    46                 esc_attr__('Read ZenPress documentation (opens in a new tab)', 'zenpress'),
    47                 esc_html__('Docs', 'zenpress')
     46                esc_attr__('Read ZenPress documentation (opens in new tab)', 'zenpress'),
     47                esc_html__('Documentation', 'zenpress')
    4848            ),
    4949            sprintf(
    5050                '<a href="%s" target="_blank" rel="noopener noreferrer" aria-label="%s">%s</a>',
    5151                esc_url('https://buymeacoffee.com/quentinld'),
    52                 esc_attr__('Support ZenPress by buying a coffee (opens in a new tab)', 'zenpress'),
    53                 esc_html__('Support ☕', 'zenpress')
     52                esc_attr__('Support ZenPress: Buy me a coffee (opens in new tab)', 'zenpress'),
     53                esc_html__('Support', 'zenpress')
    5454            )
    5555        ];
  • zenpress/trunk/inc/admin/menu.php

    r3451904 r3470504  
    1111function zenpress_add_option_page(): void {
    1212    add_options_page(
    13         __('ZenPress options', 'zenpress'),
     13        __('Settings', 'zenpress'),
    1414        __('ZenPress', 'zenpress'),
    1515        'manage_options',
     
    3636                           target="_blank"
    3737                           rel="noopener noreferrer"
    38                            aria-label="<?php echo esc_attr__('View ZenPress changelog on WordPress.org (opens in a new tab)', 'zenpress'); ?>">
    39                             <?php echo esc_html__('What\'s new ?', 'zenpress'); ?>
     38                           aria-label="<?php echo esc_attr__('View ZenPress changelog on WordPress.org (opens in new tab)', 'zenpress'); ?>">
     39                            <?php echo esc_html__('What\'s new', 'zenpress'); ?>
    4040                        </a>
    4141                    </p>
     
    4646                   target="_blank"
    4747                   rel="noopener noreferrer"
    48                    aria-label="<?php echo esc_attr__('Read the ZenPress documentation (opens in a new tab)', 'zenpress'); ?>">
     48                   aria-label="<?php echo esc_attr__('Read ZenPress documentation (opens in new tab)', 'zenpress'); ?>">
    4949                    <?php echo esc_html__('Documentation', 'zenpress'); ?>
    5050                </a>
     
    5252                   target="_blank"
    5353                   rel="noopener noreferrer"
    54                    aria-label="<?php echo esc_attr__('Leave a review for ZenPress on WordPress.org (opens in a new tab)', 'zenpress'); ?>">
    55                     <?php echo esc_html__('Leave a review (helps a lot)', 'zenpress'); ?>
     54                   aria-label="<?php echo esc_attr__('Leave a review for ZenPress on WordPress.org (opens in new tab)', 'zenpress'); ?>">
     55                    <?php echo esc_html__('Leave a review', 'zenpress'); ?>
    5656                </a>
    5757                <a href="https://buymeacoffee.com/quentinld"
     
    5959                   rel="noopener noreferrer"
    6060                   class="components-button is-next-40px-default-size is-tertiary"
    61                    aria-label="<?php echo esc_attr__('Support development: Buy me a coffee (opens in a new tab)', 'zenpress'); ?>">
     61                   aria-label="<?php echo esc_attr__('Support development: Buy me a coffee (opens in new tab)', 'zenpress'); ?>">
    6262                    <?php echo esc_html__('Buy me a coffee', 'zenpress'); ?> <span aria-hidden="true">☕</span>
    6363                </a>
     
    6868                <div class="zenpress-loading-body">
    6969                    <p class="zenpress-loading-text">
    70                         <?php echo esc_html__('Loading your ZenPress settings…', 'zenpress'); ?>
     70                        <?php echo esc_html__('Loading settings…', 'zenpress'); ?>
    7171                    </p>
    7272                </div>
     
    7575        <footer class="zenpress-footer">
    7676            <div class="zenpress-footer-title">
    77                 <p>
    78                     <?php echo esc_html__('Made ', 'zenpress'); ?>
    79                     <span aria-hidden="true"> x ❤️ </span>
    80                     <?php echo esc_html__(' by Quentin Le Duff - Your WordPress Partner', 'zenpress'); ?>
    81                 </p>
     77            <?php
     78                    echo wp_kses_post(sprintf(
     79                        /* translators: 1: decorative heart emoji, 2: author name */
     80                        __('Made with %1$s by %2$s', 'zenpress'),
     81                        '<span aria-hidden="true">❤️</span>',
     82                        'Quentin Le Duff'
     83                    ));
     84    ?>
    8285            </div>
    8386            <div class="zenpress-footer-navigation">
     
    8588                   target="_blank"
    8689                   rel="noopener noreferrer"
    87                    aria-label="<?php echo esc_attr__('Visite the developper website', 'zenpress'); ?>">
    88                     <?php echo esc_html__('My place', 'zenpress'); ?>
     90                   aria-label="<?php echo esc_attr__('Visit the developer website (opens in new tab)', 'zenpress'); ?>">
     91                    <?php echo esc_html__('Developer website', 'zenpress'); ?>
    8992                </a>
    9093                <a href="https://github.com/quentin-ld/zenpress"
    9194                   target="_blank"
    9295                   rel="noopener noreferrer"
    93                    aria-label="<?php echo esc_attr__('Review the code on Github', 'zenpress'); ?>">
    94                     <?php echo esc_html__('ZenPress code repository', 'zenpress'); ?>
     96                   aria-label="<?php echo esc_attr__('View ZenPress source code on GitHub (opens in new tab)', 'zenpress'); ?>">
     97                    <?php echo esc_html__('Source code', 'zenpress'); ?>
    9598                </a>
    9699            </div>
  • zenpress/trunk/inc/classes/integrations.php

    r3452689 r3470504  
    134134        return self::run_rest_autoconfig(
    135135            [ZenPress_Autoptimize::class, 'autoconfig'],
    136             __('Autoptimize has been configured.', 'zenpress'),
     136            __('Autoptimize configured.', 'zenpress'),
    137137            __('Autoptimize configuration failed.', 'zenpress')
    138138        );
     
    145145        return self::run_rest_autoconfig(
    146146            [ZenPress_Cache_Enabler::class, 'autoconfig'],
    147             __('Cache Enabler has been configured.', 'zenpress'),
     147            __('Cache Enabler configured.', 'zenpress'),
    148148            __('Cache Enabler configuration failed.', 'zenpress')
    149149        );
     
    156156        return self::run_rest_autoconfig(
    157157            [ZenPress_Sqlite_Object_Cache::class, 'autoconfig'],
    158             __('SQLite Object Cache has been configured.', 'zenpress'),
     158            __('SQLite Object Cache configured.', 'zenpress'),
    159159            __('SQLite Object Cache configuration failed.', 'zenpress')
    160160        );
     
    204204            'href' => wp_nonce_url(add_query_arg('clear', 'all', $base_url), 'zenpress_clear_caches'),
    205205            'meta' => [
    206                 'title' => __('Clear all caches (page cache, static assets, object cache).', 'zenpress'),
     206                'title' => __('Clear page cache, static assets cache, and object cache.', 'zenpress'),
    207207            ],
    208208        ]);
     
    212212                'id' => 'zenpress-clear-cache-enabler',
    213213                'parent' => 'zenpress',
    214                 'title' => __('Clear pages caches', 'zenpress'),
     214                'title' => __('Clear page cache', 'zenpress'),
    215215                'href' => wp_nonce_url(add_query_arg('clear', 'cache_enabler', $base_url), 'zenpress_clear_caches'),
    216216                'meta' => [
     
    224224                'id' => 'zenpress-clear-autoptimize',
    225225                'parent' => 'zenpress',
    226                 'title' => __('Clear static assets caches (CSS/JS)', 'zenpress'),
     226                'title' => __('Clear static assets cache (CSS/JS)', 'zenpress'),
    227227                'href' => wp_nonce_url(add_query_arg('clear', 'autoptimize', $base_url), 'zenpress_clear_caches'),
    228228                'meta' => [
     
    263263    private static function get_single_cleared_message(string $slug): string {
    264264        /* translators: 1: cache type (e.g. Page cache), 2: plugin name (e.g. Cache Enabler) */
    265         $format = __('%1$s (Managed by %2$s) has been cleared successfully.', 'zenpress');
     265        $format = __('%1$s (managed by %2$s) cleared successfully.', 'zenpress');
    266266        switch ($slug) {
    267267            case 'cache_enabler':
     
    315315            return sprintf(
    316316                /* translators: %s: cache type (e.g. Page cache) */
    317                 __('%s has been cleared successfully.', 'zenpress'),
     317                __('%s cleared successfully.', 'zenpress'),
    318318                $types[0]
    319319            );
     
    324324        return sprintf(
    325325            /* translators: %s: comma-separated list of cache types */
    326             __('%s have been cleared successfully.', 'zenpress'),
     326            __('%s cleared successfully.', 'zenpress'),
    327327            $list
    328328        );
     
    351351    public static function ajax_clear_caches(): void {
    352352        if (!current_user_can('manage_options')) {
    353             wp_die(esc_html__('Forbidden', 'zenpress'), '', ['response' => 403]);
     353            wp_die(esc_html__('You don\'t have permission to do that.', 'zenpress'), '', ['response' => 403]);
    354354        }
    355355        $nonce = isset($_REQUEST['_wpnonce']) ? sanitize_text_field(wp_unslash((string) $_REQUEST['_wpnonce'])) : '';
    356356        if (!wp_verify_nonce($nonce, 'zenpress_clear_caches')) {
    357             wp_die(esc_html__('Forbidden', 'zenpress'), '', ['response' => 403]);
     357            wp_die(esc_html__('You don\'t have permission to do that.', 'zenpress'), '', ['response' => 403]);
    358358        }
    359359
     
    363363                do_action('zenpress_caches_clear');
    364364            } catch (\Throwable $e) {
    365                 wp_die(esc_html__('Cache clear failed.', 'zenpress'), '', ['response' => 500]);
     365                wp_die(esc_html__('Clearing cache failed. Try again.', 'zenpress'), '', ['response' => 500]);
    366366            }
    367367            $message = self::get_all_cleared_message();
     
    373373                }
    374374            } catch (\Throwable $e) {
    375                 wp_die(esc_html__('Cache clear failed.', 'zenpress'), '', ['response' => 500]);
     375                wp_die(esc_html__('Clearing cache failed. Try again.', 'zenpress'), '', ['response' => 500]);
    376376            }
    377377            $message = self::get_single_cleared_message($clear);
    378378        } else {
    379             wp_die(esc_html__('Invalid request.', 'zenpress'), '', ['response' => 400]);
     379            wp_die(esc_html__('Invalid request. Please refresh and try again.', 'zenpress'), '', ['response' => 400]);
    380380        }
    381381
  • zenpress/trunk/inc/snippets/functions/block-user-enumeration.php

    r3448604 r3470504  
    99    $zenpress_query_string = isset($_SERVER['QUERY_STRING']) ? sanitize_text_field(wp_unslash($_SERVER['QUERY_STRING'])) : '';
    1010    if (preg_match('/author=([0-9]+)/i', $zenpress_query_string)) {
    11         wp_die(esc_html__('Access denied.', 'zenpress'), '', ['response' => 403]);
     11        wp_die(esc_html__('You don\'t have permission to view this.', 'zenpress'), '', ['response' => 403]);
    1212    }
    1313
     
    1717        static function (string|false $redirect, string $request): string|false {
    1818            if (preg_match('/\?author=([0-9]+)(\/*)/i', sanitize_text_field(wp_unslash($request)))) {
    19                 wp_die(esc_html__('Access denied.', 'zenpress'), '', ['response' => 403]);
     19                wp_die(esc_html__('You don\'t have permission to view this.', 'zenpress'), '', ['response' => 403]);
    2020            }
    2121
  • zenpress/trunk/inc/snippets/functions/disable-rest-api.php

    r3448604 r3470504  
    5454    add_filter('rest_authentication_errors', static function (WP_Error|bool|null $access) use ($zenpress_disable_wp_rest_api_allow_access): WP_Error|bool|null {
    5555        if (!is_user_logged_in() && !$zenpress_disable_wp_rest_api_allow_access()) {
    56             $message = apply_filters('zenpress_disable_wp_rest_api_error', __('REST API restricted to authenticated users.', 'zenpress'));
     56            $message = apply_filters('zenpress_disable_wp_rest_api_error', __('You must be logged in to use this.', 'zenpress'));
    5757
    5858            return new WP_Error('rest_login_required', $message, ['status' => rest_authorization_required_code()]);
  • zenpress/trunk/inc/snippets/functions/protect-wp-login.php

    r3451904 r3470504  
    77// Remove detailed login errors
    88add_filter('login_errors', static function (): string {
    9     return __('Login error.', 'zenpress');
     9    return __('Something went wrong. Try again.', 'zenpress');
    1010});
    1111
     
    3636    if (get_transient($blockKey)) {
    3737        wp_die(
    38             esc_html__('Too many failed login attempts. Try again later.', 'zenpress'),
     38            esc_html__('Too many failed attempts. Try again in a few minutes.', 'zenpress'),
    3939            '',
    4040            ['response' => 403]
     
    5050        set_transient($blockKey, true, $BLOCK_DURATION);
    5151        wp_die(
    52             esc_html__('Too many failed login attempts. Try again later.', 'zenpress'),
     52            esc_html__('Too many failed attempts. Try again in a few minutes.', 'zenpress'),
    5353            '',
    5454            ['response' => 403]
  • zenpress/trunk/inc/snippets/meta/block-user-enumeration.meta.php

    r3412245 r3470504  
    1313    'title' => __('Block user enumeration', 'zenpress'),
    1414    'description' => __(
    15         'Prevents attackers from guessing WordPress usernames by blocking requests with the `author` parameter in query strings or permalinks. Reduces exposure to brute-force and user-targeted attacks.',
     15        'Stops visitors from discovering usernames via author URLs. Reduces brute-force risk.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/clean-admin-bar.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Clean up the WordPress admin bar', 'zenpress'),
     13    'title' => __('Clean up the admin bar', 'zenpress'),
    1414    'description' => __(
    1515        'Removes unnecessary items from the admin bar in both backend and frontend. Reduces clutter and simplifies the interface.',
  • zenpress/trunk/inc/snippets/meta/clean-dashboard-items.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Clean up the WordPress Dashboard', 'zenpress'),
     13    'title' => __('Clean up the Dashboard', 'zenpress'),
    1414    'description' => __(
    15         'Removes unnecessary and ad widgets from the dashboard. Declutters the admin area and improves usability.',
     15        'Removes unnecessary and promotional widgets from the Dashboard.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-adjacent-posts.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable adjacent posts link tags', 'zenpress'),
     13    'title' => __('Disable prev/next post links in head', 'zenpress'),
    1414    'description' => __(
    1515        'Removes rel="prev" and rel="next" tags from wp_head. Reduces unnecessary HTML output and slightly improves performance.',
  • zenpress/trunk/inc/snippets/meta/disable-application-passwords.meta.php

    r3448585 r3470504  
    1313    'title' => __('Disable application passwords', 'zenpress'),
    1414    'description' => __(
    15         'Disables WordPress application passwords for all users. Improves security; do not enable if you need API or app-based authentication (e.g. mobile apps, REST clients).',
     15        'Turns off application passwords for everyone. Turn this off if you use mobile apps or other apps that log in to WordPress.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-author-archives.meta.php

    r3412245 r3470504  
    1313    'title' => __('Disable author archives', 'zenpress'),
    1414    'description' => __(
    15         'Forces author archive pages to return a 404 error. Prevents user enumeration and hides unnecessary author pages.',
     15        'Author archive URLs show "Page not found." Helps prevent listing usernames.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-autosave.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable autosave', 'zenpress'),
     13    'title' => __('Disable autosave (classic editor)', 'zenpress'),
    1414    'description' => __(
    1515        'Stops the classic editor from autosaving drafts periodically. Reduces database writes and heartbeat traffic. The block editor may still use its own autosave; this targets the legacy post editor.',
  • zenpress/trunk/inc/snippets/meta/disable-capital-p-dangit.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Disable capital_P_dangit filter', 'zenpress'),
     13    'title' => __('Disable "WordPress" spelling correction', 'zenpress'),
    1414    'description' => __(
    15         'Removes the filter that forces "Wordpress" to "WordPress" in titles, content, comments, and widget text. Saves a small amount of processing on each page load.',
     15        'Stops WordPress from changing "Wordpress" to "WordPress" in content. Saves a small amount of work on each page.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-dashicons.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable dashicons', 'zenpress'),
     13    'title' => __('Disable Dashicons (admin icons)', 'zenpress'),
    1414    'description' => __(
    15         'Prevents WordPress from loading the Dashicons CSS for visitors who are not logged in. Improves frontend performance by reducing unnecessary styles.',
     15        'Stops Dashicons (admin icons) from loading for visitors. Logged-in users still see them.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-default-pattern-categories.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable default pattern categories in site editor', 'zenpress'),
    14     'description' => __('Removes default pattern categories from the block pattern inserter in the site editor (e.g. featured, about, audio, banner, buttons, call-to-action, columns, contact, footer, gallery, header, media, portfolio, posts, query, services, team, testimonials, text, videos) and any custom ones. Simplifies the interface; patterns remain accessible.', 'zenpress'),
     13    'title' => __('Disable default pattern categories in Site Editor', 'zenpress'),
     14    'description' => __('Removes default pattern categories from the block inserter. Patterns are still available; the list is simpler.', 'zenpress'),
    1515    'category' => __('gutenberg', 'zenpress'),
    1616    'subcategory' => __('user-interface', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-jquery-migrate.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable jQuery migrate', 'zenpress'),
     13    'title' => __('Disable jQuery Migrate script', 'zenpress'),
    1414    'description' => __(
    15         'Removes jQuery Migrate from loading on the frontend while keeping it enabled in the admin. Improves frontend performance and reduces legacy overhead.',
     15        'Loads jQuery Migrate only in the admin, not on the front. Improves front-end performance.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-login-language-selector.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable the login language selector', 'zenpress'),
     13    'title' => __('Disable login language selector', 'zenpress'),
    1414    'description' => __('Removes the language dropdown from the WordPress login page. Simplifies login screen and reduces distractions.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-password-strength-meter.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Disable Password Strength Meter', 'zenpress'),
     13    'title' => __('Disable password strength meter', 'zenpress'),
    1414    'description' => __(
    15         'Prevents the password strength meter and zxcvbn scripts from loading on profile, login, and similar pages. Saves roughly 400KB and reduces script parsing. Users will not see the strength indicator when choosing passwords.',
     15        'Stops the password strength meter from loading on login and profile pages. Saves about 400KB. Users won\'t see how strong their password is.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/disable-pingback-trackback.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable pingback and trackback', 'zenpress'),
     13    'title' => __('Disable pingbacks and trackbacks', 'zenpress'),
    1414    'description' => __('Removes the X-Pingback header, disables pingbacks and trackbacks on new posts, and prevents self-pingbacks. Reduces spam, blocks potential DDoS vectors, and slightly improves performance by avoiding useless requests.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-rest-api.meta.php

    r3448585 r3470504  
    1212
    1313return [
    14     'title' => __('Disable REST API for visitors not logged into WordPress', 'zenpress'),
     14    'title' => __('Limit REST API to logged-in users', 'zenpress'),
    1515    'description' => __(
    16         'Restricts the WP REST API to logged-in users only; unauthenticated requests receive an error. Bypass filters (zenpress_disable_wp_rest_api_post_var, zenpress_disable_wp_rest_api_server_var) allow specific integrations (e.g. webhooks); use non-guessable values only.',
     16        'Only logged-in users can use the REST API. Visitors get an error. Advanced: filters let you allow specific tools; use with care.',
    1717        'zenpress'
    1818    ),
  • zenpress/trunk/inc/snippets/meta/disable-rss.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable all WordPress feeds (RDF, RSS, RSS2, Atom, and comments)', 'zenpress'),
     13    'title' => __('Disable all feeds (RSS, Atom, comments)', 'zenpress'),
    1414    'description' => __('Prevents access to all default feeds (RDF, RSS, RSS2, Atom, and comments). Also removes feed links from head, and redirects feed requests to the homepage. Reduces unnecessary requests and improves SEO consistency.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-shortlink.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WordPress shortlink', 'zenpress'),
     13    'title' => __('Disable shortlink', 'zenpress'),
    1414    'description' => __('Removes shortlink functionality from both the HTML head and HTTP headers. Reduces unnecessary output, improves performance and SEO clarity.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-wlw-manifest.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WLW link', 'zenpress'),
    14     'description' => __('Removes the WLW manifest link from the head, which was only used by the deprecated Windows Live Writer app. Reduces unnecessary metadata and improves performance.', 'zenpress'),
     13    'title' => __('Disable Windows Live Writer link', 'zenpress'),
     14    'description' => __('Removes the old Windows Live Writer link from the page. Safe to disable.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
    1616    'subcategory' => __('performance', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-woocommerce-cart-fragments.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WooCommerce cart fragments script', 'zenpress'),
    14     'description' => __('Removes the WooCommerce cart fragments JavaScript (wc-cart-fragments), which is responsible for dynamically updating the cart contents without a page reload. Disabling this can improve performance on stores that do not require live cart updates.', 'zenpress'),
     13    'title' => __('Disable WooCommerce cart fragments', 'zenpress'),
     14    'description' => __('Stops the script that updates the cart without reloading the page. Turn off if you don\'t need live cart updates.', 'zenpress'),
    1515    'category' => __('woocommerce', 'zenpress'),
    1616    'subcategory' => __('performance', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-woocommerce-scripts-styles.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WooCommerce scripts and styles on non-WooCommerce pages', 'zenpress'),
     13    'title' => __('Disable WooCommerce scripts and styles on non-shop pages', 'zenpress'),
    1414    'description' => __('Dequeues WooCommerce assets on pages where WooCommerce functionality is not required, such as homepage, blog posts, or custom pages. Helps improve performance by preventing unnecessary asset loading.', 'zenpress'),
    1515    'category' => __('woocommerce', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-woocommerce-stripe-scripts.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable unnecessary Stripe scripts on WooCommerce pages', 'zenpress'),
     13    'title' => __('Disable Stripe scripts on product and cart pages', 'zenpress'),
    1414    'description' => __('Prevents loading of Stripe-related scripts on the product and cart pages when the "Payment Request Button Support" (PRBS) is disabled. Helps improve performance by avoiding unnecessary JavaScript loading.', 'zenpress'),
    1515    'category' => __('woocommerce', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/disable-wordpress-default-lazy-loading.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Disable WordPress default lazy loading', 'zenpress'),
     13    'title' => __('Disable default lazy loading for images', 'zenpress'),
    1414    'description' => __(
    1515        'Stops WordPress from adding loading="lazy" to images and iframes. Use only if you rely on a theme, plugin, or CDN for lazy loading, or if you prefer to load all media immediately.',
  • zenpress/trunk/inc/snippets/meta/disable-xmlrpc-rsdlink.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Disable XML-RPC and remove RSD link', 'zenpress'),
     13    'title' => __('Disable XML-RPC and RSD link', 'zenpress'),
    1414    'description' => __('Disables XML-RPC (often targeted by brute force or DDoS attacks) and removes the RSD link from the HTML head to reduce exposure.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/limit-post-revisions.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Limit post revision to 10', 'zenpress'),
     13    'title' => __('Limit post revisions to 10', 'zenpress'),
    1414    'description' => __(
    1515        'Keeps at most 10 revisions per post (or page). Older revisions are deleted when new ones are created. Reduces database size and improves performance.',
  • zenpress/trunk/inc/snippets/meta/protect-wp-login.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Protect the wp-login form from brute force attacks', 'zenpress'),
    14     'description' => __('Removes detailed login error messages and limits failed login attempts per IP. Blocks further attempts for 5 minutes after 5 failed tries. Mitigates brute-force attacks.', 'zenpress'),
     13    'title' => __('Protect login from brute force', 'zenpress'),
     14    'description' => __('Hides detailed login errors and limits failed attempts per IP. After 5 failed tries, blocks that IP for 5 minutes.', 'zenpress'),
    1515    'category' => __('tools', 'zenpress'),
    1616    'subcategory' => __('security', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/remove-gutenberg-unwanted-block-patterns.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Remove WordPress default remote block patterns', 'zenpress'),
     13    'title' => __('Remove WordPress default block patterns', 'zenpress'),
    1414    'description' => __('Prevents WordPress from loading remote block patterns and removes the built-in core block patterns. Reduces editor clutter and improves performance by avoiding unnecessary data loading.', 'zenpress'),
    1515    'category' => __('gutenberg', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/remove-help-button.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Remove "Help" button', 'zenpress'),
     13    'title' => __('Remove Help tab', 'zenpress'),
    1414    'description' => __(
    15         'Hides the Help tab and panel on all admin screens. Reduces clutter for users who do not use the in-app help.',
     15        'Hides the Help tab on all admin screens. Reduces clutter if you don\'t use in-app help.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/remove-rest-api-link.meta.php

    r3448585 r3470504  
    1111
    1212return [
    13     'title' => __('Remove REST API links', 'zenpress'),
     13    'title' => __('Remove REST API links from page source', 'zenpress'),
    1414    'description' => __('Prevents WordPress from adding REST API discovery links to the head section of the site. Reduces unnecessary HTML output and slightly improves performance while keeping REST API functionality available.', 'zenpress'),
    1515    'category' => __('core', 'zenpress'),
  • zenpress/trunk/inc/snippets/meta/remove-thanks-for-using-wordpress-in-footer.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Remove "Thanks for using WordPress" in footer', 'zenpress'),
     13    'title' => __('Remove "Thanks for using WordPress" from footer', 'zenpress'),
    1414    'description' => __(
    15         'Removes the "Thank you for creating with WordPress" message from the admin footer.',
     15        'Removes the "Thanks for using WordPress" message from the admin footer.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/remove-wordpress-logo.meta.php

    r3451916 r3470504  
    1111
    1212return [
    13     'title' => __('Remove WordPress logo', 'zenpress'),
     13    'title' => __('Remove WordPress logo from admin bar', 'zenpress'),
    1414    'description' => __(
    15         'Removes the WordPress logo and its dropdown from the admin bar.',
     15        'Removes the WordPress logo and its menu from the admin bar.',
    1616        'zenpress'
    1717    ),
  • zenpress/trunk/inc/snippets/meta/separate-gutenberg-core-block-styles.meta.php

    r3412245 r3470504  
    1111
    1212return [
    13     'title' => __('Separate loading of core block styles', 'zenpress'),
     13    'title' => __('Load block styles separately', 'zenpress'),
    1414    'description' => __('Forces WordPress to load core block styles separately, improving performance by only loading the styles required for the blocks used on a page.', 'zenpress'),
    1515    'category' => __('gutenberg', 'zenpress'),
  • zenpress/trunk/languages/zenpress.pot

    r3452689 r3470504  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: ZenPress - Optimize & Secure 2.2.4\n"
     5"Project-Id-Version: ZenPress 2.2.5\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/zenpress\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-02-03T08:48:39+00:00\n"
     12"POT-Creation-Date: 2026-02-26T16:25:36+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
     
    1717#. Plugin Name of the plugin
    1818#: zenpress.php
    19 msgid "ZenPress - Optimize & Secure"
     19#: inc/admin/menu.php:14
     20#: inc/admin/menu.php:31
     21msgid "ZenPress"
    2022msgstr ""
    2123
     
    2729#. Description of the plugin
    2830#: zenpress.php
    29 msgid "Easily speed up and strengthen your WordPress site in one click: clean out unnecessary features, protect weak points, autoconfigure cache integrations."
     31msgid "Speed up and harden your site with a single click: cleans up unused features, protects security gaps, and configures cache integrations automatically."
    3032msgstr ""
    3133
     
    4143
    4244#: inc/admin/links.php:19
    43 msgid "Go to ZenPress settings page"
     45msgid "Go to ZenPress settings"
    4446msgstr ""
    4547
    4648#: inc/admin/links.php:20
     49#: inc/admin/menu.php:13
    4750msgid "Settings"
    4851msgstr ""
     
    5053#: inc/admin/links.php:40
    5154#: inc/admin/menu.php:38
    52 msgid "View ZenPress changelog on WordPress.org (opens in a new tab)"
     55msgid "View ZenPress changelog on WordPress.org (opens in new tab)"
    5356msgstr ""
    5457
     
    5861
    5962#: inc/admin/links.php:46
    60 msgid "Read ZenPress documentation (opens in a new tab)"
     63#: inc/admin/menu.php:48
     64msgid "Read ZenPress documentation (opens in new tab)"
    6165msgstr ""
    6266
    6367#: inc/admin/links.php:47
    64 msgid "Docs"
     68#: inc/admin/menu.php:49
     69msgid "Documentation"
    6570msgstr ""
    6671
    6772#: inc/admin/links.php:52
    68 msgid "Support ZenPress by buying a coffee (opens in a new tab)"
     73msgid "Support ZenPress: Buy me a coffee (opens in new tab)"
    6974msgstr ""
    7075
    7176#: inc/admin/links.php:53
    72 msgid "Support ☕"
    73 msgstr ""
    74 
    75 #: inc/admin/menu.php:13
    76 msgid "ZenPress options"
    77 msgstr ""
    78 
    79 #: inc/admin/menu.php:14
    80 #: inc/admin/menu.php:31
    81 msgid "ZenPress"
     77msgid "Support"
    8278msgstr ""
    8379
     
    8783
    8884#: inc/admin/menu.php:39
    89 msgid "What's new ?"
    90 msgstr ""
    91 
    92 #: inc/admin/menu.php:48
    93 msgid "Read the ZenPress documentation (opens in a new tab)"
    94 msgstr ""
    95 
    96 #: inc/admin/menu.php:49
    97 msgid "Documentation"
     85msgid "What's new"
    9886msgstr ""
    9987
    10088#: inc/admin/menu.php:54
    101 msgid "Leave a review for ZenPress on WordPress.org (opens in a new tab)"
     89msgid "Leave a review for ZenPress on WordPress.org (opens in new tab)"
    10290msgstr ""
    10391
    10492#: inc/admin/menu.php:55
    105 msgid "Leave a review (helps a lot)"
     93msgid "Leave a review"
    10694msgstr ""
    10795
    10896#: inc/admin/menu.php:61
    109 msgid "Support development: Buy me a coffee (opens in a new tab)"
     97msgid "Support development: Buy me a coffee (opens in new tab)"
    11098msgstr ""
    11199
     
    115103
    116104#: inc/admin/menu.php:70
    117 msgid "Loading your ZenPress settings…"
    118 msgstr ""
    119 
    120 #: inc/admin/menu.php:78
    121 msgid "Made "
    122 msgstr ""
    123 
     105msgid "Loading settings…"
     106msgstr ""
     107
     108#. translators: 1: decorative heart emoji, 2: author name
    124109#: inc/admin/menu.php:80
    125 msgid " by Quentin Le Duff - Your WordPress Partner"
    126 msgstr ""
    127 
    128 #: inc/admin/menu.php:87
    129 msgid "Visite the developper website"
    130 msgstr ""
    131 
    132 #: inc/admin/menu.php:88
    133 msgid "My place"
    134 msgstr ""
    135 
    136 #: inc/admin/menu.php:93
    137 msgid "Review the code on Github"
    138 msgstr ""
    139 
    140 #: inc/admin/menu.php:94
    141 msgid "ZenPress code repository"
     110#, php-format
     111msgid "Made with %1$s by %2$s"
     112msgstr ""
     113
     114#: inc/admin/menu.php:90
     115msgid "Visit the developer website (opens in new tab)"
     116msgstr ""
     117
     118#: inc/admin/menu.php:91
     119msgid "Developer website"
     120msgstr ""
     121
     122#: inc/admin/menu.php:96
     123msgid "View ZenPress source code on GitHub (opens in new tab)"
     124msgstr ""
     125
     126#: inc/admin/menu.php:97
     127msgid "Source code"
    142128msgstr ""
    143129
    144130#: inc/classes/integrations.php:136
    145 #: assets/build/index.js:1
    146131#: assets/src/js/config/integrations.js:11
    147 msgid "Autoptimize has been configured."
     132msgid "Autoptimize configured."
    148133msgstr ""
    149134
     
    153138
    154139#: inc/classes/integrations.php:147
    155 #: assets/build/index.js:1
    156140#: assets/src/js/config/integrations.js:25
    157 msgid "Cache Enabler has been configured."
     141msgid "Cache Enabler configured."
    158142msgstr ""
    159143
     
    163147
    164148#: inc/classes/integrations.php:158
    165 #: assets/build/index.js:1
    166149#: assets/src/js/config/integrations.js:39
    167 msgid "SQLite Object Cache has been configured."
     150msgid "SQLite Object Cache configured."
    168151msgstr ""
    169152
     
    177160
    178161#: inc/classes/integrations.php:206
    179 msgid "Clear all caches (page cache, static assets, object cache)."
     162msgid "Clear page cache, static assets cache, and object cache."
    180163msgstr ""
    181164
    182165#: inc/classes/integrations.php:214
    183 msgid "Clear pages caches"
     166msgid "Clear page cache"
    184167msgstr ""
    185168
     
    189172
    190173#: inc/classes/integrations.php:226
    191 msgid "Clear static assets caches (CSS/JS)"
     174msgid "Clear static assets cache (CSS/JS)"
    192175msgstr ""
    193176
     
    207190#: inc/classes/integrations.php:265
    208191#, php-format
    209 msgid "%1$s (Managed by %2$s) has been cleared successfully."
     192msgid "%1$s (managed by %2$s) cleared successfully."
    210193msgstr ""
    211194
     
    246229
    247230#. translators: %s: cache type (e.g. Page cache)
     231#. translators: %s: comma-separated list of cache types
    248232#: inc/classes/integrations.php:317
     233#: inc/classes/integrations.php:326
    249234#, php-format
    250 msgid "%s has been cleared successfully."
     235msgid "%s cleared successfully."
    251236msgstr ""
    252237
     
    255240msgstr ""
    256241
    257 #. translators: %s: comma-separated list of cache types
    258 #: inc/classes/integrations.php:326
    259 #, php-format
    260 msgid "%s have been cleared successfully."
    261 msgstr ""
    262 
    263242#: inc/classes/integrations.php:353
    264243#: inc/classes/integrations.php:357
    265 msgid "Forbidden"
     244msgid "You don't have permission to do that."
    266245msgstr ""
    267246
    268247#: inc/classes/integrations.php:365
    269248#: inc/classes/integrations.php:375
    270 msgid "Cache clear failed."
     249msgid "Clearing cache failed. Try again."
    271250msgstr ""
    272251
    273252#: inc/classes/integrations.php:379
    274 msgid "Invalid request."
     253msgid "Invalid request. Please refresh and try again."
    275254msgstr ""
    276255
    277256#: inc/snippets/functions/block-user-enumeration.php:11
    278257#: inc/snippets/functions/block-user-enumeration.php:19
    279 msgid "Access denied."
     258msgid "You don't have permission to view this."
    280259msgstr ""
    281260
    282261#: inc/snippets/functions/disable-rest-api.php:56
    283 msgid "REST API restricted to authenticated users."
     262msgid "You must be logged in to use this."
    284263msgstr ""
    285264
    286265#: inc/snippets/functions/protect-wp-login.php:9
    287 msgid "Login error."
     266msgid "Something went wrong. Try again."
    288267msgstr ""
    289268
    290269#: inc/snippets/functions/protect-wp-login.php:38
    291270#: inc/snippets/functions/protect-wp-login.php:52
    292 msgid "Too many failed login attempts. Try again later."
     271msgid "Too many failed attempts. Try again in a few minutes."
    293272msgstr ""
    294273
     
    298277
    299278#: inc/snippets/meta/block-user-enumeration.meta.php:14
    300 msgid "Prevents attackers from guessing WordPress usernames by blocking requests with the `author` parameter in query strings or permalinks. Reduces exposure to brute-force and user-targeted attacks."
     279msgid "Stops visitors from discovering usernames via author URLs. Reduces brute-force risk."
    301280msgstr ""
    302281
     
    345324
    346325#: inc/snippets/meta/clean-admin-bar.meta.php:13
    347 msgid "Clean up the WordPress admin bar"
     326msgid "Clean up the admin bar"
    348327msgstr ""
    349328
     
    363342
    364343#: inc/snippets/meta/clean-dashboard-items.meta.php:13
    365 msgid "Clean up the WordPress Dashboard"
     344msgid "Clean up the Dashboard"
    366345msgstr ""
    367346
    368347#: inc/snippets/meta/clean-dashboard-items.meta.php:14
    369 msgid "Removes unnecessary and ad widgets from the dashboard. Declutters the admin area and improves usability."
     348msgid "Removes unnecessary and promotional widgets from the Dashboard."
    370349msgstr ""
    371350
     
    375354
    376355#: inc/snippets/meta/disable-adjacent-posts.meta.php:13
    377 msgid "Disable adjacent posts link tags"
     356msgid "Disable prev/next post links in head"
    378357msgstr ""
    379358
     
    413392
    414393#: inc/snippets/meta/disable-application-passwords.meta.php:14
    415 msgid "Disables WordPress application passwords for all users. Improves security; do not enable if you need API or app-based authentication (e.g. mobile apps, REST clients)."
     394msgid "Turns off application passwords for everyone. Turn this off if you use mobile apps or other apps that log in to WordPress."
    416395msgstr ""
    417396
     
    421400
    422401#: inc/snippets/meta/disable-author-archives.meta.php:14
    423 msgid "Forces author archive pages to return a 404 error. Prevents user enumeration and hides unnecessary author pages."
     402msgid "Author archive URLs show \"Page not found.\" Helps prevent listing usernames."
    424403msgstr ""
    425404
    426405#: inc/snippets/meta/disable-autosave.meta.php:13
    427 msgid "Disable autosave"
     406msgid "Disable autosave (classic editor)"
    428407msgstr ""
    429408
     
    433412
    434413#: inc/snippets/meta/disable-capital-p-dangit.meta.php:13
    435 msgid "Disable capital_P_dangit filter"
     414msgid "Disable \"WordPress\" spelling correction"
    436415msgstr ""
    437416
    438417#: inc/snippets/meta/disable-capital-p-dangit.meta.php:14
    439 msgid "Removes the filter that forces \"Wordpress\" to \"WordPress\" in titles, content, comments, and widget text. Saves a small amount of processing on each page load."
     418msgid "Stops WordPress from changing \"Wordpress\" to \"WordPress\" in content. Saves a small amount of work on each page."
    440419msgstr ""
    441420
    442421#: inc/snippets/meta/disable-dashicons.meta.php:13
    443 msgid "Disable dashicons"
     422msgid "Disable Dashicons (admin icons)"
    444423msgstr ""
    445424
    446425#: inc/snippets/meta/disable-dashicons.meta.php:14
    447 msgid "Prevents WordPress from loading the Dashicons CSS for visitors who are not logged in. Improves frontend performance by reducing unnecessary styles."
     426msgid "Stops Dashicons (admin icons) from loading for visitors. Logged-in users still see them."
    448427msgstr ""
    449428
    450429#: inc/snippets/meta/disable-default-pattern-categories.meta.php:13
    451 msgid "Disable default pattern categories in site editor"
     430msgid "Disable default pattern categories in Site Editor"
    452431msgstr ""
    453432
    454433#: inc/snippets/meta/disable-default-pattern-categories.meta.php:14
    455 msgid "Removes default pattern categories from the block pattern inserter in the site editor (e.g. featured, about, audio, banner, buttons, call-to-action, columns, contact, footer, gallery, header, media, portfolio, posts, query, services, team, testimonials, text, videos) and any custom ones. Simplifies the interface; patterns remain accessible."
     434msgid "Removes default pattern categories from the block inserter. Patterns are still available; the list is simpler."
    456435msgstr ""
    457436
     
    479458
    480459#: inc/snippets/meta/disable-jquery-migrate.meta.php:13
    481 msgid "Disable jQuery migrate"
     460msgid "Disable jQuery Migrate script"
    482461msgstr ""
    483462
    484463#: inc/snippets/meta/disable-jquery-migrate.meta.php:14
    485 msgid "Removes jQuery Migrate from loading on the frontend while keeping it enabled in the admin. Improves frontend performance and reduces legacy overhead."
     464msgid "Loads jQuery Migrate only in the admin, not on the front. Improves front-end performance."
    486465msgstr ""
    487466
    488467#: inc/snippets/meta/disable-login-language-selector.meta.php:13
    489 msgid "Disable the login language selector"
     468msgid "Disable login language selector"
    490469msgstr ""
    491470
     
    503482
    504483#: inc/snippets/meta/disable-password-strength-meter.meta.php:13
    505 msgid "Disable Password Strength Meter"
     484msgid "Disable password strength meter"
    506485msgstr ""
    507486
    508487#: inc/snippets/meta/disable-password-strength-meter.meta.php:14
    509 msgid "Prevents the password strength meter and zxcvbn scripts from loading on profile, login, and similar pages. Saves roughly 400KB and reduces script parsing. Users will not see the strength indicator when choosing passwords."
     488msgid "Stops the password strength meter from loading on login and profile pages. Saves about 400KB. Users won't see how strong their password is."
    510489msgstr ""
    511490
     
    519498
    520499#: inc/snippets/meta/disable-pingback-trackback.meta.php:13
    521 msgid "Disable pingback and trackback"
     500msgid "Disable pingbacks and trackbacks"
    522501msgstr ""
    523502
     
    527506
    528507#: inc/snippets/meta/disable-rest-api.meta.php:14
    529 msgid "Disable REST API for visitors not logged into WordPress"
     508msgid "Limit REST API to logged-in users"
    530509msgstr ""
    531510
    532511#: inc/snippets/meta/disable-rest-api.meta.php:15
    533 msgid "Restricts the WP REST API to logged-in users only; unauthenticated requests receive an error. Bypass filters (zenpress_disable_wp_rest_api_post_var, zenpress_disable_wp_rest_api_server_var) allow specific integrations (e.g. webhooks); use non-guessable values only."
     512msgid "Only logged-in users can use the REST API. Visitors get an error. Advanced: filters let you allow specific tools; use with care."
    534513msgstr ""
    535514
    536515#: inc/snippets/meta/disable-rss.meta.php:13
    537 msgid "Disable all WordPress feeds (RDF, RSS, RSS2, Atom, and comments)"
     516msgid "Disable all feeds (RSS, Atom, comments)"
    538517msgstr ""
    539518
     
    543522
    544523#: inc/snippets/meta/disable-shortlink.meta.php:13
    545 msgid "Disable WordPress shortlink"
     524msgid "Disable shortlink"
    546525msgstr ""
    547526
     
    551530
    552531#: inc/snippets/meta/disable-wlw-manifest.meta.php:13
    553 msgid "Disable WLW link"
     532msgid "Disable Windows Live Writer link"
    554533msgstr ""
    555534
    556535#: inc/snippets/meta/disable-wlw-manifest.meta.php:14
    557 msgid "Removes the WLW manifest link from the head, which was only used by the deprecated Windows Live Writer app. Reduces unnecessary metadata and improves performance."
     536msgid "Removes the old Windows Live Writer link from the page. Safe to disable."
    558537msgstr ""
    559538
    560539#: inc/snippets/meta/disable-woocommerce-cart-fragments.meta.php:13
    561 msgid "Disable WooCommerce cart fragments script"
     540msgid "Disable WooCommerce cart fragments"
    562541msgstr ""
    563542
    564543#: inc/snippets/meta/disable-woocommerce-cart-fragments.meta.php:14
    565 msgid "Removes the WooCommerce cart fragments JavaScript (wc-cart-fragments), which is responsible for dynamically updating the cart contents without a page reload. Disabling this can improve performance on stores that do not require live cart updates."
     544msgid "Stops the script that updates the cart without reloading the page. Turn off if you don't need live cart updates."
    566545msgstr ""
    567546
     
    576555
    577556#: inc/snippets/meta/disable-woocommerce-scripts-styles.meta.php:13
    578 msgid "Disable WooCommerce scripts and styles on non-WooCommerce pages"
     557msgid "Disable WooCommerce scripts and styles on non-shop pages"
    579558msgstr ""
    580559
     
    584563
    585564#: inc/snippets/meta/disable-woocommerce-stripe-scripts.meta.php:13
    586 msgid "Disable unnecessary Stripe scripts on WooCommerce pages"
     565msgid "Disable Stripe scripts on product and cart pages"
    587566msgstr ""
    588567
     
    600579
    601580#: inc/snippets/meta/disable-wordpress-default-lazy-loading.meta.php:13
    602 msgid "Disable WordPress default lazy loading"
     581msgid "Disable default lazy loading for images"
    603582msgstr ""
    604583
     
    608587
    609588#: inc/snippets/meta/disable-xmlrpc-rsdlink.meta.php:13
    610 msgid "Disable XML-RPC and remove RSD link"
     589msgid "Disable XML-RPC and RSD link"
    611590msgstr ""
    612591
     
    632611
    633612#: inc/snippets/meta/limit-post-revisions.meta.php:13
    634 msgid "Limit post revision to 10"
     613msgid "Limit post revisions to 10"
    635614msgstr ""
    636615
     
    640619
    641620#: inc/snippets/meta/protect-wp-login.meta.php:13
    642 msgid "Protect the wp-login form from brute force attacks"
     621msgid "Protect login from brute force"
    643622msgstr ""
    644623
    645624#: inc/snippets/meta/protect-wp-login.meta.php:14
    646 msgid "Removes detailed login error messages and limits failed login attempts per IP. Blocks further attempts for 5 minutes after 5 failed tries. Mitigates brute-force attacks."
     625msgid "Hides detailed login errors and limits failed attempts per IP. After 5 failed tries, blocks that IP for 5 minutes."
    647626msgstr ""
    648627
     
    652631
    653632#: inc/snippets/meta/remove-gutenberg-unwanted-block-patterns.meta.php:13
    654 msgid "Remove WordPress default remote block patterns"
     633msgid "Remove WordPress default block patterns"
    655634msgstr ""
    656635
     
    660639
    661640#: inc/snippets/meta/remove-help-button.meta.php:13
    662 msgid "Remove \"Help\" button"
     641msgid "Remove Help tab"
    663642msgstr ""
    664643
    665644#: inc/snippets/meta/remove-help-button.meta.php:14
    666 msgid "Hides the Help tab and panel on all admin screens. Reduces clutter for users who do not use the in-app help."
     645msgid "Hides the Help tab on all admin screens. Reduces clutter if you don't use in-app help."
    667646msgstr ""
    668647
    669648#: inc/snippets/meta/remove-rest-api-link.meta.php:13
    670 msgid "Remove REST API links"
     649msgid "Remove REST API links from page source"
    671650msgstr ""
    672651
     
    676655
    677656#: inc/snippets/meta/remove-thanks-for-using-wordpress-in-footer.meta.php:13
    678 msgid "Remove \"Thanks for using WordPress\" in footer"
     657msgid "Remove \"Thanks for using WordPress\" from footer"
    679658msgstr ""
    680659
    681660#: inc/snippets/meta/remove-thanks-for-using-wordpress-in-footer.meta.php:14
    682 msgid "Removes the \"Thank you for creating with WordPress\" message from the admin footer."
     661msgid "Removes the \"Thanks for using WordPress\" message from the admin footer."
    683662msgstr ""
    684663
     
    692671
    693672#: inc/snippets/meta/remove-wordpress-logo.meta.php:13
    694 msgid "Remove WordPress logo"
     673msgid "Remove WordPress logo from admin bar"
    695674msgstr ""
    696675
    697676#: inc/snippets/meta/remove-wordpress-logo.meta.php:14
    698 msgid "Removes the WordPress logo and its dropdown from the admin bar."
     677msgid "Removes the WordPress logo and its menu from the admin bar."
    699678msgstr ""
    700679
    701680#: inc/snippets/meta/separate-gutenberg-core-block-styles.meta.php:13
    702 msgid "Separate loading of core block styles"
     681msgid "Load block styles separately"
    703682msgstr ""
    704683
     
    707686msgstr ""
    708687
    709 #: assets/build/index.js:1
    710 #: assets/src/js/config/integrations.js:12
    711 msgid "Autoptimize autoconfig failed. Is Autoptimize installed and active?"
    712 msgstr ""
    713 
    714 #: assets/build/index.js:1
    715 #: assets/src/js/config/integrations.js:16
    716 msgid "Setup Autoptimize"
    717 msgstr ""
    718 
    719 #: assets/build/index.js:1
    720 #: assets/src/js/config/integrations.js:17
    721 msgid "Apply recommended Autoptimize settings: Minify JS & CSS, aggregate CSS, static files, 404 fallbacks."
    722 msgstr ""
    723 
    724 #: assets/build/index.js:1
    725 #: assets/src/js/config/integrations.js:26
    726 msgid "Cache Enabler autoconfig failed. Is Cache Enabler installed and active?"
    727 msgstr ""
    728 
    729 #: assets/build/index.js:1
    730 #: assets/src/js/config/integrations.js:30
    731 msgid "Setup Cache Enabler"
    732 msgstr ""
    733 
    734 #: assets/build/index.js:1
    735 #: assets/src/js/config/integrations.js:31
    736 msgid "Apply recommended Cache Enabler settings: Clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS)."
    737 msgstr ""
    738 
    739 #: assets/build/index.js:1
    740 #: assets/src/js/config/integrations.js:43
    741 msgid "SQLite Object Cache autoconfig failed. Is SQLite Object Cache installed and active?"
    742 msgstr ""
    743 
    744 #: assets/build/index.js:1
    745 #: assets/src/js/config/integrations.js:47
    746 msgid "Setup SQLite Object Cache"
    747 msgstr ""
    748 
    749 #: assets/build/index.js:1
    750 #: assets/src/js/config/integrations.js:48
    751 msgid "Apply recommended SQLite Object Cache settings. Enable \"Use APCu\" if APCu is available."
    752 msgstr ""
    753 
    754 #: assets/build/index.js:1
    755 #: assets/src/js/components/SaveButton.js:20
    756 msgid "Save settings"
    757 msgstr ""
    758 
    759 #: assets/build/index.js:1
    760 #: assets/src/js/components/BulkSnippetActions.js:29
    761 msgid "Enable all actions"
    762 msgstr ""
    763 
    764 #: assets/build/index.js:1
    765 #: assets/src/js/components/BulkSnippetActions.js:36
    766 msgid "Disable all actions"
    767 msgstr ""
    768 
    769 #: assets/build/index.js:1
    770688#: assets/src/js/components/AutoconfigButton.js:32
    771689msgid "Applying…"
    772690msgstr ""
    773691
    774 #: assets/build/index.js:1
     692#: assets/src/js/components/BulkSnippetActions.js:29
     693msgid "Enable all"
     694msgstr ""
     695
     696#: assets/src/js/components/BulkSnippetActions.js:36
     697msgid "Disable all"
     698msgstr ""
     699
    775700#: assets/src/js/components/IntegrationsBlock.js:26
    776701msgid "Integrations"
    777702msgstr ""
    778703
    779 #: assets/build/index.js:1
    780704#: assets/src/js/components/IntegrationsBlock.js:28
    781 msgid "Show ZenPress admin bar button"
    782 msgstr ""
    783 
    784 #: assets/build/index.js:1
     705msgid "Show cache actions in admin bar"
     706msgstr ""
     707
    785708#: assets/src/js/components/IntegrationsBlock.js:31
    786 msgid "Show a ZenPress item in the admin bar with \"Clear all caches\" and sub-items for each active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, AutOptimize, or SQLite Object Cache is active. When enabled, those plugins' own admin bar buttons are hidden."
    787 msgstr ""
    788 
    789 #: assets/build/index.js:1
     709msgid "Adds a ZenPress menu to the admin bar with \"Clear all caches\" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins' own admin bar buttons."
     710msgstr ""
     711
    790712#: assets/src/js/components/PresetCard.js:28
    791 msgid "Enable"
    792 msgstr ""
    793 
    794 #: assets/build/index.js:1
     713msgid "Apply preset"
     714msgstr ""
     715
    795716#: assets/src/js/components/PresetsSidebar.js:8
    796717msgid "Corporate website"
    797718msgstr ""
    798719
    799 #: assets/build/index.js:1
    800720#: assets/src/js/components/PresetsSidebar.js:9
    801 msgid "Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives."
    802 msgstr ""
    803 
    804 #: assets/build/index.js:1
     721msgid "For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives."
     722msgstr ""
     723
    805724#: assets/src/js/components/PresetsSidebar.js:17
    806725msgid "Blog"
    807726msgstr ""
    808727
    809 #: assets/build/index.js:1
    810728#: assets/src/js/components/PresetsSidebar.js:18
    811 msgid "Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds."
    812 msgstr ""
    813 
    814 #: assets/build/index.js:1
     729msgid "For content-focused blogs. Keeps RSS and other blog features while improving performance and security."
     730msgstr ""
     731
    815732#: assets/src/js/components/PresetsSidebar.js:26
    816733msgid "E-commerce"
    817734msgstr ""
    818735
    819 #: assets/build/index.js:1
    820736#: assets/src/js/components/PresetsSidebar.js:27
    821 msgid "Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout."
    822 msgstr ""
    823 
    824 #: assets/build/index.js:1
     737msgid "For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout."
     738msgstr ""
     739
    825740#: assets/src/js/components/PresetsSidebar.js:45
    826 msgid "Pick configuration preset"
    827 msgstr ""
    828 
    829 #: assets/build/index.js:1
     741msgid "Choose a preset"
     742msgstr ""
     743
    830744#: assets/src/js/components/PresetsSidebar.js:47
    831 msgid "Don't know which features to enable? Quickly configure ZenPress by selecting a preset that matches your site type. Each preset enables optimized features for your specific use case."
    832 msgstr ""
    833 
    834 #: assets/build/index.js:1
     745msgid "Not sure what to enable? Choose a preset that matches your site. Each preset turns on a set of features for that type of site."
     746msgstr ""
     747
     748#: assets/src/js/components/SaveButton.js:20
     749msgid "Save"
     750msgstr ""
     751
     752#: assets/src/js/config/integrations.js:12
     753msgid "Autoptimize setup failed. Is Autoptimize installed and active?"
     754msgstr ""
     755
     756#: assets/src/js/config/integrations.js:16
     757msgid "Set up Autoptimize"
     758msgstr ""
     759
     760#: assets/src/js/config/integrations.js:17
     761msgid "Apply recommended settings: minify JS and CSS, combine CSS, static file caching, 404 fallbacks."
     762msgstr ""
     763
     764#: assets/src/js/config/integrations.js:26
     765msgid "Cache Enabler setup failed. Is Cache Enabler installed and active?"
     766msgstr ""
     767
     768#: assets/src/js/config/integrations.js:30
     769msgid "Set up Cache Enabler"
     770msgstr ""
     771
     772#: assets/src/js/config/integrations.js:31
     773msgid "Apply recommended settings: clear cache on content changes, WebP, compression, minify HTML."
     774msgstr ""
     775
     776#: assets/src/js/config/integrations.js:40
     777msgid "SQLite Object Cache setup failed. Is it installed and active?"
     778msgstr ""
     779
     780#: assets/src/js/config/integrations.js:44
     781msgid "Set up SQLite Object Cache"
     782msgstr ""
     783
     784#: assets/src/js/config/integrations.js:45
     785msgid "Apply recommended settings. Enable \"Use APCu\" in the plugin if available."
     786msgstr ""
     787
    835788#: assets/src/js/hooks/useSettings.js:58
    836 msgid "Failed to load settings."
    837 msgstr ""
    838 
    839 #: assets/build/index.js:1
    840 #: assets/src/js/hooks/useSettings.js:85
     789msgid "Settings could not be loaded. Refresh the page."
     790msgstr ""
     791
     792#: assets/src/js/hooks/useSettings.js:88
    841793msgid "Settings saved."
    842794msgstr ""
    843795
    844 #: assets/build/index.js:1
    845 #: assets/src/js/hooks/useSettings.js:87
    846 msgid "Failed to save settings."
    847 msgstr ""
    848 
    849 #: assets/build/index.js:1
     796#: assets/src/js/hooks/useSettings.js:91
     797msgid "Settings could not be saved. Try again."
     798msgstr ""
     799
    850800#: assets/src/js/utils/snippets.js:43
     801#: assets/src/js/utils/snippets.js:46
    851802msgid "Uncategorized"
    852803msgstr ""
    853 
    854 #: assets/build/index.js:1
    855 #: assets/src/js/utils/snippets.js:46
    856 msgid "uncategorized"
    857 msgstr ""
  • zenpress/trunk/readme.txt

    r3452689 r3470504  
    1 === ZenPress - Optimize & Secure ===
     1=== ZenPress ===
    22Contributors: @quentinldd
    33Donate link: https://github.com/sponsors/quentin-ld/
     
    55Requires at least: 6.0
    66Tested up to: 6.9
    7 Stable tag: 2.2.4
     7Stable tag: 2.2.5
    88Requires PHP: 8.1
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html/
    1111
    12 Easily speed up and strengthen your website in one click: clean out unnecessary features, protect weak points, autoconfigure cache integrations.
     12Speed up and harden your site with a single click: cleans up unused features, protects security gaps, and configures cache integrations automatically.
    1313
    1414== Description ==
    1515
    16 ZenPress is a lightweight, super-fast plugin that boosts your WordPress & WooCommerce website through a wide range of solid actions.
    17 Combined with [Cache Enabler](https://wordpress.org/plugins/cache-enabler/), [Autoptimize](https://wordpress.org/plugins/autoptimize/) and [SQLite Object Cache](https://wordpress.org/plugins/sqlite-object-cache/), ZenPress is a free alternative to major premium performance plugins.
    18 This is a simple solution for improving your WordPress website's performance and security while enjoying a simpler and lighter UI without breaking the bank.
    19 No database clutter, no ads, no pro version. Just install, activate, select what you need or pick up your settings preset and you are ready to go !
     16ZenPress is a lightweight, high-performance plugin that improves your WordPress and WooCommerce sites through a range of supportive actions.
     17Combined with [Cache Enabler](https://wordpress.org/plugins/cache-enabler/), [Autoptimize](https://wordpress.org/plugins/autoptimize/) and [SQLite Object Cache](https://wordpress.org/plugins/sqlite-object-cache/), you can use ZenPress as a reliable, free alternative to major premium performance plugins.
     18By integrating directly into the WordPress core interface, ZenPress provides a simpler experience without the need for complex custom dashboards. You can improve your site's performance and security without ads, pro versions, or database clutter.
    2019
    2120= Why choose ZenPress? =
    22 * Curated settings presets included to help you.
    23 * Deep integration with the native WordPress interface: no bloat, no extra options page, no weird custom dashboard : only what you need.
    24 * Free alternative to major premium performance plugin for everyone.
    25 * Make your WordPress website fast & clean by disabling unwanted features.
    26 * Improve security by turning off features you don’t use and hardening weak spots.
    27 * Eliminate third-party plugin bloat (actually hunting them down).
    28 * Ultra lightweight.
    29 * Future proof.
     21* Use curated settings presets to help you optimize your site instantly.
     22* Experience deep integration with the WordPress core interface for a lightweight, familiar experience.
     23* Choose a free, reliable alternative to premium performance plugins.
     24* Keep your site fast and clean by disabling unused features.
     25* Harden your security by turning off unused features and protecting weak spots.
     26* Reduce bloat from third-party plugins.
     27* Enjoy an ultra-lightweight and future-proof design.
    3028
    3129== Features ==
    3230
    33 Following features are included :
    34 
    35 = Settings subpage 🧰 =
    36 * Organized interface with vertical tabs for easy navigation between categories (Core, Gutenberg, WooCommerce, Ads-blocker, Tools).
    37 * Features grouped by subcategories (Performance, Security, User Interface) with visual icons for quick identification.
    38 * Three ready-to-use presets: Corporate website, Blog, and E-commerce - each optimized for specific site types.
    39 * Every action is documented with descriptions so that you understand what you are doing and the benefits.
    40 * Fully accessible interface with ARIA-compliant tabs and complete keyboard navigation support.
    41 * Native WordPress interface, benefits from Gutenberg's new features and the site editor.
    42 
    43 = Core =
    44 
     31ZenPress includes the following features:
     32
     33= Dashboard Settings =
     34* Navigate easily between categories like Core, Gutenberg, and WooCommerce using a structured tabbed interface.
     35* Identify features quickly with visual icons organized by Performance, Security, and User Interface.
     36* Select from three ready-to-use presets: Corporate, Blog, or E-commerce: each optimized for your specific site type.
     37* Understand every choice with concise descriptions that explain the benefits to your site.
     38* Use a fully accessible interface that includes ARIA-compliant tabs and full keyboard navigation support.
     39* Benefit from a design that matches the WordPress core look and feel, supporting the latest block editor features.
     40
     41= Core Settings =
    4542* Block user enumeration.
    46 * Clean up the WordPress admin bar.
    47 * Disable adjacent posts link tags.
    48 * Disable all WordPress feeds (RDF, RSS, RSS2, Atom, and comments).
     43* Clean up the admin bar.
     44* Disable "WordPress" spelling correction.
     45* Disable all feeds (RSS, Atom, comments).
    4946* Disable application passwords.
    5047* Disable author archives.
    51 * Disable autosave.
    52 * Disable capital_P_dangit filter.
    53 * Disable dashicons.
     48* Disable autosave (classic editor).
     49* Disable Dashicons (admin icons).
     50* Disable default lazy loading for images.
    5451* Disable DNS prefetch.
    55 * Disable jQuery migrate.
     52* Disable jQuery Migrate script.
     53* Disable login language selector.
    5654* Disable oEmbed.
    57 * Disable Password Strength Meter.
     55* Disable password strength meter.
    5856* Disable PDF thumbnails.
    59 * Disable pingback and trackback.
    60 * Disable REST API for visitors not logged into WordPress.
    61 * Disable the login language selector.
    62 * Disable WLW link.
    63 * Disable WordPress default lazy loading.
     57* Disable pingbacks and trackbacks.
     58* Disable prev/next post links in head.
     59* Disable shortlink.
     60* Disable Windows Live Writer link.
    6461* Disable WordPress emoji scripts and styles.
    65 * Disable WordPress shortlink.
    66 * Disable XML-RPC and remove RSD link.
     62* Disable XML-RPC and RSD link.
    6763* Hide WordPress version.
    68 * Limit post revision to 10.
    69 * Remove "Help" button.
    70 * Remove "Thanks for using WordPress" in footer.* Remove REST API links.
    71 * Remove WordPress logo.
    72 
    73 = WooCommerce  =
    74 * Disable unnecessary Stripe scripts on WooCommerce pages.
    75 * Disable WooCommerce cart fragments script.
    76 * Disable WooCommerce scripts and styles on non-WooCommerce pages.
     64* Limit post revisions to 10.
     65* Limit REST API to logged-in users.
     66* Remove "Thanks for using WordPress" from footer.
     67* Remove Help tab.
     68* Remove REST API links from page source.
     69* Remove WordPress logo from admin bar.
     70
     71= Gutenberg Settings =
     72* Disable default pattern categories in Site Editor.
     73* Load block styles separately.
     74* Remove WordPress default block patterns.
     75
     76= WooCommerce Settings =
     77* Disable Stripe scripts on product and cart pages.
     78* Disable WooCommerce cart fragments.
     79* Disable WooCommerce scripts and styles on non-shop pages.
    7780* Disable WooCommerce widgets.
    78 * Hide WooCommerce version.* Remove WooCommerce default block patterns.
    79 
    80 = Gutenberg  =
    81 * Disable default pattern categories in site editor.
    82 * Remove WordPress default remote block patterns.
    83 * Separate loading of core block styles.
    84 
    85 = Ads-blocker =
    86 * Clean up the WordPress Dashboard.
    87 
    88 = Tools =
    89 * Protect the wp-login form from brute force attacks.
    90 * Toggle "Show ZenPress admin bar button": ZenPress item in the admin bar with "Clear all caches" and sub-items per active integration (page cache, static assets, object cache). Visible only when at least one of Cache Enabler, Autoptimize, or SQLite Object Cache is active. When enabled, those plugins' own admin bar buttons are hidden. Toggle via Settings > ZenPress > Tools.
     81* Hide WooCommerce version.
     82* Remove WooCommerce default block patterns.
     83
     84= Ads-blocker Settings =
     85* Clean up the Dashboard.
     86
     87= Tools Settings =
     88* Protect login from brute force.
     89* Show cache actions in admin bar.
    9190
    9291= Integrations =
     
    9493ZenPress integrates with Cache Enabler, Autoptimize, and SQLite Object Cache. When any of these plugins is active, the Tools tab shows integration status and one-click autoconfig actions.
    9594
    96 * Admin bar: One "Clear all caches" button (dashicon) in the admin bar, with sub-items to clear page cache (Cache Enabler), static assets (Autoptimize), or object cache (SQLite Object Cache) separately. When the ZenPress admin bar is enabled, the third-party cache buttons (Cache Enabler, Autoptimize, SQLite Object Cache) are hidden. You can hide the ZenPress admin bar via Settings > ZenPress > Tools.
    97 * Autoptimize: One-click autoconfig enables recommended options (JS/CSS/aggregate/nogzip/fallback on; defer/HTML/logged-in/meta off).
    98 * Cache Enabler: One-click autoconfig enables clear site cache on post or plugin changes, WebP support, Gzip or Brotli compression, and minify HTML (excluding inline CSS/JS).
    99 * SQLite Object Cache: One-click autoconfig enables the "Use APCu" option in the plugin settings when the APCu extension is available.
     95* Admin bar: Adds a ZenPress menu to the admin bar with "Clear all caches" and options for each active cache (page, static files, object cache). Only appears when Cache Enabler, Autoptimize, or SQLite Object Cache is active. Hides those plugins' own admin bar buttons.
     96* Autoptimize: Minify JS and CSS, combine CSS, static file caching, 404 fallbacks.
     97* Cache Enabler: Clear cache on content changes, WebP, compression, minify HTML.
     98* SQLite Object Cache: Enable "Use APCu" in the plugin if available.
    10099
    101100= Presets =
    102 * Corporate website / Portfolio: Optimized for business sites and portfolios. Focuses on security, performance, and removing unnecessary features like RSS feeds and author archives.
    103 * Blog: Tailored for content-focused blogs. Includes performance and security optimizations while preserving essential blog features like RSS feeds.
    104 * E-commerce: Designed for WooCommerce stores. Includes all performance and security features plus WooCommerce-specific optimizations for faster checkout.
     101* Corporate website: For business sites and portfolios. Focuses on security, performance, and removing unused features like RSS and author archives.
     102* Blog: For content-focused blogs. Keeps RSS and other blog features while improving performance and security.
     103* E-commerce: For WooCommerce stores. Performance and security plus WooCommerce optimizations for faster checkout.
    105104
    106105= Accessibility =
    107 * Fully ARIA-compliant tab interface following W3C ARIA Authoring Practices Guide.
    108 * Complete keyboard navigation: Arrow keys, Home, End, Space, Enter, and Tab keys fully supported.
    109 * Automatic tab activation on focus for improved user experience.
    110 * Proper focus management with visible focus indicators.
    111 * Screen reader friendly with proper ARIA labels and roles.
     106* You can navigate the dashboard with confidence using an interface built to WCAG 2.1 AA accessibility standards.
     107* Move through settings efficiently using only your keyboard; we fully support the use of Tab, Arrow keys, Home, End, and Enter for all interactions.
     108* Experience faster navigation with automatic tab activation, which displays panels immediately as you move focus between sections.
     109* Always identify your position on the page through highly visible focus indicators on every interactive button and link.
     110* Every element is optimized for screen readers and assistive technologies with descriptive ARIA labels to provide clear context for every setting.
    112111
    113112== Roadmap ==
    114113
     114* Use new Gutenberg Icon component for categories & subcategories icons instead of Dashicons.
    115115* Additional presets for specific use cases.
    116116* Documentation pages with detailed guides.
     
    165165= Does ZenPress work with my existing caching / optimization plugins? =
    166166
    167 Yes. ZenPress focuses on disabling unnecessary core features and plugin bloat; it does not handle page caching, minification, or image optimization. It is designed to work alongside plugins like Cache Enabler, Autoptimize, and most object-cache solutions. If a performance feature overlaps, simply disable it in one of the tools.
    168 
    169 = Can ZenPress break my theme or plugins? =
    170 
    171 Potentially, yes—especially if your theme or plugins rely on features you disable (RSS feeds, oEmbed, REST API, emojis, WooCommerce assets, etc.). That’s why each snippet includes clear descriptions and categories (performance, security, UI). Always test changes on a staging site first and enable snippets gradually.
     167Yes. You can use ZenPress alongside tools like Cache Enabler or Autoptimize. Because ZenPress focuses on disabling unused core features and reducing bloat, it does not interfere with page caching or image optimization. If you notice overlapping features, you can easily toggle them off in either tool.
    172168
    173169= How do I know which snippets are safe to enable? =
    174170
    175 If you are unsure, start with a preset (Corporate, Blog, E‑commerce) and then adjust. For manual tuning, prefer UI and performance snippets first (dashicons, emojis, dashboard/admin-bar cleanup) before more invasive ones (REST API, XML‑RPC, RSS). After each change, check: frontend pages, login, editor, and (if used) WooCommerce flows.
     171If you are new to optimization, you can safely start with a curated preset (Corporate, Blog, or E‑commerce). For manual changes, we suggest starting with User Interface (UI) and performance settings, such as cleaning up the Admin Bar, before moving to more advanced core settings.
    176172
    177173= What happens if I disable the REST API? =
    178174
    179 Unauthenticated REST requests will be blocked except for any explicit bypasses configured via the filters documented in the snippet (`zenpress_disable_wp_rest_api_post_var`, `zenpress_disable_wp_rest_api_server_var`). Core features and plugins that depend on public REST endpoints (some blocks, headless/front-end apps, third-party integrations) may stop working until you whitelist the required routes.
    180 
    181 **Important**: If you don't know how to configure bypass filters or whitelist specific routes, don't activate this snippet. It can break functionality that relies on public REST API access.
     175The REST API allows different applications to communicate with your site. If you disable it, ZenPress will block unauthenticated requests to keep your site secure. However, some blocks or third-party integrations may require this to be active. If a feature stops working, you can simply use our documented filters to allow specific routes.
    182176
    183177= Does ZenPress store any personal data or phone home? =
     
    187181= Is ZenPress multisite compatible? =
    188182
    189 ZenPress can be network‑activated or activated per site. Settings are stored per site, so each site in a network can have different snippets enabled. As with any optimization/security plugin, test network‑wide changes carefully, especially REST API and XML‑RPC related snippets.
     183ZenPress is fully compatible with multisite networks. You can activate it across the entire network or on individual sites. Only Network Administrators have the capability to manage these settings across the network to ensure consistent performance and security policies.
    190184
    191185= I have a suggestion =
    192186
    193 Nice ! If you can't find anything in the roadmap, feel free to submit your suggestion on the support page! If you know how to code, you can even contribute on GitHub.
    194 
    195 == Hooks & filters ==
    196 
    197 For developers: ZenPress exposes the following action and filters for extending or bypassing behavior.
    198 
    199 = Action =
    200 * `zenpress_caches_clear` – Fired when the user clears caches from the ZenPress admin bar. Integrations (e.g. Autoptimize) hook into this to clear their own caches. You can add custom cache clear logic with `add_action('zenpress_caches_clear', 'your_callback');`.
    201 
    202 = Filters (Disable REST API snippet) =
    203 * `zenpress_disable_wp_rest_api_post_var` – Allow unauthenticated REST access when a specific POST key is present (e.g. for webhooks). Return a string or array of key names. Use non-guessable values only.
    204 * `zenpress_disable_wp_rest_api_server_var` – Allow unauthenticated REST access when `REQUEST_URI` matches a specific value. Return a string or array. Use non-guessable values only.
     187I welcome your ideas! If you have a suggestion for the roadmap, please visit the official support forum. If you are a developer, you can also contribute directly to the project on GitHub.
    205188
    206189== Changelog ==
    207190
     191= 2.2.5 =
     192- Linguistic improvements : Align to WordPress [Style, voice, and tone](https://make.wordpress.org/docs/style-guide/general-guidelines/style-voice-tone/).
     193- Accessibility improvements : Align to WordPress [accessibility guidelines](https://make.wordpress.org/docs/style-guide/general-guidelines/accessibility/).
     194
    208195= 2.2.4 =
    209 - Fix: Admin bar “Clear all caches” is now off by default; user turns it on if they want.
     196- Fix : Admin bar “Clear all caches” is now off by default; user turns it on if they want.
    210197- Code quality : Split Settings page into smaller, modular piece.
    211198- Interface : After clearing cache from the admin bar, show a WordPress success notice on the next admin load.
  • zenpress/trunk/zenpress.php

    r3452689 r3470504  
    1010 * @license   GPL v2 or later
    1111 *
    12  * Plugin Name: ZenPress - Optimize & Secure
    13  * Description: Easily speed up and strengthen your WordPress site in one click: clean out unnecessary features, protect weak points, autoconfigure cache integrations.
    14  * Version: 2.2.4
     12 * Plugin Name: ZenPress
     13 * Description: Speed up and harden your site with a single click: cleans up unused features, protects security gaps, and configures cache integrations automatically.
     14 * Version: 2.2.5
    1515 * Plugin URI: https://wordpress.org/plugins/zenpress/
    1616 * Author: Quentin Le Duff
Note: See TracChangeset for help on using the changeset viewer.