'woocommerce_before_add_to_cart_form', 'priority' => 10 ], [ 'action' => 'woocommerce_before_add_to_cart_quantity', 'priority' => PHP_INT_MAX ], [ 'action' => 'woocommerce_before_add_to_cart_button', 'priority' => PHP_INT_MAX ], [ 'action' => 'woocommerce_after_add_to_cart_button', 'priority' => 100 ], [ 'action' => 'woocommerce_post_class', 'priority' => 10 ] ]; public function __construct() { $this->attach_hooks([ 'exclude' => [ 'woocommerce_after_add_to_cart_button' ] ]); } private function product_was_handled($product) { return in_array($product->get_id(), $this->handled_product_ids); } private function output_cart_action_open() { if ( (is_product() || wp_doing_ajax()) && ! blocksy_manager()->screen->uses_woo_default_template() ) { return; } $attr = apply_filters('blocksy:woocommerce:cart-actions:attr', [ 'class' => 'ct-cart-actions' ]); echo '
'; $this->attach_hooks([ 'only' => [ 'woocommerce_after_add_to_cart_button' ] ]); } public function woocommerce_before_add_to_cart_form() { global $product; global $root_product; if ($this->product_was_handled($product)) { return; } $root_product = $product; } public function woocommerce_before_add_to_cart_quantity() { global $product; global $root_product; if ($this->product_was_handled($product)) { return; } if (! $root_product) { return; } if ( ! $root_product->is_type('simple') && ! $root_product->is_type('variation') && ! $root_product->is_type('variable') && ! $root_product->is_type('subscription') && ! $root_product->is_type('variable-subscription') ) { return; } $this->output_cart_action_open(); } public function woocommerce_before_add_to_cart_button() { global $product; global $root_product; if ($this->product_was_handled($product)) { return; } if (! $root_product) { return; } if ( ! $root_product->is_type('grouped') && ! $root_product->is_type('external') ) { return; } $this->output_cart_action_open(); } public function woocommerce_after_add_to_cart_button() { global $product; if ($this->product_was_handled($product)) { return; } if (! $product) { return; } if ( ! $product->is_type('simple') && ! $product->is_type('variable') && ! $product->is_type('subscription') && ! $product->is_type('variable-subscription') && ! $product->is_type('grouped') && ! $product->is_type('external') ) { return; } if ( ( $product->is_type('simple') || $product->is_type('variable') || $product->is_type('subscription') || $product->is_type('variable-subscription') ) && ! did_action('woocommerce_before_add_to_cart_quantity') ) { return; } echo '
'; // On single product pages we know for sure that there's only one // product that needs handling. On other pages or during AJAX requests, // we need to make sure that we don't handle the same product twice. if (is_product()) { $this->detach_hooks(); } else { $this->handled_product_ids[] = $product->get_id(); } } public function woocommerce_post_class($classes) { global $product; global $woocommerce_loop; if ($this->product_was_handled($product)) { return $classes; } $default_product_layout = blocksy_get_woo_single_layout_defaults(); $layout = blocksy_get_theme_mod( 'woo_single_layout', blocksy_get_woo_single_layout_defaults() ); $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'] ); } $add_to_cart_layer = array_values(array_filter($layout, function($k) { return $k['id'] === 'product_add_to_cart'; })); if ( empty($add_to_cart_layer) || ! $product || $product->is_type('external') || $woocommerce_loop['name'] === 'related' || ( ! is_product() && ! wp_doing_ajax() ) ) { return $classes; } $has_ajax_add_to_cart = blocksy_get_theme_mod( 'has_ajax_add_to_cart', 'no' ); if ( $has_ajax_add_to_cart === 'yes' && get_option('woocommerce_cart_redirect_after_add', 'no') === 'no' ) { $classes[] = 'ct-ajax-add-to-cart'; } return $classes; } }