File "add-to-cart.php"
Full Path: /home/amervokv/ecomlive.net/wp-content/plugins/elementor-pro/modules/woocommerce/widgets/add-to-cart.php
File size: 7.68 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace ElementorPro\Modules\Woocommerce\Widgets;
use Elementor\Controls_Manager;
use Elementor\Widget_Button;
use ElementorPro\Base\Base_Widget_Trait;
use ElementorPro\Core\Utils;
use ElementorPro\Modules\QueryControl\Module;
use ElementorPro\Modules\Woocommerce\Traits\Product_Id_Trait;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
class Add_To_Cart extends Widget_Button {
use Base_Widget_Trait;
use Product_Id_Trait;
public function get_name() {
return 'wc-add-to-cart';
}
public function get_title() {
return esc_html__( 'Custom Add To Cart', 'elementor-pro' );
}
public function get_icon() {
return 'eicon-woocommerce';
}
public function get_categories() {
return [ 'woocommerce-elements' ];
}
public function get_keywords() {
return [ 'woocommerce', 'shop', 'store', 'cart', 'product', 'button', 'add to cart' ];
}
public function on_export( $element ) {
unset( $element['settings']['product_id'] );
return $element;
}
public function unescape_html( $safe_text, $text ) {
return $text;
}
protected function register_controls() {
$this->start_controls_section(
'section_product',
[
'label' => esc_html__( 'Product', 'elementor-pro' ),
]
);
$this->add_control(
'product_id',
[
'label' => esc_html__( 'Product', 'elementor-pro' ),
'type' => Module::QUERY_CONTROL_ID,
'options' => [],
'label_block' => true,
'autocomplete' => [
'object' => Module::QUERY_OBJECT_POST,
'query' => [
'post_type' => [ 'product' ],
],
],
]
);
$this->add_control(
'show_quantity',
[
'label' => esc_html__( 'Show Quantity', 'elementor-pro' ),
'type' => Controls_Manager::SWITCHER,
'label_off' => esc_html__( 'Hide', 'elementor-pro' ),
'label_on' => esc_html__( 'Show', 'elementor-pro' ),
'description' => esc_html__( 'Please note that switching on this option will disable some of the design controls.', 'elementor-pro' ),
]
);
$this->add_control(
'quantity',
[
'label' => esc_html__( 'Quantity', 'elementor-pro' ),
'type' => Controls_Manager::NUMBER,
'default' => 1,
'condition' => [
'show_quantity' => '',
],
]
);
$this->end_controls_section();
parent::register_controls();
$this->start_controls_section(
'section_layout',
[
'label' => esc_html__( 'Layout', 'elementor-pro' ),
'tab' => Controls_Manager::TAB_CONTENT,
]
);
$this->add_control(
'layout',
[
'label' => esc_html__( 'Layout', 'elementor-pro' ),
'type' => Controls_Manager::SELECT,
'options' => [
'' => esc_html__( 'Inline', 'elementor-pro' ),
'stacked' => esc_html__( 'Stacked', 'elementor-pro' ),
'auto' => esc_html__( 'Auto', 'elementor-pro' ),
],
'prefix_class' => 'elementor-add-to-cart--layout-',
'render_type' => 'template',
]
);
$this->end_controls_section();
$this->update_control(
'link',
[
'type' => Controls_Manager::HIDDEN,
'default' => [
'url' => '',
],
]
);
$this->update_control(
'text',
[
'default' => esc_html__( 'Add to Cart', 'elementor-pro' ),
'placeholder' => esc_html__( 'Add to Cart', 'elementor-pro' ),
]
);
$this->update_responsive_control(
'align',
[
'prefix_class' => 'elementor-add-to-cart%s--align-',
]
);
$this->update_control(
'selected_icon',
[
'default' => [
'value' => 'fas fa-shopping-cart',
'library' => 'fa-solid',
],
]
);
$this->update_control(
'size',
[
'condition' => [
'show_quantity' => '',
],
]
);
}
protected function render() {
$settings = $this->get_settings_for_display();
if ( ! empty( $settings['product_id'] ) ) {
$product_id = $settings['product_id'];
} elseif ( wp_doing_ajax() && ! empty( $settings['product_id'] ) ) {
// PHPCS - No nonce is required.
// phpcs:ignore WordPress.Security.NonceVerification.Missing
$product_id = (int) Utils::_unstable_get_super_global_value( $_POST, 'post_id' );
} else {
$product_id = get_queried_object_id();
}
global $product;
$product = $this->get_product( $product_id );
$settings = $this->get_settings_for_display();
if ( in_array( $settings['layout'], [ 'auto', 'stacked' ], true ) ) {
add_action( 'woocommerce_before_add_to_cart_quantity', [ $this, 'before_add_to_cart_quantity' ], 95 );
add_action( 'woocommerce_after_add_to_cart_button', [ $this, 'after_add_to_cart_button' ], 5 );
}
if ( 'yes' === $settings['show_quantity'] ) {
$this->render_form_button( $product );
} else {
$this->render_ajax_button( $product );
}
if ( in_array( $settings['layout'], [ 'auto', 'stacked' ], true ) ) {
remove_action( 'woocommerce_before_add_to_cart_quantity', [ $this, 'before_add_to_cart_quantity' ], 95 );
remove_action( 'woocommerce_after_add_to_cart_button', [ $this, 'after_add_to_cart_button' ], 5 );
}
}
/**
* Before Add to Cart Quantity
*
* Added wrapper tag around the quantity input and "Add to Cart" button
* used to more solidly accommodate the layout when additional elements
* are added by 3rd party plugins.
*
* @since 3.6.0
*/
public function before_add_to_cart_quantity() {
?>
<div class="e-atc-qty-button-holder">
<?php
}
/**
* After Add to Cart Quantity
*
* @since 3.6.0
*/
public function after_add_to_cart_button() {
?>
</div>
<?php
}
/**
* @param \WC_Product $product
*/
private function render_ajax_button( $product ) {
$settings = $this->get_settings_for_display();
if ( $product ) {
if ( version_compare( WC()->version, '3.0.0', '>=' ) ) {
$product_type = $product->get_type();
} else {
$product_type = $product->product_type;
}
$class = implode( ' ', array_filter( [
'product_type_' . $product_type,
$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
$product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '',
] ) );
$this->add_render_attribute( 'button',
[
'rel' => 'nofollow',
'href' => $product->add_to_cart_url(),
'data-quantity' => ( isset( $settings['quantity'] ) ? $settings['quantity'] : 1 ),
'data-product_id' => $product->get_id(),
'class' => $class,
]
);
} elseif ( current_user_can( 'manage_options' ) ) {
$settings['text'] = esc_html__( 'Please set a valid product', 'elementor-pro' );
$this->set_settings( $settings );
}
parent::render();
}
private function render_form_button( $product ) {
if ( ! $product && current_user_can( 'manage_options' ) ) {
echo esc_html__( 'Please set a valid product', 'elementor-pro' );
return;
}
$text_callback = function() {
ob_start();
$this->render_text();
return ob_get_clean();
};
add_filter( 'woocommerce_get_stock_html', '__return_empty_string' );
add_filter( 'woocommerce_product_single_add_to_cart_text', $text_callback );
add_filter( 'esc_html', [ $this, 'unescape_html' ], 10, 2 );
ob_start();
woocommerce_template_single_add_to_cart();
$form = ob_get_clean();
$form = str_replace( 'single_add_to_cart_button', 'single_add_to_cart_button elementor-button', $form );
// PHPCS - The HTML from 'woocommerce_template_single_add_to_cart' is safe.
echo $form; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
remove_filter( 'woocommerce_product_single_add_to_cart_text', $text_callback );
remove_filter( 'woocommerce_get_stock_html', '__return_empty_string' );
remove_filter( 'esc_html', [ $this, 'unescape_html' ] );
}
/**
* Written as a Backbone JavaScript template and used to generate the live preview.
*
* @since 2.9.0
* @access protected
*/
// Force remote render
protected function content_template() {}
public function get_group_name() {
return 'woocommerce';
}
}