is_active_sellkit_pro) { return; } add_action('wp', [$this, 'checkout_block_bump_query_var']); add_action('wp', [$this, 'init_sellkit_global_checkout']); add_action('wp_ajax_handle_sellkit_global_checkout_ajax_requests', [$this, 'handle_ajax_requests']); } /** * Order bump for sellkit checkout block * * @since 2.3.0 */ public function checkout_block_bump_query_var() { $global_checkout_id = get_option(self::SELLKIT_GLOBAL_CHECKOUT_OPTION, 0); $steps = get_post_meta($global_checkout_id, 'nodes', true); $bump_data = []; if (! is_array($steps)) { return; } foreach ($steps as $step) { $step['type'] = (array) $step['type']; if ('checkout' === $step['type']['key']) { $bump_data = ! empty($step['bump']) ? $step['bump'] : []; } } if (! empty($bump_data)) { $bump_data = $this->get_valid_bumps($bump_data); set_query_var('bump_data', $bump_data); } } /** * Init sellkit global checkout. * * @since 1.7.4 */ public function init_sellkit_global_checkout() { $global_checkout_id = get_option(self::SELLKIT_GLOBAL_CHECKOUT_OPTION, 0); if ( 0 === $global_checkout_id || 'publish' !== get_post_status((int) $global_checkout_id) || (function_exists('is_checkout') && ! is_checkout()) ) { return; } $steps = get_post_meta($global_checkout_id, 'nodes', true); $checkout_id = 0; $bump_data = []; $optimization_data = ''; $funnel_id = 0; if (! is_array($steps)) { return; } foreach ($steps as $step) { $step['type'] = (array) $step['type']; if ('checkout' === $step['type']['key']) { $checkout_id = apply_filters('wpml_object_id', $step['page_id'], 'sellkit_step', true); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- WPML API. $bump_data = ! empty($step['bump']) ? $step['bump'] : []; $optimization_data = ! empty($step['data']['optimization']) ? $step['data']['optimization'] : ''; $funnel_id = isset($step['funnel_id']) ? $step['funnel_id'] : 0; } } $checkout_steps = get_post_meta($checkout_id, 'step_data', true); if (empty($funnel_id) && ! empty($checkout_steps)) { $funnel_id = isset($checkout_steps['funnel_id']) ? $checkout_steps['funnel_id'] : 0; } if (0 === $checkout_id) { return; } // Remove previous content. remove_all_filters('the_content'); if (defined('ELEMENTOR_VERSION') && 'elementor' === sellkit()->page_builder()) { // Set the page content. add_filter('the_content', function () use ($checkout_id) { ob_Start(); $content = Elementor::instance()->frontend->get_builder_content_for_display((int) $checkout_id, true); echo do_shortcode($content); return ob_get_clean(); }, 5); // Set sellkit canvas templates as the page template. add_action('template_redirect', function () { // Let WooCommerce clear the cart on a successful order-received visit before // our exit prevents its priority-20 hook from ever running. if (function_exists('wc_clear_cart_after_payment')) { wc_clear_cart_after_payment(); } sellkit()->load_files([ 'templates/canvas' ]); exit; }); } if ('gutenberg' === sellkit()->page_builder()) { $this->load_checkout_block_frontend(); $checkout_post = get_post($checkout_id); global $post; $post = $checkout_post; // phpcs:ignore:WordPress.WP.GlobalVariablesOverride.OverrideProhibited setup_postdata($post); $content = do_blocks($post->post_content); $content = apply_filters('the_content', $content); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- WordPress core filter. add_filter('the_content', function () use ($content) { ob_Start(); echo $content; // phpcs:ignore:WordPress.Security.EscapeOutput.OutputNotEscaped return ob_get_clean(); }, 5); // Set sellkit canvas templates as the page template. add_action('template_redirect', function () { // Let WooCommerce clear the cart on a successful order-received visit before // our exit prevents its priority-20 hook from ever running. if (function_exists('wc_clear_cart_after_payment')) { wc_clear_cart_after_payment(); } sellkit()->load_files([ 'templates/default-canvas' ]); exit; }); } add_filter('sellkit_global_checkout_activated', function () { return true; }); add_action('sellkit_checkout_required_hidden_fields', function () use ($checkout_id) { ?> get_valid_bumps($bump_data); set_query_var('bump_data', $bump_data); } if (! empty($optimization_data) && CheckoutStep::apply_coupon_validation($optimization_data)) { foreach ($optimization_data['auto_apply_coupons'] as $auto_apply_coupon) { wc()->cart->add_discount(get_the_title($auto_apply_coupon['value'])); } wc_clear_notices(); } $header_footer_templates = get_post_meta(intval($funnel_id), self::SELLKIT_GLOBAL_CHECKOUT_HEADER_FOOTER_TEMPLATE, true); if (empty($header_footer_templates) || ! is_array($header_footer_templates)) { $header_footer_templates = maybe_unserialize($header_footer_templates); } if (empty($header_footer_templates) || ! is_array($header_footer_templates)) { $header_footer_templates = []; } add_filter('sellkit_global_checkout_header_applied_id', function ($default) use ($header_footer_templates) { if ( array_key_exists('header', $header_footer_templates) && array_key_exists('value', $header_footer_templates['header']) ) { return $header_footer_templates['header']['value']; } return $default; }); add_filter('sellkit_global_checkout_footer_applied_id', function ($default) use ($header_footer_templates) { if ( array_key_exists('footer', $header_footer_templates) && array_key_exists('value', $header_footer_templates['footer']) ) { return $header_footer_templates['footer']['value']; } return $default; }); } /** * Load checkout block on frontend. * * @since 2.3.0 */ public function load_checkout_block_frontend() { global $post; if (empty($post->post_content)) { return; } $this->post_id = $post->ID; $block = 'blocks/checkout'; $block_data = explode('/', $block); $block_name = $block_data[1]; $class_name = str_replace('-', ' ', $block_name); $class_name = str_replace(' ', '_', ucwords($class_name)); $class_name = "Sellkit\blocks\Render\\{$class_name}"; $class_path = 'block-editor/' . $block . '/index'; sellkit()->load_files([ $class_path, ]); $new_class = new $class_name($this->post_id); if (! \WP_Block_Type_Registry::get_instance()->is_registered("sellkit-blocks/{$block_name}")) { $this->register_inner_blocks_by_parent($new_class); $new_class->register_block_meta(); } } /** * Register inner blocks by parent. * * @param Object $parent_class Parent class name. * @since 2.3.0 * @return void */ private function register_inner_blocks_by_parent($parent_class) { if (! method_exists($parent_class, 'has_inner_blocks')) { return; } $inner_blocks = $parent_class->get_inner_block(); sellkit()->load_files($inner_blocks); foreach ($inner_blocks as $key => $value) { if (isset($this->inner_blocks["blocks/{$key}"])) { continue; } $inner_block_class = 'Sellkit\Blocks\Inner_Block\\' . str_replace('-', '_', ucwords($key)); if (! class_exists($inner_block_class)) { continue; } $inner_block_instance = new $inner_block_class($this->post_id); if (! \WP_Block_Type_Registry::get_instance()->is_registered("sellkit-inner-blocks/{$key}")) { $inner_block_instance->register_block_meta(); } } } /** * Handle ajax requests. * * @since 1.8.9 */ public function handle_ajax_requests() { check_ajax_referer('sellkit', 'nonce'); if (! current_user_can('manage_options')) { wp_send_json_error('You do not have access to this section.', 'sellkit'); } $action = filter_var($_REQUEST['sub_action'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); // phpcs:ignore call_user_func([$this, $action]); } /** * Get header & footer design templates for Global checkout. * * @since 1.8.9 */ private function get_design_templates() { $type = filter_input(INPUT_GET, 'template_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $search = filter_input(INPUT_GET, 'input_value', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $args = [ 'post_type' => 'elementor_library', 'post_status' => ['private', 'publish'], 's' => $search, 'posts_per_page' => -1, 'meta_query' => [ //phpcs:ignore [ 'key' => '_elementor_template_type', 'value' => $type, ], ], ]; $posts = new \WP_Query($args); $values = [ [ 'label' => esc_html__('Default', 'sellkit'), 'value' => 'default', ] ]; if ($posts->post_count > 0) { foreach ($posts->posts as $post) { $values[] = [ 'label' => $post->post_title, 'value' => $post->ID, ]; } wp_send_json_success($values); } wp_send_json_success($values); } /** * Save selected header/footer template id ofr the global checkout. * * @since 1.8.9 */ private function save_selected_template_id() { $funnel_id = filter_input(INPUT_POST, 'funnel', FILTER_SANITIZE_NUMBER_INT); $template_id = filter_input(INPUT_POST, 'template_id', FILTER_DEFAULT, FILTER_FORCE_ARRAY); $template_type = filter_input(INPUT_POST, 'template', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $data = get_post_meta($funnel_id, self::SELLKIT_GLOBAL_CHECKOUT_HEADER_FOOTER_TEMPLATE, true); if (empty($data) || ! is_array($data)) { $data = []; } if (isset($data[$template_type])) { unset($data[$template_type]); } $data[$template_type] = [ 'label' => (empty($template_id['label'])) ? esc_html__('Search...', 'sellkit') : $template_id['label'], 'value' => (empty($template_id['value'])) ? 0 : $template_id['value'], ]; update_post_meta($funnel_id, self::SELLKIT_GLOBAL_CHECKOUT_HEADER_FOOTER_TEMPLATE, $data); wp_send_json_success($data); } /** * Get selected header/footer id. * * @since 1.8.9 */ private function get_selected_template_id() { $funnel_id = filter_input(INPUT_POST, 'funnel', FILTER_SANITIZE_NUMBER_INT); $data = get_post_meta($funnel_id, self::SELLKIT_GLOBAL_CHECKOUT_HEADER_FOOTER_TEMPLATE, true); $template = filter_input(INPUT_POST, 'template', FILTER_SANITIZE_FULL_SPECIAL_CHARS); if (empty($data)) { $data = [ 'header' => [ 'label' => esc_html__('Search...', 'sellkit'), 'value' => 0, ], 'footer' => [ 'label' => esc_html__('Search...', 'sellkit'), 'value' => 0, ], ]; } if (! is_array($data)) { $data = maybe_unserialize($data); } wp_send_json_success($data); } /** * Create new Elementor template. * * @since 1.8.9 */ private function create_new_template() { $template = filter_input(INPUT_POST, 'template', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $post_title = filter_input(INPUT_POST, 'post_title', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $args = [ 'post_type' => 'elementor_library', 'post_title' => $post_title, 'post_status' => 'publish', 'meta_input' => [ '_elementor_template_type' => $template, '_elementor_edit_mode' => 'builder', 'jx-layout-type' => $template, '_wp_page_template' => 'full-width.php', ], ]; $id = wp_insert_post($args); if (intval($id) > 0) { $editor_url = Elementor::$instance->documents->get($id)->get_edit_url(); wp_send_json_success([ 'label' => $post_title, 'value' => $id, 'url' => $editor_url, ]); } wp_send_json_error(); } /** * Checks all bumps and return data. * * @since 1.8.1 * @param array $bump_data Bump data. * @return array */ public function get_valid_bumps($bump_data) { $valid_bumps = []; foreach ($bump_data as $bump) { $conditions = ! empty($bump['data']['conditions']) ? $bump['data']['conditions'] : ''; if (! empty($conditions) && empty(sellkit_conditions_validation($conditions))) { continue; } $valid_bumps[] = $bump; } return $valid_bumps; } } new Checkout();