{"id":363731,"date":"2026-09-11T17:09:49","date_gmt":"2026-09-11T17:09:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/basil\/"},"modified":"2026-09-11T17:09:19","modified_gmt":"2026-09-11T17:09:19","slug":"basil","status":"publish","type":"plugin","link":"https:\/\/roh.wordpress.org\/plugins\/basil\/","author":23560140,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.5","stable_tag":"0.1.5","tested":"7.1","requires":"6.9","requires_php":"8.1","requires_plugins":null,"header_name":"Basil","header_author":"Basil Cache","header_description":"Rule-driven static page caching for WordPress power users.","assets_banners_color":"68987e","last_updated":"2026-09-11 17:09:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/basilcache.com\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":50,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.5":{"tag":"0.1.5","author":"basilcache","date":"2026-09-11 17:09:19","revision":3691802}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3691802,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3691802,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3691802,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3691802,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3691802,"resolution":"1","location":"assets","locale":"","width":1760,"height":599},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3691802,"resolution":"2","location":"assets","locale":"","width":1760,"height":376},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3691802,"resolution":"3","location":"assets","locale":"","width":1505,"height":633},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3691802,"resolution":"4","location":"assets","locale":"","width":1743,"height":658}},"screenshots":{"1":"Dashboard showing cache status, storage usage, scheduled cleanup, and controls to purge all pages or one URL.","2":"Rules list showing enabled state, priority, cache action, match conditions, and rule-management controls.","3":"Rule settings for the name, priority, enabled state, action, and cache profile.","4":"Match-condition editor with condition groups, JSON representation, and optional exceptions."}},"plugin_section":[],"plugin_tags":[146,280278,68923,247,125792],"plugin_category":[52,54],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-363731","plugin","type-plugin","status-publish","hentry","plugin_tags-cache","plugin_tags-cache-rules","plugin_tags-full-page-cache","plugin_tags-performance","plugin_tags-static-cache","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_committers-basilcache"],"banners":{"banner":"https:\/\/ps.w.org\/basil\/assets\/banner-772x250.png?rev=3691802","banner_2x":"https:\/\/ps.w.org\/basil\/assets\/banner-1544x500.png?rev=3691802","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/basil\/assets\/icon-128x128.png?rev=3691802","icon_2x":"https:\/\/ps.w.org\/basil\/assets\/icon-256x256.png?rev=3691802","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/basil\/assets\/screenshot-1.png?rev=3691802","caption":"Dashboard showing cache status, storage usage, scheduled cleanup, and controls to purge all pages or one URL."},{"src":"https:\/\/ps.w.org\/basil\/assets\/screenshot-2.png?rev=3691802","caption":"Rules list showing enabled state, priority, cache action, match conditions, and rule-management controls."},{"src":"https:\/\/ps.w.org\/basil\/assets\/screenshot-3.png?rev=3691802","caption":"Rule settings for the name, priority, enabled state, action, and cache profile."},{"src":"https:\/\/ps.w.org\/basil\/assets\/screenshot-4.png?rev=3691802","caption":"Match-condition editor with condition groups, JSON representation, and optional exceptions."}],"raw_content":"<!--section=description-->\n<p>Basil is a full-page cache plugin for site owners who want caching decisions to\nbe explicit and explainable. Its first release is focused on layered cache and\nbypass rules, local static HTML files, and a minimal early cache-hit path.<\/p>\n\n<p>Basil is fail-open: a request that is unmatched, unsafe, expired, corrupt, or\notherwise unsuitable for caching continues through WordPress normally.<\/p>\n\n<p>Rules may match the entire eligible site, exact public content, public post\ntypes, built-in categories and their descendants, or case-sensitive URL path\nglobs. Match and exception conditions can be nested with AND and OR groups.\nWhen several rules apply, Basil resolves them deterministically by higher\npriority, greater specificity, and then later creation.<\/p>\n\n<p>Cached anonymous HTML is stored as guarded local files. On a valid warm hit,\nthe standalone <code>advanced-cache.php<\/code> drop-in serves the final response before\nWordPress or Composer boots. Logged-in, personalized, query-string, private,\nnon-HTML, and otherwise unsafe responses bypass the cache.<\/p>\n\n<p>The plugin makes no external requests and collects no telemetry.<\/p>\n\n<p>Version 1 supports single-site WordPress installations only. It does not edit\ncached HTML, optimize HTML\/CSS\/JavaScript, cache media, warm pages, or use a\nremote cache service.<\/p>\n\n<h3>Usage<\/h3>\n\n<ol>\n<li>Open Basil &gt; Rules and create an explicit cache or bypass rule.<\/li>\n<li>Choose a numeric priority. A larger number wins before specificity is\nconsidered.<\/li>\n<li>Build the required Match tree and, when needed, an Unless tree.<\/li>\n<li>Choose Lite, Aggressive, or bounded Custom cache lifetimes for cache rules.<\/li>\n<li>Save the rule, then request an eligible matching page once to generate it.<\/li>\n<li>Use Basil &gt; Dashboard to inspect cache health or purge one URL or all pages.<\/li>\n<\/ol>\n\n<p>Basil notices use WordPress's standard close control. Dismissing the recurring\nconfigured-cache confirmation is remembered for the current administrator;\nnew safety warnings remain independent and visible.<\/p>\n\n<p>HEAD and conditional ETag requests may consume an existing entry. Only an\neligible anonymous GET response can generate one.<\/p>\n\n<h3>Support<\/h3>\n\n<p>Website: <a href=\"https:\/\/basilcache.com\/\">basilcache.com<\/a><\/p>\n\n<p>The Basil dashboard reports setup, ownership, conflict, and cache-directory\nstate. If caching is unavailable, first review its contextual guidance and\nconfirm that WordPress can write <code>wp-config.php<\/code>, <code>wp-content\/<\/code>, and the cache\ndirectory through the configured filesystem method.<\/p>\n\n<p>When requesting support, include the Basil and WordPress versions, PHP version,\nthe dashboard status text, and reproducible rule inputs. Do not publish cached\nHTML, cookies, authorization headers, filesystem credentials, or private site\ndata.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>Basil does not send data to third parties or collect telemetry. Cached files\ncontain final anonymous HTML responses and private cache metadata on the local\nserver. Depending on the rendered page, that anonymous HTML may contain public\nsite content or visitor-independent output produced by other plugins. Site\nadministrators are responsible for configuring rules that exclude dynamic or\npersonalized pages. Administrators can purge these files from the Basil\ndashboard.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>basil<\/code> directory to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP\nfrom the Plugins screen.<\/li>\n<li>Activate Basil from the Plugins screen.<\/li>\n<li>Open the Basil dashboard and follow the guided page-cache setup.<\/li>\n<li>Add explicit cache rules. Requests that match no rule bypass the cache.<\/li>\n<\/ol>\n\n<p>Activation alone does not edit <code>wp-config.php<\/code> or install a drop-in.<\/p>\n\n<p>The guided setup asks WordPress for filesystem access. When safe, it creates\n    cache\/basil\/ under the configured uploads directory, installs Basil's owned\n    advanced-cache.php in the configured content directory, and adds a marked\n    WP_CACHE block near the end of <code>wp-config.php<\/code>. It leaves an existing\n    WP_CACHE definition and every foreign drop-in unchanged, and explains when\nmanual action is necessary.\nIf another cache plugin leaves Basil's markers stale or incomplete, the\ndashboard offers a protected repair action. It removes only exact Basil blocks\nand marker comments while preserving other declarations and plugin settings.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20does%20basil%20require%20wordpress%206.9%3F\"><h3>Why does Basil require WordPress 6.9?<\/h3><\/dt>\n<dd><p>Basil captures completed templates through WordPress's native template\nenhancement buffer instead of opening its own long-lived output buffer. Sites\nthat opt out of this buffer for streaming, or serve pages outside the normal\ntemplate lifecycle, continue to work but do not generate cache entries.<\/p><\/dd>\n<dt id=\"does%20basil%20cache%20pages%20immediately%20after%20activation%3F\"><h3>Does Basil cache pages immediately after activation?<\/h3><\/dt>\n<dd><p>No. Basil defaults to bypassing every request. Page caching requires guided\nsetup and at least one enabled cache rule.<\/p><\/dd>\n<dt id=\"does%20basil%20cache%20pages%20for%20logged-in%20visitors%3F\"><h3>Does Basil cache pages for logged-in visitors?<\/h3><\/dt>\n<dd><p>No. Basil bypasses requests that contain authentication, session, cart, or\nother known personalization signals.<\/p><\/dd>\n<dt id=\"does%20basil%20use%20a%20remote%20service%20or%20send%20telemetry%3F\"><h3>Does Basil use a remote service or send telemetry?<\/h3><\/dt>\n<dd><p>No. Version 1 uses the local filesystem and makes no runtime external requests.<\/p><\/dd>\n<dt id=\"what%20files%20and%20configuration%20can%20basil%20change%3F\"><h3>What files and configuration can Basil change?<\/h3><\/dt>\n<dd><p>Only the guided setup can add Basil's marked <code>WP_CACHE<\/code> block and owned\n    advanced-cache.php drop-in. Runtime cache entries stay below\n    cache\/basil\/ under the configured uploads base. Basil verifies exact ownership\nmarkers before removing any of these artifacts.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20another%20page-cache%20plugin%20is%20active%3F\"><h3>What happens when another page-cache plugin is active?<\/h3><\/dt>\n<dd><p>Basil reports the likely conflict and does not deactivate the other plugin or\noverwrite its drop-in. An <code>object-cache.php<\/code> drop-in is not treated as a\npage-cache conflict.<\/p><\/dd>\n<dt id=\"what%20if%20another%20cache%20plugin%20changes%20basil%27s%20wp-config.php%20markers%3F\"><h3>What if another cache plugin changes Basil's wp-config.php markers?<\/h3><\/dt>\n<dd><p>Basil reports that <code>WP_CACHE<\/code> needs repair and offers a protected dashboard\nbutton. The repair removes only canonical Basil blocks and exact Basil marker\ncomments. Other <code>WP_CACHE<\/code> declarations, plugin settings, and unfamiliar\nconfiguration remain unchanged.<\/p><\/dd>\n<dt id=\"what%20happens%20on%20deactivation%20or%20uninstall%3F\"><h3>What happens on deactivation or uninstall?<\/h3><\/dt>\n<dd><p>Deactivation preserves rules but clears cached pages, scheduled cleanup, and\nonly Basil-owned runtime\/configuration artifacts. Uninstall also removes\nBasil's stored rules and private options. Foreign files and configuration are\nleft untouched.<\/p><\/dd>\n<dt id=\"is%20multisite%20supported%3F\"><h3>Is multisite supported?<\/h3><\/dt>\n<dd><p>No. Version 1 detects multisite and keeps page caching disabled.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20generated%20cache%20files%3F\"><h3>Can I edit generated cache files?<\/h3><\/dt>\n<dd><p>No. Editable final HTML is intentionally deferred. Manual changes to cache\nentries are unsupported and may make an entry fail validation and bypass.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Require WordPress 6.9 and use its native finalized-template buffer for response capture; respect streaming opt-outs.<\/li>\n<li>Store cache data under the configured uploads directory and honor relocated filesystem paths.<\/li>\n<li>Move the Basil admin menu below Settings.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Make Basil dashboard and rule-operation notices dismissible.<\/li>\n<li>Remember configured-cache notice dismissal per administrator across reloads.<\/li>\n<li>Preserve visibility of separate safety warnings and remove dismissal data on uninstall.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Add one-click recovery for stale or incomplete Basil wp-config.php markers.<\/li>\n<li>Preserve other cache plugins' declarations and configuration during repair.<\/li>\n<li>Report damaged Basil marker state as \"Needs repair\" instead of unavailable.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Add a one-click all-pages Lite quick start.<\/li>\n<li>Add dashboard, website, contact, and toolbar shortcuts.<\/li>\n<li>Move Basil higher in the administration menu and name its Dashboard submenu.<\/li>\n<li>Make the configured-cache notice dismissible and add guarded directory indexes.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fix cache generation on FastCGI configurations where PHP does not expose request server fields through <code>filter_input()<\/code>.<\/li>\n<li>Show the configured WordPress timezone next to the scheduled cleanup time.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release of layered cache rules and local static HTML page caching.<\/li>\n<\/ul>","raw_excerpt":"Rule-driven static page caching with explicit, deterministic control over which pages may be cached.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/363731","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=363731"}],"author":[{"embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/basilcache"}],"wp:attachment":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=363731"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=363731"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=363731"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=363731"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=363731"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=363731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}