attach_button();
}
public function enqueue() {
wp_register_style( 'rtsb-modules', rtsb()->get_assets_uri( 'modules/modules.css' ), [], RTSB_VERSION );
wp_register_script(
'rtsb-compare',
rtsb()->get_assets_uri( 'modules/compare.js' ),
[
'jquery',
'rtsb-public',
],
RTSB_VERSION,
true
);
wp_enqueue_style( 'rtsb-modules' );
wp_enqueue_script( 'rtsb-compare' );
$params = apply_filters(
'rtsb/module/compare/js_params',
[
'product_id' => get_the_ID(),
'resturl' => get_rest_url(),
'isLoggedIn' => is_user_logged_in(),
'pageUrl' => CompareFns::instance()->get_page_url(),
'rest_nonce' => wp_create_nonce( 'wp_rest' ),
'notice' => [
'added' => Fns::get_option( 'modules', 'compare', 'notice_added_text', esc_html__( 'Product added!', 'shopbuilder' ) ),
'removed' => Fns::get_option( 'modules', 'compare', 'notice_removed_text', esc_html__( 'Product removed!', 'shopbuilder' ) ),
'browse' => Fns::get_option( 'modules', 'compare', 'browse_list_text', esc_html__( 'Browse compare!', 'shopbuilder' ) ),
'error' => esc_html__( 'Some thing went wrong!!', 'shopbuilder' ),
],
]
);
wp_localize_script( 'rtsb-compare', 'rtsbCompareParams', $params );
}
/**
* Add the "Add to Wishlist" button. Needed to use in wp_head hook.
*
* @return void
* @since 1.0.0
*/
public function attach_button() {
$positions = apply_filters(
'rtsb/module/compare/product_btn_positions',
[
'before_cart_btn' => [
'hook' => 'woocommerce_before_add_to_cart_button',
'priority' => 20,
],
'after_add_to_cart' => [
'hook' => 'woocommerce_single_product_summary',
'priority' => 31,
],
'after_thumbnail' => [
'hook' => 'woocommerce_product_thumbnails',
'priority' => 21,
],
'after_summary' => [
'hook' => 'woocommerce_after_single_product_summary',
'priority' => 11,
],
'custom' => [
'hook' => Fns::get_option( 'modules', 'compare', 'product_custom_hook_name', '' ),
'priority' => Fns::get_option( 'modules', 'compare', 'product_custom_hook_priority', 10 ),
],
]
);
// Add the link "Add to wishlist".
$product_btn_enable = Fns::get_option( 'modules', 'compare', 'show_btn_product_page', true, 'checkbox' );
$product_btn_position = Fns::get_option( 'modules', 'compare', 'product_btn_position', 'after_add_to_cart' );
if ( $product_btn_enable && 'shortcode' !== $product_btn_position && isset( $positions[ $product_btn_position ]['hook'] ) ) {
add_action(
$positions[ $product_btn_position ]['hook'],
[
$this,
'button_hook',
],
isset( $positions[ $product_btn_position ]['priority'] ) ? absint( $positions[ $product_btn_position ]['priority'] ) : ''
);
}
// check if Add to wishlist button is enabled for loop.
$loop_btn_enable = Fns::get_option( 'modules', 'compare', 'show_btn_on_loop', true, 'checkbox' );
if ( ! $loop_btn_enable ) {
return;
}
$positions = apply_filters(
'rtsb/module/compare/loop_btn_position',
[
'before_add_to_cart' => [
'hook' => 'woocommerce_after_shop_loop_item',
'priority' => 7,
],
'after_add_to_cart' => [
'hook' => 'woocommerce_after_shop_loop_item',
'priority' => 15,
],
'custom' => [
'hook' => Fns::get_option( 'modules', 'compare', 'loop_custom_hook_name', '' ),
'priority' => Fns::get_option( 'modules', 'compare', 'loop_custom_hook_priority', 10 ),
],
]
);
// Add the link "Add to wishlist" in the loop.
$loop_btn_position = Fns::get_option( 'modules', 'compare', 'loop_btn_position', 'after_add_to_cart' );
if ( 'shortcode' !== $loop_btn_position && isset( $positions[ $loop_btn_position ]['hook'] ) ) {
add_action(
$positions[ $loop_btn_position ]['hook'],
[
$this,
'button_hook',
],
isset( $positions[ $loop_btn_position ]['priority'] ) ? $positions[ $loop_btn_position ]['priority'] : ''
);
}
// TODO:: Maybe this hooks is not working. Need to Check gutenberg compatibility.
// Add the link "Add to wishlist" for Gutenberg blocks.
add_filter( 'woocommerce_blocks_product_grid_item_html', [ $this, 'add_button_for_block' ], 10, 3 );
}
/**
* Add ATW button to Products block item
*
* @param string $item_html HTML of the single block item.
* @param array $data Data used to render the item.
* @param WC_Product $product Current product.
*
* @return string Filtered HTML.
*/
public function add_button_for_block( $item_html, $data, $product ) {
// Add the link "Add to wishlist" in the loop.
$shop_btn_position = Fns::get_option( 'modules', 'compare', 'loop_btn_position', 'after_add_to_cart' );
ob_start();
$this->print_button( $product->get_id() );
$button = ob_get_clean();
$parts = [];
preg_match( '/(
)[\S|\s]*?([\S|\s]*?<\/a>)([\S|\s]*?)(<\/li>)/', $item_html, $parts );
if ( ! $parts || count( $parts ) < 5 ) {
return $item_html;
}
// removes first match (entire match).
array_shift( $parts );
// removes empty parts.
$parts = array_filter( $parts );
// searches for index to cut parts array.
switch ( $shop_btn_position ) {
case 'before_add_to_cart':
$index = 2;
break;
case 'after_add_to_cart':
$index = 3;
break;
default:
$index = 0;
break;
}
// if index is found, stitch button in correct position.
if ( $index ) {
$first_set = array_slice( $parts, 0, $index );
$second_set = array_slice( $parts, $index );
$parts = array_merge(
$first_set,
(array) $button,
$second_set
);
// replace li classes.
$parts[0] = preg_replace( '/class="(.*)"/', 'class="$1 add-to-wishlist-' . $shop_btn_position . '"', $parts[0] );
}
// join all parts together and return item.
return implode( '', $parts );
}
/**
* @return string|void
*/
public function print_button( $product_id = 0 ) {
global $product;
// product object.
$current_product = $product_id ? wc_get_product( $product_id ) : false;
$current_product = $current_product ?: $product;
if ( ! $current_product instanceof WC_Product ) {
return '';
}
// product parent.
$current_product_parent = $current_product->get_parent_id();
// button class.
$classes = [];
// check if product is already in compare list.
$icon_html = '';
$exists = CompareFns::instance()->is_exists_in_list( $current_product->get_id() );
if ( $exists ) {
$classes[] = 'rtsb-compare-remove';
$button_text = Fns::get_option( 'modules', 'compare', 'button_text', esc_html__( 'Remove from list', 'shopbuilder' ) );
$button_text = apply_filters( 'rtsb/modules/compare/remove_from_list_button_text', $button_text );
} else {
$classes[] = 'rtsb-compare-add';
// labels & icons settings.
$button_text = Fns::get_option( 'modules', 'compare', 'button_text', esc_html__( 'Add to Compare', 'shopbuilder' ) );
// button text.
$button_text = apply_filters( 'rtsb/module/compare/add_to_list_button_txt', $button_text );
}
// get product type.
$product_type = $current_product->get_type();
$params = [
'exists' => $exists,
'classes' => $classes,
'product_id' => $current_product->get_id(),
'parent_product_id' => $current_product_parent ?: $current_product->get_id(),
'product_type' => $product_type,
'button_text' => $button_text,
'show_button_text' => false,
'left_text' => apply_filters( 'rtsb/module/compare/button_left_text', '' ),
'right_text' => apply_filters( 'rtsb/module/compare/button_right_text', '' ),
];
$atts = apply_filters( 'rtsb/module/compare/button_params', $params );
$atts['icon_html'] = apply_filters( 'rtsb/module/compare/icon_html', $icon_html, $atts );
Fns::load_template( 'compare/button', $atts );
}
/**
* Print "Add to compare" button
*
* @return void
*/
public function button_hook() {
if ( ! apply_filters( 'rtsb/module/compare/show_button', true ) ) {
return;
}
global $product;
if ( $product instanceof WC_Product ) {
do_action( 'rtsb/modules/compare/print_button', $product->get_id() );
}
}
/**
* List Shortcode callable function
*
* @param array $atts
* @param string $content
*
* @return string [HTML]
*/
public function list_shortcode( $atts, $content = '' ) {
wp_enqueue_style( 'rtsb-modules' );
wp_enqueue_script( 'rtsb-compare' );
/* Fetch From option data */
$empty_text = Fns::get_option( 'modules', 'compare', 'empty_table_text', esc_html__( 'No product found at your list.', 'shopbuilder' ) );
/* Product and Field */
$products = CompareFns::instance()->get_products_data();
$field_ids = [ 'primary' ] + CompareFns::instance()->get_list_field_ids();
$return_to_shop_text = Fns::get_option( 'modules', 'compare', 'return_to_shop_text', esc_html__( 'Return to shop', 'shopbuilder' ) );
$default_atts = [
'compare' => self::instance(),
'products' => $products,
'field_ids' => $field_ids,
'return_to_shop_text' => $return_to_shop_text,
'empty_text' => ! empty( $empty_text ) ? $empty_text : '',
];
$atts = shortcode_atts( $default_atts, $atts, $content );
$args = apply_filters( 'rtsb/module/compare/list_args', $atts );
return Fns::load_template( 'compare/list', $args, true );
}
/**
* Compare button Shortcode callable function
*
* @param array $atts
* @param string $content
*
* @return string [HTML]
*/
public function button_shortcode( $atts, $content = '' ) {
wp_enqueue_style( 'rtsb-modules' );
wp_enqueue_script( 'rtsb-compare' );
global $product;
if ( ! $product instanceof WC_Product ) {
return '';
}
ob_start();
do_action( 'rtsb/modules/compare/print_button', $product->get_id() );
return ob_get_clean();
}
/**
* Compare counter Shortcode callable function
*
* @param array $atts
* @param string $content
*
* @return string [HTML]
*/
public function counter_shortcode( $atts, $content = '' ) {
wp_enqueue_style( 'rtsb-modules' );
$product_ids = CompareFns::instance()->get_compared_product_ids();
$button_text = esc_html__( 'Compare', 'shopbuilder' );
$page_url = CompareFns::instance()->get_page_url();
$default_atts = [
'product_ids' => $product_ids,
'item_count' => count( $product_ids ),
'page_url' => $page_url,
'button_text' => $button_text,
'text' => '',
];
$atts = shortcode_atts( $default_atts, $atts, $content );
$count_attr = apply_filters( 'rtsb/module/compare/counter_args', $atts );
return Fns::load_template( 'compare/counter', $count_attr, true );
}
/**
* Add specific body class when the Wishlist page is opened
*
* @param array $classes Existing boy classes.
*
* @return array
*/
public function add_body_class( $classes ) {
$compare_page_id = Fns::get_option( 'modules', 'compare', 'page', 0, 'number' );
if ( ! empty( $compare_page_id ) && is_page( $compare_page_id ) ) {
$classes[] = 'rtsb-compare-page';
$classes[] = 'woocommerce';
$classes[] = 'woocommerce-page';
}
return $classes;
}
}