PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.5.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.5.0
4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / WordPress / Cache / W3TotalCacheService.php
surecart / app / src / WordPress / Cache Last commit date
CacheService.php 2 weeks ago CacheServiceProvider.php 2 weeks ago DoNotCachePageService.php 2 weeks ago LiteSpeedCacheService.php 4 months ago W3TotalCacheService.php 4 months ago WpFastestCacheService.php 4 months ago
W3TotalCacheService.php
150 lines
1 <?php
2
3 namespace SureCart\WordPress\Cache;
4
5 /**
6 * W3 Total Cache Service.
7 */
8 class W3TotalCacheService extends CacheService {
9 /**
10 * Bootstrap the service.
11 *
12 * @return void
13 */
14 public function bootstrap() {
15 // Early return if W3 Total Cache plugin is not active.
16 if ( ! $this->isCachePluginActive() ) {
17 return;
18 }
19
20 parent::bootstrap();
21
22 // Use W3TC's filter to prevent caching of SureCart pages.
23 add_filter( 'w3tc_can_cache', [ $this, 'maybePreventCaching' ], 10, 2 );
24
25 // Exclude critical WordPress scripts from minification.
26 add_filter( 'w3tc_minify_js_do_tag_minification', [ $this, 'excludeScriptsFromMinify' ], 10, 3 );
27
28 // Exclude SureCart scripts from defer.
29 add_filter( 'w3tc_minify_js_script_tags', [ $this, 'excludeScriptsFromDefer' ] );
30 }
31
32 /**
33 * Check if W3 Total Cache plugin is active.
34 *
35 * @return bool
36 */
37 protected function isCachePluginActive(): bool {
38 return defined( 'W3TC' ) || function_exists( 'w3tc_flush_all' );
39 }
40
41 /**
42 * Prevent W3TC from caching SureCart dynamic pages.
43 *
44 * @param bool $can_cache Whether W3TC can cache this page.
45 * @param mixed $page_grabber The W3TC page grabber object.
46 * @return bool
47 */
48 public function maybePreventCaching( $can_cache, $page_grabber = null ) {
49 // If already not caching, return early.
50 if ( ! $can_cache ) {
51 return $can_cache;
52 }
53
54 // Check if this is a SureCart page that should not be cached.
55 if ( $this->shouldExcludeFromCache() ) {
56 return false;
57 }
58
59 return $can_cache;
60 }
61
62 /**
63 * Disable cache for the current page.
64 *
65 * @param string $reason Reason for disabling cache.
66 * @return void
67 */
68 protected function disableCache( string $reason ): void {
69 if ( ! defined( 'DONOTCACHEPAGE' ) ) {
70 define( 'DONOTCACHEPAGE', true );
71 }
72 }
73
74 /**
75 * Purge product cache when stock is adjusted.
76 *
77 * @param \SureCart\Models\Product $product The product model.
78 * @return void
79 */
80 public function purgeProductCacheOnStockAdjustment( $product ) {
81 // Check if W3TC flush function exists.
82 if ( ! function_exists( 'w3tc_flush_post' ) ) {
83 return;
84 }
85
86 if ( empty( $product ) ) {
87 return;
88 }
89
90 // Get the WordPress post ID for the product.
91 $post_id = $product->metadata->wp_id ?? null;
92
93 if ( ! empty( $post_id ) ) {
94 w3tc_flush_post( $post_id );
95 }
96
97 /**
98 * Action fired after purging cache for a product on stock adjustment.
99 *
100 * @param \SureCart\Models\Product $product The product model.
101 */
102 do_action( 'surecart/cache/purged_product', $product );
103 }
104
105 /**
106 * Exclude critical scripts from W3TC minification.
107 *
108 * @param bool $do_minification Whether to minify this script.
109 * @param string $script_tag The script tag HTML.
110 * @param string $file The script file URL.
111 * @return bool
112 */
113 public function excludeScriptsFromMinify( $do_minification, $script_tag, $file ) {
114 if ( ! $do_minification ) {
115 return $do_minification;
116 }
117
118 foreach ( $this->getJsDeferExcludes() as $exclude ) {
119 if ( strpos( $file, $exclude ) !== false || strpos( $script_tag, $exclude ) !== false ) {
120 return false;
121 }
122 }
123
124 return $do_minification;
125 }
126
127 /**
128 * Exclude critical scripts from W3TC defer.
129 *
130 * @param array $script_tags Array of script tags.
131 * @return array
132 */
133 public function excludeScriptsFromDefer( $script_tags ) {
134 if ( ! is_array( $script_tags ) ) {
135 return $script_tags;
136 }
137
138 foreach ( $script_tags as $key => $tag ) {
139 foreach ( $this->getJsDeferExcludes() as $exclude ) {
140 if ( strpos( $tag, $exclude ) !== false ) {
141 $script_tags[ $key ] = preg_replace( '/^<script\b/', '<script data-no-defer="1"', $tag, 1 );
142 break;
143 }
144 }
145 }
146
147 return $script_tags;
148 }
149 }
150