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 / CompatibilityService.php
surecart / app / src / WordPress Last commit date
Admin 2 months ago Assets 2 weeks ago CLI 2 years ago Cache 2 weeks ago Pages 10 months ago PostTypes 2 months ago Posts 1 year ago Shortcodes 1 month ago Taxonomies 1 year ago Templates 1 year ago Users 2 months ago ActionsService.php 3 years ago CompatibilityService.php 4 months ago CurrencyService.php 4 months ago GoogleMapApiService.php 2 months ago HealthService.php 2 months ago LineItemStateService.php 2 years ago PluginActionLinksService.php 1 year ago PluginService.php 1 year ago PluginServiceProvider.php 1 year ago RecaptchaValidationService.php 2 years ago StateService.php 7 months ago ThemeService.php 4 months ago ThemeServiceProvider.php 7 months ago TranslationsServiceProvider.php 3 months ago UpgradeNoticeService.php 1 year ago
CompatibilityService.php
269 lines
1 <?php
2 /**
3 * Compatibility service.
4 *
5 * @package SureCartAppCore
6 * @author SureCart <support@surecart.com>
7 * @copyright SureCart
8 * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0
9 * @link https://surecart.com
10 */
11
12 namespace SureCart\WordPress;
13
14 use SureCart\WordPress\Admin\Notices\AdminNoticesService;
15
16 /**
17 * Provides compatibility with other plugins.
18 */
19 class CompatibilityService {
20 /**
21 * Bootstrap the service.
22 *
23 * @return void
24 */
25 public function bootstrap() {
26 // UAG fix.
27 add_action( 'render_block_data', [ $this, 'maybeEnqueueUAGBAssets' ] );
28 // SC Form Shortcode fix.
29 add_filter( 'surecart/shortcode/render', [ $this, 'maybeEnqueueUAGBAssetsForShortcode' ], 5, 3 );
30
31 // rankmath fix.
32 add_action( 'rank_math/head', [ $this, 'rankMathFix' ] );
33 add_filter( 'rank_math/frontend/canonical', [ $this, 'rankMathUrlFix' ] );
34 add_filter( 'rank_math/sitemap/xml_post_url', [ $this, 'rankMathUrlFix' ] );
35 add_filter( 'rank_math/sitemap/post_type_archive_link', [ $this, 'rankMathUrlFix' ] );
36
37 // Yoast SEO fix.
38 add_action( 'wpseo_frontend_presenters', [ $this, 'yoastSEOFix' ] );
39
40 // Siteground JS combine exclude.
41 add_filter( 'sgo_javascript_combine_exclude_ids', [ $this, 'sitegroundJsCombineExcludeScriptIds' ] );
42
43 // Show gutenberg active notice.
44 add_action( 'admin_init', [ $this, 'gutenbergActiveNotice' ] );
45
46 // Load Divi Compatibility CSS.
47 add_action( 'wp_enqueue_scripts', [ $this, 'diviCompatibility' ] );
48
49 // Load Bricks Compatibility CSS.
50 add_action( 'wp_enqueue_scripts', [ $this, 'bricksCompatibility' ] );
51
52 // Load Blocks Global Styles if enabled by Merchant in the setting.
53 if ( (bool) get_option( 'surecart_load_block_assets_on_demand', false ) && \SureCart::theme()->shouldLoadOnDemandBlockAssets() ) {
54 add_filter( 'should_load_separate_core_block_assets', '__return_true' );
55 }
56
57 add_action( 'render_block', [ $this, 'fixKadenceAccordionPaneButtonType' ], 10, 2 );
58 }
59
60 /**
61 * Adds type="button" to the button in the Kadence Accordion Pane.
62 * This prevents the button from submitting the form.
63 *
64 * @param string $content Block content.
65 * @param array $block Block data.
66 *
67 * @return string
68 */
69 public function fixKadenceAccordionPaneButtonType( $content, $block ) {
70 if ( 'kadence/pane' === $block['blockName'] ) {
71 $processor = new \WP_HTML_Tag_Processor( $content );
72 $has_tag = $processor->next_tag( 'button' );
73 if ( $has_tag ) {
74 $processor->set_attribute( 'type', 'button' );
75 }
76 return $processor->get_updated_html();
77 }
78 return $content;
79 }
80
81 /**
82 * Load Divi Compatibility CSS.
83 *
84 * @return void
85 */
86 public function diviCompatibility() {
87 if ( ! is_plugin_active( 'divi-builder/divi-builder.php' ) ) {
88 return;
89 }
90 wp_enqueue_style( 'surecart-divi-compatibility', plugins_url( 'styles/divi-compatibility.css', SURECART_PLUGIN_FILE ), '', \SureCart::plugin()->version(), 'all' );
91 }
92
93 /**
94 * Load Bricks Compatibility CSS.
95 *
96 * @return void
97 */
98 public function bricksCompatibility() {
99 $active_theme = wp_get_theme();
100
101 if ( empty( $active_theme ) || 'Bricks' !== $active_theme->get( 'Name' ) ) {
102 return;
103 }
104
105 wp_enqueue_style( 'surecart-bricks-compatibility', plugins_url( 'styles/bricks-compatibility.css', SURECART_PLUGIN_FILE ), '', \SureCart::plugin()->version(), 'all' );
106 }
107
108 /** Prevent Yoast SEO from outputing SEO meta tags on our custom pages.
109 *
110 * @param array $presenters Presenters.
111 * @return array Empty Array.
112 */
113 public function yoastSEOFix( $presenters ) {
114 if ( is_singular( 'sc_product' ) || is_singular( 'sc_collection' ) || is_singular( 'sc_upsell' ) ) {
115 $title_presenters = array_filter(
116 $presenters,
117 function ( $item ) {
118 return strpos( get_class( $item ), 'SEO\Presenters\Title_Presenter' );
119 }
120 );
121 return apply_filters( 'sc_wpseo_frontend_presenters', $title_presenters, $presenters );
122 }
123
124 return $presenters;
125 }
126
127 /**
128 * Prevent rankmath from outputting og:tags on our custom pages.
129 *
130 * @return void
131 */
132 public function rankMathFix() {
133 if ( is_singular( 'sc_product' ) || is_singular( 'sc_collection' ) || is_singular( 'sc_upsell' ) ) {
134 remove_all_actions( 'rank_math/opengraph/facebook' );
135 remove_all_actions( 'rank_math/opengraph/twitter' );
136 }
137 }
138
139 /**
140 * Fix the canonical URL for rankmath.
141 *
142 * @param string $canonical The canonical URL.
143 *
144 * @return string
145 */
146 public function rankMathUrlFix( $canonical ) {
147 // Some Rank Math filters may pass boolean false to indicate the archive/link
148 // should not be included. If $canonical is empty or not a string, don't process.
149 if ( empty( $canonical ) || ! is_string( $canonical ) ) {
150 return $canonical;
151 }
152
153 return remove_query_arg( 'currency', $canonical );
154 }
155
156 /**
157 * Render block data.
158 *
159 * @param array $parsed_block Block data.
160 *
161 * @return array
162 */
163 public function maybeEnqueueUAGBAssets( $parsed_block ) {
164 // UAGB must be activated.
165 if ( ! class_exists( '\UAGB_Post_Assets' ) ) {
166 return $parsed_block;
167 }
168
169 // must be our checkout form block.
170 if ( 'surecart/checkout-form' !== $parsed_block['blockName'] && 'surecart/upsell' !== $parsed_block['blockName'] ) {
171 return $parsed_block;
172 }
173
174 $post = get_post();
175 $upsell_id = isset( $post->upsell->id ) ? $post->upsell->id : null;
176
177 $id = $parsed_block['attrs']['id'] ?? $upsell_id;
178
179 if ( empty( $id ) ) {
180 return $parsed_block;
181 }
182
183 // If Spectra Blocks are present in the form, enqueue the assets.
184 $post_assets_instance = new \UAGB_Post_Assets( $id );
185 $post_assets_instance->enqueue_scripts(); // This will enqueue the JS and CSS files.
186
187 if ( ! empty( $post_assets_instance->file_generation ) && 'disabled' === $post_assets_instance->file_generation ) {
188 add_action( 'wp_footer', array( $post_assets_instance, 'print_stylesheet' ) ); // As on checkout page, the wp_head action is loaded late & Spectra prints inline CSS on that action for file_generation disabled case, we need to print the CSS on footer.
189 }
190
191 return $parsed_block;
192 }
193
194 /**
195 * Filter SC Form Shortcode to load the Spectra Blocks Assets.
196 *
197 * @param string $output Content.
198 * @param array $attributes Shortcode attributes.
199 * @param string $name Shortcode Tag.
200 *
201 * @return array
202 */
203 public function maybeEnqueueUAGBAssetsForShortcode( $output, $attributes, $name ) {
204 // UAGB must be activated.
205 if ( ! class_exists( '\UAGB_Post_Assets' ) ) {
206 return $output;
207 }
208
209 // must be our form shortcode.
210 if ( 'sc_form' !== $name ) {
211 return $output;
212 }
213
214 // must have an ID.
215 if ( empty( $attributes['id'] ) ) {
216 return $output;
217 }
218
219 // If Spectra Blocks are present in the form, enqueue the assets.
220 $post_assets_instance = new \UAGB_Post_Assets( $attributes['id'] );
221 $post_assets_instance->enqueue_scripts();
222
223 return $output;
224 }
225
226 /**
227 * Show the Gutenberg active notice.
228 *
229 * @return void
230 */
231 public function gutenbergActiveNotice(): void {
232 if ( is_plugin_active( 'gutenberg/gutenberg.php' ) ) {
233 ( new AdminNoticesService() )->add(
234 [
235 'name' => 'gutenberg_active_notice',
236 'type' => 'warning',
237 'title' => esc_html__( 'SureCart', 'surecart' ),
238 'text' => wp_kses_post( __( '<p>The Gutenberg plugin is currently active. SureCart blocks might not perform as expected within the block editor. If you encounter any issues, consider disabling the Gutenberg plugin.<p>', 'surecart' ) ),
239 ]
240 );
241 }
242 }
243
244 /**
245 * Exclude SureCart JS modules from Siteground JS combine.
246 * This is to prevent the JS modules from being combined and minified by Siteground.
247 *
248 * @param array $exclude_ids Array of JS module IDs to exclude.
249 *
250 * @return array
251 */
252 public function sitegroundJsCombineExcludeScriptIds( $exclude_ids ) {
253 // WordPress scripts which depends on interactivity.
254 $exclude_ids[] = '@wordpress/block-library/navigation/view-js-module';
255
256 // SureCart scripts.
257 $exclude_ids[] = '@surecart/product-page-js-module';
258 $exclude_ids[] = '@surecart/image-slider-js-module';
259 $exclude_ids[] = '@surecart/checkout-js-module';
260 $exclude_ids[] = '@surecart/cart-js-module';
261 $exclude_ids[] = '@surecart/checkout-service-js-module';
262 $exclude_ids[] = '@surecart/checkout-events-js-module';
263 $exclude_ids[] = '@surecart/dropdown-js-module';
264 $exclude_ids[] = '@surecart/product-list-js-module';
265
266 return $exclude_ids;
267 }
268 }
269