include_refund_order_section(); } add_filter( 'get_user_option_meta-box-order_' . CARTFLOWS_STEP_POST_TYPE, array( $this, 'metabox_order' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'load_notice_script' ) ); add_action( 'wp_ajax_cartflows_migrate_order_bump', array( $this, 'migrate_order_bump' ) ); add_action( 'wp_ajax_cartflows_migrate_pre_checkout_offer_styles', array( $this, 'migrate_pre_checkout_styles' ) ); add_action( 'admin_notices', array( $this, 'migration_conditional_notices' ) ); add_filter( 'install_plugin_overwrite_comparison', array( $this, 'update_override_comparison_html' ), 10, 3 ); add_filter( 'cartflows_admin_exclude_import_meta_keys', array( $this, 'add_meta_keys_to_exclude_from_import' ) ); // Let WooCommerce know, CartFlows Pro is compatible with HPOS. add_action( 'before_woocommerce_init', array( $this, 'declare_woo_hpos_compatibility' ) ); add_action( 'wp_ajax_cartflows_dismiss_flow_analytics_notice', array( $this, 'dismiss_flow_analytics_notice' ) ); add_filter( 'cartflows_step_importer_args', array( $this, 'update_meta_before_import_json' ), 10, 1 ); add_filter( 'cartflows_template_import_meta_data', array( $this, 'update_meta_before_import_template' ), 10, 1 ); } /** * Remove ob product id from meta data. * * @param array $pre_post_data step data. * * @return array */ public function update_meta_before_import_json( $pre_post_data ) { if ( isset( $pre_post_data['meta_input'] ) ) { $step_meta_data = $pre_post_data['meta_input']; if ( isset( $step_meta_data['wcf-order-bumps'] ) && is_array( $step_meta_data['wcf-order-bumps'] ) ) { $order_bumps = $step_meta_data['wcf-order-bumps']; foreach ( $order_bumps as $key => $ob_data ) { if ( isset( $ob_data['product'] ) ) { unset( $order_bumps[ $key ]['product'] ); } } $pre_post_data['meta_input']['wcf-order-bumps'] = $order_bumps; } } return $pre_post_data; } /** * Remove ob product id from meta data. * * @param array $step_meta_data step meta data. * * @return array. */ public function update_meta_before_import_template( $step_meta_data ) { if ( ! empty( $step_meta_data ) && isset( $step_meta_data['wcf-order-bumps'] ) ) { $order_bumps = $step_meta_data['wcf-order-bumps'][0]; $is_serialize = is_serialized( $order_bumps, true ); if ( ! empty( $order_bumps ) ) { if ( $is_serialize ) { $order_bumps = maybe_unserialize( stripslashes( $order_bumps ) ); } elseif ( ! is_array( $order_bumps ) ) { $order_bumps = json_decode( stripslashes( $order_bumps ), true ); } if ( is_array( $order_bumps ) ) { foreach ( $order_bumps as $key => $ob_data ) { if ( isset( $ob_data['product'] ) ) { unset( $order_bumps[ $key ]['product'] ); } } } $step_meta_data['wcf-order-bumps'][0] = $is_serialize && is_array( $order_bumps ) ? maybe_serialize( $order_bumps ) : $order_bumps; } } return $step_meta_data; } /** * Declare the woo HPOS compatibility. */ public function declare_woo_hpos_compatibility() { if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) { \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', CARTFLOWS_PRO_FILE, true ); } } /** * Exclude meta keys for pro. * * @param array $meta_keys meta keys. */ public function add_meta_keys_to_exclude_from_import( $meta_keys ) { $pro_meta_keys = array( 'wcf-ab-test', 'wcf-yes-next-step', 'wcf-no-next-step', 'wcf-offer-product', 'wcf-order-bump-product', 'wcf-pre-checkout-offer-product', 'wcf-product-options-data', 'wcf-yes-next-step', 'wcf-no-next-step', 'wcf-checkout-rules', ); $meta_keys = array_merge( $meta_keys, $pro_meta_keys ); return $meta_keys; } /** * Show notice before downgrading to lower plan. * * @param string $table_html table html. * @param array $current_plugin current plugin data. * @param array $new_plugin new plugin data. * * @since x.x.x */ public function update_override_comparison_html( $table_html, $current_plugin, $new_plugin ) { if ( isset( $current_plugin['Name'] ) ) { if ( $current_plugin['Name'] === $new_plugin['Name'] ) { return $table_html; } if ( 'CartFlows Pro' === $current_plugin['Name'] ) { $table_html .= sprintf( /* translators: %1$s: HTML, %2$s: HTML */ __( '%1$sYou are installing the lower plan of the CartFlows compared to what currently you have, it will disable some pro features that you might be using. %2$s', 'cartflows-pro' ), '', '' ); } elseif ( 'CartFlows Plus' === $current_plugin['Name'] && 'CartFlows Starter' === $new_plugin['Name'] ) { $table_html .= sprintf( /* translators: %1$s: HTML, %2$s: HTML */ __( '%1$sYou are installing the lower plan of the CartFlows compared to what currently you have, it will disable some plus features that you might be using. %2$s', 'cartflows-pro' ), '', '' ); } } return $table_html; } /** * Show migration in process notice. * * @since 1.7.0 */ public function order_bump_migration_processing_notice() { $action_schedular_page_url = admin_url( 'admin.php?page=wc-status&tab=action-scheduler&s=cartflows' ); ?>
is_woo_active ) { return; } if ( ! $this->allowed_screen_for_notices() ) { return; } if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) { return; } if ( 'no' === get_option( 'wcf_order_bump_migrated', false ) ) { $this->migrate_order_bump_notice(); } elseif ( 'processing' === get_option( 'wcf_order_bump_migrated', false ) ) { $this->order_bump_migration_processing_notice(); } elseif ( 'done' === get_option( 'wcf_migration_complete_status', false ) ) { $this->migration_complete_notice(); } if ( 'no' === get_option( 'wcf_pre_checkout_offer_styles_migrated', false ) ) { $this->migrate_pre_checkout_styles_notice(); } elseif ( 'processing' === get_option( 'wcf_pre_checkout_offer_styles_migrated', false ) ) { $this->pre_checkout_offer_style_migration_processing_notice(); } elseif ( 'done' === get_option( 'wcf_pre_checkout_offer_styles_migration_complete_status', false ) ) { $this->pre_checkout_offer_migration_complete_notice(); } } /** * Show migration complete notice. * * @since 1.7.0 */ public function migration_complete_notice() { ?>
logger->migration_log( 'Initiating Order Bump migration process.' ); $response_data = array( 'success' => false, 'messsage' => __( 'Cannot schedule a migration. Action scheduler function not found.', 'cartflows-pro' ), ); if ( function_exists( 'as_enqueue_async_action' ) ) { as_enqueue_async_action( 'cartflows_migrate_order_bumps' ); update_option( 'wcf_order_bump_migrated', 'processing' ); $response_data = array( 'success' => true, 'messsage' => __( 'Order Bump 1st migration action scheduled successfully.', 'cartflows-pro' ), ); } wcf()->logger->migration_log( $response_data['messsage'] ); wp_send_json_success( $response_data ); } /** * New UI notice. * * @since 1.7.0 */ public function load_notice_script() { if ( ! $this->allowed_screen_for_notices() || ! current_user_can( 'cartflows_manage_flows_steps' ) ) { return; } // Loading Script file. wp_enqueue_script( 'cartflows-pro-notice', CARTFLOWS_PRO_URL . 'admin/assets/js/notices.js', array( 'jquery' ), CARTFLOWS_PRO_VER, false ); $action_schedular_page_url = admin_url( 'admin.php?page=wc-status&tab=action-scheduler&s=cartflows' ); $vars = array( 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'ob_migration_nonce' => wp_create_nonce( 'cartflows-migrate-order-bump' ), 'pre_checkout_offer_migration_nonce' => wp_create_nonce( 'cartflows-migrate-pre-checkout-offer-styles' ), /* translators: %1$1s: link html start, %2$12: link html end*/ 'ob_notice_text' => sprintf( __( 'CartFlows is migrating the old order bump to the new one in the background. The migration process may take a little while, so please be patient. %1$1s View Progress >> %2$2s', 'cartflows-pro' ), '', '' ), /* translators: %1$1s: link html start, %2$12: link html end*/ 'pre_checkout_offer_migration_notice' => sprintf( __( 'CartFlows is migrating the pre checkout offer styles in the background. The migration process may take a little while, so please be patient. %1$1s View Progress >> %2$2s', 'cartflows-pro' ), '', '' ), 'flow_analytics_dismiss_notice_nonce' => wp_create_nonce( 'cartflows-dismiss-flow-analytics-notice' ), ); wp_localize_script( 'cartflows-pro-notice', 'CartFlows_Pro_Common_Vars', $vars ); } /** * Migrate Order Bump notice. * * @since 1.7.0 */ public function migrate_order_bump_notice() { ?>
logger->migration_log( 'Initiating pre checkout offer migration process.' ); $response_data = array( 'success' => false, 'messsage' => __( 'Cannot schedule a migration. Action scheduler function not found.', 'cartflows-pro' ), ); if ( function_exists( 'as_enqueue_async_action' ) ) { as_enqueue_async_action( 'cartflows_migrate_pre_checkout_offer_styles' ); update_option( 'wcf_pre_checkout_offer_styles_migrated', 'processing' ); $response_data = array( 'success' => true, 'messsage' => __( '1st migration action scheduled successfully.', 'cartflows-pro' ), ); } wcf()->logger->migration_log( $response_data['messsage'] ); wp_send_json_success( $response_data ); } /** * Check allowed screen for notices. * * @since 1.7.0 * @return bool */ public function allowed_screen_for_notices() { $screen = get_current_screen(); $screen_id = $screen ? $screen->id : ''; $allowed_screens = array( 'toplevel_page_cartflows', 'dashboard', 'plugins', ); if ( in_array( $screen_id, $allowed_screens, true ) ) { return true; } return false; } /** * Metabox fixed orders. * * @param array $pro_metabox_order Metabox orders. * @return array */ public function metabox_order( $pro_metabox_order ) { if ( isset( $pro_metabox_order['side'] ) ) { $pro_metabox_order['side'] = str_replace( array( 'wcf-offer-settings', ), '', $pro_metabox_order['side'] ); } return $pro_metabox_order; } /** * License arguments for Rest API Request. * * @param array $defaults License arguments. * @return array License arguments. */ public function licence_args( $defaults ) { if ( ! class_exists( 'CartFlows_Pro_Licence' ) ) { return $defaults; } // Get license class instance. $cartflows_license_instance = cartflows_pro_license_instance(); $data = get_option( 'wc_am_client_' . $cartflows_license_instance->product_id . '_api_key', array() ); $licence_key = isset( $data['api_key'] ) ? esc_attr( $data['api_key'] ) : ''; $args = array( 'request' => 'status', 'product_id' => CARTFLOWS_PRO_PRODUCT_ID, 'instance' => $cartflows_license_instance->wc_am_instance_id, 'object' => $cartflows_license_instance->wc_am_domain, 'licence_key' => $licence_key, ); return apply_filters( 'cartflows_pro_licence_args', wp_parse_args( $args, $defaults ) ); } /** * Set default options for settings. * * @param array $settings settings data. * @since 1.0.0 */ public function set_default_settings( $settings ) { $settings['paypal_reference_transactions'] = 'disable'; $settings['pre_checkout_offer'] = 'disable'; return $settings; } /** * Hide order meta-data from order list backend. * * @param array $arr order meta data. * @return array * @since 1.0.0 */ public function custom_woocommerce_hidden_order_itemmeta( $arr ) { $arr[] = '_cartflows_step_id'; return $arr; } /** * Changing a meta title * * @param string $key The meta key. * @param WC_Meta_Data $meta The meta object. * @param WC_Order_Item $item The order item object. * @return string The title. */ public function change_order_item_meta_title( $key, $meta, $item ) { if ( '_cartflows_upsell' === $meta->key ) { $key = __( 'Upsell Offer', 'cartflows-pro' ); } elseif ( '_cartflows_downsell' === $meta->key ) { $key = __( 'Downsell Offer', 'cartflows-pro' ); } return $key; } /** * Admin body classes. * * Body classes to be added to tag in admin page * * @param String $classes body classes returned from the filter. * @return String body classes to be added to tag in admin page */ public static function add_admin_pro_body_class( $classes ) { $classes .= ' cartflows-pro-' . CARTFLOWS_PRO_VER; return $classes; } /** * Google analytics settings. * * @param array $google_analytics_settings_data settings. * * @return array $google_analytics_settings_data Modified settings. */ public function add_google_analytics_pro_events( $google_analytics_settings_data ) { $google_analytics_settings_data['enable_bump_order_add_to_cart'] = 'disable'; return $google_analytics_settings_data; } /** * Offer refund. */ public function include_refund_order_section() { /* Refund */ include_once CARTFLOWS_PRO_DIR . 'classes/class-cartflows-pro-refund.php'; } } /** * Prepare if class 'Cartflows_Pro_Admin' exist. * Kicking this off by calling 'get_instance()' method */ Cartflows_Pro_Admin::get_instance();