[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fXZgoC32-dtBITKkh4S66LyzQD2AMaYcNp7G8CAu7m6I":3},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":11,"num_ratings":11,"last_updated":13,"tested_up_to":14,"requires_at_least":15,"requires_php":16,"tags":17,"homepage":20,"download_link":21,"security_score":22,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24,"vulnerabilities":25,"developer":26,"crawl_stats":23,"alternatives":34,"analysis":119,"fingerprints":144},"environment-displayer-for-pantheon","Environment Displayer for Pantheon","1.0.1","Rajin Sharwar","https:\u002F\u002Fprofiles.wordpress.org\u002Frajinsharwar\u002F","\u003Cp>A super light-weight WordPress plugin to display the current Pantheon’s environment in the ADMIN Toolbar of WordPress. Avoid conflicts while working on various envionment, and always besure that you are working on the correct branch. No configurations needed. Just activate it, and your admin panel will display the current environment.\u003C\u002Fp>\n","A super light-weight WordPress plugin to display the current Pantheon's environment in the ADMIN Toolbar of WordPress.",0,779,"2022-11-18T06:38:00.000Z","6.1.10","3.9","5.6",[18,19],"pantheon","pantheon-hosting","","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fenvironment-displayer-for-pantheon.1.0.1.zip",85,null,"2026-03-15T15:16:48.613Z",[],{"slug":27,"display_name":7,"profile_url":8,"plugin_count":28,"total_installs":29,"avg_security_score":30,"avg_patch_time_days":31,"trust_score":32,"computed_at":33},"rajinsharwar",7,340,89,30,86,"2026-04-04T05:40:21.900Z",[35,56,71,85,104],{"slug":36,"name":37,"version":38,"author":39,"author_profile":40,"description":41,"short_description":42,"active_installs":43,"downloaded":44,"rating":45,"num_ratings":46,"last_updated":47,"tested_up_to":48,"requires_at_least":49,"requires_php":50,"tags":51,"homepage":54,"download_link":55,"security_score":45,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24},"pantheon-advanced-page-cache","Pantheon Advanced Page Cache","2.1.2","Pantheon Systems","https:\u002F\u002Fprofiles.wordpress.org\u002Fgetpantheon\u002F","\u003Cp>\u003Ca href=\"https:\u002F\u002Fcircleci.com\u002Fgh\u002Fpantheon-systems\u002Fpantheon-advanced-page-cache\" rel=\"nofollow ugc\">\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>For sites wanting fine-grained control over how their responses are represented in their edge cache, Pantheon Advanced Page Cache is the golden ticket. Here’s a high-level overview of how the plugin works:\u003C\u002Fp>\n\u003Col>\n\u003Cli>When a response is generated, the plugin uses surrogate keys based on WordPress’ main \u003Ccode>WP_Query\u003C\u002Fcode> object to “tag” the response with identifers for the data used in the response. See the “Adding Custom Keys” section for including your own surrogate keys.\u003C\u002Fli>\n\u003Cli>When WordPress data is modified, the plugin triggers a purge request for the data’s corresponding surrogate keys.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Because of its surrogate key technology, Pantheon Advanced Page Cache empowers WordPress sites with a significantly more accurate cache purge mechanism, and generally higher cache hit rate. It even works with the WordPress REST API.\u003C\u002Fp>\n\u003Cp>Go forth and make awesome! And, once you’ve built something great, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpantheon-systems\u002Fpantheon-advanced-page-cache\u002Fissues\" rel=\"nofollow ugc\">send us feature requests (or bug reports)\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3>How It Works\u003C\u002Fh3>\n\u003Cp>Pantheon Advanced Page Cache makes heavy use of surrogate keys, which enable responses to be “tagged” with identifiers that can then later be used in purge requests. For instance, a home page response might include the \u003Ccode>Surrogate-Key\u003C\u002Fcode> header with these keys:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Surrogate-Key: front home post-43 user-4 post-41 post-9 post-7 post-1 user-1\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Similarly, a \u003Ccode>GET\u003C\u002Fcode> requests to \u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u003C\u002Fcode> might include the \u003Ccode>Surrogate-Key\u003C\u002Fcode> header with these keys:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Surrogate-Key: rest-post-collection rest-post-43 rest-post-43 rest-post-9 rest-post-7 rest-post-1\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Because cached responses include metadata describing the data therein, surrogate keys enable more flexible purging behavior like:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>When a post is updated, clear the cache for the post’s URL, the homepage, any index view the post appears on, and any REST API endpoints the post is present in.\u003C\u002Fli>\n\u003Cli>When an author changes their name, clear the cache for the author’s archive and any post they’ve authored.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>There is a limit to the number of surrogate keys in a response, so we’ve optimized them based on a user’s expectation of a normal WordPress site. See the “Emitted Keys” section for full details on which keys are included, and the “Adding Custom Keys” section following for information on how to add your own.\u003C\u002Fp>\n\u003Ch4>Adding Custom Keys\u003C\u002Fh4>\n\u003Cp>By default, Pantheon Advanced Page Cache generates surrogate keys based on an interpretation of the main \u003Ccode>WP_Query\u003C\u002Fcode> query object. Because WordPress sends headers before the page is rendered, you need to use the \u003Ccode>pantheon_wp_main_query_surrogate_keys\u003C\u002Fcode> filter to include additional surrogate keys for any data present on the page.\u003C\u002Fp>\n\u003Cp>For example, to include surrogate keys for a sidebar rendered on the homepage, you can filter the keys using the \u003Ccode>is_home()\u003C\u002Fcode> template tag:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F**\n * Add surrogate key for the featured content sidebar rendered on the homepage.\n *\u002F\nadd_filter( 'pantheon_wp_main_query_surrogate_keys', function( $keys ){\n    if ( is_home() ) {\n        $keys[] = 'sidebar-home-featured';\n    }\n    return $keys;\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Then, when sidebars are updated, you can use the \u003Ccode>pantheon_wp_clear_edge_keys()\u003C\u002Fcode> helper function to emit a purge event specific to the surrogate key:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F**\n * Trigger a purge event for the featured content sidebar when widgets are updated.\n *\u002F\nadd_action( 'update_option_sidebars_widgets', function() {\n    pantheon_wp_clear_edge_keys( array( 'sidebar-home-featured' ) );\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Similarly, to include surrogate keys for posts queried on the homepage, you can pre-fetch the posts before the page is rendered:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F**\n * An example of pre-fetching a WP_Query to tag the\n * response with queried data. You'd use `papcx_wp_query()`\n * a second time within your template to use the data.\n *\u002F\nadd_filter( 'pantheon_wp_main_query_surrogate_keys', function( $keys ) {\n    if ( is_home() ) {\n        $query = papcx_wp_query( array(\n            'post_type' => 'page',\n        ) );\n        foreach( $query->posts as $post ) {\n            $keys[] = 'post-' . $post->ID;\n        }\n    }\n    return $keys;\n});\n\n\u002F**\n * Register a 'papc-non-persistent' cache group to cache data\n * in a non-persistent manner. We only want data in this group\n * to be cached within the page request.\n *\u002F\nadd_action( 'init', function(){\n    wp_cache_add_non_persistent_groups( array( 'papc-non-persistent' ) );\n});\n\n\u002F**\n * Helper function to instantiate a WP_Query object only\n * once per page request.\n *\n * @param array $args Arguments to pass to WP_Query.\n * @return WP_Query\n *\u002F\nfunction papcx_wp_query( $args = array() ) {\n    $cache_key = md5( serialize( $args ) );\n    \u002F\u002F WP_Query object will be in cache the second time we use the function.\n    $cache_value = wp_cache_get( $cache_key, 'papc-non-persistent' );\n    if ( false !== $cache_value ) {\n        return $cache_value;\n    }\n    $query = new WP_Query( $args );\n    wp_cache_set( $cache_key, $query, 'papc-non-persistent' );\n    return $query;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Because Pantheon Advanced Page Cache already handles WordPress post purge events, there’s no additional call to \u003Ccode>pantheon_wp_clear_edge_keys()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Lastly, the \u003Ccode>pantheon_wp_rest_api_surrogate_keys\u003C\u002Fcode> filter lets you filter surrogate keys present in a REST API response.\u003C\u002Fp>\n\u003Ch4>Additional purging by path\u003C\u002Fh4>\n\u003Cp>When a post is published for the first time, the permalink’s path is also purged even if it has no matching keys. This can be further filtered with the \u003Ccode>pantheon_clear_post_path\u003C\u002Fcode> filter.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>    add_action('pantheon_clear_post_path', function($paths) {\n        \u002F\u002F Add or remove paths from $paths\n        return $paths\n    }, 10, 3);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Need a bit more power? In addition to \u003Ccode>pantheon_wp_clear_edge_keys()\u003C\u002Fcode>, there are two additional helper functions you can use:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>pantheon_wp_clear_edge_paths( $paths = array() )\u003C\u002Fcode> – Purge cache for one or more paths.\u003C\u002Fli>\n\u003Cli>\u003Ccode>pantheon_wp_clear_edge_all()\u003C\u002Fcode> – Warning! With great power comes great responsibility. Purge the entire cache, but do so wisely.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Ignoring Specific Post Types\u003C\u002Fh4>\n\u003Cp>By default, Pantheon Advanced Page Cache is pretty aggressive in how it clears its surrogate keys. Specifically, any time \u003Ccode>wp_insert_post\u003C\u002Fcode> is called (which can include any time a post of any type is added or updated, even private post types), it will purge a variety of keys including \u003Ccode>home\u003C\u002Fcode>, \u003Ccode>front\u003C\u002Fcode>, \u003Ccode>404\u003C\u002Fcode> and \u003Ccode>feed\u003C\u002Fcode>. To bypass or override this behavior, since 1.5.0 we have a filter allowing an array of post types to ignore to be passed before those caches are purged. By default, the \u003Ccode>revision\u003C\u002Fcode> post type is ignored, but others can be added:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F**\n* Add a custom post type to the ignored post types.\n*\n* @param array $ignored_post_types The array of ignored post types.\n* @return array\n*\u002F\nfunction filter_ignored_posts( $ignored_post_types ) {\n    $ignored_post_types[] = 'my-post-type'; \u002F\u002F Ignore my-post-type from cache purges.\n    return $ignored_post_types;\n}\n\nadd_filter( 'pantheon_purge_post_type_ignored', 'filter_ignored_posts' );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>This will prevent the cache from being purged if the given post type is updated.\u003C\u002Fp>\n\u003Ch4>Setting the Cache Max Age with a filter\u003C\u002Fh4>\n\u003Cp>The cache max age setting is controlled by the \u003Ca href=\"https:\u002F\u002Fdocs.pantheon.io\u002Fguides\u002Fwordpress-configurations\u002Fwordpress-cache-plugin\" rel=\"nofollow ugc\">Pantheon Page Cache\u003C\u002Fa> admin page. As of 2.0.0, there are three cache age options by default — 1 week, 1 month, 1 year. Pantheon Advanced Page Cache automatically purges the cache of updated and related posts and pages, but you might want to override the cache max age value and set it programmatically. In this case, you can use the \u003Ccode>pantheon_cache_default_max_age\u003C\u002Fcode> filter added in \u003Ca href=\"https:\u002F\u002Fdocs.pantheon.io\u002Fguides\u002Fwordpress-configurations\u002Fwordpress-cache-plugin#override-the-default-max-age\" rel=\"nofollow ugc\">Pantheon MU plugin 1.4.0+\u003C\u002Fa>. For example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add_filter( 'pantheon_cache_default_max_age', function() {\n    return 10 * DAY_IN_SECONDS;\n} );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>When the cache max age is filtered in this way, the admin option is disabled and a notice is displayed.\u003C\u002Fp>\n\u003Ch4>Updating the cache max age based on nonces\u003C\u002Fh4>\n\u003Cp>Nonces created on the front-end, often used to secure forms and other data, have a lifetime, and if the cache max age is longer than the nonce lifetime, the nonce may expire before the cache does. To avoid this, you can use the \u003Ccode>pantheon_cache_nonce_lifetime\u003C\u002Fcode> action to set the \u003Ccode>pantheon_cache_default_max_age\u003C\u002Fcode> to less than the nonce lifetime. For example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>do_action( 'pantheon_cache_nonce_lifetime' );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>It’s important to wrap your \u003Ccode>do_action\u003C\u002Fcode> in the appropriate conditionals to ensure that the action is only called when necessary and not filtering the cache max age in cases when it’s not necessary. This might mean only running on certain pages or in certain contexts in your code.\u003C\u002Fp>\n\u003Ch3>WP-CLI Commands\u003C\u002Fh3>\n\u003Cp>This plugin implements a variety of \u003Ca href=\"https:\u002F\u002Fwp-cli.org\" rel=\"nofollow ugc\">WP-CLI\u003C\u002Fa> commands. All commands are grouped into the \u003Ccode>wp pantheon cache\u003C\u002Fcode> namespace.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$ wp help pantheon cache\n\nNAME\n\n  wp pantheon cache\n\nDESCRIPTION\n\n  Manage the Pantheon Advanced Page Cache.\n\nSYNOPSIS\n\n  wp pantheon cache \u003Ccommand>\n\nSUBCOMMANDS\n\n  purge-all       Purge the entire page cache.\n  purge-key       Purge one or more surrogate keys from cache.\n  purge-path      Purge one or more paths from cache.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Use \u003Ccode>wp help pantheon cache \u003Ccommand>\u003C\u002Fcode> to learn more about each command.\u003C\u002Fp>\n\u003Ch3>Debugging\u003C\u002Fh3>\n\u003Cp>By default, Pantheon’s infrastructure strips out the \u003Ccode>Surrogate-Key\u003C\u002Fcode> response header before responses are served to clients. The contents of this header can be viewed as \u003Ccode>Surrogate-Key-Raw\u003C\u002Fcode> by adding on a debugging header to the request.\u003C\u002Fp>\n\u003Cp>A direct way of inspecting headers is with \u003Ccode>curl -I\u003C\u002Fcode>. This command will make a request and show just the response headers. Adding \u003Ccode>-H \"Pantheon-Debug:1\"\u003C\u002Fcode> will result in \u003Ccode>Surrogate-Key-Raw\u003C\u002Fcode> being included in the response headers. The complete command looks like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>curl -IH \"Pantheon-Debug:1\" https:\u002F\u002Fscalewp.io\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Piping to \u003Ccode>grep\u003C\u002Fcode> will filter the output down to just the \u003Ccode>Surrogate-Key-Raw\u003C\u002Fcode> header:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>curl -IH \"Pantheon-Debug:1\" https:\u002F\u002Fscalewp.io\u002F | grep -i Surrogate-Key-Raw\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Tada!\u003C\u002Fp>\n\u003Ch3>Emitted Keys and Purge Events\u003C\u002Fh3>\n\u003Ch4>Emitted Keys on Traditional Views\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Home \u003Ccode>\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>home\u003C\u002Fcode>, \u003Ccode>front\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Single post \u003Ccode>\u002F2016\u002F10\u002F14\u002Fsurrogate-keys\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>single\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode>, \u003Ccode>post-user-\u003Cid>\u003C\u002Fcode>, \u003Ccode>post-term-\u003Cid>\u003C\u002Fcode> (all terms assigned to post)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Author archive \u003Ccode>\u002Fauthor\u002Fpantheon\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>archive\u003C\u002Fcode>, \u003Ccode>user-\u003Cid>\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Term archive \u003Ccode>\u002Ftag\u002Fcdn\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>archive\u003C\u002Fcode>, \u003Ccode>term-\u003Cid>\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Day archive \u003Ccode>\u002F2016\u002F10\u002F14\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>archive\u003C\u002Fcode>, \u003Ccode>date\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Month archive \u003Ccode>\u002F2016\u002F10\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>archive\u003C\u002Fcode>, \u003Ccode>date\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Year archive \u003Ccode>\u002F2016\u002F\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>archive\u003C\u002Fcode>, \u003Ccode>date\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Search \u003Ccode>\u002F?s=\u003Csearch>\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>search\u003C\u002Fcode>, either \u003Ccode>search-results\u003C\u002Fcode> or \u003Ccode>search-no-results\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode> (all posts in main query)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Not found (404)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emits surrogate keys: \u003Ccode>404\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Emitted Keys on REST API Endpoints\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Posts\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-post-collection\u003C\u002Fcode>, \u003Ccode>rest-post-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F\u003Cid>\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-post-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Pages\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fpages\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-page-collection\u003C\u002Fcode>, \u003Ccode>rest-post-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fpages\u002F\u003Cid>\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-post-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Categories\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-category-collection\u003C\u002Fcode>, \u003Ccode>rest-term-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories\u002F\u003Cid>\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-term-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Tags\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Ftags\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-post_tag-collection\u003C\u002Fcode>, \u003Ccode>rest-term-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Ftags\u002F\u003Cid>\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-term-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Comments\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fcomments\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-comment-collection\u003C\u002Fcode>, \u003Ccode>rest-comment-post-\u003Cpost-id>\u003C\u002Fcode>, \u003Ccode>rest-comment-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fcomments\u002F\u003Cid>\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-comment-post-\u003Cpost-id>\u003C\u002Fcode>, \u003Ccode>rest-comment-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Users\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fusers\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-user-collection\u003C\u002Fcode>, \u003Ccode>rest-user-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fusers\u002F\u003Cid>\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-user-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Settings\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Fwp\u002Fv2\u002Fsettings\u003C\u002Fcode> emits surrogate keys: \u003Ccode>rest-setting-\u003Cname>\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Purge Events\u003C\u002Fh4>\n\u003Cp>Different WordPress actions cause different surrogate keys to be purged, documented here.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>wp_insert_post \u002F transition_post_status \u002F before_delete_post \u002F delete_attachment\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>home\u003C\u002Fcode>, \u003Ccode>front\u003C\u002Fcode>, \u003Ccode>404\u003C\u002Fcode>, \u003Ccode>post-\u003Cid>\u003C\u002Fcode>, \u003Ccode>user-\u003Cid>\u003C\u002Fcode>, \u003Ccode>term-\u003Cid>\u003C\u002Fcode>, \u003Ccode>rest-\u003Ctype>-collection\u003C\u002Fcode>, \u003Ccode>rest-comment-post-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: homepage, single post, any page with 404 header, any archive where post displays, author archive, term archive, REST API collection and resource endpoints\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>clean_post_cache\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>post-\u003Cid>\u003C\u002Fcode>, \u003Ccode>rest-post-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: single post, REST API resource endpoint\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>created_term \u002F edited_term \u002F delete_term\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>term-\u003Cid>\u003C\u002Fcode>, \u003Ccode>post-term-\u003Cid>\u003C\u002Fcode>, \u003Ccode>rest-\u003Ctaxonomy>-collection\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: term archive, any post where the term is assigned, REST API collection and resource endpoints\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>clean_term_cache\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>term-\u003Cid>\u003C\u002Fcode>, \u003Ccode>rest-term-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: term archive, REST API resource endpoint\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>wp_insert_comment \u002F transition_comment_status\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>rest-comment-collection\u003C\u002Fcode>, \u003Ccode>rest-comment-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: REST API collection and resource endpoints\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>clean_comment_cache\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>rest-comment-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: REST API resource endpoint\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>clean_user_cache\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>user-\u003Cid>\u003C\u002Fcode>, \u003Ccode>rest-user-\u003Cid>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: author archive, any post where the user is the author\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>updated_option\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purges surrogate keys: \u003Ccode>rest-setting-\u003Cname>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Affected views: REST API resource endpoint\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Surrogate Keys for taxonomy terms\u003C\u002Fh3>\n\u003Cp>Setting surrogate keys for posts with large numbers of taxonomies (such as WooCommerce products with a large number of global attributes) can suffer from slower queries. Surrogate keys can be skipped for ‘product’ post types’ taxonomy terms (or any other criteria you see fit) with the following filter:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>function custom_should_add_terms($should_add_terms, $wp_query) {\n    if ( $wp_query->is_singular( 'product' ) ) {\n        return false;\n    }\n    return $should_add_terms;\n}\nadd_filter('pantheon_should_add_terms', 'custom_should_add_terms', 10, 2);\u003Ch3>Other Filters\u003C\u002Fh3>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>pantheon_apc_disable_admin_notices\u003C\u002Fh4>\n\u003Cp>Since 2.0.0, Pantheon Advanced Page Cache displays a number of admin notices about your current cache max age value. You can disable these notices with the \u003Ccode>pantheon_apc_disable_admin_notices\u003C\u002Fcode> filter.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add_filter( 'pantheon_apc_disable_admin_notices', '__return_true' );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Alternately, the function callback is passed into the \u003Ccode>pantheon_apc_disable_admin_notices\u003C\u002Fcode> filter, allowing you to specify precisely \u003Cem>which\u003C\u002Fem> notice to disable, for example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add_filter( 'pantheon_apc_disable_admin_notices', function( $disable_notices, $callback ) {\n    if ( $callback === '\\\\Pantheon_Advanced_Page_Cache\\\\Admin_Interface\\\\admin_notice_maybe_recommend_higher_max_age' ) {\n        return true;\n    }\n    return $disable_notices;\n}, 10, 2 );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The above example would disable \u003Cem>only\u003C\u002Fem> the admin notice recommending a higher cache max age.\u003C\u002Fp>\n\u003Ch3>Plugin Integrations\u003C\u002Fh3>\n\u003Cp>Pantheon Advanced Page Cache integrates with WordPress plugins, including:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fwp-graphql\u002F\" rel=\"ugc\">WPGraphQL\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Contributing\u003C\u002Fh3>\n\u003Cp>See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpantheon-systems\u002Fwp-saml-auth\u002Fblob\u002Fmaster\u002FCONTRIBUTING.md\" rel=\"nofollow ugc\">CONTRIBUTING.md\u003C\u002Fa> for information on contributing.\u003C\u002Fp>\n","Automatically clear related pages from Pantheon's Edge when you update content. High TTL. Fresh content. Visitors never wait.",10000,1039772,100,1,"2025-12-16T18:21:00.000Z","6.9.4","6.4","7.4",[52,53,18],"cache","cdn","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fpantheon-advanced-page-cache\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpantheon-advanced-page-cache.2.1.2.zip",{"slug":57,"name":58,"version":59,"author":39,"author_profile":40,"description":60,"short_description":61,"active_installs":62,"downloaded":63,"rating":45,"num_ratings":28,"last_updated":64,"tested_up_to":48,"requires_at_least":65,"requires_php":66,"tags":67,"homepage":69,"download_link":70,"security_score":45,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24},"bv-pantheon-migration","Pantheon Migrations","5.88","\u003Cp>Pantheon is a website management platform that is the best place to run your WordPress site — hands down. And migrating your WordPress site doesn’t get any easier than with Pantheon Migrations.\u003C\u002Fp>\n\u003Cp>With this plugin forget the headaches of manually migrating your site. All you need to activate the plugin is administrative access to your WordPress site. Just copy and paste your SFTP credentials from your new Pantheon site to the Pantheon Migrations tab in your WordPress Dashboard and click “migrate”. You can get back to work on other projects, and our migrations team will email you when everything is complete.\u003C\u002Fp>\n\u003Cp>For full instructions please see our \u003Ca href=\"https:\u002F\u002Fpantheon.io\u002Fdocs\u002Fmigrate-wordpress\u002F\" rel=\"nofollow ugc\">docs page\u003C\u002Fa> on Pantheon Migrations.\u003C\u002Fp>\n\u003Cp>Shout out to \u003Ca href=\"https:\u002F\u002Fblogvault.net\u002F\" rel=\"nofollow ugc\">BlogVault.net\u003C\u002Fa> for the development and hand in creating this plugin. By using this plugin you are agreeing to their \u003Ca href=\"https:\u002F\u002Fblogvault.net\u002Ftos\" rel=\"nofollow ugc\">Terms of Service\u003C\u002Fa>\u003C\u002Fp>\n","The easiest way to migrate your site to Pantheon",1000,100092,"2025-12-03T16:43:00.000Z","4.0","5.6.0",[68,18],"migration","https:\u002F\u002Fpantheon.io","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fbv-pantheon-migration.5.88.zip",{"slug":72,"name":73,"version":74,"author":39,"author_profile":40,"description":75,"short_description":76,"active_installs":77,"downloaded":78,"rating":45,"num_ratings":46,"last_updated":79,"tested_up_to":48,"requires_at_least":80,"requires_php":50,"tags":81,"homepage":69,"download_link":84,"security_score":45,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24},"pantheon-hud","Pantheon HUD","0.4.5","\u003Cp>This plugin provides situational awareness of the Pantheon plaform from within your WordPress dashboard. It’s helpful to be reminded what environment you’re in, as well as providing quick links to get back to Pantheon’s dashboard, or to interface with your WordPress installation via the command line.\u003C\u002Fp>\n\u003Cp>Pantheon HUD is in early stages of development. We want your feedback! \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpantheon-systems\u002Fpantheon-hud\u002Fissues\" rel=\"nofollow ugc\">Create a Github issue\u003C\u002Fa> with questions, feature requests, or bug reports.\u003C\u002Fp>\n","A heads-up display into your Pantheon environment.",900,70929,"2025-12-02T18:56:00.000Z","4.9",[82,83,18],"environment-indicator","hosting","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpantheon-hud.0.4.5.zip",{"slug":86,"name":87,"version":88,"author":89,"author_profile":90,"description":91,"short_description":92,"active_installs":93,"downloaded":94,"rating":45,"num_ratings":46,"last_updated":95,"tested_up_to":96,"requires_at_least":16,"requires_php":50,"tags":97,"homepage":102,"download_link":103,"security_score":45,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":24},"traffic-jammer","Traffic Jammer","1.4.91","Carey","https:\u002F\u002Fprofiles.wordpress.org\u002Fslick2\u002F","\u003Cp>Prevent unwanted traffic incidents that might result in site outages and billing overages.  WordPress plugin that blocks IP and bots categorized as harmful, resulting in heavy server loads from frequently crawled pages, or utilized in vulnerability\u002Fsecurity breach scans.\u003C\u002Fp>\n\u003Ch3>Usage instructions for Integrating AbuseIPDb\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Obtain your free API key from AbuseIPDB (\u003Ca href=\"https:\u002F\u002Fwww.abuseipdb.com\" rel=\"nofollow ugc\">\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>Install and activate the plugin via your WordPress dashboard.\u003C\u002Fli>\n\u003Cli>Configure the plugin settings by adding your API key and setting threat thresholds.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Firewall\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Manually add an IP to be blocked\u003C\u002Fli>\n\u003Cli>Manually add Bots\u002FUser-Agents\u002FScrappers to prevent site visit\u003C\u002Fli>\n\u003Cli>Manually add an IP to be whitelisted on the login page\u003C\u002Fli>\n\u003Cli>Automatically block malicious traffic thru analysis on an hourly basis\u003C\u002Fli>\n\u003Cli>Automatically block excessive login attempts with configurable threshold\u003C\u002Fli>\n\u003Cli>Automatically block excessive visits from an incremented query that would bust the CDN cache\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>WP-CLI commands\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>Example\nwp jam block 127.0.0.10\nwp jam unblock 127.0.0.10\nwp jam topip\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>\u003Ca href=\"https:\u002F\u002Fpantheon.io\" rel=\"nofollow ugc\">Pantheon.io\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Prevent traffic overages due to excessive visits from malicious traffic. The plugin can be used on sites hosted on \u003Ca href=\"https:\u002F\u002Fpantheon.io\" rel=\"nofollow ugc\">Pantheon.io\u003C\u002Fa> and no additional symlinks required.\u003C\u002Fp>\n\u003Ch4>Pantheon terminus command\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>terminus wp sitename.env -- jam block 127.0.0.1\nterminus wp sitename.env -- jam unblock 127.0.0.1\n\u003C\u002Fcode>\u003C\u002Fpre>\n","Safeguard your site from malicious activity and unwanted visitors by effortlessly managing IP blocks through the dashboard or command line ingerface.",40,3720,"2025-10-19T19:43:00.000Z","6.8.5",[98,99,100,18,101],"block-ip","bots","login","security","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Ftraffic-jammer\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Ftraffic-jammer.1.4.91.zip",{"slug":105,"name":106,"version":107,"author":39,"author_profile":40,"description":108,"short_description":109,"active_installs":11,"downloaded":110,"rating":11,"num_ratings":11,"last_updated":20,"tested_up_to":48,"requires_at_least":111,"requires_php":112,"tags":113,"homepage":116,"download_link":117,"security_score":45,"vuln_count":11,"unpatched_count":11,"last_vuln_date":23,"fetched_at":118},"pantheon-content-publisher","Pantheon Content Publisher","1.3.5","\u003Cp>\u003Cstrong>The Pantheon Content Publisher plugin for WordPress enables seamless content publishing from Google Drive and Google Docs directly to WordPress sites.\u003C\u002Fstrong> Perfect for editorial teams who collaborate on content within Google Docs, this plugin ensures a smooth transition from document creation to web publishing, facilitating real-time previews and direct publishing options.\u003C\u002Fp>\n\u003Ch3>Features\u003C\u002Fh3>\n\u003Ch4>Real-time Preview\u003C\u002Fh4>\n\u003Cp>Experience seamless document previews within your WordPress environment as they would appear live on the web.\u003C\u002Fp>\n\u003Ch4>One-click Publishing\u003C\u002Fh4>\n\u003Cp>Enable direct publishing from Google Docs to WordPress, simplifying content management and streamlining workflows.\u003C\u002Fp>\n\u003Ch4>Custom Post Type Support\u003C\u002Fh4>\n\u003Cp>Publish content to any public post type registered on your WordPress site, including custom post types. Authors can also specify the target post type per document via metadata.\u003C\u002Fp>\n\u003Ch4>ACF Integration\u003C\u002Fh4>\n\u003Cp>Sync Content Publisher metadata fields to Advanced Custom Fields (ACF). Navigate to Settings > Pantheon Content Publisher > Integration tab to define field mappings per post type. Each tab shows ACF fields from the field groups assigned to that post type — enter the exact Content Publisher metadata field name (case-sensitive) to create a mapping. Mapped values are automatically applied on every publish. Sync errors are displayed in the Integration tab and auto-clear after one hour. Requires the ACF plugin (free or Pro) to be installed and active. Works with custom post types.\u003C\u002Fp>\n\u003Cp>For more information, please check \u003Ca href=\"https:\u002F\u002Fdocs.content.pantheon.io\" rel=\"nofollow ugc\">Pantheon Content Publisher documentation\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3>Integration with Third-Party Services\u003C\u002Fh3>\n\u003Ch4>Important Disclosure\u003C\u002Fh4>\n\u003Cp>This plugin integrates with Google Drive and Google Docs to facilitate document publishing to WordPress.\u003Cbr \u002F>\nWhen enabled, it will access documents from these services for the purposes of rendering previews and enabling publishing functionality via the \u003Ca href=\"https:\u002F\u002Fdocs.content.pantheon.io\" rel=\"nofollow ugc\">Pantheon Content Publisher service\u003C\u002Fa>. These services are not processing any data or content originating from WordPress or the plugin itself and no other third-party service is used to process data.\u003Cbr \u002F>\nPantheon Content Publisher policies and terms are available at \u003Ca href=\"https:\u002F\u002Flegal.pantheon.io\u002F\" rel=\"nofollow ugc\">https:\u002F\u002Flegal.pantheon.io\u002F\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>This plugin makes use of the Apollo open-source GraphQL Client library and references its \u003Ca href=\"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fapollo-client-devtools\u002Fjdkknkkbebbapilgoeccciglkfbmbnfm\" rel=\"nofollow ugc\">Chrome extension\u003C\u002Fa>.\u003Cbr \u002F>\nGoogle Chrome Web Store: \u003Ca href=\"https:\u002F\u002Fssl.gstatic.com\u002Fchrome\u002Fwebstore\u002Fintl\u002Fen\u002Fgallery_tos.html\" rel=\"nofollow ugc\">Terms of Service\u003C\u002Fa>,  \u003Ca href=\"https:\u002F\u002Fpolicies.google.com\u002Fprivacy?hl=en\" rel=\"nofollow ugc\">Privacy Policy\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Mozilla\u002FFireFox:  \u003Ca href=\"https:\u002F\u002Fwww.mozilla.org\u002Fen-US\u002Fabout\u002Flegal\u002Fterms\u002Fmozilla\u002F\" rel=\"nofollow ugc\">Terms of Service\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fwww.mozilla.org\u002Fen-US\u002Fprivacy\u002Fwebsites\u002F\" rel=\"nofollow ugc\">Privacy Policy\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>This library only suggests the use of this tool to developers. Users don’t interact with it and no data is exchanged with this service.\u003C\u002Fp>\n\u003Cp>This service is provided by \u003Ca href=\"https:\u002F\u002Fwww.apollographql.com\" rel=\"nofollow ugc\">Apollo\u003C\u002Fa>. See the \u003Ca href=\"https:\u002F\u002Fwww.apollographql.com\u002FApollo-Terms-of-Service.pdf\" rel=\"nofollow ugc\">Apollo Term of Service\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fwww.apollographql.com\u002FApollo-Privacy-Policy.pdf\" rel=\"nofollow ugc\">Apollo Privacy Policy\u003C\u002Fa> for details on terms.\u003C\u002Fp>\n\u003Ch4>Data Handling\u003C\u002Fh4>\n\u003Cp>User documents from Google Drive are accessed and processed to generate content on WordPress.\u003Cbr \u002F>\nNo other personal data is shared with or stored on third-party services beyond this operational scope.\u003C\u002Fp>\n","The Pantheon Content Publisher plugin for WordPress enables seamless content publishing from Google Drive and Google Docs directly to WordPress sites.",1266,"5.7","8.1.0",[114,115,18],"acf","google-docs","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fpantheon-content-publisher\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpantheon-content-publisher.1.3.5.zip","2026-03-15T10:48:56.248Z",{"attackSurface":120,"codeSignals":132,"taintFlows":139,"riskAssessment":140,"analyzedAt":143},{"hooks":121,"ajaxHandlers":128,"restRoutes":129,"shortcodes":130,"cronEvents":131,"entryPointCount":11,"unprotectedCount":11},[122],{"type":123,"name":124,"callback":125,"file":126,"line":127},"action","wp_before_admin_bar_render","pantheon_environment_displayer","pantheon-environment-displayer.php",16,[],[],[],[],{"dangerousFunctions":133,"sqlUsage":134,"outputEscaping":136,"fileOperations":11,"externalRequests":11,"nonceChecks":11,"capabilityChecks":11,"bundledLibraries":138},[],{"prepared":11,"raw":11,"locations":135},[],{"escaped":46,"rawEcho":11,"locations":137},[],[],[],{"summary":141,"deductions":142},"The \"environment-displayer-for-pantheon\" plugin v1.0.1 exhibits a remarkably strong security posture based on the provided static analysis. The complete absence of any identified dangerous functions, raw SQL queries, unsanitized taint flows, and file operations is a significant strength.  Furthermore, all analyzed outputs are properly escaped, indicating good development practices for preventing cross-site scripting vulnerabilities. The plugin also has no external HTTP requests or bundled libraries, further reducing potential attack vectors.\n\nThe plugin's vulnerability history is also exceptionally clean, with no recorded CVEs of any severity. This, combined with the clean static analysis, suggests a plugin that has been developed with security in mind and has likely undergone thorough review. The primary weakness, if any can be identified from this data, is the lack of any capability checks or nonce checks on the identified entry points. However, given that there are zero entry points (AJAX handlers, REST API routes, shortcodes, cron events) without authentication checks, this lack of specific checks on entry points is not a direct security concern in this version, but it does represent a missed opportunity for defense-in-depth.\n\nIn conclusion, this plugin appears to be very secure. The development team has clearly prioritized security by eliminating common vulnerabilities. While the absence of explicit capability and nonce checks on entry points is a general best practice, it is rendered moot by the current lack of any unprotected entry points. The plugin is therefore assessed as having a low risk profile.",[],"2026-03-17T06:28:56.811Z",{"wat":145,"direct":150},{"assetPaths":146,"generatorPatterns":147,"scriptPaths":148,"versionParams":149},[],[],[],[],{"cssClasses":151,"htmlComments":152,"htmlAttributes":153,"restEndpoints":154,"jsGlobals":155,"shortcodeOutput":156},[],[],[],[],[],[]]