elementor_editor_compatibility(); $this->gutenberg_editor_compatibility(); $this->bb_editor_compatibility(); } /** * Elementor editor compatibility. */ public function elementor_editor_compatibility() { add_action( 'cartflows_elementor_editor_compatibility', function( $post_id, $elementor_ajax ) { add_action( 'cartflows_elementor_before_optin_shortcode', array( $this, 'before_optin_shortcode_actions' ) ); }, 10, 2 ); } /** * Beaver Builder editor compatibility. */ public function bb_editor_compatibility() { add_action( 'cartflows_bb_editor_compatibility', function( $post_id ) { add_action( 'cartflows_bb_before_optin_shortcode', array( $this, 'before_optin_shortcode_actions' ) ); }, 10, 1 ); } /** * Gutenburg editor compatibility. */ public function gutenberg_editor_compatibility() { add_action( 'cartflows_gutenberg_before_optin_shortcode', array( $this, 'before_optin_shortcode_actions' ) ); } /** * Remove login and registration actions. */ public function remove_woo_actions() { if ( _is_wcf_doing_optin_ajax() ) { if ( isset( $_POST['billing_email'] ) && ! empty( $_POST['billing_email'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing if ( email_exists( sanitize_email( wp_unslash( $_POST['billing_email'] ) ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing add_filter( 'woocommerce_checkout_registration_required', '__return_false' ); add_filter( 'woocommerce_checkout_registration_enabled', '__return_false' ); } } add_filter( 'woocommerce_checkout_registration_enabled', '__return_false' ); } add_action( 'cartflows_woo_checkout_update_order_review', array( $this, 'filter_remove_woo_data' ) ); } /** * Filter or remove woo data on update order review ajax call. * * @param string $post_data post data woo. * @return void */ public function filter_remove_woo_data( $post_data ) { if ( isset( $post_data['_wcf_optin_id'] ) ) { add_filter( 'woocommerce_get_terms_and_conditions_checkbox_text', '__return_false' ); add_filter( 'woocommerce_order_button_text', array( $this, 'place_order_button_text' ), 1 ); } } /** * Change order button text . * * @param string $button_text place order. * @return string */ public function place_order_button_text( $button_text ) { $optin_id = get_the_ID(); if ( ! $optin_id && isset( Cartflows_Woo_Hooks::$ajax_data['_wcf_optin_id'] ) ) { $optin_id = intval( Cartflows_Woo_Hooks::$ajax_data['_wcf_optin_id'] ); } if ( $optin_id ) { $wcf_order_button_text = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-button-text' ); if ( ! empty( $wcf_order_button_text ) ) { $button_text = $wcf_order_button_text; } } return $button_text; } /** * Display all WooCommerce notices. * * @since 1.1.5 */ public function display_woo_notices() { if ( null != WC()->session && function_exists( 'woocommerce_output_all_notices' ) ) { woocommerce_output_all_notices(); } } /** * Check for checkout flag * * @param bool $is_checkout is checkout. * * @return bool */ public function woo_checkout_flag( $is_checkout ) { if ( ! is_admin() ) { if ( _is_wcf_optin_type() ) { $is_checkout = true; } } return $is_checkout; } /** * Render checkout shortcode markup. * * @param array $atts attributes. * @return string */ public function optin_shortcode_markup( $atts ) { if ( ! function_exists( 'wc_print_notices' ) ) { $notice_out = '

' . __( 'WooCommerce functions do not exist. If you are in an IFrame, please reload it.', 'cartflows' ) . '

'; $notice_out .= ''; return $notice_out; } $atts = shortcode_atts( array( 'id' => 0, ), $atts ); $optin_id = intval( $atts['id'] ); $show_optin_preview = false; if ( is_admin() ) { $show_optin_preview = apply_filters( 'cartflows_show_demo_optin_form', false ); if ( $show_optin_preview && 0 === $optin_id ) { if ( isset( $_POST['id'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing $optin_id = intval( $_POST['id'] ); //phpcs:ignore WordPress.Security.NonceVerification.Missing } } } if ( empty( $optin_id ) && ! is_admin() ) { if ( ! _is_wcf_optin_type() && ! $show_optin_preview ) { return '

' . __( 'Please place shortcode on Optin step-type only.', 'cartflows' ) . '

'; } global $post; $optin_id = intval( $post->ID ); } $output = ''; ob_start(); do_action( 'cartflows_optin_form_before', $optin_id ); $optin_layout = 'default'; $template_default = CARTFLOWS_OPTIN_DIR . 'templates/optin-template-simple.php'; include $template_default; $output .= ob_get_clean(); return $output; } /** * Configure Cart Data. * * @since 1.0.0 * * @return void */ public function preconfigured_cart_data() { if ( is_admin() ) { return; } global $post; if ( _is_wcf_optin_type() ) { if ( wp_doing_ajax() ) { return; } else { $optin_id = $post->ID; do_action( 'cartflows_optin_before_configure_cart', $optin_id ); $products = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-optin-product' ); if ( ! is_array( $products ) ) { return; } /* Empty the current cart */ WC()->cart->empty_cart(); if ( is_array( $products ) && count( $products ) < 1 ) { wc_add_notice( __( 'No product is selected. Please select a Simple, Virtual and Free product from the meta settings.', 'cartflows' ), 'error' ); return; } /* Set customer session if not set */ if ( ! is_user_logged_in() && WC()->cart->is_empty() ) { WC()->session->set_customer_session_cookie( true ); } $product_id = reset( $products ); $_product = wc_get_product( $product_id ); if ( ! empty( $_product ) ) { if ( $_product->is_type( 'simple' ) && $_product->is_virtual() ) { if ( $_product->get_price() > 0 ) { wc_add_notice( __( 'Please update the selected product\'s price to zero (0).', 'cartflows' ), 'error' ); } else { $quantity = 1; WC()->cart->add_to_cart( $product_id, $quantity ); } } else { wc_add_notice( __( 'Please select a Simple, Virtual and Free product.', 'cartflows' ), 'error' ); } } else { wc_add_notice( __( 'Please select a Simple, Virtual and Free product.', 'cartflows' ), 'error' ); } do_action( 'cartflows_optin_after_configure_cart', $optin_id ); } } } /** * Load shortcode data. * * @return void */ public function shortcode_load_data() { if ( _is_wcf_optin_type() ) { add_action( 'wp_enqueue_scripts', array( $this, 'shortcode_scripts' ), 21 ); add_action( 'wp_enqueue_scripts', array( $this, 'compatibility_scripts' ), 101 ); $this->before_optin_shortcode_actions(); global $post; $optin_id = $post->ID; do_action( 'cartflows_optin_before_shortcode', $optin_id ); } } /** * Before option shortcode actions. */ public function before_optin_shortcode_actions() { /* Show notices if cart has errors */ add_action( 'woocommerce_cart_has_errors', 'woocommerce_output_all_notices' ); // Outputting the hidden field in checkout page. add_action( 'woocommerce_after_order_notes', array( $this, 'checkout_shortcode_post_id' ), 99 ); add_action( 'woocommerce_login_form_end', array( $this, 'checkout_shortcode_post_id' ), 99 ); /* Remove unnecessary option */ add_filter( 'woocommerce_enable_order_notes_field', '__return_false' ); add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false' ); remove_all_actions( 'woocommerce_before_checkout_form' ); remove_all_actions( 'woocommerce_checkout_billing' ); remove_all_actions( 'woocommerce_checkout_shipping' ); remove_all_actions( 'woocommerce_checkout_before_order_review' ); remove_all_actions( 'woocommerce_checkout_order_review' ); remove_all_actions( 'woocommerce_checkout_after_order_review' ); add_filter( 'woocommerce_cart_needs_payment', '__return_false' ); add_filter( 'woocommerce_available_payment_gateways', array( $this, 'disable_payment_gateways' ) ); /* Paypal Expresss remove */ if ( function_exists( 'wc_gateway_ppec' ) ) { remove_action( 'wp_enqueue_scripts', array( wc_gateway_ppec()->cart, 'enqueue_scripts' ) ); } // Hook in actions once. add_action( 'woocommerce_before_checkout_form', 'woocommerce_output_all_notices', 10 ); add_action( 'woocommerce_checkout_billing', array( WC()->checkout, 'checkout_form_billing' ) ); add_action( 'woocommerce_checkout_shipping', array( WC()->checkout, 'checkout_form_shipping' ) ); add_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 ); /* Submit Button */ add_filter( 'woocommerce_order_button_text', array( $this, 'place_order_button_text' ), 10, 1 ); add_filter( 'woocommerce_get_terms_and_conditions_checkbox_text', '__return_false' ); /* Remove login actions */ add_filter( 'woocommerce_checkout_registration_enabled', '__return_false' ); add_filter( 'woocommerce_checkout_registration_required', '__return_false' ); } /** * Disable payment gateways. * * @param array $available_gateways gateways. * @return array */ public function disable_payment_gateways( $available_gateways ) { if ( ! is_admin() ) { $available_gateways = array(); } return $available_gateways; } /** * Render checkout ID hidden field. * * @param array $checkout checkout session data. * @return void */ public function checkout_shortcode_post_id( $checkout ) { if ( ! _is_wcf_optin_type() ) { return; } global $post; $optin_id = $post->ID; $flow_id = get_post_meta( $optin_id, 'wcf-flow-id', true ); echo ''; echo ''; } /** * Load shortcode scripts. * * @return void */ public function shortcode_scripts() { wp_enqueue_style( 'wcf-optin-template', wcf()->utils->get_css_url( 'optin-template' ), '', CARTFLOWS_VER ); wp_enqueue_script( 'wcf-optin-template', wcf()->utils->get_js_url( 'optin-template' ), array( 'jquery' ), CARTFLOWS_VER, true ); do_action( 'cartflows_optin_scripts' ); $optin_dynamic_css = apply_filters( 'cartflows_optin_enable_dynamic_css', true ); if ( $optin_dynamic_css ) { global $post; $optin_id = $post->ID; $style = get_post_meta( $optin_id, 'wcf-dynamic-css', true ); $css_version = get_post_meta( $optin_id, 'wcf-dynamic-css-version', true ); if ( empty( $style ) || CARTFLOWS_ASSETS_VERSION !== $css_version ) { $style = $this->generate_style(); update_post_meta( $optin_id, 'wcf-dynamic-css', wp_slash( $style ) ); update_post_meta( $optin_id, 'wcf-dynamic-css-version', CARTFLOWS_ASSETS_VERSION ); } /* Load all fonts */ CartFlows_Font_Families::render_fonts( $optin_id ); wp_add_inline_style( 'wcf-optin-template', $style ); } } /** * Load compatibility scripts. * * @return void */ public function compatibility_scripts() { global $post; $optin_id = $post->ID; // Add DIVI Compatibility css if DIVI theme is enabled. if ( Cartflows_Compatibility::get_instance()->is_divi_enabled() || Cartflows_Compatibility::get_instance()->is_divi_builder_enabled( $optin_id ) ) { wp_enqueue_style( 'wcf-optin-template-divi', wcf()->utils->get_css_url( 'optin-template-divi' ), '', CARTFLOWS_VER ); } } /** * Generate styles. * * @return string */ public function generate_style() { global $post; $optin_id = $post->ID; $r = ''; $g = ''; $b = ''; $output = ''; /* Global */ $primary_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-primary-color' ); $base_font_family = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-base-font-family' ); /* Input Fields */ $input_font_family = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-input-font-family' ); $input_font_weight = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-input-font-weight' ); $field_input_size = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-input-field-size' ); $field_tb_padding = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-field-tb-padding' ); $field_lr_padding = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-field-lr-padding' ); $field_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-field-color' ); $field_bg_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-field-bg-color' ); $field_border_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-field-border-color' ); $field_label_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-field-label-color' ); if ( 'custom' == $field_input_size ) { $field_input_size = '38px'; } /* Submit Button */ $submit_button_width = '100%'; $optin_button_position = ''; $button_font_size = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-font-size' ); $button_font_family = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-button-font-family' ); $button_font_weight = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-button-font-weight' ); $submit_button_height = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-button-size' ); $submit_tb_padding = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-tb-padding' ); $submit_lr_padding = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-lr-padding' ); $submit_button_position = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-button-position' ); $submit_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-color' ); $submit_hover_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-hover-color' ); $submit_bg_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-bg-color', $primary_color ); $submit_bg_hover_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-bg-hover-color', $primary_color ); $submit_border_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-border-color', $primary_color ); $submit_border_hover_color = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-border-hover-color', $primary_color ); if ( 'custom' == $submit_button_height ) { $submit_button_height = '38px'; $submit_button_width = 'auto'; switch ( $submit_button_position ) { case 'left': $optin_button_position = '0 auto 0 0'; break; case 'center': $optin_button_position = '0 auto'; break; case 'right': $optin_button_position = '0 0 0 auto'; break; default: $optin_button_position = '0 auto'; break; } } if ( Cartflows_Compatibility::get_instance()->is_divi_enabled() || Cartflows_Compatibility::get_instance()->is_divi_builder_enabled( $optin_id ) ) { include CARTFLOWS_OPTIN_DIR . 'includes/optin-dynamic-divi-css.php'; } else { include CARTFLOWS_OPTIN_DIR . 'includes/optin-dynamic-css.php'; } return $output; } /** * Get ajax end points. * * @param string $endpoint_url end point URL. * @param string $request end point request. * @return string */ public function get_ajax_endpoint( $endpoint_url, $request ) { global $post; if ( ! empty( $post ) && ! empty( $_SERVER['REQUEST_URI'] ) ) { if ( _is_wcf_optin_type() ) { if ( mb_strpos( $endpoint_url, 'checkout', 0, 'utf-8' ) === false ) { if ( '' === $request ) { $query_args = array( 'wc-ajax' => '%%endpoint%%', ); } else { $query_args = array( 'wc-ajax' => $request, ); } $uri = explode( '?', esc_url_raw( $_SERVER['REQUEST_URI'] ), 2 ); $uri = $uri[0]; $endpoint_url = esc_url( add_query_arg( $query_args, $uri ) ); } } } return $endpoint_url; } /** * Save checkout fields. * * @param int $order_id order id. * @param array $posted posted data. * @return void */ public function save_optin_fields( $order_id, $posted ) { // We are calling this function on WooCommerce action where nonce is verified. //phpcs:disable WordPress.Security.NonceVerification.Missing $optin_id = isset( $_POST['_wcf_optin_id'] ) ? intval( wp_unslash( $_POST['_wcf_optin_id'] ) ) : 0; if ( CARTFLOWS_STEP_POST_TYPE === get_post_type( $optin_id ) ) { update_post_meta( $order_id, '_wcf_optin_id', $optin_id ); } $flow_id = isset( $_POST['_wcf_flow_id'] ) ? intval( wp_unslash( $_POST['_wcf_flow_id'] ) ) : 0; if ( CARTFLOWS_FLOW_POST_TYPE === get_post_type( $flow_id ) ) { update_post_meta( $order_id, '_wcf_flow_id', $flow_id ); } //phpcs:enable WordPress.Security.NonceVerification.Missing } /** * Redirect users to our checkout if hidden param * * @param string $redirect redirect url. * @param object $user user. * @return string */ public function after_login_redirect( $redirect, $user ) { // We are calling this function on WooCommerce action where nonce is verified. //phpcs:disable WordPress.Security.NonceVerification.Missing if ( isset( $_POST['_wcf_optin_id'] ) ) { $optin_id = intval( $_POST['_wcf_optin_id'] ); $redirect = get_permalink( $optin_id ); } //phpcs:enable WordPress.Security.NonceVerification.Missing return $redirect; } /** * Add custom class to the fields to change the UI to three column. * * @param array $fields fields. */ public function set_optin_default_fields( $fields ) { if ( _is_wcf_optin_type() ) { global $post; $optin_id = $post->ID; } else { if ( _is_wcf_doing_optin_ajax() && wcf()->utils->get_optin_id_from_post_data() ) { $optin_id = wcf()->utils->get_optin_id_from_post_data(); } else { return $fields; } } $first_name = $fields['first_name']; $last_name = $fields['last_name']; /* Make fields required */ $first_name['required'] = true; $last_name['required'] = true; $fields = array( 'first_name' => $first_name, 'last_name' => $last_name, ); return apply_filters( 'cartflows_optin_default_fields', $fields, $optin_id ); } /** * Add custom class to the fields to change the UI to three column. * * @param array $fields fields. */ public function set_optin_fields( $fields ) { if ( _is_wcf_optin_type() ) { global $post; $optin_id = $post->ID; } else { if ( _is_wcf_doing_optin_ajax() && wcf()->utils->get_optin_id_from_post_data() ) { $optin_id = wcf()->utils->get_optin_id_from_post_data(); } else { return $fields; } } $billing_first_name = $fields['billing']['billing_first_name']; $billing_last_name = $fields['billing']['billing_last_name']; $billing_email = $fields['billing']['billing_email']; $fields['billing'] = array( 'billing_first_name' => $billing_first_name, 'billing_last_name' => $billing_last_name, 'billing_email' => $billing_email, ); return apply_filters( 'cartflows_optin_fields', $fields, $optin_id ); } /** * Billing field customization. * * @param array $fields fields data. * @param string $country country name. * @return array */ public function billing_optin_fields( $fields, $country ) { //phpcs:disable WordPress.Security.NonceVerification.Missing $show_optin_preview = false; if ( is_admin() ) { $show_optin_preview = apply_filters( 'cartflows_show_demo_optin_form', false ); } if ( _is_wcf_optin_type() || $show_optin_preview ) { global $post; if ( $post ) { $optin_id = $post->ID; } else { if ( is_admin() && isset( $_POST['id'] ) ) { $optin_id = intval( $_POST['id'] ); } } } else { if ( _is_wcf_doing_optin_ajax() && wcf()->utils->get_optin_id_from_post_data() ) { $optin_id = wcf()->utils->get_optin_id_from_post_data(); } else { return $fields; } } if ( is_wc_endpoint_url( 'edit-address' ) ) { return $fields; } $billing_first_name = $fields['billing_first_name']; $billing_last_name = $fields['billing_last_name']; $billing_email = $fields['billing_email']; /* Make fields required */ $billing_first_name['required'] = true; $billing_last_name['required'] = true; $fields = array( 'billing_first_name' => $billing_first_name, 'billing_last_name' => $billing_last_name, 'billing_email' => $billing_email, ); return apply_filters( 'cartflows_billing_optin_fields', $fields, $country, $optin_id ); //phpcs:enable WordPress.Security.NonceVerification.Missing } /** * Replace billing label. * * @param string $notice Notice. * @param string $field_label Field name. * @return string */ public function change_field_label_in_required_notice( $notice, $field_label ) { if ( _is_wcf_doing_optin_ajax() ) { $notice = str_replace( 'Billing ', '', $notice ); } return $notice; } } /** * Kicking this off by calling 'get_instance()' method */ Cartflows_Optin_Markup::get_instance();