{"id":402025,"date":"2026-11-12T14:24:52","date_gmt":"2026-11-12T14:24:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/keellayer-connector\/"},"modified":"2026-11-12T15:26:29","modified_gmt":"2026-11-12T15:26:29","slug":"keellayer-connector","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/keellayer-connector\/","author":12911309,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.8.1","stable_tag":"1.8.1","tested":"7.1.4","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"KeelLayer Connector","header_author":"Havenswift Hosting","header_description":"Shows your hosting plans, domain prices and domain availability from Keel on any WordPress theme, and links visitors through to sign up.","last_updated":"2026-11-12 15:26:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":61,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.8.1":{"tag":"1.8.1","author":"havenswift-hosting","date":"2026-11-12 15:26:29","revision":3798659}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3798536,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3798536,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3798536,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3798536,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"keel\/status":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/status","title":"Keel network status","category":"widgets","icon":"shield-alt","description":"Whether anything is broken right now, and what planned work is coming, read from Keel.","keywords":["status","incident","maintenance","uptime","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"mode":{"type":"string","default":"full"},"history":{"type":"string","default":"yes"},"updates":{"type":"string","default":"yes"},"ok_text":{"type":"string","default":""}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/knowledgebase":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/knowledgebase","title":"Keel knowledgebase","category":"widgets","icon":"book-alt","description":"Your help guides, read from Keel, with a page for each one under this page.","keywords":["knowledgebase","help","guides","support","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"limit":{"type":"string","default":"0"},"category":{"type":"string","default":""},"categories":{"type":"string","default":"yes"},"summaries":{"type":"string","default":"yes"},"search":{"type":"string","default":"no"},"related":{"type":"string","default":"yes"}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/product-groups":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/product-groups","title":"Keel product groups","category":"widgets","icon":"category","description":"Your catalogue's groups, each with its cheapest recurring price, for a menu or a landing page.","keywords":["groups","categories","menu","hosting","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"currency":{"type":"string","default":""},"groups":{"type":"string","default":""},"limit":{"type":"string","default":"0"},"layout":{"type":"string","default":"cards"},"features":{"type":"string","default":"yes"},"plans":{"type":"string","default":"no"},"prices":{"type":"string","default":"yes"},"link":{"type":"string","default":""}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/promotions":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/promotions","title":"Keel offers","category":"widgets","icon":"tag","description":"The discount codes that are really on, read from Keel so a banner cannot promise what the basket refuses.","keywords":["offers","promotions","discount","coupon","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"currency":{"type":"string","default":""},"limit":{"type":"string","default":"0"},"codes":{"type":"string","default":""},"ends":{"type":"string","default":"yes"},"layout":{"type":"string","default":"cards"}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/announcements":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/announcements","title":"Keel announcements","category":"widgets","icon":"megaphone","description":"Your news, planned maintenance and incident notices, read from Keel.","keywords":["announcements","news","notices","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"limit":{"type":"string","default":"5"},"kind":{"type":"string","default":""},"slug":{"type":"string","default":""},"bodies":{"type":"string","default":"yes"},"dates":{"type":"string","default":"yes"}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/domain-search":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/domain-search","title":"Keel domain search","category":"widgets","icon":"search","description":"Lets a visitor check whether a domain name is free. Keel asks the registry; this does not speak WHOIS.","keywords":["domain","search","availability","whois","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"currency":{"type":"string","default":""},"placeholder":{"type":"string","default":""},"button":{"type":"string","default":""},"heading":{"type":"string","default":""}},"editorScript":"file:.\/editor.js","script":"keellayer-connector-domain-search","style":"keellayer-connector"},"keel\/tld-pricing":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/tld-pricing","title":"Keel domain prices","category":"widgets","icon":"admin-site-alt3","description":"What each domain extension costs to register, transfer and renew, read from Keel.","keywords":["domain","tld","pricing","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"currency":{"type":"string","default":""},"actions":{"type":"string","default":"register,transfer,renew"},"years":{"type":"string","default":"1"},"tlds":{"type":"string","default":""},"limit":{"type":"string","default":"0"},"badges":{"type":"string","default":"yes"}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/plan":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/plan","title":"Keel plan","category":"widgets","icon":"products","description":"One plan in full, including the choices and extras its order form offers, read from Keel.","keywords":["plan","product","options","addons","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"plan":{"type":"string","default":""},"currency":{"type":"string","default":""},"cycle_count":{"type":"string","default":""},"cycle_unit":{"type":"string","default":""},"features":{"type":"string","default":"yes"},"options":{"type":"string","default":"yes"},"addons":{"type":"string","default":"yes"},"prices":{"type":"string","default":"yes"},"button":{"type":"string","default":"yes"},"label":{"type":"string","default":""}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"},"keel\/pricing":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"keel\/pricing","title":"Keel pricing table","category":"widgets","icon":"tag","description":"Your live hosting plans and prices, read from Keel.","keywords":["pricing","plans","hosting","keel"],"textdomain":"keellayer-connector","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"group":{"type":"string","default":""},"currency":{"type":"string","default":""},"cycle":{"type":"string","default":""},"columns":{"type":"string","default":"3"},"heading":{"type":"string","default":"yes"},"tax_note":{"type":"string","default":""},"layout":{"type":"string","default":"cards"},"products":{"type":"string","default":""},"featured":{"type":"string","default":""}},"editorScript":"file:.\/editor.js","style":"keellayer-connector"}},"tagged_versions":["1.8.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3798536,"resolution":"1","location":"assets","locale":"","width":2672,"height":1722},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3798536,"resolution":"2","location":"assets","locale":"","width":2224,"height":1626},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3798658,"resolution":"3","location":"assets","locale":"","width":2656,"height":2600}},"screenshots":{"1":"Plans and prices from the real catalogue.","2":"Domain prices per extension.","3":"Settings \u2192 Keel, showing the connection and health check."}},"plugin_section":[],"plugin_tags":[15149,24441,3013,1456,23300],"plugin_category":[45],"plugin_contributors":[284648],"plugin_business_model":[],"class_list":["post-402025","plugin","type-plugin","status-publish","hentry","plugin_tags-billing","plugin_tags-domain-search","plugin_tags-domains","plugin_tags-hosting","plugin_tags-web-hosting","plugin_category-ecommerce","plugin_contributors-havenswift-hosting","plugin_committers-havenswift-hosting"],"banners":{"banner":"https:\/\/ps.w.org\/keellayer-connector\/assets\/banner-772x250.png?rev=3798536","banner_2x":"https:\/\/ps.w.org\/keellayer-connector\/assets\/banner-1544x500.png?rev=3798536","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/keellayer-connector\/assets\/icon-128x128.png?rev=3798536","icon_2x":"https:\/\/ps.w.org\/keellayer-connector\/assets\/icon-256x256.png?rev=3798536","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/keellayer-connector\/assets\/screenshot-1.png?rev=3798536","caption":"Plans and prices from the real catalogue."},{"src":"https:\/\/ps.w.org\/keellayer-connector\/assets\/screenshot-2.png?rev=3798536","caption":"Domain prices per extension."},{"src":"https:\/\/ps.w.org\/keellayer-connector\/assets\/screenshot-3.png?rev=3798658","caption":"Settings \u2192 Keel, showing the connection and health check."}],"raw_content":"<!--section=description-->\n<p>Most hosting companies sell from a WordPress site and bill from something\nelse, so the pricing page drifts away from what customers are actually\ncharged. This plugin reads your plans, prices and domain availability straight\nfrom your own Keel installation, so it cannot.<\/p>\n\n<p>Sixteen shortcodes, every one reading your own installation: pricing tables, a\nprice inline in a sentence, a full plan page, your product groups, an order\nbutton carrying the plan and term the visitor chose, domain prices, a working\ndomain search, your network status, your announcements, your knowledgebase\nwith its own search, the promotions really running, a currency switcher, a\ncomparison table, a contact form that opens a real ticket, and your Trustpilot\nrating. All but two are blocks as well.<\/p>\n\n<p>It holds no key and stores no customer data. Keel's storefront API is\nunauthenticated by design: a price list is public, and a key shipped inside a\ndownloadable plugin is not a secret. The plugin is read only and can change\nnothing in Keel.<\/p>\n\n<p>Three things stay off until you turn them on: the knowledgebase and\nannouncements at the Keel end, the Trustpilot rating here.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Everything below leaves the browser or your server. None of it carries\nanything personal, and three of the four are off unless you turn them on.<\/p>\n\n<ol>\n<li><p><strong>Your own Keel installation<\/strong>, at the address you enter in Settings then\nKeel. Read only, anonymous, server to server: your plan list, your domain\nprices, and whether one name is free. What is sent is the domain typed into\nthe search box, and a request header naming this plugin, its version and\nthis site's own address, so that your Keel can tell which of your sites is\nasking. Nothing is sent to us or to any address but the one you entered.<\/p><\/li>\n<li><p><strong>A captcha provider, only if your Keel requires a solved challenge on\ndomain searches<\/strong>, and only on a page carrying a search: Google reCAPTCHA,\nhCaptcha or Cloudflare Turnstile, whichever you chose in Keel. Script URLs\nand policies are under \"What exactly does a captcha load?\" below.<\/p><\/li>\n<li><p><strong>Trustpilot's widget<\/strong>, only with <code>[keel_reviews mode=\"widget\"]<\/code>. The\nbrowser loads\n   https:\/\/widget.trustpilot.com\/bootstrap\/v5\/tp.widget.bootstrap.min.js.\nTerms\nhttps:\/\/corporate.trustpilot.com\/legal\/for-reviewers\/terms-of-use-for-consumers\nand privacy\nhttps:\/\/corporate.trustpilot.com\/legal\/for-reviewers\/privacy-policy-end-user<\/p><\/li>\n<li><p><strong>Your public Trustpilot profile<\/strong>, only with\n   [keel_reviews mode=\"cached\"]. Your server reads the rating from the page\nyou name and holds it six hours. Nothing loads in the browser, no cookie is\nset, and the request names only this plugin and its version, not your site.\nSame terms as above.<\/p>\n\n<p>[keel_reviews] is off by default, and with it off neither 3 nor 4 happens.<\/p><\/li>\n<\/ol>\n\n<!--section=installation-->\n<p>Keel lives on a hostname of its own, beside this WordPress site:<\/p>\n\n<ul>\n<li><code>https:\/\/example.com<\/code> - your WordPress site<\/li>\n<li><code>https:\/\/clients.example.com<\/code> - Keel<\/li>\n<\/ul>\n\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to <strong>Settings \u2192 Keel<\/strong>.<\/li>\n<li>Put in the address Keel is on, the one your customers use to sign in. No\npath. Leave the Storefront box empty.<\/li>\n<li>The Connection section on that screen tells you straight away whether it\nworked, which storefront Keel answered for, whether a domain search will\nrun, and the group slugs to paste into a shortcode.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20do%20i%20put%20in%20%60product%60%20if%20my%20plans%20have%20no%20slugs%3F\"><h3>What do I put in `product` if my plans have no slugs?<\/h3><\/dt>\n<dd><p>The id, which Settings \u2192 Keel lists beside every plan. A plan converted from\nanother billing system often has no slug yet, and the storefront says so by\nsending <code>null<\/code> - so the shortcode takes either, exactly as Keel's own order\nform does, and a page and the order form it links to therefore always resolve\nthe same plan.<\/p><\/dd>\n<dt id=\"can%20keel%20go%20in%20a%20subdirectory%20of%20my%20wordpress%20site%3F\"><h3>Can Keel go in a subdirectory of my WordPress site?<\/h3><\/dt>\n<dd><p>No. Keel identifies a company by hostname, and the table it reads has no path\nin it at all, so a path cannot say which company a request is about. Give Keel\na hostname of its own.<\/p><\/dd>\n<dt id=\"what%20do%20i%20put%20in%20the%20storefront%20box%3F\"><h3>What do I put in the Storefront box?<\/h3><\/dt>\n<dd><p>Nothing. The address identifies your storefront, and it is the one identifier\nyou cannot get wrong. The box is a compatibility route for an installation that\ndoes not yet know the address you entered.<\/p>\n\n<p>If you do fill it in with a name belonging to a different company from the\naddress, Keel refuses the request and the settings screen explains it, rather\nthan showing one brand's prices and sending the buyer to another brand's order\nform.<\/p><\/dd>\n<dt id=\"my%20domain%20search%20says%20it%20is%20unavailable\"><h3>My domain search says it is unavailable<\/h3><\/dt>\n<dd><p>Your Keel is asking for a solved challenge. That challenge is on for domain\nsearches whatever the per-form switch says, because the search is the one thing\non a storefront that can cost you money at a registrar.<\/p>\n\n<p>This plugin draws the box for reCAPTCHA v2, hCaptcha and Turnstile. It cannot\ndraw <strong>invisible reCAPTCHA v3<\/strong>, which has no box. Settings \u2192 Keel says which\none you are on. Either pick one of the three on Keel's captcha screen, or clear\nthe captcha keys there and let Keel rely on its own cache and daily lookup\nceiling.<\/p><\/dd>\n<dt id=\"a%20price%20i%20just%20changed%20is%20still%20showing%20the%20old%20figure\"><h3>A price I just changed is still showing the old figure<\/h3><\/dt>\n<dd><p>Prices are cached for five minutes so a busy pricing page does not ask Keel on\nevery hit. It will catch up on its own, or press <strong>Clear the cache<\/strong> on the\nsettings screen.<\/p><\/dd>\n<dt id=\"keel%20is%20down.%20what%20do%20visitors%20see%3F\"><h3>Keel is down. What do visitors see?<\/h3><\/dt>\n<dd><p>The last prices this site managed to read, for up to a week, rather than a\nblank space or an error. The settings screen and a notice in your admin say\nthat is what is happening, for as long as it is happening.<\/p>\n\n<p>Domain availability is never served from an old copy. A week-old \"available\"\nwould sell a name somebody else already registered, so a lookup that fails\nsays it failed.<\/p><\/dd>\n<dt id=\"can%20visitors%20order%20without%20leaving%20my%20site%3F\"><h3>Can visitors order without leaving my site?<\/h3><\/dt>\n<dd><p>No, and that is deliberate. Payment, tax and terms belong in one place. Each\nplan links to your Keel order form.<\/p><\/dd>\n<dt id=\"what%20exactly%20does%20a%20captcha%20load%3F\"><h3>What exactly does a captcha load?<\/h3><\/dt>\n<dd><p>Only the provider your Keel is set to, and only on a page with a domain\nsearch. Google reCAPTCHA is <code>https:\/\/www.google.com\/recaptcha\/api.js<\/code>, terms\nhttps:\/\/policies.google.com\/terms, privacy https:\/\/policies.google.com\/privacy.\nhCaptcha is <code>https:\/\/js.hcaptcha.com\/1\/api.js<\/code>, terms\nhttps:\/\/www.hcaptcha.com\/terms, privacy https:\/\/www.hcaptcha.com\/privacy.\nCloudflare Turnstile is\n    https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js, terms\nhttps:\/\/www.cloudflare.com\/website-terms\/, privacy\nhttps:\/\/www.cloudflare.com\/privacypolicy\/. With no challenge required by your\nKeel, none of them is loaded at all.<\/p><\/dd>\n<dt id=\"how%20do%20i%20show%20a%20pricing%20table%3F\"><h3>How do I show a pricing table?<\/h3><\/dt>\n<dd><p>[keel_pricing group=\"shared-hosting\"] draws cards side by side.\n    [keel_pricing group=\"shared-hosting\" layout=\"comparison\"] puts the plans\nacross the top and what each includes down the side. Add\n    featured=\"advanced-hosting\" to mark one. Both read the same plans, so two\npages cannot disagree.<\/p>\n\n<p>Rows come from what each plan says it includes, entered in Keel as a label\nand a value. Use the same label across a group and the rows line up. Only\n\"yes\", \"no\", \"true\", \"false\", \"included\" and \"none\" become a tick or a cross;\nanything else prints as you typed it.<\/p><\/dd>\n<dt id=\"can%20i%20compare%20plans%20from%20different%20groups%3F\"><h3>Can I compare plans from different groups?<\/h3><\/dt>\n<dd><p>Yes: <code>[keel_compare plans=\"basic,advanced,business\"]<\/code> compares exactly those,\nin the order you name them. <code>[keel_compare groups=\"shared,reseller\"]<\/code> compares\nthe cheapest plan in each group.<\/p>\n\n<p>One table shows one billing period, because a column priced in a different\nperiod is a figure the eye compares and the small print does not correct. Name\nit with <code>cycle=\"1:year\"<\/code>, or leave it out and the period your named plans\nshare is used. If they share none, the shortcode is left unexpanded on the\npage so the problem is visible, and an administrator is told why.<\/p><\/dd>\n<dt id=\"can%20a%20visitor%20see%20prices%20in%20their%20own%20currency%3F\"><h3>Can a visitor see prices in their own currency?<\/h3><\/dt>\n<dd><p>[keel_currency_switcher] offers the currencies your installation really\nprices in, and the order form opens in the one they chose.<\/p><\/dd>\n<dt id=\"can%20somebody%20with%20no%20account%20reach%20support%3F\"><h3>Can somebody with no account reach support?<\/h3><\/dt>\n<dd><p>[keel_enquiry] opens a real ticket in a real department, with no account\nneeded.<\/p><\/dd>\n<dt id=\"does%20an%20affiliate%20link%20still%20pay%20out%3F\"><h3>Does an affiliate link still pay out?<\/h3><\/dt>\n<dd><p>Yes. A visitor arriving with <code>?ref=<\/code> or <code>?aftid=<\/code> has it carried through to\nyour Keel order form, including on the landing page itself. It is done in the\nbrowser rather than in PHP, so a cached page cannot credit one visitor's\naffiliate for everybody else's sales.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.8.1<\/h4>\n\n<ul>\n<li><strong>Security: the enquiry form now carries a nonce and checks it.<\/strong>\n  [keel_enquiry] could be submitted from another site, so a cross-site\nrequest was able to open a ticket in your support desk. A page carrying the\nform is now kept out of the page cache, so the nonce on it is always one\nthis site will accept.<\/li>\n<li>Query string, cookie and <code>$_SERVER<\/code> values are sanitized where they are\nread rather than where they are used.<\/li>\n<li>Markup built inside the plugin is escaped where it is echoed.<\/li>\n<li>The Trustpilot terms and privacy links in this readme pointed at addresses\nthat redirect three times; they now name Trustpilot's own current pages.<\/li>\n<li>The settings-page confirmation after \"check now\" and \"clear the cache\" is\nshown only for a signed redirect from this plugin.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li><strong>A visitor can now reach your support desk without an account.<\/strong>\n  [keel_enquiry] opens a real ticket in a department you have marked as\npublic. Keel has had a public enquiry form since the website builder was\nwritten and it addressed the message by SECTION - a row in Keel's own page\ntree - which a WordPress site has none of and never will, so this was\nunreachable from a marketing site. An internal queue is never offered and\nis refused even when named directly, and the ticket is attached to no\ncustomer account however the address matches.<\/li>\n<li><strong><code>[keel_currency_switcher]<\/code><\/strong> offers the currencies your installation\nreally prices in, and carries the choice into the order form. No rate is\napplied to anything: each figure is the one Keel holds for that currency, so\na switched price is the price the invoice will carry.<\/li>\n<li><strong><code>[keel_compare]<\/code><\/strong> draws a comparison table from the catalogue. The\ncomparison page is the one page on a hosting site that is always out of date,\nbecause it is the one kept by hand.<\/li>\n<li><strong>An affiliate link that lands on your marketing site now pays out.<\/strong> The\ncode is remembered and added to links pointing at Keel, sixty days, first\ntouch winning, matching Keel's own rule. Affiliatant's parameter is read as\nwell as Keel's.<\/li>\n<li>Documented <code>[keel_tld_pricing]<\/code> and <code>[keel_domain_search]<\/code> by name. Both\nhave worked since 1.0.0 and the description talked about what they do\nwithout ever telling anybody what to type.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li><strong>A plan row can be switched between monthly, annual and biennial, and\nnothing on the page is calculated to do it.<\/strong> Every figure the toggle\nwrites was formatted here from a price Keel sent, so a toggled price is the\nsame number the invoice will carry. A script that multiplied a monthly\nfigure by twelve would produce a price nobody could reconcile.<\/li>\n<li><strong>The toggle offers only the terms EVERY plan in the row sells.<\/strong> Offering\none that a single plan does not would leave that card showing its monthly\nprice under an \"Annually\" heading, and a visitor reading four cards cannot\ntell which one failed to change. Fewer than two terms in common and there is\nno toggle, which is a group sold on one term rather than a fault.<\/li>\n<li><code>cycle=<\/code> still pins a row to one term and now suppresses the toggle with\nit, because the attribute is an instruction and a control that overrode it\nwould make the page disagree with its own heading.<\/li>\n<li>The card opens on the term the toggle opens on. Without a <code>cycle=<\/code> the\ncheapest recurring price was shown, which on a group sold quarterly as well\nas annually put a quarterly figure under a pressed \"Annually\" button.<\/li>\n<li>The control ships <code>hidden<\/code> and a theme's script removes the attribute, so a\nreader with no JavaScript is shown one complete price and never a dead\ncontrol.<\/li>\n<\/ul>\n\n<p>Earlier versions are in <code>changelog.txt<\/code>, which ships with the plugin.<\/p>","raw_excerpt":"Puts your live hosting plans, domain prices and a working domain search on any WordPress site, read from your own Keel installation.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/402025","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=402025"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/havenswift-hosting"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=402025"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=402025"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=402025"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=402025"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=402025"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=402025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}