{"id":366931,"date":"2026-10-12T11:04:50","date_gmt":"2026-10-12T11:04:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/nexya\/"},"modified":"2026-10-12T12:25:16","modified_gmt":"2026-10-12T12:25:16","slug":"freexya","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/freexya\/","author":23563827,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.7","stable_tag":"1.3.7","tested":"7.1.3","requires":"6.9","requires_php":"8.2","requires_plugins":null,"header_name":"Freexya \u2013 Cookie Consent, SMTP, Redirects & Security Toolkit","header_author":"nexya.dev","header_description":"WordPress modules, one panel. Switch a module on, switch a module off \u2014 and nothing of it runs on the site while it is off.","assets_banners_color":"15302e","last_updated":"2026-10-12 12:25:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/nexya.dev\/plugins\/","header_author_uri":"https:\/\/nexya.dev","rating":5,"author_block_rating":0,"active_installs":0,"downloads":53,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.6":{"tag":"1.3.6","author":"nexyadev","date":"2026-10-12 11:19:12","revision":3741281},"1.3.7":{"tag":"1.3.7","author":"nexyadev","date":"2026-10-12 12:25:16","revision":3741488}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3741376,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3741376,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3741488,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3741488,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.6","1.3.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3741203,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3741203,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3741203,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3741203,"resolution":"4","location":"assets","locale":"","width":1440,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3741203,"resolution":"5","location":"assets","locale":"","width":1440,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3741203,"resolution":"6","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"The hub: each module switches on or off, and a module that is off registers nothing.","2":"The cookie banner on the site: nothing optional runs before the visitor agrees.","3":"Security: the HTTP headers, each explained, sent without breaking the site.","4":"SEO: who publishes the site, the content, the social networks, the sitemap.","5":"404s &amp; Redirects: the broken addresses visitors hit, with their count, redirected in one click.","6":"E-mails: one sender address for every message, sent through PHP, SMTP or an API."}},"plugin_section":[262246],"plugin_tags":[362,223629,131785,726,6696],"plugin_category":[54,55],"plugin_contributors":[286098],"plugin_business_model":[],"class_list":["post-366931","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-captcha","plugin_tags-consent-mode","plugin_tags-gdpr","plugin_tags-redirects","plugin_tags-smtp","plugin_category-security-and-spam-protection","plugin_category-seo-and-marketing","plugin_contributors-nexyadev","plugin_committers-nexyadev"],"banners":{"banner":"https:\/\/ps.w.org\/freexya\/assets\/banner-772x250.png?rev=3741488","banner_2x":"https:\/\/ps.w.org\/freexya\/assets\/banner-1544x500.png?rev=3741488","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/freexya\/assets\/icon-128x128.png?rev=3741376","icon_2x":"https:\/\/ps.w.org\/freexya\/assets\/icon-256x256.png?rev=3741376","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/freexya\/assets\/screenshot-1.png?rev=3741203","caption":"The hub: each module switches on or off, and a module that is off registers nothing."},{"src":"https:\/\/ps.w.org\/freexya\/assets\/screenshot-2.png?rev=3741203","caption":"The cookie banner on the site: nothing optional runs before the visitor agrees."},{"src":"https:\/\/ps.w.org\/freexya\/assets\/screenshot-3.png?rev=3741203","caption":"Security: the HTTP headers, each explained, sent without breaking the site."},{"src":"https:\/\/ps.w.org\/freexya\/assets\/screenshot-4.png?rev=3741203","caption":"SEO: who publishes the site, the content, the social networks, the sitemap."},{"src":"https:\/\/ps.w.org\/freexya\/assets\/screenshot-5.png?rev=3741203","caption":"404s &amp; Redirects: the broken addresses visitors hit, with their count, redirected in one click."},{"src":"https:\/\/ps.w.org\/freexya\/assets\/screenshot-6.png?rev=3741203","caption":"E-mails: one sender address for every message, sent through PHP, SMTP or an API."}],"raw_content":"<!--section=description-->\n<p>One plugin for the jobs every WordPress site needs, instead of five or six:<\/p>\n\n<ul>\n<li><strong>E-mails that do not arrive<\/strong> \u2014 send through SMTP or an API, keep a log of every message, and read the server's own reason when one fails.<\/li>\n<li><strong>A cookie banner that really blocks<\/strong> \u2014 third-party scripts and embeds wait for consent, with Google Consent Mode v2.<\/li>\n<li><strong>404s after a redesign<\/strong> \u2014 a log of the broken addresses visitors hit, with their count, redirected in one click.<\/li>\n<li><strong>Security<\/strong> \u2014 HTTP headers, a limit on failed logins, and your plugins checked against known vulnerabilities.<\/li>\n<\/ul>\n\n<p>Each job is a module you switch on from the hub, and a module that is off registers nothing: none of its hooks run on the site. The modules:<\/p>\n\n<ul>\n<li><strong>Dashboard<\/strong> \u2014 a readable admin home and a tidied toolbar.<\/li>\n<li><strong>Shortcuts<\/strong> \u2014 duplicate content, reorder it by hand, add entries in one click.<\/li>\n<li><strong>Roles &amp; capabilities<\/strong> \u2014 capabilities sorted under the post type that creates them, and the site seen through a role's eyes without leaving your own account.<\/li>\n<li><strong>Activity log<\/strong> \u2014 who changed what, with the before and the after.<\/li>\n<li><strong>Cookies<\/strong> \u2014 a consent banner, third-party scripts held back until consent, and a scan that finds them.<\/li>\n<li><strong>SEO<\/strong> \u2014 titles and descriptions with a suggestion drawn from the page's text, sitemap, schema, llms.txt.<\/li>\n<li><strong>Mail<\/strong> \u2014 SMTP, an API provider, or a Gmail or Microsoft 365 account connected with OAuth, a delivery log, a test message, an invisible captcha for the site's forms.<\/li>\n<li><strong>Redirects<\/strong> \u2014 exact redirects and a 404 log with the hit count.<\/li>\n<li><strong>Media<\/strong> \u2014 regenerate thumbnails in the background, in batches.<\/li>\n<li><strong>Security<\/strong> \u2014 security headers, a content policy, a limit on failed logins, and a check of the installed plugins against known vulnerabilities.<\/li>\n<li><strong>Maintenance<\/strong> \u2014 a holding page, database clean-up, a database export, and the previous version of each extension kept before its update.<\/li>\n<li><strong>Custom fields<\/strong> \u2014 field groups with repeaters, flexible content and relations, kept in their own tables, and content types and taxonomies of your own.<\/li>\n<li><strong>Element<\/strong> \u2014 sixteen Elementor widgets for custom fields, NCF\u2019s or ACF\u2019s: repeaters as cards, tabs or tables, galleries and sliders, key figures, teams, timelines, taxonomies, maps.<\/li>\n<li><strong>Translate<\/strong> \u2014 your site in several languages: each page linked to its translations, a translation editor beside the original (blocks, Elementor, ACF and NCF fields), addresses in \/en\/, a menu per language, a language switcher, hreflang, and every text of the site translated from the admin. A site coming from WPML or Polylang moves over in one click.<\/li>\n<\/ul>\n\n<h4>Free and Pro<\/h4>\n\n<p>Everything above is free, on as many sites as you like. nexya Pro, sold on nexya.dev, adds three modules \u2014 nexya forms, Mailya for newsletters and a page cache \u2014 and the parts that do the repetitive work for you: suggested redirects and pattern rules, CSV import, a daily vulnerability pass and a file fingerprint with rollback, a two-step login, updates undone by themselves when they break the site, undo from the activity log, a second sending server and failure alerts for mail, a branded login screen and admin skin, banner appearance and consent service by service, scheduled database clean-up, orphan image sizes, folders in the media library, and longer log retention. The free version contains none of that code; nexya Pro is delivered by Freemius after purchase, and takes over from this plugin with the same settings.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sends nothing to a third party by default. The features that reach the network, and what they send, are listed under External services below.<\/p>\n\n<h4>Multisite<\/h4>\n\n<p>Multisite networks are not supported. On a network the plugin stays switched off and says so.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Nothing below runs unless you switch the matching module or option on. No data leaves the site by default, and the plugin sends no usage data anywhere.<\/p>\n\n<p><strong>WPVulnerability (Security module, vulnerability watch).<\/strong> When you start a check from the Security screen, the plugin asks the public WPVulnerability API whether the installed plugins have known vulnerabilities. For each installed plugin, its slug is sent to www.wpvulnerability.net; nothing else about the site is sent. Nothing is sent until you start a check. Terms and privacy (legal notice of its publisher): https:\/\/www.robotstxt.es\/legal\/<\/p>\n\n<p><strong>WordPress.org checksums (Security module).<\/strong> While the Security module is on, once a day and when you press \"Check now\", the plugin asks api.wordpress.org \u2014 the same service WordPress uses for its own updates \u2014 for the checksums of the installed WordPress version, sending only that version number and the site language, then compares them with the core files on your server. Terms: https:\/\/wordpress.org\/about\/privacy\/<\/p>\n\n<p><strong>IndexNow (SEO module, optional, off by default).<\/strong> Only if you switch it on, each time a page is published, updated or taken down its address is sent to api.indexnow.org, which shares it with the search engines that take part (Bing, Yandex, Seznam, Naver and others), along with the site's host name and the verification key the plugin serves at the root of your site. Nothing is sent while the site asks search engines not to index it, or runs on a local address. Terms: https:\/\/www.indexnow.org\/terms \u2014 Privacy (Microsoft, which runs the IndexNow service): https:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/p>\n\n<p><strong>Stripe (nexya forms, Payment module, optional, nexya Pro).<\/strong> Only once you switch the module on and enter your own Stripe secret key, a form with a payment field sends, when the visitor submits it, the amount, the currency, the name of the form, the visitor's e-mail address if the form asks for one, and the entry's number to api.stripe.com to open a Stripe Checkout page; the visitor then pays on Stripe's site. Stripe calls back the site's own webhook address to confirm the payment. Terms: https:\/\/stripe.com\/legal\/ssa \u2014 Privacy: https:\/\/stripe.com\/privacy<\/p>\n\n<p><strong>PayPal (nexya forms, Payment module, optional, nexya Pro).<\/strong> Only once you enter your own PayPal REST app credentials, a form with a payment field sends, when the visitor chooses PayPal, the amount, the currency, the name of the form and the entry's number to api-m.paypal.com (or api-m.sandbox.paypal.com in sandbox mode) to open a PayPal approval page; the visitor approves the payment on PayPal's site, and the site captures it when they come back. Terms: https:\/\/www.paypal.com\/legalhub\/home \u2014 Privacy: https:\/\/www.paypal.com\/myaccount\/privacy\/privacyhub<\/p>\n\n<p><strong>Patchstack (Security module, optional).<\/strong> Only if you enter your own Patchstack API key, the same check also asks api.patchstack.com, sending each installed plugin's slug and your key. Terms: https:\/\/patchstack.com\/terms-and-conditions\/ \u2014 Privacy: https:\/\/patchstack.com\/privacy-policy\/<\/p>\n\n<p><strong>E-mail delivery (E-mails module).<\/strong> When you pick an API provider instead of SMTP, the messages your site sends are handed to that provider's API: sender, recipients, subject, body and attachments, at the moment the message is sent. You choose the provider and enter its API key. The providers offered are Brevo (https:\/\/www.brevo.com\/legal\/termsofuse\/ \u2014 https:\/\/www.brevo.com\/legal\/privacypolicy\/), SendGrid (https:\/\/www.twilio.com\/en-us\/legal\/tos \u2014 https:\/\/www.twilio.com\/en-us\/legal\/privacy), Postmark (https:\/\/postmarkapp.com\/terms-of-service \u2014 https:\/\/postmarkapp.com\/privacy-policy), Resend (https:\/\/resend.com\/legal\/terms-of-service \u2014 https:\/\/resend.com\/legal\/privacy-policy), SMTP2GO (https:\/\/www.smtp2go.com\/terms\/ \u2014 https:\/\/www.smtp2go.com\/privacy\/), MailerSend (https:\/\/www.mailersend.com\/legal\/terms-of-service \u2014 https:\/\/www.mailersend.com\/legal\/privacy-policy), SendLayer (https:\/\/sendlayer.com\/terms-of-service\/ \u2014 https:\/\/sendlayer.com\/privacy-policy\/), Mandrill (https:\/\/mailchimp.com\/legal\/terms\/ \u2014 https:\/\/mailchimp.com\/legal\/privacy\/), Mailgun (https:\/\/www.mailgun.com\/legal\/terms\/ \u2014 https:\/\/www.mailgun.com\/legal\/privacy-policy\/), Elastic Email (https:\/\/elasticemail.com\/resources\/usage-policies\/terms-of-use \u2014 https:\/\/elasticemail.com\/resources\/usage-policies\/privacy-policy) and SparkPost (https:\/\/www.sparkpost.com\/policies\/tou\/ \u2014 https:\/\/www.sparkpost.com\/policies\/privacy\/).<\/p>\n\n<p><strong>Gmail and Microsoft 365 sending (E-mails module, optional).<\/strong> Only if you choose Google (Gmail, Workspace) or Microsoft 365 (Outlook) as the sending method and connect an account. When you press \"Connect\", your browser goes to accounts.google.com or login.microsoftonline.com, where you sign in and allow the site to send e-mail; the plugin then sends the authorisation code it gets back, with the client ID and secret you entered, to oauth2.googleapis.com or login.microsoftonline.com to obtain an access token, and renews that token there when it expires while the site is sending. No password is stored on the site. Each message the site sends then goes through smtp.gmail.com, or smtp.office365.com \/ smtp-mail.outlook.com, with its sender, recipients, subject, body and attachments, at the moment it is sent. Google \u2014 Terms: https:\/\/policies.google.com\/terms \u2014 Privacy: https:\/\/policies.google.com\/privacy. Microsoft \u2014 Terms: https:\/\/www.microsoft.com\/en-us\/servicesagreement \u2014 Privacy: https:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/p>\n\n<p><strong>Cloudflare (Cache module, optional).<\/strong> Only if you switch the Cloudflare option on and enter your zone ID and API token: each time the nexya cache is emptied, the plugin asks api.cloudflare.com to empty the cache of that zone, sending the zone ID, the token and, when only some pages changed, their addresses. Terms: https:\/\/www.cloudflare.com\/terms\/ \u2014 Privacy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<p><strong>Form webhook (nexya forms, optional).<\/strong> Only if you enter an address in a form's settings, each entry of that form is sent, when it is submitted, to that address as JSON: the form's name and number, the entry's number and date, the page it was sent from, the site's address, and the answers with the label and type of each field. You choose the address (Zapier, Make, n8n, a CRM\u2026); the plugin contacts no address you did not enter, and the terms and privacy policy that apply are those of the service you chose.<\/p>\n\n<p><strong>AI suggestions (optional).<\/strong> The plugin calls no AI provider itself. When you press a button that asks for a suggestion (a title, a description, an image text\u2026), the text needed for it is handed to the AI client built into WordPress, which sends it to the provider of the connector you set up in WordPress, under that provider's terms. Without such a connector, these buttons do not appear and nothing is sent.<\/p>\n\n<p><strong>Audience measurement tags (SEO module).<\/strong> If, and only if, you enter an ID or an address for one of them, the module prints that service's tag on the front end; the visitor's browser then loads the script from the service and sends it what that tag collects.\n* Google Tag Manager and Google Analytics 4, from www.googletagmanager.com. Terms: https:\/\/marketingplatform.google.com\/about\/analytics\/terms\/us\/ \u2014 Privacy: https:\/\/policies.google.com\/privacy\n* Plausible, from plausible.io or the address you enter. Terms: https:\/\/plausible.io\/terms \u2014 Privacy: https:\/\/plausible.io\/privacy\n* Umami, from the address of your own Umami instance or Umami Cloud. Terms: https:\/\/umami.is\/terms \u2014 Privacy: https:\/\/umami.is\/privacy\n* Matomo, from the address of your own Matomo instance or Matomo Cloud. Terms: https:\/\/matomo.org\/matomo-cloud-terms-of-service\/ \u2014 Privacy: https:\/\/matomo.org\/privacy-policy\/<\/p>\n\n<p><strong>Freemius (trial and purchase of nexya Pro).<\/strong> The Freemius SDK ships with the plugin in anonymous mode: on its own it sends nothing and shows no opt-in. Only when an administrator starts the Pro trial or buys nexya Pro from the plugin's screens are the site address, the WordPress, PHP and plugin versions and the administrator's name and e-mail address sent to Freemius, which handles the checkout and the licence. Terms: https:\/\/freemius.com\/terms\/ \u2014 Privacy: https:\/\/freemius.com\/privacy\/<\/p>\n\n<p><strong>Lists of known hosts (Cookies and Security modules).<\/strong> These are not remote files and nothing is loaded from them. The cookie module carries a list of third-party hostnames (Google Fonts, Font Awesome, public CDNs, YouTube, Google Maps and so on) as plain data: a script or frame already on your page whose address matches one of them is held back until the visitor consents. The Security module carries a similar list of well-known origins, offered as ready-made lines when you write your site's content security policy, the header that tells browsers which origins your pages may load from. Both lists are plain data files, modules\/Cookie\/data\/hosts.json and modules\/Security\/data\/origins.json. The plugin itself never contacts any of these hosts.<\/p>\n\n<p><strong>Requests to your own site.<\/strong> The cookie scan, the sharing-image finder of the SEO module and a few background jobs fetch pages of your own site from your own server. Nothing leaves it.<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<ul>\n<li>Chart.js 4.5.1 (MIT) draws the statistics charts \u2014 assets\/js\/chart.min.js. Source: https:\/\/github.com\/chartjs\/Chart.js<\/li>\n<li>Freemius SDK (GPL) handles the licence and the update checks. Source: https:\/\/github.com\/Freemius\/wordpress-sdk<\/li>\n<li>Font Awesome Free 6.7.2 brand icons (CC BY 4.0) for the social networks of e-mails and pop-ups \u2014 assets\/social\/. Source: https:\/\/fontawesome.com<\/li>\n<\/ul>\n\n<p>The plugin's own JavaScript and CSS ship unminified, as written.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In <strong>Plugins &gt; Add New<\/strong>, search for \u201cfreexya\u201d, then install and activate it. You can also upload the folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Open <strong>nexya<\/strong> in the admin menu. On a new install, a first card asks what kind of site this is \u2014 a showcase site, a shop or a blog \u2014 and switches on the modules that suit it in one click. You can also pick them yourself.<\/li>\n<li>The hub lists every module with its switch: a module that is off registers nothing on the site. Each module that is on gets its own page in the nexya menu, with its settings.<\/li>\n<li>The hub's other tabs hold what is shared: <strong>Settings<\/strong> (the panel language, and whether your settings are kept if the plugin is deleted), <strong>Colours<\/strong> (your brand colours for the cookie banner, forms, messages and holding pages), <strong>AI<\/strong> (the connector the AI features use) and <strong>Export &amp; import<\/strong> (every setting in one file, to copy a set-up to another site).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20a%20module%20i%20turned%20off%20still%20cost%20anything%3F\"><h3>Does a module I turned off still cost anything?<\/h3><\/dt>\n<dd><p>Almost nothing. The registry declares them all, but only boots the modules that are on: the others register no hooks, load no assets and run no queries.<\/p><\/dd>\n<dt id=\"where%20are%20smtp%20passwords%20stored%3F\"><h3>Where are SMTP passwords stored?<\/h3><\/dt>\n<dd><p>Encrypted with AES-256-GCM in a single option, under a key derived from your WordPress salts. If you rotate those salts the stored secrets can no longer be read, and the panel tells you to enter them again.<\/p><\/dd>\n<dt id=\"and%20the%20licence%3F\"><h3>And the licence?<\/h3><\/dt>\n<dd><p>The licence is handled by Freemius: the key, its activation and the checkout live in the Freemius screens under the nexya menu. The plugin stores nothing about it.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%3F\"><h3>What happens when I uninstall?<\/h3><\/dt>\n<dd><p>You choose, when you deactivate the plugin (or in Settings \u203a If the plugin is deleted):<\/p>\n\n<ul>\n<li>Keep my settings \u2014 its scheduled tasks are cleared and the server rules it wrote are taken out; everything else stays, for a reinstall or a move to nexya Pro.<\/li>\n<li>Erase everything \u2014 roles go back to the capabilities they had before the plugin touched them, the plugin's tables and options are dropped, its scheduled tasks are cleared and the private folder is removed. A copy of the settings only (no logs, no page data) stays for 30 days as a WordPress transient, which WordPress deletes on its own once it expires; if the plugin comes back within that time, it offers to import it.<\/li>\n<\/ul><\/dd>\n<dt id=\"can%20i%20move%20from%20wpml%20or%20polylang%3F\"><h3>Can I move from WPML or Polylang?<\/h3><\/dt>\n<dd><p>Yes, in Translate \u203a Import, after a backup and ideally on a copy of the site first. Languages, versions of contents, terms, menus, strings and forms come over; the former plugin is only switched off, so switching it back on restores the site. The addresses keep their shape, and those that change are redirected (301) through the Redirects module.<\/p>\n\n<p>Not taken over: prices per currency from WooCommerce Multilingual, a domain or subdomain per language (redirect it at the host), translated media files, and add-ons that need WPML or Polylang themselves. Image alternative texts are translated in Texts \u203a Images.<\/p><\/dd>\n<dt id=\"how%20do%20i%20move%20to%20nexya%20pro%20without%20losing%20my%20settings%3F\"><h3>How do I move to nexya Pro without losing my settings?<\/h3><\/dt>\n<dd><p>Install and activate nexya Pro while this plugin is still in place: both read the same settings, and Pro switches this version off. Then delete this version.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.7<\/h4>\n\n<ul>\n<li>Permalinks: right after the plugin is activated, or after a module is switched on, the notice no longer claims that the address rules are missing; WordPress writes them at once and the notice only appears when rules are really missing.<\/li>\n<\/ul>\n\n<h4>1.3.6<\/h4>\n\n<ul>\n<li>Hub: on a new install, a first card asks what kind of site this is \u2014 a showcase site, a shop or a blog \u2014 and switches on the modules that suit it in one click; each stays free to switch off.<\/li>\n<li>Mailya: a Section block groups blocks on a coloured background \u2014 up to three columns side by side, with their own split, gap, vertical alignment, side space, inner space and rounded corners. Titles, paragraphs, images, buttons, separators, spaces and social links go inside each column.<\/li>\n<li>Mailya: an image can have rounded corners, and the rounded corners of an image or a section can differ on phones.<\/li>\n<li>Mailya: on phones, a section shows its columns one under the other by default; two or three side by side can be chosen instead.<\/li>\n<li>Permalinks: the \u201cPermalinks regenerated\u201d message no longer comes back on every page; it shows once, right after the regeneration.<\/li>\n<li>Media library: after \u201cSelect all\u201d, the \u201cMove to trash\u201d and \u201cDelete permanently\u201d buttons are usable at once, in a folder and in the trash, without clicking a file first.<\/li>\n<li>Security: the templates WPML keeps in its cache inside the media folder are no longer reported every day as suspicious PHP files, as long as they hold nothing but a template.<\/li>\n<li>Admin notices: the close button is easier to see and centred in its notice.<\/li>\n<\/ul>\n\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Permalinks: a notice warns when the address rules need regenerating \u2014 rules missing after a plugin or a type was added, none stored at all, or posts answering \u201cPage not found\u201d because the server lost them \u2014 with a \u201cRegenerate now\u201d button and a link to the permalink settings.<\/li>\n<li>Cookies: the default colour of the \u201cAccept\u201d button was too pale for its white text; it is now darker and readable, and a site that kept the old default follows the new one.<\/li>\n<li>Cookies and Google consent mode: links on the site no longer carry a \u201c_gl\u201d parameter for every visitor who has not chosen yet. Only a visitor who arrives from an ad keeps their click from page to page, and the parameter leaves the address bar once Google has read it.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Query monitor: it no longer changes how WordPress runs \u2014 the queries are read as they pass, without switching SAVEQUERIES on. The free version lists them without their times unless wp-config.php asks for them; with nexya Pro, times are measured for an administrator\u2019s own pages only.<\/li>\n<li>Forms: the PHP notice \u201ctranslation loading for the freexya domain was triggered too early\u201d, written to the debug log on every page since WordPress 6.7, is gone.<\/li>\n<li>Mailya: the monthly digest tab no longer stops with an error on a site whose time zone is set as a UTC offset, as on a fresh WordPress install.<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Security: the files of every plugin that comes from wordpress.org are compared each day with the originals of their version, and PHP files hidden in the media folder are flagged; an e-mail warns when something new appears. nexya Pro puts an original back \u2014 of WordPress or of a plugin \u2014 or sets a suspicious file aside in one click, keeping a copy of each. A file you know can be allowed: it is no longer reported, unless it changes again.<\/li>\n<li>Translate and WooCommerce: a shop in several languages \u2014 one product per language, linked, sharing prices, sales, SKU, stock, dimensions, shipping, pictures, categories and attributes; each variation has its version. The Shop, Cart, Checkout and My account pages follow the visitor\u2019s language, the basket shows its products in the language read, an order keeps its language and the customer receives its e-mails in it. \u201cCreate by hand\u201d on a product makes a real WooCommerce copy, and a SKU only has to be unique within one language.<\/li>\n<li>Translate: a Shop and strings tab translates \u2014 by hand or with AI \u2014 the names of attributes, shipping methods and payment methods, and the strings a theme registers for Polylang. With nexya Pro, Polylang\u2019s functions (pll_current_language(), pll__(), pll_the_languages()\u2026) answer with nexya\u2019s languages once Polylang is switched off.<\/li>\n<li>From Polylang: the import also takes over the shop \u2014 products with their prices, stock and variations, categories, tags, attributes and the language of orders \u2014, the strings translated in Polylang and the options pages of ACF Options for Polylang. A version left a draft beside a published original counts as unfinished and is translated in full, title included.<\/li>\n<li>Translate \u203a Texts: the theme\u2019s strings are read whatever their text domain, in PHP files and Twig templates, strings without a domain and plural forms included, and other themes can be ticked like plugins; a string the theme\u2019s language file already translates shows a \u201cLanguage file\u201d state with its text. Each file folds, and one button folds or unfolds them all.<\/li>\n<li>AI \u203a Batches: a \u201cTranslate the site\u2019s contents\u201d card translates in the background, in one go, the contents of the types ticked \u2014 pages, posts, products and every type with languages \u2014 then the terms, menus, forms, strings, options pages and shop texts, into the languages ticked, as drafts or published; it shows the count and the cost first.<\/li>\n<li>Translate: a version still word for word its original, or made by hand with fields still copied from it, is translated \u2014 only the fields a person rewrote are kept and locked, and they are no longer sent to the AI; tags, entities and kinds of spaces aside, a field identical to the original counts as to translate. The editor shows such a version \u201cTo translate\u201d or \u201cTo complete\u201d.<\/li>\n<li>AI translation: a field whose markup comes back damaged no longer stops the whole page \u2014 markers written another way are taken back, a stubborn text is translated piece by piece between its tags, and only a field that still fails stays \u201cTo translate\u201d. Without an AI connector, the \u201cTranslate everything with AI\u201d button leads to the connector settings instead of disappearing.<\/li>\n<li>Translate: a get_posts() query filtered on a category no longer mixes languages, and WooCommerce\u2019s own calls \u2014 the basket, the checkout, its Store API \u2014 speak the language of the page that made them.<\/li>\n<li>Admin theme: the edit screen keeps its full width when a plugin or the theme sets the content area inline. Aris: the editor\u2019s heatmap section no longer queries a site where the heatmap was never switched on. Query monitor: its button sits a little higher, clear of the buttons other plugins put bottom right.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>nexya forms and Mailya: an icon before and\/or after the label of the submit button \u2014 one of sixteen, or an image from the media library \u2014 centred on the text, the order following right-to-left languages.<\/li>\n<li>Editor: the language and translations, the visibility, the unpublishing date and the internal links of a post sit in one nexya panel of the sidebar, in sections, instead of separate boxes; each language shows whether it is translated.<\/li>\n<li>Aris: when a published page had visits recorded by the heatmap over the last 30 days, the nexya panel of the editor shows its views and clicks and opens its heatmap in one click, for each type of screen.<\/li>\n<li>Media: an Uploading files card names what the server allows \u2014 largest file, memory to process an image, time per request, image library, formats \u2014 says in plain words which limit stops an upload, tests each image library with a real photo, and can make WordPress use GD rather than Imagick; when an upload fails in the media library, its message now says the likely cause and what to do.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Cookies and Cache: the page is filtered and kept through the output buffer WordPress itself opens and closes around templates, instead of one opened by the plugin; nexya now needs WordPress 6.9 or later.<\/li>\n<li>Admin theme: the WooCommerce report colours are changed in the browser, on the charts and their legends, instead of rewriting the whole page.<\/li>\n<li>Readme: the external services now also cover Gmail and Microsoft 365 sending, Cloudflare, the forms webhook and the AI suggestions.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Translate: the language and the other versions of each content come from one index, read in a single query per page, instead of two queries for each linked content; the menu pre-reading of 1.2.38 is no longer needed and is gone.<\/li>\n<\/ul>\n\n<p>Earlier versions: https:\/\/nexya.dev\/en\/whats-new\/<\/p>","raw_excerpt":"Cookie consent with Google Consent Mode, SMTP with mail log, redirects and 404s, captcha, security headers \u2014 one light plugin, modules you switch on.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/366931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=366931"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nexyadev"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=366931"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=366931"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=366931"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=366931"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=366931"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=366931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}