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