You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

283 lines
7.3 KiB
PHP

<?php
/**
* WooCommerce Modules: ET_Builder_Module_Woocommerce_Cross_Sells class
*
* The ET_Builder_Module_Woocommerce_Cross_Sells Class is responsible for rendering the
* Cross sells using the WooCommerce template.
*
* @since 4.14.0
* @package Divi\Builder
*/
defined( 'ABSPATH' ) || exit;
/**
* Class representing WooCommerce Cart Upsells component.
*
* @since 4.14.0
*/
class ET_Builder_Module_Woocommerce_Cross_Sells extends ET_Builder_Module {
/**
* Initialize.
*/
public function init() {
$this->name = esc_html__( 'Woo Cross Sells', 'et_builder' );
$this->plural = esc_html__( 'Woo Cross Sells', 'et_builder' );
$this->slug = 'et_pb_wc_cross_sells';
$this->vb_support = 'on';
$this->folder_name = 'et_pb_woo_modules';
$this->main_css_element = '%%order_class%%.et_pb_wc_cross_sells';
$this->advanced_fields = array(
'fonts' => array(
'title' => array(
'label' => et_builder_i18n( 'Title' ),
'css' => array(
'main' => implode(
',',
[
"{$this->main_css_element} ul.products li.product h3",
"{$this->main_css_element} ul.products li.product h1",
"{$this->main_css_element} ul.products li.product h2",
"{$this->main_css_element} ul.products li.product h4",
"{$this->main_css_element} ul.products li.product h5",
"{$this->main_css_element} ul.products li.product h6",
]
),
'hover' => implode(
',',
[
"{$this->main_css_element} .woocommerce ul.products li.product h3:hover",
"{$this->main_css_element} .woocommerce ul.products li.product h1:hover",
"{$this->main_css_element} .woocommerce ul.products li.product h2:hover",
"{$this->main_css_element} .woocommerce ul.products li.product h4:hover",
"{$this->main_css_element} .woocommerce ul.products li.product h5:hover",
"{$this->main_css_element} .woocommerce ul.products li.product h6:hover",
]
),
'important' => 'plugin_only',
),
'font_size' => array(
'default' => '14px',
),
'line_height' => array(
'default' => '1em',
),
),
'price' => array(
'label' => esc_html__( 'Price', 'et_builder' ),
'css' => array(
'main' => implode(
',',
[
"{$this->main_css_element} ul.products li.product .price",
"{$this->main_css_element} ul.products li.product .price .amount",
]
),
),
'font_size' => array(
'default' => '14px',
),
'line_height' => array(
'range_settings' => array(
'min' => '1',
'max' => '100',
'step' => '1',
),
'default' => '26px',
),
),
),
);
$this->help_videos = array(
array(
'id' => esc_html( '7X03vBPYJ1o' ),
'name' => esc_html__( 'Divi WooCommerce Modules', 'et_builder' ),
),
);
}
/**
* {@inheritdoc}
*/
public function get_fields() {
$fields = array(
'__cross_sells' => array(
'type' => 'computed',
'computed_callback' => array(
'ET_Builder_Module_Woocommerce_Cross_Sells',
'get_cross_sells',
),
'computed_depends_on' => array(
/*
* `depends_on` arg is required. Otherwise AJAX will return null.
* @see et_pb_process_computed_property().
* `product` will not be processed since there is no definition in
* @see ET_Builder_Module_Woocommerce_Checkout_Order::get_fields()
*/
'product',
),
),
);
return $fields;
}
/**
* Swaps Cross-sells template.
*
* @param string $template Template.
* @param string $template_name Template name.
* @param array $args Arguments.
* @param string $template_path Template path.
* @param string $default_path Default path.
*
* @return string
*/
public static function swap_template( $template, $template_name, $args, $template_path, $default_path ) {
$is_template_override = in_array(
$template_name,
array(
'cart/cross-sells.php',
),
true
);
if ( $is_template_override ) {
return trailingslashit( ET_BUILDER_DIR ) . 'feature/woocommerce/templates/' . $template_name;
}
return $template;
}
/**
* Gets Cross sells markup.
*
* @param array $args Props.
* @param array $conditional_tags Conditional tags set during computed property AJAX call.
*
* @return string
*/
public static function get_cross_sells( $args = array(), $conditional_tags = array() ) {
if ( is_checkout() ) {
return;
}
if ( ! function_exists( 'woocommerce_cross_sell_display' ) ) {
return;
}
$is_tb = et_()->array_get( $conditional_tags, 'is_tb', false );
$output = '';
if ( ( $is_tb || et_fb_is_computed_callback_ajax() || is_et_pb_preview() ) ) {
$cross_sell_items = array(
1001 => array(
'name' => esc_html__( 'Product 4', 'et_builder' ),
'price' => '12.00',
),
1002 => array(
'name' => esc_html__( 'Product 5', 'et_builder' ),
'price' => '75.00',
),
1003 => array(
'name' => esc_html__( 'Product 6', 'et_builder' ),
'price' => '38.00',
),
);
$cross_sell_products = [];
foreach ( $cross_sell_items as $id => $details ) {
$product = new ET_Builder_Woocommerce_Product_Simple_Placeholder();
$product->set_name( $details['name'] );
$product->set_id( $id );
$product->set_price( $details['price'] );
$cross_sell_products[] = $product;
}
wc_set_loop_prop( 'name', 'cross-sells' );
wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_cross_sells_columns', 2 ) );
$orderby = apply_filters( 'woocommerce_cross_sells_orderby', 'rand' );
$order = apply_filters( 'woocommerce_cross_sells_order', 'desc' );
$cross_sells = wc_products_array_orderby( $cross_sell_products, $orderby, $order );
$limit = apply_filters( 'woocommerce_cross_sells_total', 0 );
$cross_sells = $limit > 0 ? array_slice( $cross_sells, 0, $limit ) : $cross_sells;
// Runs only on Builder mode.
add_filter(
'wc_get_template',
[
'ET_Builder_Module_Woocommerce_Cross_Sells',
'swap_template',
],
10,
5
);
ob_start();
wc_get_template(
'cart/cross-sells.php',
array(
'cross_sells' => $cross_sells,
// Not used now, but used in previous version of up-sells.php.
'posts_per_page' => $limit,
'orderby' => $orderby,
'columns' => 2,
)
);
$output = ob_get_clean();
remove_filter(
'wc_get_template',
[
'ET_Builder_Module_Woocommerce_Cross_Sells',
'swap_template',
],
10,
5
);
} else {
if ( ! is_null( WC()->cart ) ) {
ob_start();
woocommerce_cross_sell_display( 0 );
$output = ob_get_clean();
}
}
return $output;
}
/**
* Renders the module output.
*
* @param array $attrs List of attributes.
* @param string $content Content being processed.
* @param string $render_slug Slug of module that is used for rendering output.
*
* @return string
*/
public function render( $attrs, $content, $render_slug ) {
// Module classnames.
$this->add_classname(
array(
$this->get_text_orientation_classname(),
)
);
$output = self::get_cross_sells();
return $this->_render_module_wrapper( $output, $render_slug );
}
}
new ET_Builder_Module_Woocommerce_Cross_Sells();