PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.7.1
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.7.1
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 / Request / RequestCacheService.php
surecart / app / src / Request Last commit date
RequestCacheService.php 1 year ago RequestService.php 1 year ago RequestServiceProvider.php 1 year ago
RequestCacheService.php
238 lines
1 <?php
2 namespace SureCart\Request;
3
4 /**
5 * Request caching service.
6 */
7 class RequestCacheService {
8 /**
9 * Has this been cached yet for the request?
10 *
11 * @var boolean
12 */
13 protected static $cached = false;
14
15 /**
16 * The endpoint for the request
17 *
18 * @var string
19 */
20 protected $endpoint = '';
21
22 /**
23 * The args for the request
24 *
25 * @var array
26 */
27 protected $args = [];
28
29 /**
30 * The cache key on the account.
31 *
32 * @var string
33 */
34 protected $account_cache_key = '';
35
36 /**
37 * Needs an endpoint and args
38 *
39 * @param string $endpoint The endpoint for the request.
40 * @param array $args The args for the request.
41 * @param string $account_cache_key The key on the account model to check for cache.
42 */
43 public function __construct( $endpoint, $args, $account_cache_key ) {
44 $this->endpoint = $endpoint;
45 $this->args = $args;
46 $this->account_cache_key = $account_cache_key;
47 }
48
49 /**
50 * Can we use transient caching.
51 *
52 * @return boolean
53 */
54 public function canUseTransient() {
55 $expand = $this->args['query']['expand'] ?? [];
56 // if any expand has nested expansion, do not cache.
57 foreach ( $expand as $item ) {
58 if ( strpos( '.', $item ) !== false ) {
59 return false;
60 }
61 }
62 return true;
63 }
64
65 /**
66 * Get the object cache key.
67 *
68 * @return string
69 */
70 public function getObjectCacheKey() {
71 return $this->endpoint . wp_json_encode( $this->args );
72 }
73
74 /**
75 * Get the transient cache key.
76 *
77 * @return string
78 */
79 public function getTransientCacheKey() {
80 $timestamp = \SureCart::account()->cache_keys->{$this->account_cache_key} ?? 0;
81 if ( ! $timestamp ) {
82 return '';
83 }
84 // we need to hash this this because there is a limit on string size for the key on the options table.
85 return wp_hash( $this->endpoint . wp_json_encode( $this->args ) . $timestamp );
86 }
87
88 /**
89 * Set the cache.
90 *
91 * @param mixed $data Data to set.
92 * @param string $type The type of cache to set.
93 *
94 * @return boolean
95 */
96 public function setCache( $data, $type ) {
97 switch ( $type ) {
98 case 'object':
99 return $this->setObjectCache( $data );
100 case 'transient':
101 return $this->setTransientCache( $data );
102 }
103 return false;
104 }
105
106 /**
107 * Set the object cache.
108 *
109 * @param mixed $data Data to set.
110 *
111 * @return boolean
112 */
113 public function setObjectCache( $data ) {
114 $object_cache_key = $this->getObjectCacheKey();
115 // set in object cache.
116 if ( $object_cache_key ) {
117 return wp_cache_set( $object_cache_key, $data );
118 }
119 return false;
120 }
121
122 /**
123 * Get request from object cache.
124 *
125 * @return mixed
126 */
127 public function getObjectCache() {
128 // we cache this so we can request it several times.
129 $object_cache_key = $this->getObjectCacheKey();
130
131 // flush the cache on the first request to clear any redis caching.
132 if ( ! self::$cached ) {
133 wp_cache_flush();
134 self::$cached = true;
135 }
136
137 // already made the request this cycle.
138 return wp_cache_get( $object_cache_key );
139 }
140
141 /**
142 * Set the transient cache.
143 *
144 * @param mixed $data Data to set.
145 *
146 * @return boolean
147 */
148 public function setTransientCache( $data ) {
149 if ( ! $this->canUseTransient() ) {
150 return false;
151 }
152
153 $transient_cache_key = $this->getTransientCacheKey();
154 if ( $transient_cache_key ) {
155 return set_transient( $transient_cache_key, $data, 60 * MINUTE_IN_SECONDS );
156 }
157 return false;
158 }
159
160 /**
161 * Get the transient cache.
162 *
163 * @return mixed
164 */
165 public function getTransientCache() {
166 if ( ! $this->canUseTransient() ) {
167 return false;
168 }
169 return get_transient( $this->getTransientCacheKey() );
170 }
171
172 /**
173 * Get the previous cache key.
174 *
175 * @return string
176 */
177 public function getPreviousCacheKey() {
178 $timestamp = \SureCart::account()->cache_keys->{$this->account_cache_key} ?? 0;
179 if ( ! $timestamp ) {
180 return '';
181 }
182 // we need to hash this this because there is a limit on string size for the key on the options table.
183 return wp_hash( 'sc_previous' . $this->endpoint . wp_json_encode( $this->args ) . $timestamp );
184 }
185
186 /**
187 * Set the previous cache.
188 *
189 * @param mixed $data Data to set.
190 *
191 * @return boolean
192 */
193 public function setPreviousCache( $data ) {
194 $cache_key = $this->getPreviousCacheKey();
195 if ( $cache_key ) {
196 return update_option( $cache_key, $data, false );
197 }
198 return false;
199 }
200
201 /**
202 * Get the previous cache.
203 *
204 * @return mixed
205 */
206 public function getPreviousCache() {
207 return get_option( $this->getPreviousCacheKey() );
208 }
209
210 /**
211 * Get the previous cache updating key.
212 *
213 * @return mixed
214 */
215 public function getPreviousCacheUpdatingKey() {
216 return $this->endpoint . '_updating';
217 }
218
219 /**
220 * Set the previous cache updating state.
221 *
222 * @param mixed $state State to set.
223 * @return mixed
224 */
225 public function setPreviousCacheUpdatingState( $state ) {
226 return update_option( $this->getPreviousCacheUpdatingKey(), $state, false );
227 }
228
229 /**
230 * Get the previous cache updating state.
231 *
232 * @return mixed
233 */
234 public function getPreviousCacheUpdatingState() {
235 return get_option( $this->getPreviousCacheUpdatingKey() );
236 }
237 }
238