true, 'product_rating' => true, 'product_price' => true, 'product_desc' => true, 'product_meta' => true, 'product_sharing' => true, // For now detect only someone disabled the add to cart // from the summary. 'product_add_to_cart' => true ]; public function __construct() { $this->additional_actions = new SingleProductAdditionalActions(); new WooCommerceAddToCart(); add_filter('the_password_form', function($output, $post) { if ($post->post_type !== 'product') { return $output; } return str_replace( 'post-password-form"', 'post-password-form is-width-constrained"', $output ); }, 10, 2); add_action('wp_enqueue_scripts', function() { if ( get_option('woocommerce_enable_ajax_add_to_cart') === 'no' && blocksy_manager()->screen->is_product() ) { wp_enqueue_script('wc-add-to-cart'); } }); } public function receive_initial_woo_behavior($initial_woo_behavior) { $this->initial_woo_behavior = array_merge( $this->initial_woo_behavior, $initial_woo_behavior ); } // TODO: skip if no translation plugin is present public function register_translations() { $default_product_layout = blocksy_get_woo_single_layout_defaults(); $layout = blocksy_get_theme_mod( 'woo_single_layout', $default_product_layout ); $layout = blocksy_normalize_layout( $layout, $default_product_layout ); $product_view_type = blocksy_get_product_view_type(); if ( $product_view_type === 'top-gallery' || $product_view_type === 'columns-top-gallery' ) { $woo_single_split_layout = blocksy_get_theme_mod( 'woo_single_split_layout', [ 'left' => blocksy_get_woo_single_layout_defaults('left'), 'right' => blocksy_get_woo_single_layout_defaults('right') ] ); $layout = array_merge( $woo_single_split_layout['left'], $woo_single_split_layout['right'] ); } $additional_info_layer = array_values(array_filter($layout, function($k) { return $k['id'] === 'additional_info'; })); if (empty($additional_info_layer)) { return; } $items = blocksy_akg('additional_info_items', $additional_info_layer[0], []); add_filter( 'blocksy:translations-manager:all-translation-keys', function ($all_keys) use ($additional_info_layer) { $items = blocksy_akg('additional_info_items', $additional_info_layer[0], []); foreach ($items as $key => $item) { $item_i18n_id_prefix = 'single_product:additional_info_item:' . $item['id']; if (isset($item['__id'])) { $item_i18n_id_prefix = 'single_product:additional_info_item:' . $item['__id']; } $all_keys[] = [ 'key' => $item_i18n_id_prefix . ':item_title', 'value' => $item['item_title'] ]; } return $all_keys; } ); } public function render_layout($args = []) { $args = wp_parse_args( $args, [ 'layout' => null, 'defaults' => null, 'exclude' => null ] ); if (! $args['layout']) { $args['layout'] = blocksy_get_theme_mod( 'woo_single_layout', blocksy_get_woo_single_layout_defaults() ); } if ($args['defaults']) { $args['layout'] = blocksy_normalize_layout( $args['layout'], $args['defaults'] ); } $args['layout'] = apply_filters( 'blocksy:woocommerce:product-single:layout', $args['layout'] ); do_action('blocksy:woocommerce:product-single:layout:before', $args); foreach ($args['layout'] as $layer) { if (! $layer['enabled']) { continue; } // For now respect initial behavior only for add to cart layer. if ( $layer['id'] === 'product_add_to_cart' && ! $this->initial_woo_behavior['product_add_to_cart'] ) { continue; } if (method_exists($this, $layer['id'])) { $this->{$layer['id']}($layer); continue; } do_action('blocksy:woocommerce:product:custom:layer', $layer); } do_action('blocksy:woocommerce:product-single:layout:after', $args); } public function product_title($layer) { do_action('blocksy:woocommerce:product-single:title:before'); woocommerce_template_single_title(); do_action('blocksy:woocommerce:product-single:title:after'); } public function product_rating($layer) { do_action('blocksy:woocommerce:product-single:rating:before'); woocommerce_template_single_rating(); do_action('blocksy:woocommerce:product-single:rating:after'); } public function product_price($layer) { do_action('blocksy:woocommerce:product-single:price:before'); woocommerce_template_single_price(); do_action('blocksy:woocommerce:product-single:price:after'); } public function product_desc($layer) { do_action('blocksy:woocommerce:product-single:excerpt:before'); woocommerce_template_single_excerpt(); do_action('blocksy:woocommerce:product-single:excerpt:after'); } public function divider($layer) { echo blocksy_html_tag( 'span', [ 'class' => 'ct-product-divider', 'data-id' => blocksy_akg('__id', $layer, 'default') ], '' ); } public function product_add_to_cart($layer) { do_action('blocksy:woocommerce:product-single:add_to_cart:before'); $section_title = blocksy_akg('add_to_cart_layer_title', $layer, ''); ob_start(); woocommerce_template_single_add_to_cart(); $single_add_to_cart = ob_get_clean(); echo blocksy_html_tag( 'div', [ 'class' => 'ct-product-add-to-cart', ], ( ! empty($section_title) || is_customize_preview() ? blocksy_html_tag( 'span', [ 'class' => 'ct-module-title', ], $section_title ) : '' ) . $single_add_to_cart ); do_action('blocksy:woocommerce:product-single:add_to_cart:after'); } public function product_meta($layer) { do_action('blocksy:woocommerce:product-single:meta:before'); woocommerce_template_single_meta(); do_action('blocksy:woocommerce:product-single:meta:after'); } public function product_payment_methods($layer) { $items = [ [ 'id' => 'item_mastercard', 'enabled' => true, 'label' => 'Mastercard' ], [ 'id' => 'item_visa', 'enabled' => true, 'label' => 'Visa' ], [ 'id' => 'item_amex', 'enabled' => true, 'label' => 'Amex' ], [ 'id' => 'item_discover', 'enabled' => true, 'label' => 'Discover' ], ]; if (isset($layer['payment_items'])) { $items = $layer['payment_items']; } if (! count($items)) { return; } $data_color = blocksy_akg('payment_icons_color', $layer, 'default'); $section_title = blocksy_translate_dynamic( blocksy_akg( 'payment_methods_title', $layer, __('Guaranteed Safe Checkout', 'blocksy') ), 'single_product:payment_methods:title' ); $out = '
'; echo $out; } public function additional_info($layer) { $items = [ [ 'id' => 'additional_info_item_premium_quality', 'enabled' => true, 'item_title' => __('Premium Quality', 'blocksy'), ], [ 'id' => 'additional_info_item_secure_payments', 'enabled' => true, 'item_title' => __('Secure Payments', 'blocksy'), ], [ 'id' => 'additional_info_item_satisfaction_guarantee', 'enabled' => true, 'item_title' => __('Satisfaction Guarantee', 'blocksy') ], [ 'id' => 'additional_info_item_worldwide_shipping', 'enabled' => true, 'item_title' => __('Worldwide Shipping', 'blocksy') ], [ 'id' => 'additional_info_item_money_back_guarantee', 'enabled' => true, 'item_title' => __('Money Back Guarantee', 'blocksy') ], ]; if (isset($layer['additional_info_items'])) { $items = $layer['additional_info_items']; } if (! count($items)) { return; } $section_title = blocksy_translate_dynamic( blocksy_akg( 'product_additional_info_title', $layer, __('Extra Features', 'blocksy') ), 'single_product:additional_info:title' ); $out = '