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 / WordPress / Shortcodes / ProductContextShortcodeWrapper.php
surecart / app / src / WordPress / Shortcodes Last commit date
ProductContextShortcodeWrapper.php 2 months ago ShortcodesBlockConversionService.php 3 years ago ShortcodesService.php 2 months 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