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 / ShortcodesService.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
ShortcodesService.php
236 lines
1 <?php
2
3 namespace SureCart\WordPress\Shortcodes;
4
5 use SureCart\WordPress\Assets\BlockAssetsLoadService;
6 /**
7 * The shortcodes service.
8 */
9 class ShortcodesService {
10
11 /**
12 * Old Shortcode block names which we want to not render through interactivity.
13 *
14 * @var array
15 */
16 protected $old_blocks_by_name = [
17 'surecart/product-collection-tags' => 'surecart/product-collection-tags',
18 'surecart/product-media' => 'surecart/product-media-old',
19 'surecart/product-title' => 'surecart/product-title-old',
20 'surecart/product-description' => 'surecart/product-description-old',
21 'surecart/product-price' => 'surecart/product-price',
22 'surecart/product-variant-choices' => 'surecart/product-variant-choices',
23 'surecart/product-price-choices' => 'surecart/product-price-choices',
24 'surecart/product-quantity' => 'surecart/product-quantity-old',
25 'surecart/product-buy-button' => 'surecart/product-buy-button-old',
26 ];
27
28 /**
29 * Render shortcode notice
30 *
31 * @param string $name Name.
32 *
33 * @return string
34 */
35 public function renderShortcodeNotice( $name ) {
36 return sprintf(
37 '<h5 style="%s">%s</h5>',
38 'background: #F1F1F1; color: #434242; padding: 2em; border-radius: 0.5em;',
39 esc_html(
40 sprintf(
41 /* translators: %s: shortcode name */
42 __( 'Please visit the frontend of your page builder to view the %s shortcode contents.', 'surecart' ),
43 esc_html( $name )
44 )
45 )
46 );
47 }
48
49 /**
50 * Check if shortcode should render itself
51 *
52 * @param string $name Name of the shortcode.
53 * @return boolean
54 */
55 public function cannotRenderShortcode( $name ) {
56 if ( 'sc_product_list' !== $name ) { // If the shortcode is not Product List, return false.
57 return false;
58 }
59
60 $assets_service = new BlockAssetsLoadService();
61
62 return $assets_service->isUsingPageBuilder();
63 }
64
65 /**
66 * Register shortcode by name
67 *
68 * @param string $name Name of the shortcode.
69 * @param string $block_name The registered block name.
70 * @param array $defaults Default attributes.
71 * @param array $options Opaque options bag forwarded to the `surecart/shortcodes/render_callback` filter.
72 *
73 * @return void
74 */
75 public function registerBlockShortcodeByName( $name, $block_name, $defaults = array(), array $options = array() ) {
76 add_shortcode(
77 $name,
78 apply_filters(
79 'surecart/shortcodes/render_callback',
80 function ( $attributes, $content ) use ( $name, $block_name, $defaults ) {
81 if ( empty( $block_name ) ) {
82 return '';
83 }
84 if ( $this->cannotRenderShortcode( $name ) ) { // If we are in the editor of any Page Builders & Block is Product List, render the shortcode itself.
85 return $this->renderShortcodeNotice( $name );
86 }
87
88 add_filter( 'should_load_separate_core_block_assets', '__return_false', 11 ); // Disable loading separate core block assets.
89 wp_enqueue_global_styles(); // Enqueue global styles.
90
91 // Product shortcodes can use either `id` or `product_id` for the product —
92 // they mean the same thing, and `id` is kept if both are given.
93 // Review shortcodes get this elsewhere, so skip `surecart/product-review-*`.
94 if ( is_array( $attributes )
95 && 0 === strpos( $block_name, 'surecart/product' )
96 && 0 !== strpos( $block_name, 'surecart/product-review' ) ) {
97 if ( empty( $attributes['id'] ) && ! empty( $attributes['product_id'] ) ) {
98 $attributes['id'] = $attributes['product_id'];
99 }
100 // Drop the alias once mapped (safe to call when it was never set).
101 unset( $attributes['product_id'] );
102 }
103
104 // convert comma separated attributes to array.
105 if ( is_array( $attributes ) ) {
106 foreach ( $attributes as $key => $value ) {
107 if ( strpos( $value, ',' ) !== 0 && isset( $defaults[ $key ] ) && is_array( $defaults[ $key ] ) ) {
108 $attributes[ $key ] = explode( ',', $value );
109 }
110 }
111 }
112
113 $shortcode_attrs = wp_parse_args(
114 $attributes,
115 $defaults
116 );
117
118 $shortcode_attrs = apply_filters( "shortcode_atts_{$name}", $shortcode_attrs, $shortcode_attrs, $shortcode_attrs, $name );
119
120 // If the block is old block, we need to process it differently.
121 $block = (object) [
122 'parsed_block' => [
123 'blockName' => $block_name,
124 'attrs' => $shortcode_attrs,
125 ],
126 ];
127
128 // we need to remove this since this is processed twice for some blocks.
129 add_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10, 2 );
130
131 if ( ! empty( $this->old_blocks_by_name[ $block_name ] ) ) {
132 $old_block = \SureCart::block()
133 ->productPageBlocksMigration( $block, $this->old_blocks_by_name[ $block_name ] )
134 ->maybeRenderOldBlockFromShortcode( $name );
135 }
136
137 if ( ! empty( $old_block ) ) {
138 remove_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10 );
139 return $old_block;
140 }
141
142 $content = $this->processBlock( $block_name, $shortcode_attrs, $content );
143
144 remove_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10 );
145
146 return $content;
147 },
148 $name,
149 $options
150 )
151 );
152 }
153
154 /**
155 * Register a pattern file as a shortcode.
156 *
157 * @param string $name Shortcode name (e.g. 'sc_product_review_list').
158 * @param string $pattern_file Pattern filename without path or extension (e.g. 'product-review-standard').
159 * @param array $options Opaque options bag forwarded to the `surecart/shortcodes/render_callback` filter.
160 *
161 * @return void
162 */
163 public function registerPatternShortcodeByName( $name, $pattern_file, array $options = array() ) {
164 add_shortcode(
165 $name,
166 apply_filters(
167 'surecart/shortcodes/render_callback',
168 function () use ( $pattern_file ) {
169 $pattern = include SURECART_PLUGIN_DIR . '/templates/patterns/' . $pattern_file . '.php';
170 $block_html = $pattern['content'] ?? '';
171
172 add_filter( 'should_load_separate_core_block_assets', '__return_false', 11 );
173 wp_enqueue_global_styles();
174 add_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10, 2 );
175
176 $output = wp_interactivity_process_directives( do_blocks( $block_html ) );
177
178 remove_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10 );
179
180 return $output;
181 },
182 $name,
183 $options
184 )
185 );
186 }
187
188 /**
189 * Process the block
190 *
191 * @param string $block_name Block name.
192 * @param array $shortcode_attrs Shortcode attributes.
193 * @param string $content Content.
194 *
195 * @return string
196 */
197 public function processBlock( $block_name, $shortcode_attrs, $content ) {
198 switch ( $block_name ) {
199 case 'surecart/product-list':
200 case 'surecart/product-collection':
201 return wp_interactivity_process_directives( \SureCart::block()->productListMigration( $shortcode_attrs )->render() );
202
203 case 'surecart/product-collection-tags':
204 return wp_interactivity_process_directives( \SureCart::block()->productCollectionBadgesMigration( $shortcode_attrs )->render() );
205
206 case 'surecart/product-price':
207 return wp_interactivity_process_directives( \SureCart::block()->productSelectedPriceMigration( $shortcode_attrs )->render() );
208
209 case 'surecart/product-price-choices':
210 return wp_interactivity_process_directives( \SureCart::block()->productPriceChoicesMigration( $shortcode_attrs )->render() );
211
212 case 'surecart/product-variant-choices':
213 return wp_interactivity_process_directives( \SureCart::block()->productVariantsMigration( $shortcode_attrs )->render() );
214 }
215
216 return wp_interactivity_process_directives(
217 do_blocks( '<!-- wp:' . $block_name . ' ' . wp_json_encode( $shortcode_attrs, JSON_FORCE_OBJECT ) . ' -->' . do_shortcode( $content ) . '<!-- /wp:' . $block_name . ' -->' )
218 );
219 }
220
221 /**
222 * Remove interactivity doing it wrong
223 *
224 * @param string $trigger Trigger.
225 * @param string $function_name Function name.
226 *
227 * @return string|false
228 */
229 public function removeInteractivityDoingItWrong( $trigger, $function_name ) {
230 if ( 'WP_Interactivity_API::evaluate' !== $function_name ) {
231 return $trigger;
232 }
233 return false;
234 }
235 }
236