{"id":374819,"date":"2026-09-24T11:50:18","date_gmt":"2026-09-24T11:50:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flx-modernize\/"},"modified":"2026-10-29T18:05:41","modified_gmt":"2026-10-29T18:05:41","slug":"flx-modernize","status":"publish","type":"plugin","link":"https:\/\/ory.wordpress.org\/plugins\/flx-modernize\/","author":161177,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Flx Modernize","header_author":"Rickey Gu","header_description":"Adds a sale-savings badge (\"Save NN%\") to supported WooCommerce product pages, computed locally from each product's own regular\/sale price -- no external service required. Optionally, an experimental external Flx Render integration can also be configured; native WooCommerce rendering is always the fallback. Manage both under Settings > Flx Modernize.","assets_banners_color":"","last_updated":"2026-10-29 18:05:41","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/modernize.flexplat.com\/","header_author_uri":"https:\/\/github.com\/rickey29","rating":0,"author_block_rating":0,"active_installs":0,"downloads":180,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.0.2":{"tag":"0.0.2","author":"rickey29","date":"2026-09-24 11:49:53","revision":3711211},"1.0.0":{"tag":"1.0.0","author":"rickey29","date":"2026-10-29 18:05:41","revision":3773722}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.0.2","1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[141196,247,17455,1141,289553],"plugin_category":[45],"plugin_contributors":[153307],"plugin_business_model":[],"class_list":["post-374819","plugin","type-plugin","status-publish","hentry","plugin_tags-headless","plugin_tags-performance","plugin_tags-rendering","plugin_tags-theme","plugin_tags-twenty-twenty-five","plugin_category-ecommerce","plugin_contributors-rickey29","plugin_committers-rickey29"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/flx-modernize.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Flx Modernize sends the content of a page to a Flx Render service, which returns the finished HTML page. Visitors see a modern, fast page that keeps your theme's design. WordPress stays the source of all content, and if the Render service is unavailable, WordPress renders the page itself, so the site never breaks.<\/p>\n\n<p>This release supports sites using the <strong>Twenty Twenty-Five<\/strong> theme. A Twenty Twenty-Five renderer package is available from <a href=\"https:\/\/modernize.flexplat.com\/download\/\">modernize.flexplat.com<\/a>; you can run it yourself or have it hosted for you.<\/p>\n\n<h4>What is rendered through Flx<\/h4>\n\n<ul>\n<li>The blog home page, category and tag archives<\/li>\n<li>Single posts and pages<\/li>\n<li>Search results<\/li>\n<li>The \"Page not found\" (404) page, still sent with a real 404 status<\/li>\n<\/ul>\n\n<p>The theme's header with its menu, and its footer, appear on every one of these pages.<\/p>\n\n<h4>What always stays normal WordPress<\/h4>\n\n<ul>\n<li>Anyone who is logged in (administrators and editors always see normal WordPress)<\/li>\n<li>Previews, drafts, private, scheduled and password-protected content<\/li>\n<li>Feeds, embeds, robots.txt, trackbacks and any request other than GET or HEAD<\/li>\n<\/ul>\n\n<h4>Safety<\/h4>\n\n<ul>\n<li>Only anonymous visitors get Flx pages, and the page data is built as an anonymous visitor.<\/li>\n<li>No visitor data is sent to the Render service: no cookies, no user account and no query-string values. The one exception is the words a visitor searches for, because the search results page shows them.<\/li>\n<li>Requests to the Render service can be signed with a key only your site holds; a Render service in enforce mode rejects anything else.<\/li>\n<li>Flx pages are sent with <code>Cache-Control: private, no-store<\/code>, and a page served by WordPress because the Render service failed is sent with <code>no-store<\/code>.<\/li>\n<li>Deactivating the plugin instantly returns the whole site to normal WordPress.<\/li>\n<\/ul>\n\n<h4>For developers<\/h4>\n\n<p>The <code>flx_modernize_should_render<\/code> filter lets you turn Flx off for a request (return <code>false<\/code>). It can never turn Flx on for a logged-in user.<\/p>\n\n<p>Documentation and a step-by-step tutorial for building a renderer for a theme are at <a href=\"https:\/\/modernize.flexplat.com\/\">modernize.flexplat.com<\/a>.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>Flx Modernize works by sending page data to an external <strong>Flx Render service<\/strong> over HTTPS and displaying the HTML it returns.<\/p>\n\n<ul>\n<li><strong>Which service:<\/strong> the one whose URL an administrator enters on the Flx Modernize settings screen. It can be your own self-hosted instance (the renderer package is GPL-licensed open source) or one hosted for you. There is no default: until a Render URL is saved, the plugin sends nothing anywhere and WordPress renders every page normally.<\/li>\n<li><strong>When data is sent:<\/strong> only when an anonymous visitor requests a page that Flx renders (see the lists above).<\/li>\n<li><strong>What is sent:<\/strong> the content needed to draw that page: title, content, excerpt, slug and permalink; publish and modified dates and author display name; featured image URL, size and alt text; site name and home URL; the header menu's labels and links; links to the site's own theme CSS (which the Render service then fetches from your site); for archives and search, the list of posts and paging; for search, the search words.<\/li>\n<li><strong>What is never sent:<\/strong> visitor cookies, IP addresses, user accounts, email addresses, passwords or other query-string values.<\/li>\n<\/ul>\n\n<p>The Render service is operated by whoever hosts it: you, or the provider you choose. When the hosting is provided by Flx (Rickey Gu), the terms are agreed with you directly; see <a href=\"https:\/\/modernize.flexplat.com\/\">modernize.flexplat.com<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Flx Modernize from the Plugins screen.<\/li>\n<li>Set up a Flx Render service for your theme (see <a href=\"https:\/\/modernize.flexplat.com\/download\/\">modernize.flexplat.com<\/a>), or have one hosted for you.<\/li>\n<li>Recommended: add a signing key to <code>wp-config.php<\/code>, with the same key configured on the Render service:\n   define( 'FLX_MODERNIZE_RENDER_KEY_ID', 'your-key-id' );\n   define( 'FLX_MODERNIZE_RENDER_SIGNING_SECRET', 'a-long-random-secret' );<\/li>\n<li>Go to <strong>Flx Modernize<\/strong> in wp-admin, enter the Render service URL and save.<\/li>\n<li>Visit your site while logged out: pages are now served through Flx. While logged in you keep seeing normal WordPress.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20themes%20are%20supported%3F\"><h3>Which themes are supported?<\/h3><\/dt>\n<dd><p>Twenty Twenty-Five in this release. Each theme needs a renderer that knows its design; the tutorial at modernize.flexplat.com shows how one is built.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20render%20service%20is%20down%3F\"><h3>What happens if the Render service is down?<\/h3><\/dt>\n<dd><p>WordPress renders the page itself, automatically, and sends it with <code>Cache-Control: no-store<\/code> so the fallback page is not cached.<\/p><\/dd>\n<dt id=\"why%20do%20i%20still%20see%20normal%20wordpress%3F\"><h3>Why do I still see normal WordPress?<\/h3><\/dt>\n<dd><p>Because you are logged in. Flx serves anonymous visitors only. Open the site in a private window to see the Flx pages.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page-cache%20plugins%3F\"><h3>Does it work with page-cache plugins?<\/h3><\/dt>\n<dd><p>Flx pages tell page-cache plugins not to store them (<code>DONOTCACHEPAGE<\/code>) and send <code>Cache-Control: private, no-store<\/code>. Public HTML caching is planned for a later release.<\/p><\/dd>\n<dt id=\"which%20menus%20are%20supported%3F\"><h3>Which menus are supported?<\/h3><\/dt>\n<dd><p>The header menu, with custom, page, post and category links, one level deep. Sub-menus are not supported yet.<\/p><\/dd>\n<dt id=\"does%20it%20need%20woocommerce%3F\"><h3>Does it need WooCommerce?<\/h3><\/dt>\n<dd><p>No.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>New Flx Modernize: renders the blog home page, archives, posts, pages, search results and the 404 page through your Flx Render service, in the Twenty Twenty-Five theme's look.<\/li>\n<li>Serves anonymous visitors only; logged-in users, previews and password-protected or non-public content always get normal WordPress.<\/li>\n<li>Page data is built as an anonymous visitor; no visitor data is sent except search words.<\/li>\n<li>Optional signed requests to the Render service.<\/li>\n<li><code>Cache-Control: private, no-store<\/code> on Flx pages and <code>no-store<\/code> on fallback pages; <code>DONOTCACHEPAGE<\/code> for page-cache plugins.<\/li>\n<li>Header menus with custom, page, post and category links.<\/li>\n<li><code>flx_modernize_should_render<\/code> filter to turn Flx off for a request.<\/li>\n<li>No default Render URL: nothing is sent until an administrator saves one.<\/li>\n<\/ul>\n\n<h4>0.0.2<\/h4>\n\n<ul>\n<li>Early preview.<\/li>\n<\/ul>","raw_excerpt":"Serve your WordPress pages to visitors through your own Flx Render service, in your theme's look, with automatic fallback to WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/374819","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=374819"}],"author":[{"embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rickey29"}],"wp:attachment":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=374819"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=374819"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=374819"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=374819"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=374819"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=374819"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}