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 / Shortcodes / ProductContextShortcodeWrapper.php
surecart / app / src / WordPress / Shortcodes Last commit date
ProductContextShortcodeWrapper.php 1 month ago ShortcodesBlockConversionService.php 2 years ago ShortcodesService.php 1 month ago ShortcodesServiceProvider.php 1 month ago
ProductContextShortcodeWrapper.php
74 lines
1 <?php
2
3 namespace SureCart\WordPress\Shortcodes;
4
5 /**
6 * Wraps the render callback for shortcodes that opt in via `['supports_product_id' => true]`.
7 */
8 class ProductContextShortcodeWrapper {
9
10 public function bootstrap() {
11 add_filter( 'surecart/shortcodes/render_callback', [ $this, 'maybeWrap' ], 10, 3 );
12 }
13
14 /**
15 * Wrap the render callback when the caller opted in; pass through otherwise.
16 *
17 * @param callable $callback Render callback supplied by ShortcodesService.
18 * @param string $name Shortcode name (unused — opt-in is via $options).
19 * @param array $options Caller-supplied options bag.
20 *
21 * @return callable
22 */
23 public function maybeWrap( callable $callback, $name, array $options = array() ) {
24 if ( empty( $options['supports_product_id'] ) ) {
25 return $callback;
26 }
27
28 return function ( $attributes = '', $content = null ) use ( $callback ) {
29 // Accept both `id` and `product_id`; `product_id` (these shortcodes' native param) wins.
30 $product_id = is_array( $attributes )
31 ? ( $attributes['product_id'] ?? $attributes['id'] ?? '' )
32 : '';
33
34 if ( empty( $product_id ) ) {
35 return $callback( $attributes, $content );
36 }
37
38 $product_id = (string) $product_id;
39 unset( $attributes['product_id'], $attributes['id'] );
40
41 // Clear so sc_get_product() doesn't short-circuit to the page's product.
42 $product = $this->withQueryVar( null, fn() => sc_get_product( $product_id ) );
43
44 // Unresolved id: render empty rather than silently using the page's product.
45 if ( empty( $product ) || empty( $product->id ) ) {
46 return '';
47 }
48
49 // Inner next-gen blocks read this query var via render_block_context.
50 return $this->withQueryVar( $product, fn() => $callback( $attributes, $content ) );
51 };
52 }
53
54 /**
55 * Run `$fn` with `surecart_current_product` temporarily set to `$value`,
56 * restoring the previous value afterward (even on exception).
57 *
58 * @param mixed $value New query var value (null clears it).
59 * @param callable $fn Callable to invoke.
60 *
61 * @return mixed
62 */
63 protected function withQueryVar( $value, callable $fn ) {
64 $previous = get_query_var( 'surecart_current_product' );
65 set_query_var( 'surecart_current_product', $value );
66
67 try {
68 return $fn();
69 } finally {
70 set_query_var( 'surecart_current_product', $previous );
71 }
72 }
73 }
74