PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / 3.1.1
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce v3.1.1
3.3.0 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.1 trunk 1.0.4 1.1.0 1.1.0.1 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 All 162 releases
cartflows / classes / class-cartflows-loader.php

class-cartflows-loader.php in CartFlows – Funnel Builder & Checkout Plugin for WooCommerce 3.1.1, at classes/class-cartflows-loader.php

758 lines 22.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * CartFlows Loader.
4 *
5 * @package CartFlows
6 */
7
8 // Exit if accessed directly.
9 if ( ! defined( 'ABSPATH' ) ) {
10 exit;
11 }
12 if ( ! class_exists( 'Cartflows_Loader' ) ) {
13
14 /**
15 * Class Cartflows_Loader.
16 */
17 final class Cartflows_Loader {
18
19 /**
20 * Member Variable
21 *
22 * @var instance
23 */
24 private static $instance = null;
25
26 /**
27 * Member Variable
28 *
29 * @var utils
30 */
31 public $utils = null;
32
33 /**
34 * Member Variable
35 *
36 * @var logger
37 */
38 public $logger = null;
39
40 /**
41 * Member Variable
42 *
43 * @var options
44 */
45 public $options = null;
46
47 /**
48 * Member Variable
49 *
50 * @var meta
51 */
52 public $meta = null;
53
54 /**
55 * Member Variable
56 *
57 * @var Tracking_Data
58 */
59 public $alldata;
60
61 /**
62 * Member Variable
63 *
64 * @var flow
65 */
66 public $flow = null;
67
68 /**
69 * Member Variable
70 *
71 * @var wcf_step_objs
72 */
73
74 public $wcf_step_objs = array();
75
76 /**
77 * Member Variable
78 *
79 * @var assets_vars
80 */
81 public $assets_vars = null;
82
83 /**
84 * Member Variable
85 *
86 * @var assets_vars
87 */
88
89 public $is_woo_active = true;
90
91 /**
92 * Initiator
93 */
94 public static function get_instance() {
95 if ( is_null( self::$instance ) ) {
96
97 self::$instance = new self();
98
99 /**
100 * CartFlows loaded.
101 *
102 * Fires when Cartflows was fully loaded and instantiated.
103 *
104 * @since 1.0.0
105 */
106 do_action( 'cartflows_loaded' );
107 }
108
109 return self::$instance;
110 }
111
112 /**
113 * Constructor
114 */
115 public function __construct() {
116 $this->define_constants();
117
118 // Activation hook.
119 register_activation_hook( CARTFLOWS_FILE, array( $this, 'activation_reset' ) );
120
121 // deActivation hook.
122 register_deactivation_hook( CARTFLOWS_FILE, array( $this, 'deactivation_reset' ) );
123
124 // Need to add library before the plugin loaded. https://actionscheduler.org/usage/.
125 require_once CARTFLOWS_DIR . '/libraries/action-scheduler/action-scheduler.php';
126
127 add_action( 'plugins_loaded', array( $this, 'load_plugin' ), 99 );
128 add_action( 'init', array( $this, 'load_cf_textdomain' ) );
129
130 // Priority 5 mirrors Astra's init_bsf_analytics() pattern: set_entity() must
131 // run before BSF_Analytics_Loader::load_analytics() fires at priority 10.
132 add_action( 'init', array( $this, 'deactivation_survey_data_handler' ), 5 );
133 }
134
135 /**
136 * Defines all constants
137 *
138 * @since 1.0.0
139 */
140 public function define_constants() {
141
142 define( 'CARTFLOWS_BASE', plugin_basename( CARTFLOWS_FILE ) );
143 define( 'CARTFLOWS_DIR', plugin_dir_path( CARTFLOWS_FILE ) );
144 define( 'CARTFLOWS_URL', plugins_url( '/', CARTFLOWS_FILE ) );
145
146 define( 'CARTFLOWS_VER', '3.1.1' );
147 define( 'CARTFLOWS_SLUG', 'cartflows' );
148 define( 'CARTFLOWS_SETTINGS', 'cartflows_settings' );
149 define( 'CARTFLOWS_NAME', 'CartFlows' );
150
151 define( 'CARTFLOWS_REQ_CF_PRO_VER', '3.1.0' );
152
153 // Resolves to true for users upgrading from <3.0.0 (set by Cartflows_Update on first 3.0+ admin_init)
154 // and stays true until the user opts out via the Advanced-tab toggle or the legacy in-app switch.
155 // Fresh installs never see this option set, so they default to the new UI. The toggle saves
156 // 'enable'/'disable' strings; older code paths may have stored a boolean true — accept both.
157 $cartflows_legacy_admin_saved = get_option( 'cartflows-legacy-admin', false );
158 define( 'CARTFLOWS_LEGACY_ADMIN', in_array( $cartflows_legacy_admin_saved, array( true, 1, '1', 'enable', 'yes' ), true ) );
159
160 define( 'CARTFLOWS_ASSETS_VERSION', get_option( 'cartflows-assets-version', time() ) );
161
162 define( 'CARTFLOWS_FLOW_POST_TYPE', 'cartflows_flow' );
163 define( 'CARTFLOWS_STEP_POST_TYPE', 'cartflows_step' );
164
165 define( 'CARTFLOWS_FLOW_PERMALINK_SLUG', 'flow' );
166 define( 'CARTFLOWS_STEP_PERMALINK_SLUG', 'step' );
167
168 if ( ! defined( 'CARTFLOWS_SERVER_URL' ) ) {
169 define( 'CARTFLOWS_SERVER_URL', 'https://my.cartflows.com/' );
170 }
171 if ( ! defined( 'CARTFLOWS_DOMAIN_URL' ) ) {
172 define( 'CARTFLOWS_DOMAIN_URL', 'https://cartflows.com/' );
173 }
174 if ( ! defined( 'CARTFLOWS_TEMPLATES_URL' ) ) {
175 define( 'CARTFLOWS_TEMPLATES_URL', 'https://templates.cartflows.com/' );
176 }
177 define( 'CARTFLOWS_TAXONOMY_STEP_TYPE', 'cartflows_step_type' );
178 define( 'CARTFLOWS_TAXONOMY_STEP_FLOW', 'cartflows_step_flow' );
179
180 if ( ! defined( 'CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER' ) ) {
181 define( 'CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER', 'cartflows_step_page_builder' );
182 }
183 if ( ! defined( 'CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER' ) ) {
184 define( 'CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER', 'cartflows_flow_page_builder' );
185 }
186 if ( ! defined( 'CARTFLOWS_TAXONOMY_FLOW_CATEGORY' ) ) {
187 define( 'CARTFLOWS_TAXONOMY_FLOW_CATEGORY', 'cartflows_flow_category' );
188 }
189
190 if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) {
191
192 $upload_dir = wp_upload_dir( null, false );
193
194 define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' );
195 }
196
197 $cookie_prefix = '';
198
199 if ( defined( 'CARTFLOWS_COOKIE_PREFIX' ) ) {
200 $cookie_prefix = CARTFLOWS_COOKIE_PREFIX;
201 }
202
203 define( 'CARTFLOWS_ACTIVE_CHECKOUT', $cookie_prefix . 'wcf_active_checkout' );
204
205 define( 'CARTFLOWS_PINTEREST_CONSENT', $cookie_prefix . 'cartflows_pinterest_consent' );
206
207 if ( ! defined( 'CARTFLOWS_HTTPS' ) ) {
208 define( 'CARTFLOWS_HTTPS', is_ssl() ? true : false );
209 }
210
211 define( 'CARTFLOWS_NPS_WEBHOOK_URL', 'https://webhook.ottokit.com/ottokit/af2151cc-6fe3-40a4-a9d3-12859be4d602' );
212
213 $GLOBALS['wcf_step'] = null;
214 }
215
216 /**
217 * Get site slug
218 *
219 * @since 1.6.15
220 * @return string
221 */
222 public function get_site_slug() {
223 return Cartflows_Helper::get_common_setting( 'default_page_builder' );
224 }
225
226 /**
227 * Get site URL
228 *
229 * @since 1.6.15
230 * @param string $page_builder_slug Page builder slug.
231 * @return string
232 */
233 public function get_site_url( $page_builder_slug = '' ) {
234
235 $page_builder_slug = ( ! empty( $page_builder_slug ) ) ? $page_builder_slug : wcf()->get_site_slug();
236
237 if ( ! empty( $page_builder_slug ) ) {
238 return trailingslashit( CARTFLOWS_TEMPLATES_URL ) . $page_builder_slug . '/';
239 }
240
241 return CARTFLOWS_TEMPLATES_URL;
242 }
243
244 /**
245 * Loads plugin files.
246 *
247 * @since 1.0.0
248 *
249 * @return void
250 */
251 public function load_plugin() {
252 $this->load_helper_files_components();
253 $this->load_core_files();
254 $this->load_core_components();
255
256 add_action( 'wp_loaded', array( $this, 'initialize' ) );
257 add_action( 'cartflows_pro_init', array( $this, 'after_cartflows_pro_init' ) );
258
259 if ( ! $this->is_woo_active ) {
260 add_action( 'admin_notices', array( $this, 'fails_to_load' ) );
261 }
262
263 /**
264 * CartFlows Init.
265 *
266 * Fires when Cartflows is instantiated.
267 *
268 * @since 1.0.0
269 */
270 do_action( 'cartflows_init' );
271 }
272
273 /**
274 * After CartFlows Pro init.
275 *
276 * @since 1.1.19
277 *
278 * @return void
279 */
280 public function after_cartflows_pro_init() {
281 if ( ! is_admin() ) {
282 return;
283 }
284
285 if ( version_compare( CARTFLOWS_PRO_VER, CARTFLOWS_REQ_CF_PRO_VER, '<' ) ) {
286 add_action( 'admin_notices', array( $this, 'required_cartflows_pro_notice' ) );
287 }
288
289 if ( version_compare( CARTFLOWS_PRO_VER, '1.11.14', '=' ) && 'starter' === CARTFLOWS_PRO_PLUGIN_TYPE ) {
290 add_action( 'admin_notices', array( $this, 'show_upgrade_starter_plan_notice' ) );
291 }
292 }
293
294 /**
295 * Show CartFlows Pro: Starter plan update Notice.
296 *
297 * @since 1.11.14
298 *
299 * @return void
300 */
301 public function show_upgrade_starter_plan_notice() {
302
303 $class = 'notice notice-warning wcf-notice';
304 /* translators: %s: html tags */
305 $message = sprintf( __( 'The new version of %1$s%3$s%2$s is released. Please download the latest zip to install the new updates. Click here to %4$sdownload%5$s.', 'cartflows' ), '<strong>', '</strong>', CARTFLOWS_PRO_DISPLAY_TITLE, '<a href="https://my.cartflows.com/" target="_blank">', '</a>' );
306
307 printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), wp_kses_post( $message ) );
308 }
309
310 /**
311 * Required CartFlows Pro Notice.
312 *
313 * @since 1.1.19
314 *
315 * @return void
316 */
317 public function required_cartflows_pro_notice() {
318 $required_pro_version = CARTFLOWS_REQ_CF_PRO_VER;
319
320 $class = 'notice notice-warning wcf-notice';
321 /* translators: %s: html tags */
322 $message = sprintf( __( 'You are using an older version of %1$s%3$s%2$s. Please update %1$s%3$s%2$s plugin to version %1$s%4$s%2$s or higher.', 'cartflows' ), '<strong>', '</strong>', CARTFLOWS_PRO_DISPLAY_TITLE, $required_pro_version );
323
324 printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), wp_kses_post( $message ) );
325 }
326
327 /**
328 * Load Helper Files and Components.
329 *
330 * @since 1.0.0
331 *
332 * @return void
333 */
334 public function load_helper_files_components() {
335 $this->is_woo_active = function_exists( 'WC' );
336
337 /* Public Utils */
338 include_once CARTFLOWS_DIR . 'classes/class-cartflows-utils.php';
339
340 /* Public Global Name space Functions */
341 include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php';
342
343 /* Admin Helper */
344 include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php';
345
346 /* Factory objects */
347 include_once CARTFLOWS_DIR . 'classes/class-cartflows-step-factory.php';
348
349 /* Meta Default Values */
350 include_once CARTFLOWS_DIR . 'classes/class-cartflows-default-meta.php';
351
352 require_once CARTFLOWS_DIR . 'classes/class-cartflows-tracking.php';
353 require_once CARTFLOWS_DIR . 'classes/class-cartflows-rollback.php';
354
355 if ( is_admin() ) {
356 require_once CARTFLOWS_DIR . 'libraries/astra-notices/class-astra-notices.php';
357 }
358
359 if ( ! class_exists( 'BSF_Analytics_Loader' ) ) {
360 require_once CARTFLOWS_DIR . 'libraries/bsf-analytics/class-bsf-analytics-loader.php';
361 }
362
363 $this->utils = Cartflows_Utils::get_instance();
364 $this->options = Cartflows_Default_Meta::get_instance();
365
366 // Plugin major update notice.
367 if ( ! class_exists( 'Cartflows_Plugin_Update_Notifications' ) ) {
368 require_once CARTFLOWS_DIR . 'libraries/cartflows-plugin-update-notifications/class-cartflows-plugin-update-notifications.php';
369 }
370
371 // Load the NPS Survey library.
372 if ( ! class_exists( 'Cartflows_Nps_Survey' ) ) {
373 require_once CARTFLOWS_DIR . 'libraries/class-cartflows-nps-survey.php';
374 }
375
376 // Load the CartFlows Pointer library.
377 if ( ! class_exists( 'Cartflows_Pointer' ) ) {
378 require_once CARTFLOWS_DIR . 'libraries/cartflows-pointer/class-cartflows-pointer.php';
379 }
380 }
381
382 /**
383 * Deactivation Survey Data Handler
384 *
385 * @since 2.1.17
386 *
387 * @return void
388 */
389 public function deactivation_survey_data_handler() {
390 $bsf_analytics = BSF_Analytics_Loader::get_instance();
391
392 $bsf_analytics->set_entity(
393 array(
394 'cf' => array(
395 'hide_optin_checkbox' => true,
396 'product_name' => 'CartFlows',
397 'usage_doc_link' => 'https://my.cartflows.com/usage-tracking/',
398 'path' => CARTFLOWS_DIR . 'libraries/bsf-analytics',
399 'author' => 'CartFlows Inc',
400 'deactivation_survey' => apply_filters(
401 'cartflows_bsf_analytics_deactivation_survey_data',
402 array(
403 array(
404 'id' => 'deactivation-survey-cartflows',
405 'popup_logo' => CARTFLOWS_URL . 'admin-core/assets/images/cartflows-icon.svg',
406 'plugin_slug' => 'cartflows',
407 'plugin_version' => CARTFLOWS_VER,
408 'popup_title' => __( 'Quick Feedback', 'cartflows' ),
409 'support_url' => 'https://cartflows.com/contact/',
410 'popup_description' => __( 'If you have a moment, please share why you are deactivating CartFlows:', 'cartflows' ),
411 'show_on_screens' => array( 'plugins' ),
412 ),
413 )
414 ),
415 ),
416 )
417 );
418 }
419
420 /**
421 * Init hooked function.
422 *
423 * @since 1.0.0
424 *
425 * @return void
426 */
427 public function initialize() {
428 $this->assets_vars = $this->utils->get_assets_path();
429 }
430
431 /**
432 * Load Core Files.
433 *
434 * @since 1.0.0
435 *
436 * @return void
437 */
438 public function load_core_files() {
439 /* Update compatibility. */
440 require_once CARTFLOWS_DIR . 'classes/class-cartflows-update.php';
441
442 /* Page builder compatibilty class */
443 include_once CARTFLOWS_DIR . 'compatibilities/class-cartflows-compatibility.php';
444
445 /* Theme support */
446 if ( $this->is_woo_active ) {
447 /* Woo hooks */
448 include_once CARTFLOWS_DIR . 'classes/class-cartflows-woo-hooks.php';
449 }
450
451 /* Importer */
452 include_once CARTFLOWS_DIR . 'classes/importer/class-cartflows-importer-loader.php';
453
454 /* Admin Meta Fields*/
455 include_once CARTFLOWS_DIR . 'classes/fields/typography/class-cartflows-font-families.php';
456
457 // Analytics — BSF Analytics Events integration. Loaded on every request so the
458 // bsf_core_stats filter is registered for both frontend and admin transmissions.
459 include_once CARTFLOWS_DIR . 'classes/class-cartflows-analytics.php';
460
461 if ( is_admin() ) {
462
463 /* Admin helper */
464 include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin.php';
465
466 /* Dashboard widget — funnel performance summary on wp-admin/index.php. */
467 include_once CARTFLOWS_DIR . 'classes/class-cartflows-dashboard-widget.php';
468 }
469
470 /* Admin loader — fork between legacy (admin-legacy-core/) and current (admin-core/) UI. */
471 if ( defined( 'CARTFLOWS_LEGACY_ADMIN' ) && CARTFLOWS_LEGACY_ADMIN ) {
472 include_once CARTFLOWS_DIR . 'admin-legacy-loader.php';
473 } else {
474 include_once CARTFLOWS_DIR . 'admin-loader.php';
475 }
476
477 if ( class_exists( 'WP_CLI' ) ) {
478 /* WP-CLI registration follows the active UI tree. */
479 if ( defined( 'CARTFLOWS_LEGACY_ADMIN' ) && CARTFLOWS_LEGACY_ADMIN ) {
480 require_once CARTFLOWS_DIR . 'admin-legacy-core/inc/wp-cli.php';
481 } else {
482 require_once CARTFLOWS_DIR . 'admin-core/inc/wp-cli.php';
483 }
484 }
485
486 /* Logger */
487 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler-interface.php';
488 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler.php';
489 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler-file.php';
490 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-levels.php';
491 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-logger-interface.php';
492 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-wc-logger.php';
493
494 /* Core Modules */
495 include_once CARTFLOWS_DIR . 'classes/class-cartflows-logger.php';
496
497 /* Frontend Global */
498 include_once CARTFLOWS_DIR . 'classes/class-cartflows-frontend.php';
499 require_once CARTFLOWS_DIR . 'classes/class-cartflows-flow-frontend.php';
500
501 /* Modules */
502 include_once CARTFLOWS_DIR . 'modules/flow/class-cartflows-flow.php';
503 include_once CARTFLOWS_DIR . 'modules/landing/class-cartflows-landing.php';
504
505 if ( $this->is_woo_active ) {
506 include_once CARTFLOWS_DIR . 'modules/checkout/class-cartflows-checkout.php';
507 include_once CARTFLOWS_DIR . 'modules/thankyou/class-cartflows-thankyou.php';
508 include_once CARTFLOWS_DIR . 'modules/optin/class-cartflows-optin.php';
509 include_once CARTFLOWS_DIR . 'modules/woo-dynamic-flow/class-cartflows-woo-dynamic-flow.php';
510 include_once CARTFLOWS_DIR . 'modules/email-report/class-cartflows-admin-report-emails.php';
511 }
512
513 if ( class_exists( '\Elementor\Plugin' ) ) {
514 // Load the widgets.
515 include_once CARTFLOWS_DIR . 'modules/elementor/class-cartflows-el-widgets-loader.php';
516 }
517
518 if ( class_exists( 'FLBuilder' ) ) {
519
520 include_once CARTFLOWS_DIR . 'modules/beaver-builder/class-cartflows-bb-modules-loader.php';
521 }
522
523 include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin-notices.php';
524
525 include_once CARTFLOWS_DIR . 'classes/deprecated/deprecated-hooks.php';
526
527 include_once CARTFLOWS_DIR . 'modules/gutenberg/classes/class-cartflows-block-loader.php';
528
529 // Abilities API (WordPress 6.9+).
530 require_once CARTFLOWS_DIR . 'abilities/class-cartflows-abilities-loader.php';
531 include_once CARTFLOWS_DIR . 'modules/webhook/class-cartflows-webhook-loader.php';
532 }
533
534 /**
535 * Load Core Components.
536 *
537 * @since 1.0.0
538 *
539 * @return void
540 */
541 public function load_core_components() {
542 $this->logger = Cartflows_Logger::get_instance();
543 $this->flow = Cartflows_Flow_Frontend::get_instance();
544 }
545
546 /**
547 * Create files/directories.
548 */
549 public function create_files() {
550 // Install files and folders for uploading files and prevent hotlinking.
551 $upload_dir = wp_upload_dir();
552
553 $files = array(
554 array(
555 'base' => CARTFLOWS_LOG_DIR,
556 'file' => '.htaccess',
557 'content' => 'deny from all',
558 ),
559 array(
560 'base' => CARTFLOWS_LOG_DIR,
561 'file' => 'index.html',
562 'content' => '',
563 ),
564 );
565
566 foreach ( $files as $file ) {
567 if ( wp_mkdir_p( $file['base'] ) && ! file_exists( trailingslashit( $file['base'] ) . $file['file'] ) ) {
568 $file_handle = @fopen( trailingslashit( $file['base'] ) . $file['file'], 'w' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_fopen
569 if ( $file_handle ) {
570 fwrite( $file_handle, $file['content'] ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite, WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fwrite
571 fclose( $file_handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose
572 }
573 }
574 }
575 }
576
577 /**
578 * Load CartFlows Pro Text Domain.
579 * This will load the translation textdomain depending on the file priorities.
580 * 1. Global Languages /wp-content/languages/cartflows/ folder
581 * 2. Local dorectory /wp-content/plugins/cartflows/languages/ folder
582 *
583 * @since 1.0.3
584 * @return void
585 */
586 public function load_cf_textdomain() {
587 // Default languages directory for CartFlows Pro.
588 $lang_dir = CARTFLOWS_DIR . 'languages/';
589
590 /**
591 * Filters the languages directory path to use for CartFlows Pro.
592 *
593 * @param string $lang_dir The languages directory path.
594 */
595 $lang_dir = apply_filters( 'cartflows_languages_directory', $lang_dir );
596
597 // Traditional WordPress plugin locale filter.
598 global $wp_version;
599
600 $get_locale = get_locale();
601
602 if ( $wp_version >= 4.7 ) {
603 $get_locale = get_user_locale();
604 }
605
606 /**
607 * Language Locale for CartFlows Pro
608 *
609 * @var $get_locale The locale to use.
610 * Uses get_user_locale()` in WordPress 4.7 or greater,
611 * otherwise uses `get_locale()`.
612 */
613 $locale = apply_filters( 'plugin_locale', $get_locale, 'cartflows' );
614 $mofile = sprintf( '%1$s-%2$s.mo', 'cartflows', $locale );
615
616 // Setup paths to current locale file.
617 $mofile_local = $lang_dir . $mofile;
618 $mofile_global = WP_LANG_DIR . '/plugins/' . $mofile;
619
620 if ( file_exists( $mofile_global ) ) {
621 // Look in global /wp-content/languages/cartflows/ folder.
622 load_textdomain( 'cartflows', $mofile_global );
623 } elseif ( file_exists( $mofile_local ) ) {
624 // Look in local /wp-content/plugins/cartflows/languages/ folder.
625 load_textdomain( 'cartflows', $mofile_local );
626 } else {
627 // Load the default language files.
628 load_plugin_textdomain( 'cartflows', false, $lang_dir );
629 }
630 }
631
632 /**
633 * Fires admin notice when Elementor is not installed and activated.
634 *
635 * @since 1.0.0
636 *
637 * @return void
638 */
639 public function fails_to_load() {
640 $screen = get_current_screen();
641
642 if ( ! wcf()->utils->is_step_post_type() ) {
643 return;
644 }
645
646 if ( ! wcf()->utils->check_is_woo_required_page() ) {
647 return;
648 }
649
650 $skip_notice = false;
651
652 wp_localize_script( 'wcf-global-admin', 'cartflows_woo', array( 'show_update_post' => $skip_notice ) );
653
654 $class = 'notice notice-warning';
655 /* translators: %s: html tags */
656 $message = sprintf( __( 'This %1$sCartFlows%2$s page requires %1$sWooCommerce%2$s plugin installed & activated.', 'cartflows' ), '<strong>', '</strong>' );
657
658 $plugin = 'woocommerce/woocommerce.php';
659
660 if ( _is_woo_installed() ) {
661 if ( ! current_user_can( 'activate_plugins' ) ) {
662 return;
663 }
664
665 $action_url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin . '&amp;plugin_status=all&amp;paged=1&amp;s', 'activate-plugin_' . $plugin );
666 $button_label = __( 'Activate WooCommerce', 'cartflows' );
667 } else {
668 if ( ! current_user_can( 'install_plugins' ) ) {
669 return;
670 }
671
672 $action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=woocommerce' ), 'install-plugin_woocommerce' );
673 $button_label = __( 'Install WooCommerce', 'cartflows' );
674 }
675
676 $button = '<p><a href="' . $action_url . '" class="button-primary">' . $button_label . '</a></p><p></p>';
677
678 printf( '<div class="%1$s"><p>%2$s</p>%3$s</div>', esc_attr( $class ), wp_kses_post( $message ), wp_kses_post( $button ) );
679 }
680
681 /**
682 * Activation Reset
683 */
684 public function activation_reset() {
685 if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) {
686
687 $upload_dir = wp_upload_dir( null, false );
688
689 define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' );
690 }
691
692 $this->create_files();
693 include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php';
694 include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php';
695 include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-flow-post-type.php';
696 include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-step-post-type.php';
697
698 Cartflows_Flow_Post_Type::get_instance()->flow_post_type();
699 Cartflows_Step_Post_Type::get_instance()->step_post_type();
700 // Required to flush rules while registering custom post type.
701 flush_rewrite_rules(); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules
702
703 // Update the cartflows asset version when plugin activated.
704 update_option( 'cartflows-assets-version', time() );
705
706 update_option( 'wcf_start_onboarding', true );
707
708 // Record install time for time-to-value analytics (only on fresh install).
709 Cartflows_Helper::set_analytics_flag( 'usage_installed_time', time() );
710 }
711
712 /**
713 * Deactivation Reset
714 */
715 public function deactivation_reset() {
716 }
717
718 /**
719 * Logger Class Instance
720 */
721 public function logger() {
722 return Cartflows_Logger::get_instance();
723 }
724 }
725
726 /**
727 * Prepare if class 'Cartflows_Loader' exist.
728 * Kicking this off by calling 'get_instance()' method
729 */
730 Cartflows_Loader::get_instance();
731 }
732
733 /**
734 * Get global class.
735 *
736 * @return object
737 */
738 function wcf() { //phpcs:ignore Universal.Files.SeparateFunctionsFromOO.Mixed
739 return Cartflows_Loader::get_instance();
740 }
741
742 if ( ! function_exists( '_is_woo_installed' ) ) {
743
744 /**
745 * Is woocommerce plugin installed.
746 *
747 * @since 1.0.0
748 *
749 * @access public
750 */
751 function _is_woo_installed() {
752 $path = 'woocommerce/woocommerce.php';
753 $plugins = get_plugins();
754
755 return isset( $plugins[ $path ] );
756 }
757 }
758