attach_button();
}
/**
* Hide Wishlist button.
*
* @param boolean $is_enable Wishlist Permission.
* @return boolean
*/
public function wishlist_button_show_hide( $is_enable ) {
$enable_login_limit = Fns::get_option( 'modules', 'wishlist', 'enable_login_limit', false, 'checkbox' );
$hide_for_non_logged_in = Fns::get_option( 'modules', 'wishlist', 'hide_wishlist_non_logged_in', false, 'checkbox' );
if ( $enable_login_limit && $hide_for_non_logged_in && ! is_user_logged_in() ) {
$is_enable = false;
}
return $is_enable;
}
/**
* Script.
*
* @return void
*/
public function enqueue() {
// Enqueue assets.
$this->handle = Fns::enqueue_module_assets( $this->handle, 'wishlist' );
if ( is_user_logged_in() && is_account_page() ) {
wp_enqueue_script( 'wc-add-to-cart' );
wp_enqueue_script( 'wc-add-to-cart-variation' );
}
$params = apply_filters(
'rtsb/module/wishlist/js_params',
[
'product_id' => get_the_ID(),
'resturl' => get_rest_url(),
'isLoggedIn' => is_user_logged_in(),
'pageUrl' => WishlistFns::instance()->get_page_url(),
'rest_nonce' => wp_create_nonce( 'wp_rest' ),
'notice' => [
'add_to_wishlist' => esc_html__( 'Add to wishlist', 'shopbuilder' ),
'remove_wishlist' => esc_html__( 'Remove from list', 'shopbuilder' ),
'button_text' => Fns::get_option( 'modules', 'wishlist', 'button_text', esc_html__( 'Add to wishlist', 'shopbuilder' ) ),
'added' => Fns::get_option( 'modules', 'wishlist', 'notice_added_text', esc_html__( 'Product added!', 'shopbuilder' ) ),
'removed' => Fns::get_option( 'modules', 'wishlist', 'notice_removed_text', esc_html__( 'Product removed!', 'shopbuilder' ) ),
'exist' => Fns::get_option( 'modules', 'wishlist', 'notice_removed_text', esc_html__( 'The product is already in your wishlist!', 'shopbuilder' ) ),
'browse' => Fns::get_option( 'modules', 'wishlist', 'browse_list_text', esc_html__( 'Browse wishlist', 'shopbuilder' ) ),
'error' => esc_html__( 'Security error!', 'shopbuilder' ),
'position' => Fns::get_option( 'general', 'notification', 'notification_position', 'center-center' ),
],
]
);
wp_localize_script( $this->handle, 'rtsbWishlistParams', $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/wishlist/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', 'wishlist', 'product_custom_hook_name', '' ),
'priority' => Fns::get_option( 'modules', 'wishlist', 'product_custom_hook_priority', 10 ),
],
]
);
// Add the link "Add to wishlist".
$product_btn_enable = Fns::get_option( 'modules', 'wishlist', 'show_btn_product_page', true, 'checkbox' );
$product_btn_position = Fns::get_option( 'modules', 'wishlist', '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', 'wishlist', 'show_btn_on_loop', false, 'checkbox' );
if ( ! $loop_btn_enable ) {
return;
}
$positions = apply_filters(
'rtsb/module/wishlist/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', 'wishlist', 'loop_custom_hook_name', '' ),
'priority' => Fns::get_option( 'modules', 'wishlist', 'loop_custom_hook_priority', 10 ),
],
]
);
// Add the link "Add to wishlist" in the loop.
$loop_btn_position = Fns::get_option( 'modules', 'wishlist', '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'] : '' );
}
// 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.
$loop_btn_position = Fns::get_option( 'modules', 'wishlist', 'shop_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 ( $loop_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-' . $loop_btn_position . '"', $parts[0] );
}
// join all parts together and return item.
return implode( '', $parts );
}
/**
* Print "Add to compare" button
*
* @return void
*/
public function button_hook() {
if ( ! apply_filters( 'rtsb/module/wishlist/show_button', true ) ) {
return;
}
global $product;
if ( ! $product instanceof WC_Product ) {
return;
}
do_action( 'rtsb/modules/wishlist/print_button', $product->get_id() );
}
/**
* Print "Add to compare" button
*
* @param int $product_id Product ID.
*
* @return void
*/
public function print_button( $product_id = 0 ) {
global $product;
if ( ! $product instanceof WC_Product && $product_id ) {
$product = wc_get_product( $product_id );
}
// product parent.
$product_parent = $product->get_parent_id();
// button class.
$classes = [];
// check if product is already in wishlist.
$exists = WishlistFns::instance()->is_exists_in_wishlist( $product->get_id() );
if ( $exists ) {
$classes[] = 'rtsb-wishlist-remove';
$button_text = esc_html__( 'Remove from list', 'shopbuilder' );
$button_text = apply_filters( 'rtsb/modules/wishlist/remove_from_list_button_text', $button_text );
$icon_html = '';
} else {
$classes[] = 'rtsb-wishlist-add';
$icon_html = '';
// labels & icons settings.
$button_text = Fns::get_option( 'modules', 'wishlist', 'button_text', esc_html__( 'Add to wishlist', 'shopbuilder' ) );
// button text.
$button_text = apply_filters( 'rtsb/module/wishlist/add_to_list_button_txt', $button_text );
}
// get product type.
$product_type = $product->get_type();
$params = [
'exists' => $exists,
'classes' => $classes,
'product_id' => $product->get_id(),
'parent_product_id' => $product_parent ?: $product->get_id(),
'product_type' => $product_type,
'button_text' => $button_text,
'show_button_text' => ! empty( Fns::get_option( 'modules', 'wishlist', 'button_text', '' ) ),
'left_text' => apply_filters( 'rtsb/module/wishlist/button_left_text', '' ),
'right_text' => apply_filters( 'rtsb/module/wishlist/button_right_text', '' ),
];
// let third party developer filter options.
$atts = apply_filters( 'rtsb/module/wishlist/button_params', $params );
// set fragment options.
$atts['icon_html'] = apply_filters( 'rtsb/module/wishlist/icon_html', $icon_html, $atts );
Fns::load_template( 'wishlist/button', $atts );
}
/**
* Add specific body class when the Wishlist page is opened
*
* @param array $classes Existing boy classes.
*
* @return array
*/
public function add_body_class( $classes ) {
$wishlist_page_id = Fns::get_option( 'modules', 'wishlist', 'page', '', 'number' );
if ( ! empty( $wishlist_page_id ) && is_page( $wishlist_page_id ) ) {
$classes[] = 'woocommerce-wishlist rtsb-wishlist-page';
$classes[] = 'woocommerce';
$classes[] = 'woocommerce-page';
}
return $classes;
}
/**
* Table List Shortcode callable function
*
* @param array $atts Shortcode attributes.
* @param string $content Shortcode content.
*
* @return string [HTML]
*/
public function list_shortcode( $atts, $content = '' ) {
$this->handle = Fns::optimized_handle( $this->handle );
wp_enqueue_style( $this->handle );
wp_enqueue_script( $this->handle );
/* Fetch From option data */
$empty_text = Fns::get_option( 'modules', 'wishlist', 'empty_table_text', esc_html__( 'No product found at your wishlist.', 'shopbuilder' ) );
/* Product and Field */
$products = WishlistFns::instance()->get_products_data();
$field_ids = WishlistFns::instance()->get_field_ids();
$custom_headings = [];
$default_atts = [
'products' => $products,
'field_ids' => $field_ids,
'empty_text' => ! empty( $empty_text ) ? $empty_text : '',
];
$atts = shortcode_atts( $default_atts, $atts, $content );
$args = apply_filters( 'rtsb/module/wishlist/list_args', $atts );
return Fns::load_template( 'wishlist/list', $args, true );
}
/**
* Wishlist button Shortcode callable function
*
* @return string [HTML]
*/
public function button_shortcode() {
$this->handle = Fns::optimized_handle( $this->handle );
wp_enqueue_style( $this->handle );
wp_enqueue_script( $this->handle );
ob_start();
global $product;
if ( ! $product instanceof WC_Product ) {
return '';
}
do_action( 'rtsb/modules/wishlist/print_button', $product->get_id() );
return ob_get_clean();
}
/**
* Counter Shortcode callable function
*
* @param array $atts Shortcode attributes.
* @param string $content Shortcode content.
*
* @return string [HTML]
*/
public function counter_shortcode( $atts, $content = '' ) {
wp_enqueue_style( Fns::optimized_handle( $this->handle ) );
$enable_login_limit = Fns::get_option( 'modules', 'wishlist', 'enable_login_limit', false, 'checkbox' );
$products = WishlistFns::instance()->get_wishlist_ids();
if ( ! is_user_logged_in() && $enable_login_limit ) {
$button_text = esc_html__( 'Please login', 'shopbuilder' );
} else {
$button_text = esc_html__( 'Wishlist', 'shopbuilder' );
}
$icon_html = '';
$page_url = WishlistFns::instance()->get_page_url();
$default_atts = [
'products' => $products,
'item_count' => count( $products ),
'page_url' => $page_url,
'button_text' => $button_text,
'enable_login_limit' => $enable_login_limit,
'text' => '',
'show_icon' => '', // 'yes' for show.
];
$atts = shortcode_atts( $default_atts, $atts, $content );
$count_attr = apply_filters( 'rtsb/module/wishlist/counter_args', $atts );
if ( 'yes' === ( $count_attr['show_icon'] ?? '' ) ) {
$count_attr['icon_html'] = apply_filters( 'rtsb/module/wishlist/counter/icon_html', $icon_html, $count_attr );
} else {
$count_attr['icon_html'] = '';
}
return Fns::load_template( 'wishlist/counter', $count_attr, true );
}
}