PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.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 / BlockLibrary / URLParamService.php
surecart / app / src / BlockLibrary Last commit date
BlockAnchorSupportService.php 1 year ago BlockCurrencyConversionSupportService.php 1 year ago BlockPatternsService.php 1 year ago BlockService.php 6 months ago BlockServiceProvider.php 6 months ago BlockStylesService.php 5 months ago BlockValidationService.php 2 years ago CartMenuIconMigrationService.php 1 year ago CartMigrationService.php 1 year ago FormModeSwitcherService.php 1 month ago ProductCollectionBadgesMigrationService.php 1 year ago ProductListFilterTagsMigrationService.php 1 year ago ProductListMigrationService.php 1 year ago ProductListService.php 1 year ago ProductPageBlocksMigrationService.php 1 year ago ProductPriceChoicesMigrationService.php 1 year ago ProductQuickViewService.php 11 months ago ProductReviewFormService.php 6 months ago ProductSelectedPriceMigrationService.php 1 year ago ProductVariantsMigrationService.php 1 year ago URLParamService.php 1 week ago
URLParamService.php
411 lines
1 <?php
2
3 namespace SureCart\BlockLibrary;
4
5 /**
6 * Provide URL params related functionality.
7 */
8 class URLParamService {
9 /**
10 * Prefix.
11 *
12 * @var string
13 */
14 protected $prefix = 'query';
15
16 /**
17 * Pagination Key.
18 *
19 * @var string
20 */
21 protected $pagination_key = 'page';
22
23 /**
24 * Search Key.
25 *
26 * @var string
27 */
28 protected $search_key = 'search';
29
30 /**
31 * Unique instance ID.
32 *
33 * @var string
34 */
35 protected $instance_id = '';
36
37 /**
38 * URL.
39 *
40 * @var string|false
41 */
42 protected $url = false;
43
44 /**
45 * Set the prefix.
46 *
47 * @param string $prefix Prefix.
48 */
49 public function __construct( $prefix = 'query' ) {
50 global $sc_query_id;
51 $this->prefix = $prefix;
52 $this->instance_id = $sc_query_id;
53 }
54
55 /**
56 * Set the block ID.
57 *
58 * @param string $prefix Prefix.
59 */
60 public function setPrefix( $prefix ) {
61 $this->prefix = $prefix;
62 return $this;
63 }
64
65 /**
66 * Set the block ID.
67 *
68 * @param string $instance_id Unique instance ID.
69 */
70 public function setInstanceId( $instance_id ) {
71 $this->instance_id = $instance_id;
72 return $this;
73 }
74
75 /**
76 * Get a unique key for a block.
77 *
78 * @param string $name Name.
79 * @param string $instance_id Unique instance ID.
80 *
81 * @return string
82 */
83 public function getKey( $name = '', $instance_id = '' ) {
84 $instance_id = $instance_id ? $instance_id : $this->instance_id;
85 $prefix = ! empty( $this->prefix ) ? ( $this->prefix . '-' ) : '';
86 if ( ! $instance_id ) {
87 return trim( $prefix . strtolower( $name ), '-' );
88 }
89 return trim( $prefix . $instance_id . '-' . strtolower( $name ), '-' );
90 }
91
92 /**
93 * Get the name of a key.
94 *
95 * @param string $key Key.
96 * @param string $instance_id Unique instance ID.
97 *
98 * @return string
99 */
100 public function getName( $key = '', $instance_id = '' ) {
101 $instance_id = $instance_id ? $instance_id : $this->instance_id;
102 $prefix = ! empty( $this->prefix ) ? ( $this->prefix . '-' ) : '';
103
104 // Strip the prefix if it exists.
105 if ( ! empty( $prefix ) && strpos( $key, $prefix ) === 0 ) {
106 $key = substr( $key, strlen( $prefix ) );
107 }
108
109 // Strip the instance ID if it exists.
110 if ( ! empty( $instance_id ) && strpos( $key, $instance_id . '-' ) === 0 ) {
111 $key = substr( $key, strlen( $instance_id . '-' ) );
112 }
113
114 // Return the original name.
115 return $key;
116 }
117
118 /**
119 * Get the filter arguments.
120 *
121 * @param string $name Name.
122 * @param string $instance_id Unique instance ID.
123 *
124 * @return array
125 */
126 public function getArg( $name, $instance_id = '' ) {
127 $instance_id = $instance_id ? $instance_id : $this->instance_id;
128 $key = $this->getKey( $name, $instance_id );
129 return $_GET[ $key ] ?? null;
130 }
131
132 /**
133 * Get the filter arguments.
134 *
135 * @param string $instance_id Unique instance ID.
136 *
137 * @return array
138 */
139 public function getArgs( $instance_id = '' ) {
140 $instance_id = $instance_id ? $instance_id : $this->instance_id;
141 $args = [];
142 foreach ( $_GET as $key => $value ) {
143 if ( strpos( $key, $this->getKey( '', $instance_id ) ) === 0 ) {
144 $args[ $key ] = $value;
145 }
146 }
147 return $args;
148 }
149
150 /**
151 * Coerce a raw filter value into a list.
152 *
153 * Crawlers routinely drop the `[0]` out of a faceted URL, so
154 * `?products-sc_collection=slug` arrives as a bare string where callers
155 * expect the list that `?products-sc_collection[0]=slug` produces.
156 *
157 * @param mixed $value Raw filter value.
158 *
159 * @return array
160 */
161 protected function toList( $value ) {
162 return array_values(
163 array_filter(
164 is_array( $value ) ? $value : [ $value ],
165 fn( $item ) => is_scalar( $item ) && '' !== $item
166 )
167 );
168 }
169
170 /**
171 * Get the filter arguments.
172 *
173 * @param string $instance_id Unique instance ID.
174 *
175 * @return array Map of taxonomy name to a list of term slugs.
176 */
177 public function getAllTaxonomyArgs( $instance_id = '' ) {
178 $instance_id = $instance_id ? $instance_id : $this->instance_id;
179 $args = $this->getArgs( $instance_id ); // Use getArgs to get filtered arguments.
180 $taxonomy_args = [];
181
182 foreach ( $args as $key => $value ) {
183 $taxonomy_name = $this->getName( $key, $instance_id );
184 $terms = $this->toList( $value );
185
186 if ( taxonomy_exists( $taxonomy_name ) && ! empty( $terms ) ) {
187 $taxonomy_args[ $taxonomy_name ] = $terms;
188 }
189 }
190
191 return $taxonomy_args;
192 }
193
194 /**
195 * Get the star rating arguments.
196 *
197 * @param string $instance_id Unique instance ID.
198 *
199 * @return array Map of 'ratings' to a list of values.
200 */
201 public function getAllStarArgs( $instance_id = '' ): array {
202 $instance_id = $instance_id ? $instance_id : $this->instance_id;
203 $args = $this->getArgs( $instance_id ); // Use getArgs to get filtered arguments.
204 $star_args = [];
205
206 foreach ( $args as $key => $value ) {
207 $star_name = $this->getName( $key, $instance_id );
208 $ratings = $this->toList( $value );
209
210 if ( 'ratings' === $star_name && ! empty( $ratings ) ) {
211 $star_args[ $star_name ] = $ratings;
212 }
213 }
214
215 return $star_args;
216 }
217
218 /**
219 * Get the current page.
220 *
221 * @param string $instance_id Unique instance ID.
222 *
223 * @return int
224 */
225 public function getCurrentPage( $instance_id = '' ) {
226 $instance_id = $instance_id ? $instance_id : $this->instance_id;
227 $key = $this->getKey( $this->pagination_key, $instance_id );
228 return max( 1, absint( $_GET[ $key ] ?? 1 ) );
229 }
230
231 /**
232 * Add a generic argument to the URL.
233 *
234 * @param string $key Key.
235 * @param string|array $value Value.
236 * @param string $instance_id Unique instance ID.
237 * @return string
238 */
239 public function addArg( $key, $value, $instance_id = '' ) {
240 // get the instance ID.
241 $instance_id = $instance_id ? $instance_id : $this->instance_id;
242 // get the key for this filter argument.
243 $key = $this->getKey( $key, $instance_id );
244 // make sure the value is always lowercase.
245 $value = is_array( $value ) ? array_map( 'strtolower', $value ) : strtolower( $value );
246 // return the new URL without pagination for filtering.
247 $this->url = add_query_arg( strtolower( $key ), $value, $this->url );
248 // return this.
249 return $this;
250 }
251
252 /**
253 * Get the URL.
254 *
255 * @return string
256 */
257 public function url() {
258 return $this->url;
259 }
260
261 /**
262 * Add a pagination argument to the URL.
263 *
264 * @param int $page Page.
265 * @param string $instance_id Unique instance ID.
266 *
267 * @return string
268 */
269 public function addPageArg( $page, $instance_id = '' ) {
270 return $this->addArg( $this->pagination_key, $page, $instance_id );
271 }
272
273 /**
274 * Add a filter argument to the URL.
275 *
276 * @param string $key Key.
277 * @param string $value Value.
278 * @param string $instance_id Unique instance ID.
279 *
280 * @return string
281 */
282 public function addFilterArg( $key, $value, $instance_id = '' ) {
283 // get the instance ID.
284 $instance_id = $instance_id ? $instance_id : $this->instance_id;
285
286 // get the key for this filter argument.
287 $key = $this->getKey( $key, $instance_id );
288
289 // get the existing filters.
290 $existing_filters = $this->toList( $_GET[ $key ] ?? null );
291
292 // add the new filter.
293 $filters = array_unique( array_merge( $existing_filters, [ $value ] ) );
294
295 // return the new URL without pagination for filtering, preserving search.
296 return remove_query_arg(
297 [
298 $this->getKey( $this->pagination_key, $instance_id ),
299 ],
300 add_query_arg( $key, $filters, $this->url )
301 );
302 }
303
304 /**
305 * Check if a filter argument exists in the URL.
306 *
307 * @param string $key Key.
308 * @param string $value Value.
309 * @param string $instance_id Unique instance ID.
310 *
311 * @return bool
312 */
313 public function hasFilterArg( $key, $value, $instance_id = '' ) {
314 // get the instance ID.
315 $instance_id = $instance_id ? $instance_id : $this->instance_id;
316
317 // get the key for this filter argument.
318 $key = $this->getKey( $key, $instance_id );
319
320 // get the existing filters.
321 $existing_filters = $this->toList( $_GET[ $key ] ?? null );
322
323 // check if the value exists in the existing filters.
324 return in_array( strval( $value ), $existing_filters, false );
325 }
326
327 /**
328 * Remove all specified arguments from the URL.
329 *
330 * @param array $existing_filters Existing filters to remove.
331 * @param string $instance_id Unique instance ID.
332 *
333 * @return string
334 */
335 protected function removeAllArgs( $existing_filters, $instance_id = '' ) {
336 // get the instance ID.
337 $instance_id = $instance_id ? $instance_id : $this->instance_id;
338
339 // prepare keys to remove.
340 $keys_to_remove = [
341 $this->getKey( $this->pagination_key, $instance_id ),
342 $this->getKey( $this->search_key, $instance_id ),
343 ];
344
345 // gather keys to remove using existing filter keys.
346 foreach ( array_keys( $existing_filters ) as $filter_key ) {
347 $keys_to_remove[] = $this->getKey( $filter_key, $instance_id );
348 }
349
350 // return the new URL without pagination for filtering.
351 return remove_query_arg( $keys_to_remove, $this->url );
352 }
353
354 /**
355 * Remove all filter arguments from the URL.
356 *
357 * @param string $instance_id Unique instance ID.
358 *
359 * @return string
360 */
361 public function removeAllFilterArgs( $instance_id = '' ) {
362 $instance_id = $instance_id ? $instance_id : $this->instance_id;
363 $existing_filters = $this->getAllTaxonomyArgs( $instance_id );
364 return $this->removeAllArgs( $existing_filters, $instance_id );
365 }
366
367 /**
368 * Remove all star rating arguments from the URL.
369 *
370 * @param string $instance_id Unique instance ID.
371 *
372 * @return string
373 */
374 public function removeAllStarArgs( $instance_id = '' ) {
375 $instance_id = $instance_id ? $instance_id : $this->instance_id;
376 $existing_filters = $this->getAllStarArgs( $instance_id );
377 return $this->removeAllArgs( $existing_filters, $instance_id );
378 }
379
380 /**
381 * Remove a filter argument from the URL.
382 *
383 * @param string $key Key.
384 * @param string $value Value.
385 * @param string $instance_id Unique instance ID.
386 *
387 * @return string
388 */
389 public function removeFilterArg( $key, $value, $instance_id = '' ) {
390 // get the instance ID.
391 $instance_id = $instance_id ? $instance_id : $this->instance_id;
392
393 // get the key for this filter argument.
394 $key = $this->getKey( $key, $instance_id );
395
396 // get the existing filters.
397 $existing_filters = $this->toList( $_GET[ $key ] ?? null );
398
399 // remove the new filter.
400 $filters = array_diff( $existing_filters, [ $value ] );
401
402 // return the new URL without pagination for filtering, preserving search.
403 return remove_query_arg(
404 [
405 $this->getKey( $this->pagination_key, $instance_id ),
406 ],
407 add_query_arg( $key, $filters, $this->url )
408 );
409 }
410 }
411