PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / 3.1.4
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce v3.1.4
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.4, at classes/class-cartflows-loader.php

760 lines 22.5 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.4' );
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-bsf-admin-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 include_once CARTFLOWS_DIR . 'modules/content-generation/class-cartflows-ai-init.php';
534 }
535
536 /**
537 * Load Core Components.
538 *
539 * @since 1.0.0
540 *
541 * @return void
542 */
543 public function load_core_components() {
544 $this->logger = Cartflows_Logger::get_instance();
545 $this->flow = Cartflows_Flow_Frontend::get_instance();
546 }
547
548 /**
549 * Create files/directories.
550 */
551 public function create_files() {
552 // Install files and folders for uploading files and prevent hotlinking.
553 $upload_dir = wp_upload_dir();
554
555 $files = array(
556 array(
557 'base' => CARTFLOWS_LOG_DIR,
558 'file' => '.htaccess',
559 'content' => 'deny from all',
560 ),
561 array(
562 'base' => CARTFLOWS_LOG_DIR,
563 'file' => 'index.html',
564 'content' => '',
565 ),
566 );
567
568 foreach ( $files as $file ) {
569 if ( wp_mkdir_p( $file['base'] ) && ! file_exists( trailingslashit( $file['base'] ) . $file['file'] ) ) {
570 $file_handle = @fopen( trailingslashit( $file['base'] ) . $file['file'], 'w' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_fopen
571 if ( $file_handle ) {
572 fwrite( $file_handle, $file['content'] ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite, WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fwrite
573 fclose( $file_handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose
574 }
575 }
576 }
577 }
578
579 /**
580 * Load CartFlows Pro Text Domain.
581 * This will load the translation textdomain depending on the file priorities.
582 * 1. Global Languages /wp-content/languages/cartflows/ folder
583 * 2. Local dorectory /wp-content/plugins/cartflows/languages/ folder
584 *
585 * @since 1.0.3
586 * @return void
587 */
588 public function load_cf_textdomain() {
589 // Default languages directory for CartFlows Pro.
590 $lang_dir = CARTFLOWS_DIR . 'languages/';
591
592 /**
593 * Filters the languages directory path to use for CartFlows Pro.
594 *
595 * @param string $lang_dir The languages directory path.
596 */
597 $lang_dir = apply_filters( 'cartflows_languages_directory', $lang_dir );
598
599 // Traditional WordPress plugin locale filter.
600 global $wp_version;
601
602 $get_locale = get_locale();
603
604 if ( $wp_version >= 4.7 ) {
605 $get_locale = get_user_locale();
606 }
607
608 /**
609 * Language Locale for CartFlows Pro
610 *
611 * @var $get_locale The locale to use.
612 * Uses get_user_locale()` in WordPress 4.7 or greater,
613 * otherwise uses `get_locale()`.
614 */
615 $locale = apply_filters( 'plugin_locale', $get_locale, 'cartflows' );
616 $mofile = sprintf( '%1$s-%2$s.mo', 'cartflows', $locale );
617
618 // Setup paths to current locale file.
619 $mofile_local = $lang_dir . $mofile;
620 $mofile_global = WP_LANG_DIR . '/plugins/' . $mofile;
621
622 if ( file_exists( $mofile_global ) ) {
623 // Look in global /wp-content/languages/cartflows/ folder.
624 load_textdomain( 'cartflows', $mofile_global );
625 } elseif ( file_exists( $mofile_local ) ) {
626 // Look in local /wp-content/plugins/cartflows/languages/ folder.
627 load_textdomain( 'cartflows', $mofile_local );
628 } else {
629 // Load the default language files.
630 load_plugin_textdomain( 'cartflows', false, $lang_dir );
631 }
632 }
633
634 /**
635 * Fires admin notice when Elementor is not installed and activated.
636 *
637 * @since 1.0.0
638 *
639 * @return void
640 */
641 public function fails_to_load() {
642 $screen = get_current_screen();
643
644 if ( ! wcf()->utils->is_step_post_type() ) {
645 return;
646 }
647
648 if ( ! wcf()->utils->check_is_woo_required_page() ) {
649 return;
650 }
651
652 $skip_notice = false;
653
654 wp_localize_script( 'wcf-global-admin', 'cartflows_woo', array( 'show_update_post' => $skip_notice ) );
655
656 $class = 'notice notice-warning';
657 /* translators: %s: html tags */
658 $message = sprintf( __( 'This %1$sCartFlows%2$s page requires %1$sWooCommerce%2$s plugin installed & activated.', 'cartflows' ), '<strong>', '</strong>' );
659
660 $plugin = 'woocommerce/woocommerce.php';
661
662 if ( _is_woo_installed() ) {
663 if ( ! current_user_can( 'activate_plugins' ) ) {
664 return;
665 }
666
667 $action_url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin . '&amp;plugin_status=all&amp;paged=1&amp;s', 'activate-plugin_' . $plugin );
668 $button_label = __( 'Activate WooCommerce', 'cartflows' );
669 } else {
670 if ( ! current_user_can( 'install_plugins' ) ) {
671 return;
672 }
673
674 $action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=woocommerce' ), 'install-plugin_woocommerce' );
675 $button_label = __( 'Install WooCommerce', 'cartflows' );
676 }
677
678 $button = '<p><a href="' . $action_url . '" class="button-primary">' . $button_label . '</a></p><p></p>';
679
680 printf( '<div class="%1$s"><p>%2$s</p>%3$s</div>', esc_attr( $class ), wp_kses_post( $message ), wp_kses_post( $button ) );
681 }
682
683 /**
684 * Activation Reset
685 */
686 public function activation_reset() {
687 if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) {
688
689 $upload_dir = wp_upload_dir( null, false );
690
691 define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' );
692 }
693
694 $this->create_files();
695 include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php';
696 include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php';
697 include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-flow-post-type.php';
698 include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-step-post-type.php';
699
700 Cartflows_Flow_Post_Type::get_instance()->flow_post_type();
701 Cartflows_Step_Post_Type::get_instance()->step_post_type();
702 // Required to flush rules while registering custom post type.
703 flush_rewrite_rules(); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules
704
705 // Update the cartflows asset version when plugin activated.
706 update_option( 'cartflows-assets-version', time() );
707
708 update_option( 'wcf_start_onboarding', true );
709
710 // Record install time for time-to-value analytics (only on fresh install).
711 Cartflows_Helper::set_analytics_flag( 'usage_installed_time', time() );
712 }
713
714 /**
715 * Deactivation Reset
716 */
717 public function deactivation_reset() {
718 }
719
720 /**
721 * Logger Class Instance
722 */
723 public function logger() {
724 return Cartflows_Logger::get_instance();
725 }
726 }
727
728 /**
729 * Prepare if class 'Cartflows_Loader' exist.
730 * Kicking this off by calling 'get_instance()' method
731 */
732 Cartflows_Loader::get_instance();
733 }
734
735 /**
736 * Get global class.
737 *
738 * @return object
739 */
740 function wcf() { //phpcs:ignore Universal.Files.SeparateFunctionsFromOO.Mixed
741 return Cartflows_Loader::get_instance();
742 }
743
744 if ( ! function_exists( '_is_woo_installed' ) ) {
745
746 /**
747 * Is woocommerce plugin installed.
748 *
749 * @since 1.0.0
750 *
751 * @access public
752 */
753 function _is_woo_installed() {
754 $path = 'woocommerce/woocommerce.php';
755 $plugins = get_plugins();
756
757 return isset( $plugins[ $path ] );
758 }
759 }
760