PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.3
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
ShortcodesBlockConversionService.php 2 years ago ShortcodesService.php 1 year ago ShortcodesServiceProvider.php 1 year ago
ShortcodesService.php
207 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 * Convert the block
30 *
31 * @param string $name Block name.
32 * @param string $block Block block.
33 * @param array $defaults Default attributes.
34 *
35 * @return void
36 */
37 public function registerBlockShortcode( $name, $block, $defaults = array() ) {
38 add_shortcode(
39 $name,
40 function ( $attributes, $content ) use ( $name, $block, $defaults ) {
41 return ( new ShortcodesBlockConversionService( $attributes, $content ) )->convert(
42 $name,
43 $block,
44 $defaults
45 );
46 },
47 10,
48 2
49 );
50 }
51
52 /**
53 * Render shortcode notice
54 *
55 * @param string $name Name.
56 *
57 * @return string
58 */
59 public function renderShortcodeNotice( $name ) {
60 return sprintf(
61 '<h5 style="%s">%s</h5>',
62 'background: #F1F1F1; color: #434242; padding: 2em; border-radius: 0.5em;',
63 esc_html(
64 sprintf(
65 /* translators: %s: shortcode name */
66 __( 'Please visit the frontend of your page builder to view the %s shortcode contents.', 'surecart' ),
67 esc_html( $name )
68 )
69 )
70 );
71 }
72
73 /**
74 * Check if shortcode should render itself
75 *
76 * @param string $name Name of the shortcode.
77 * @return boolean
78 */
79 public function cannotRenderShortcode( $name ) {
80 if ( 'sc_product_list' !== $name ) { // If the shortcode is not Product List, return false.
81 return false;
82 }
83
84 $assets_service = new BlockAssetsLoadService();
85
86 return $assets_service->isUsingPageBuilder();
87 }
88
89 /**
90 * Register shortcode by name
91 *
92 * @param string $name Name of the shortcode.
93 * @param string $block_name The registered block name.
94 * @param array $defaults Default attributes.
95 *
96 * @return void
97 */
98 public function registerBlockShortcodeByName( $name, $block_name, $defaults = array() ) {
99 add_shortcode(
100 $name,
101 function ( $attributes, $content ) use ( $name, $block_name, $defaults ) {
102 if ( empty( $block_name ) ) {
103 return '';
104 }
105 if ( $this->cannotRenderShortcode( $name ) ) { // If we are in the editor of any Page Builders & Block is Product List, render the shortcode itself.
106 return $this->renderShortcodeNotice( $name );
107 }
108
109 add_filter( 'should_load_separate_core_block_assets', '__return_false', 11 ); // Disable loading separate core block assets.
110 wp_enqueue_global_styles(); // Enqueue global styles.
111
112 // convert comma separated attributes to array.
113 if ( is_array( $attributes ) ) {
114 foreach ( $attributes as $key => $value ) {
115 if ( strpos( $value, ',' ) !== 0 && isset( $defaults[ $key ] ) && is_array( $defaults[ $key ] ) ) {
116 $attributes[ $key ] = explode( ',', $value );
117 }
118 }
119 }
120
121 $shortcode_attrs = wp_parse_args(
122 $attributes,
123 $defaults
124 );
125
126 $shortcode_attrs = apply_filters( "shortcode_atts_{$name}", $shortcode_attrs, $shortcode_attrs, $shortcode_attrs, $name );
127
128 // If the block is old block, we need to process it differently.
129 $block = (object) [
130 'parsed_block' => [
131 'blockName' => $block_name,
132 'attrs' => $shortcode_attrs,
133 ],
134 ];
135
136 // we need to remove this since this is processed twice for some blocks.
137 add_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10, 2 );
138
139 if ( ! empty( $this->old_blocks_by_name[ $block_name ] ) ) {
140 $old_block = \SureCart::block()
141 ->productPageBlocksMigration( $block, $this->old_blocks_by_name[ $block_name ] )
142 ->maybeRenderOldBlockFromShortcode( $name );
143 }
144
145 if ( ! empty( $old_block ) ) {
146 remove_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10 );
147 return $old_block;
148 }
149
150 $content = $this->processBlock( $block_name, $shortcode_attrs, $content );
151
152 remove_filter( 'doing_it_wrong_trigger_error', [ $this, 'removeInteractivityDoingItWrong' ], 10 );
153
154 return $content;
155 }
156 );
157 }
158
159 /**
160 * Process the block
161 *
162 * @param string $block_name Block name.
163 * @param array $shortcode_attrs Shortcode attributes.
164 * @param string $content Content.
165 *
166 * @return string
167 */
168 public function processBlock( $block_name, $shortcode_attrs, $content ) {
169 switch ( $block_name ) {
170 case 'surecart/product-list':
171 case 'surecart/product-collection':
172 return wp_interactivity_process_directives( \SureCart::block()->productListMigration( $shortcode_attrs )->render() );
173
174 case 'surecart/product-collection-tags':
175 return wp_interactivity_process_directives( \SureCart::block()->productCollectionBadgesMigration( $shortcode_attrs )->render() );
176
177 case 'surecart/product-price':
178 return wp_interactivity_process_directives( \SureCart::block()->productSelectedPriceMigration( $shortcode_attrs )->render() );
179
180 case 'surecart/product-price-choices':
181 return wp_interactivity_process_directives( \SureCart::block()->productPriceChoicesMigration( $shortcode_attrs )->render() );
182
183 case 'surecart/product-variant-choices':
184 return wp_interactivity_process_directives( \SureCart::block()->productVariantsMigration( $shortcode_attrs )->render() );
185 }
186
187 return wp_interactivity_process_directives(
188 do_blocks( '<!-- wp:' . $block_name . ' ' . wp_json_encode( $shortcode_attrs, JSON_FORCE_OBJECT ) . ' -->' . do_shortcode( $content ) . '<!-- /wp:' . $block_name . ' -->' )
189 );
190 }
191
192 /**
193 * Remove interactivity doing it wrong
194 *
195 * @param string $trigger Trigger.
196 * @param string $function_name Function name.
197 *
198 * @return string|false
199 */
200 public function removeInteractivityDoingItWrong( $trigger, $function_name ) {
201 if ( 'WP_Interactivity_API::evaluate' !== $function_name ) {
202 return $trigger;
203 }
204 return false;
205 }
206 }
207