Skip to content

Instantly share code, notes, and snippets.

@ManiruzzamanAkash
Created March 30, 2026 08:03
Show Gist options
  • Select an option

  • Save ManiruzzamanAkash/2aeab4c3244ac5feed901c469e9f1d07 to your computer and use it in GitHub Desktop.

Select an option

Save ManiruzzamanAkash/2aeab4c3244ac5feed901c469e9f1d07 to your computer and use it in GitHub Desktop.
Abstract CacheService for SureCart
<?php
namespace SureCart\WordPress\Cache;
/**
* Abstract Cache Service.
*/
abstract class CacheService {
/**
* Bootstrap the service.
*
* @return void
*/
public function bootstrap() {
// Early return if the cache plugin is not active.
if ( ! $this->isCachePluginActive() ) {
return;
}
// Disable cache for SureCart dynamic pages.
add_action( 'wp', [ $this, 'maybeDisableCache' ] );
// Disable cache for SureCart REST API requests.
add_action( 'rest_api_init', [ $this, 'maybeDisableCacheForRestApi' ], 1 );
// Purge cache when product stock is adjusted.
add_action( 'surecart/product_stock_adjusted', [ $this, 'purgeProductCacheOnStockAdjustment' ] );
}
/**
* Disable cache for the current page.
*
* @param string $reason Reason for disabling cache.
* @return void
*/
abstract protected function disableCache( string $reason ): void;
/**
* Check if the cache plugin is active.
*
* @return bool
*/
abstract protected function isCachePluginActive(): bool;
/**
* Check if the current page should be excluded from cache.
*
* @return bool
*/
public function shouldExcludeFromCache(): bool {
return $this->isCustomerDashboardPage()
|| $this->isCheckoutPage()
|| $this->hasCheckoutFormBlock()
|| $this->isBuyPage();
}
/**
* Maybe disable cache for SureCart dynamic pages.
*
* @return void
*/
public function maybeDisableCache() {
if ( $this->isCustomerDashboardPage() ) {
$this->disableCacheWithBrowserHeaders( 'SureCart customer dashboard' );
return;
}
if ( $this->isCheckoutPage() ) {
$this->disableCacheWithBrowserHeaders( 'SureCart checkout page' );
return;
}
if ( $this->hasCheckoutFormBlock() ) {
$this->disableCacheWithBrowserHeaders( 'SureCart checkout form block' );
return;
}
if ( $this->isBuyPage() ) {
$this->disableCacheWithBrowserHeaders( 'SureCart buy page' );
return;
}
}
/**
* Disable both server-side and browser caching.
*
* @param string $reason Reason for disabling cache.
* @return void
*/
protected function disableCacheWithBrowserHeaders( string $reason ): void {
// Disable server-side caching via the cache plugin.
$this->disableCache( $reason );
// Disable browser caching by sending no-cache headers.
if ( ! headers_sent() ) {
nocache_headers();
}
}
/**
* Maybe disable cache for SureCart REST API requests.
*
* @return void
*/
public function maybeDisableCacheForRestApi() {
if ( $this->isSureCartRestRequest() ) {
$this->disableCacheWithBrowserHeaders( 'SureCart REST API request' );
}
}
/**
* Check if the current request is a SureCart REST API request.
*
* @return bool
*/
protected function isSureCartRestRequest(): bool {
$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
if ( strpos( $request_uri, '/surecart/' ) !== false && strpos( $request_uri, 'wp-json' ) !== false ) {
return true;
}
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$rest_route = isset( $_GET['rest_route'] ) ? sanitize_text_field( wp_unslash( $_GET['rest_route'] ) ) : '';
if ( strpos( $rest_route, '/surecart/' ) !== false ) {
return true;
}
return false;
}
/**
* Purge product cache when stock is adjusted.
*
* @param \SureCart\Models\Product $product The product model.
* @return void
*/
public function purgeProductCacheOnStockAdjustment( $product ) {
// Override in child classes if needed.
}
/**
* Check if the current page is the customer dashboard page.
*
* @return bool
*/
protected function isCustomerDashboardPage(): bool {
return \SureCart::pages()->isCustomerDashboardPageByUrl();
}
/**
* Check if the current page is the checkout page.
*
* @return bool
*/
protected function isCheckoutPage(): bool {
$checkout_page_id = \SureCart::pages()->getId( 'checkout' );
if ( empty( $checkout_page_id ) ) {
return false;
}
return is_page( $checkout_page_id );
}
/**
* Check if the current page has a checkout form block.
*
* @return bool
*/
protected function hasCheckoutFormBlock(): bool {
$post = get_post();
if ( ! $post ) {
return false;
}
return has_block( 'surecart/checkout-form', $post ) || has_block( 'surecart/form', $post );
}
/**
* Check if the current page is a buy page.
*
* @return bool
*/
protected function isBuyPage(): bool {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
return isset( $_GET['sc-buy'] ) || ! empty( get_query_var( 'sc-buy' ) );
}
/**
* Get SureCart vary cookies.
*
* @return array
*/
protected function getVaryCookies(): array {
$cookies = [
'sc_checkout_id',
'sc_customer_id',
'sc_order_id',
];
/**
* Filter the SureCart cookies used for cache variation.
*
* @param array $cookies Array of cookie names.
*/
return apply_filters( 'surecart/cache/vary_cookies', $cookies );
}
/**
* Get core WordPress scripts that should be excluded from JS defer.
*
* @return array
*/
protected function getJsDeferExcludes(): array {
$scripts = [
'wp-api-fetch',
'wp-a11y',
'wp-i18n',
'wp-url',
'dom-ready',
'wp-hooks',
'api-fetch',
'a11y.min.js',
'i18n.min.js',
'url.min.js',
'dom-ready.min.js',
'hooks.min.js',
];
/**
* Filter the scripts excluded from JS defer.
*
* @param array $scripts Array of script patterns to exclude.
*/
return apply_filters( 'surecart/cache/js_defer_excludes', $scripts );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment