define_constants(); // Activation hook. register_activation_hook( CARTFLOWS_FILE, array( $this, 'activation_reset' ) ); // deActivation hook. register_deactivation_hook( CARTFLOWS_FILE, array( $this, 'deactivation_reset' ) ); // Need to add library before the plugin loaded. https://actionscheduler.org/usage/. require_once CARTFLOWS_DIR . '/libraries/action-scheduler/action-scheduler.php'; add_action( 'plugins_loaded', array( $this, 'load_plugin' ), 99 ); add_action( 'plugins_loaded', array( $this, 'load_cf_textdomain' ) ); } /** * Defines all constants * * @since 1.0.0 */ public function define_constants() { define( 'CARTFLOWS_BASE', plugin_basename( CARTFLOWS_FILE ) ); define( 'CARTFLOWS_DIR', plugin_dir_path( CARTFLOWS_FILE ) ); define( 'CARTFLOWS_URL', plugins_url( '/', CARTFLOWS_FILE ) ); define( 'CARTFLOWS_VER', '2.0.2' ); define( 'CARTFLOWS_SLUG', 'cartflows' ); define( 'CARTFLOWS_SETTINGS', 'cartflows_settings' ); define( 'CARTFLOWS_NAME', 'CartFlows' ); define( 'CARTFLOWS_REQ_CF_PRO_VER', '2.0.0' ); // For backward compatibility we are setting CARTFLOWS_LEGACY_ADMIN to false, so pro-loader for new UI will be load. define( 'CARTFLOWS_LEGACY_ADMIN', false ); define( 'CARTFLOWS_ASSETS_VERSION', get_option( 'cartflows-assets-version', time() ) ); define( 'CARTFLOWS_FLOW_POST_TYPE', 'cartflows_flow' ); define( 'CARTFLOWS_STEP_POST_TYPE', 'cartflows_step' ); define( 'CARTFLOWS_FLOW_PERMALINK_SLUG', 'flow' ); define( 'CARTFLOWS_STEP_PERMALINK_SLUG', 'step' ); if ( ! defined( 'CARTFLOWS_SERVER_URL' ) ) { define( 'CARTFLOWS_SERVER_URL', 'https://my.cartflows.com/' ); } define( 'CARTFLOWS_DOMAIN_URL', 'https://cartflows.com/' ); define( 'CARTFLOWS_TEMPLATES_URL', 'https://templates.cartflows.com/' ); define( 'CARTFLOWS_TAXONOMY_STEP_TYPE', 'cartflows_step_type' ); define( 'CARTFLOWS_TAXONOMY_STEP_FLOW', 'cartflows_step_flow' ); if ( ! defined( 'CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER' ) ) { define( 'CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER', 'cartflows_step_page_builder' ); } if ( ! defined( 'CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER' ) ) { define( 'CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER', 'cartflows_flow_page_builder' ); } if ( ! defined( 'CARTFLOWS_TAXONOMY_FLOW_CATEGORY' ) ) { define( 'CARTFLOWS_TAXONOMY_FLOW_CATEGORY', 'cartflows_flow_category' ); } if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) { $upload_dir = wp_upload_dir( null, false ); define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' ); } $cookie_prefix = ''; if ( defined( 'CARTFLOWS_COOKIE_PREFIX' ) ) { $cookie_prefix = CARTFLOWS_COOKIE_PREFIX; } define( 'CARTFLOWS_ACTIVE_CHECKOUT', $cookie_prefix . 'wcf_active_checkout' ); if ( ! defined( 'CARTFLOWS_HTTPS' ) ) { define( 'CARTFLOWS_HTTPS', is_ssl() ? true : false ); } $GLOBALS['wcf_step'] = null; } /** * Get site slug * * @since 1.6.15 * @return string */ public function get_site_slug() { return Cartflows_Helper::get_common_setting( 'default_page_builder' ); } /** * Get site URL * * @since 1.6.15 * @param string $page_builder_slug Page builder slug. * @return string */ public function get_site_url( $page_builder_slug = '' ) { $page_builder_slug = ( ! empty( $page_builder_slug ) ) ? $page_builder_slug : wcf()->get_site_slug(); if ( ! empty( $page_builder_slug ) ) { return trailingslashit( CARTFLOWS_TEMPLATES_URL ) . $page_builder_slug . '/'; } return CARTFLOWS_TEMPLATES_URL; } /** * Loads plugin files. * * @since 1.0.0 * * @return void */ public function load_plugin() { $this->load_helper_files_components(); $this->load_core_files(); $this->load_core_components(); add_action( 'wp_loaded', array( $this, 'initialize' ) ); add_action( 'cartflows_pro_init', array( $this, 'after_cartflows_pro_init' ) ); if ( ! $this->is_woo_active ) { add_action( 'admin_notices', array( $this, 'fails_to_load' ) ); } /** * CartFlows Init. * * Fires when Cartflows is instantiated. * * @since 1.0.0 */ do_action( 'cartflows_init' ); } /** * After CartFlows Pro init. * * @since 1.1.19 * * @return void */ public function after_cartflows_pro_init() { if ( ! is_admin() ) { return; } if ( version_compare( CARTFLOWS_PRO_VER, CARTFLOWS_REQ_CF_PRO_VER, '<' ) ) { add_action( 'admin_notices', array( $this, 'required_cartflows_pro_notice' ) ); } if ( version_compare( CARTFLOWS_PRO_VER, '1.11.14', '=' ) && 'starter' === CARTFLOWS_PRO_PLUGIN_TYPE ) { add_action( 'admin_notices', array( $this, 'show_upgrade_starter_plan_notice' ) ); } } /** * Show CartFlows Pro: Starter plan update Notice. * * @since 1.11.14 * * @return void */ public function show_upgrade_starter_plan_notice() { $class = 'notice notice-warning wcf-notice'; /* translators: %s: html tags */ $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' ), '', '', CARTFLOWS_PRO_DISPLAY_TITLE, '', '' ); printf( '

%2$s

', esc_attr( $class ), wp_kses_post( $message ) ); } /** * Required CartFlows Pro Notice. * * @since 1.1.19 * * @return void */ public function required_cartflows_pro_notice() { $required_pro_version = CARTFLOWS_REQ_CF_PRO_VER; $class = 'notice notice-warning wcf-notice'; /* translators: %s: html tags */ $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' ), '', '', CARTFLOWS_PRO_DISPLAY_TITLE, $required_pro_version ); printf( '

%2$s

', esc_attr( $class ), wp_kses_post( $message ) ); } /** * Load Helper Files and Components. * * @since 1.0.0 * * @return void */ public function load_helper_files_components() { $this->is_woo_active = function_exists( 'WC' ); /* Public Utils */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-utils.php'; /* Public Global Name space Functions */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php'; /* Admin Helper */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php'; /* Factory objects */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-step-factory.php'; /* Meta Default Values */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-default-meta.php'; require_once CARTFLOWS_DIR . 'classes/class-cartflows-tracking.php'; if ( is_admin() ) { require_once CARTFLOWS_DIR . 'libraries/astra-notices/class-astra-notices.php'; } if ( ! class_exists( 'BSF_Analytics_Loader' ) ) { require_once CARTFLOWS_DIR . '/admin/bsf-analytics/class-bsf-analytics-loader.php'; } $bsf_analytics = BSF_Analytics_Loader::get_instance(); $bsf_analytics->set_entity( array( 'cf' => array( 'product_name' => 'CartFlows', 'usage_doc_link' => 'https://my.cartflows.com/usage-tracking/', 'path' => CARTFLOWS_DIR . 'admin/bsf-analytics', 'author' => 'CartFlows Inc', ), ) ); $this->utils = Cartflows_Utils::get_instance(); $this->options = Cartflows_Default_Meta::get_instance(); // Plugin major update notice. if ( ! class_exists( 'Cartflows_Plugin_Update_Notifications' ) ) { require_once CARTFLOWS_DIR . 'libraries/cartflows-plugin-update-notifications/class-cartflows-plugin-update-notifications.php'; } } /** * Init hooked function. * * @since 1.0.0 * * @return void */ public function initialize() { $this->assets_vars = $this->utils->get_assets_path(); } /** * Load Core Files. * * @since 1.0.0 * * @return void */ public function load_core_files() { /* Update compatibility. */ require_once CARTFLOWS_DIR . 'classes/class-cartflows-update.php'; /* Page builder compatibilty class */ include_once CARTFLOWS_DIR . 'compatibilities/class-cartflows-compatibility.php'; /* Theme support */ if ( $this->is_woo_active ) { /* Woo hooks */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-woo-hooks.php'; } /* Importer */ include_once CARTFLOWS_DIR . 'classes/importer/class-cartflows-importer-loader.php'; /* Admin Meta Fields*/ include_once CARTFLOWS_DIR . 'classes/fields/typography/class-cartflows-font-families.php'; if ( is_admin() ) { /* Admin helper */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin.php'; } /* New admin loader with namespace */ include_once CARTFLOWS_DIR . 'admin-loader.php'; if ( class_exists( 'WP_CLI' ) ) { /* New admin wp-cli with namespace */ require_once CARTFLOWS_DIR . 'admin-core/inc/wp-cli.php'; } /* Logger */ include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler-interface.php'; include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler.php'; include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler-file.php'; include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-levels.php'; include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-logger-interface.php'; include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-wc-logger.php'; /* Core Modules */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-logger.php'; /* Frontend Global */ include_once CARTFLOWS_DIR . 'classes/class-cartflows-frontend.php'; require_once CARTFLOWS_DIR . 'classes/class-cartflows-flow-frontend.php'; /* Modules */ include_once CARTFLOWS_DIR . 'modules/flow/class-cartflows-flow.php'; include_once CARTFLOWS_DIR . 'modules/landing/class-cartflows-landing.php'; if ( $this->is_woo_active ) { include_once CARTFLOWS_DIR . 'modules/checkout/class-cartflows-checkout.php'; include_once CARTFLOWS_DIR . 'modules/thankyou/class-cartflows-thankyou.php'; include_once CARTFLOWS_DIR . 'modules/optin/class-cartflows-optin.php'; include_once CARTFLOWS_DIR . 'modules/woo-dynamic-flow/class-cartflows-woo-dynamic-flow.php'; include_once CARTFLOWS_DIR . 'modules/email-report/class-cartflows-admin-report-emails.php'; } if ( class_exists( '\Elementor\Plugin' ) ) { // Load the widgets. include_once CARTFLOWS_DIR . 'modules/elementor/class-cartflows-el-widgets-loader.php'; } if ( class_exists( 'FLBuilder' ) ) { include_once CARTFLOWS_DIR . 'modules/beaver-builder/class-cartflows-bb-modules-loader.php'; } include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin-notices.php'; include_once CARTFLOWS_DIR . 'classes/deprecated/deprecated-hooks.php'; include_once CARTFLOWS_DIR . 'modules/gutenberg/classes/class-cartflows-block-loader.php'; } /** * Load Core Components. * * @since 1.0.0 * * @return void */ public function load_core_components() { $this->logger = Cartflows_Logger::get_instance(); $this->flow = Cartflows_Flow_Frontend::get_instance(); } /** * Create files/directories. */ public function create_files() { // Install files and folders for uploading files and prevent hotlinking. $upload_dir = wp_upload_dir(); $files = array( array( 'base' => CARTFLOWS_LOG_DIR, 'file' => '.htaccess', 'content' => 'deny from all', ), array( 'base' => CARTFLOWS_LOG_DIR, 'file' => 'index.html', 'content' => '', ), ); foreach ( $files as $file ) { if ( wp_mkdir_p( $file['base'] ) && ! file_exists( trailingslashit( $file['base'] ) . $file['file'] ) ) { $file_handle = @fopen( trailingslashit( $file['base'] ) . $file['file'], 'w' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_fopen if ( $file_handle ) { fwrite( $file_handle, $file['content'] ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite, WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fwrite fclose( $file_handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose } } } } /** * Load CartFlows Pro Text Domain. * This will load the translation textdomain depending on the file priorities. * 1. Global Languages /wp-content/languages/cartflows/ folder * 2. Local dorectory /wp-content/plugins/cartflows/languages/ folder * * @since 1.0.3 * @return void */ public function load_cf_textdomain() { // Default languages directory for CartFlows Pro. $lang_dir = CARTFLOWS_DIR . 'languages/'; /** * Filters the languages directory path to use for CartFlows Pro. * * @param string $lang_dir The languages directory path. */ $lang_dir = apply_filters( 'cartflows_languages_directory', $lang_dir ); // Traditional WordPress plugin locale filter. global $wp_version; $get_locale = get_locale(); if ( $wp_version >= 4.7 ) { $get_locale = get_user_locale(); } /** * Language Locale for CartFlows Pro * * @var $get_locale The locale to use. * Uses get_user_locale()` in WordPress 4.7 or greater, * otherwise uses `get_locale()`. */ $locale = apply_filters( 'plugin_locale', $get_locale, 'cartflows' ); $mofile = sprintf( '%1$s-%2$s.mo', 'cartflows', $locale ); // Setup paths to current locale file. $mofile_local = $lang_dir . $mofile; $mofile_global = WP_LANG_DIR . '/plugins/' . $mofile; if ( file_exists( $mofile_global ) ) { // Look in global /wp-content/languages/cartflows/ folder. load_textdomain( 'cartflows', $mofile_global ); } elseif ( file_exists( $mofile_local ) ) { // Look in local /wp-content/plugins/cartflows/languages/ folder. load_textdomain( 'cartflows', $mofile_local ); } else { // Load the default language files. load_plugin_textdomain( 'cartflows', false, $lang_dir ); } } /** * Fires admin notice when Elementor is not installed and activated. * * @since 1.0.0 * * @return void */ public function fails_to_load() { $screen = get_current_screen(); if ( ! wcf()->utils->is_step_post_type() ) { return; } if ( ! wcf()->utils->check_is_woo_required_page() ) { return; } $skip_notice = false; wp_localize_script( 'wcf-global-admin', 'cartflows_woo', array( 'show_update_post' => $skip_notice ) ); $class = 'notice notice-warning'; /* translators: %s: html tags */ $message = sprintf( __( 'This %1$sCartFlows%2$s page requires %1$sWooCommerce%2$s plugin installed & activated.', 'cartflows' ), '', '' ); $plugin = 'woocommerce/woocommerce.php'; if ( _is_woo_installed() ) { if ( ! current_user_can( 'activate_plugins' ) ) { return; } $action_url = wp_nonce_url( 'plugins.php?action=activate&plugin=' . $plugin . '&plugin_status=all&paged=1&s', 'activate-plugin_' . $plugin ); $button_label = __( 'Activate WooCommerce', 'cartflows' ); } else { if ( ! current_user_can( 'install_plugins' ) ) { return; } $action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=woocommerce' ), 'install-plugin_woocommerce' ); $button_label = __( 'Install WooCommerce', 'cartflows' ); } $button = '

' . $button_label . '

'; printf( '

%2$s

%3$s
', esc_attr( $class ), wp_kses_post( $message ), wp_kses_post( $button ) ); } /** * Activation Reset */ public function activation_reset() { if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) { $upload_dir = wp_upload_dir( null, false ); define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' ); } $this->create_files(); include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php'; include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php'; include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-flow-post-type.php'; include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-step-post-type.php'; Cartflows_Flow_Post_Type::get_instance()->flow_post_type(); Cartflows_Step_Post_Type::get_instance()->step_post_type(); // Required to flush rules while registering custom post type. flush_rewrite_rules(); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules // Update the cartflows asset version when plugin activated. update_option( 'cartflows-assets-version', time() ); update_option( 'wcf_start_onboarding', true ); } /** * Deactivation Reset */ public function deactivation_reset() { } /** * Logger Class Instance */ public function logger() { return Cartflows_Logger::get_instance(); } } /** * Prepare if class 'Cartflows_Loader' exist. * Kicking this off by calling 'get_instance()' method */ Cartflows_Loader::get_instance(); } /** * Get global class. * * @return object */ function wcf() { return Cartflows_Loader::get_instance(); } if ( ! function_exists( '_is_woo_installed' ) ) { /** * Is woocommerce plugin installed. * * @since 1.0.0 * * @access public */ function _is_woo_installed() { $path = 'woocommerce/woocommerce.php'; $plugins = get_plugins(); return isset( $plugins[ $path ] ); } }