is_exists_in_wishlist( $product_id ) ) {
return 0;
}
$pIds = $this->get_wishlist_ids();
$pIds = array_diff( $pIds, [ $product_id ] );
if ( is_user_logged_in() ) {
$this->update_user_wishlist_ids( $pIds );
} else {
$cookie_name = $this->get_cookie_name();
if ( empty( $pIds ) ) {
setcookie( $cookie_name, false, 0, COOKIEPATH, COOKIE_DOMAIN, false, false );
$_COOKIE[ $cookie_name ] = false;
} else {
setcookie( $cookie_name, wp_json_encode( $pIds ), 0, COOKIEPATH, COOKIE_DOMAIN, false, false );
$_COOKIE[ $cookie_name ] = wp_json_encode( $pIds );
}
}
return true;
}
public static function get_page_url() {
$page_id = Fns::get_option( 'modules', 'wishlist', 'page' );
return absint( $page_id ) ? get_permalink( $page_id ) : '#';
}
/**
* Product Add
*
* @param integer $product_id
*/
public function add_product( $product_id ) {
if ( $this->is_exists_in_wishlist( $product_id ) ) {
return 0;
}
$pIds = $this->get_wishlist_ids();
$pIds[] = $product_id;
if ( is_user_logged_in() ) {
$this->update_user_wishlist_ids( $pIds );
} else {
$cookie_name = $this->get_cookie_name();
setcookie( $cookie_name, wp_json_encode( $pIds ), 0, COOKIEPATH, COOKIE_DOMAIN, false, false );
$_COOKIE[ $cookie_name ] = wp_json_encode( $pIds );
}
return 1;
}
/**
* [get_products_data] generate wishlist products data
*
* @return array product list
*/
public function get_products_data() {
$ids = $this->get_wishlist_ids();
if ( empty( $ids ) ) {
return [];
}
$args = [
'include' => $ids,
];
$products = wc_get_products( $args );
$products_data = [];
$fields = $this->get_field_ids();
$fields = array_filter(
$fields,
function ( $field ) {
return 'pa_' === substr( $field, 0, 3 );
},
ARRAY_FILTER_USE_KEY
);
$data_none = '-';
foreach ( $products as $product ) {
$rating_count = $product->get_rating_count();
$average = $product->get_average_rating();
$quantity_args = [
'input_value' => 1,
'min_value' => $product->get_min_purchase_quantity(),
'max_value' => $product->get_max_purchase_quantity(),
];
$products_data[ $product->get_id() ] = [
'id' => $product->get_id(),
'remove' => $product->get_id(),
'image' => $product->get_image() ? $product->get_image() : $data_none,
'title' => $product->get_title() ? $product->get_title() : $data_none,
'image_id' => $product->get_image_id(),
'permalink' => $product->get_permalink(),
'price' => $product->get_price_html() ? $product->get_price_html() : $data_none,
'rating' => wc_get_rating_html( $average, $rating_count ),
'add_to_cart' => $this->add_to_cart_html( $product ) ? $this->add_to_cart_html( $product ) : $data_none,
'quantity' => woocommerce_quantity_input( $quantity_args, $product, false ),
'dimensions' => wc_format_dimensions( $product->get_dimensions( false ) ),
'description' => $product->get_short_description() ? $product->get_short_description() : $data_none,
'weight' => $product->get_weight() ? $product->get_weight() : $data_none,
'sku' => $product->get_sku() ? $product->get_sku() : $data_none,
'availability' => $this->availability_html( $product ),
];
foreach ( $fields as $field_id => $field_name ) {
if ( taxonomy_exists( $field_id ) ) {
$products_data[ $product->get_id() ][ $field_id ] = [];
$terms = get_the_terms( $product->get_id(), $field_id );
if ( ! empty( $terms ) ) {
foreach ( $terms as $term ) {
$term = sanitize_term( $term, $field_id );
$products_data[ $product->get_id() ][ $field_id ][] = $term->name;
}
} else {
$products_data[ $product->get_id() ][ $field_id ][] = '-';
}
$products_data[ $product->get_id() ][ $field_id ] = implode( ', ', $products_data[ $product->get_id() ][ $field_id ] );
}
}
}
return $products_data;
}
/**
* Table field list
*
* @return array Table Field list
*/
public function get_field_ids() {
$default_show = [
'info',
'price',
'availability',
'add_to_cart',
'remove',
];
$fields_settings = Fns::get_option( 'modules', 'wishlist', 'page_show_fields', [] );
if ( isset( $fields_settings ) && ( is_array( $fields_settings ) ) && count( $fields_settings ) > 1 ) {
$fields = $fields_settings;
} else {
$fields = $default_show;
}
return $fields;
}
/**
* Get default fields List
* return array
*/
public function get_default_fields() {
$fields = [
'info' => esc_html__( 'Products', 'shopbuilder' ),
'image' => esc_html__( 'Image', 'shopbuilder' ),
'title' => esc_html__( 'Title', 'shopbuilder' ),
'price' => esc_html__( 'Price', 'shopbuilder' ),
'quantity' => esc_html__( 'Quantity', 'shopbuilder' ),
'add_to_cart' => esc_html__( 'Add To Cart', 'shopbuilder' ),
'remove' => esc_html__( 'Remove', 'shopbuilder' ),
'description' => esc_html__( 'Description', 'shopbuilder' ),
'availability' => esc_html__( 'Availability', 'shopbuilder' ),
'sku' => esc_html__( 'Sku', 'shopbuilder' ),
'weight' => esc_html__( 'Weight', 'shopbuilder' ),
'dimensions' => esc_html__( 'Dimensions', 'shopbuilder' ),
];
return apply_filters( 'rtsb/module/wishlist/list_default_fields', $fields );
}
/**
* [get_cookie_name] Get cookie name
*
* @return string [string]
*/
public function get_cookie_name() {
$name = Wishlist::KEY;
if ( is_multisite() ) {
$name .= '_' . get_current_blog_id();
}
return $name;
}
/**
* display_field
*
* @param string $field_id
* @param array $product
*
* @return void [html]
*/
public function display_field( $field_id, $product ) {
$type = $field_id;
if ( 'pa_' === substr( $field_id, 0, 3 ) ) {
$type = 'attribute';
}
switch ( $type ) {
case 'info':
?>
' . wp_kses_post( $product[ $field_id ] ) . '';
break;
case 'add_to_cart':
Fns::print_html( apply_filters( 'rtsb/modules/wishlist/add_to_cart_btn', $product[ $field_id ] ) );
break;
case 'attribute':
echo wp_kses_post( $product[ $field_id ] );
break;
case 'weight':
if ( $product[ $field_id ] ) {
$unit = $product[ $field_id ] !== '-' ? get_option( 'woocommerce_weight_unit' ) : '';
Fns::print_html( wc_format_localized_decimal( $product[ $field_id ] ) . ' ' . esc_attr( $unit ) );
}
break;
case 'description':
Fns::print_html( apply_filters( 'woocommerce_short_description', $product[ $field_id ] ) );
break;
default:
echo wp_kses_post( $product[ $field_id ] );
break;
}
}
/**
* Field name
*
* @param string $field
*
* @return string|void
*/
public function field_name( $field, $custom = false ) {
if ( empty( $field ) ) {
return;
}
if ( $custom === true ) {
return $field;
}
$default = $this->get_default_fields();
$str = substr( $field, 0, 3 );
if ( 'pa_' === $str ) {
$field_name = wc_attribute_label( $field );
} else {
$field_name = $default[ $field ];
}
return $field_name;
}
/**
* Get wishlist product ids
*
* @return array
*/
public function get_wishlist_ids() {
$ids = [];
if ( is_user_logged_in() ) {
$listIds = get_user_meta( get_current_user_id(), Wishlist::KEY, true );
if ( is_array( $listIds ) && ! empty( $listIds ) ) {
$ids = array_map( 'absint', $listIds );
}
} else {
$cookie_name = $this->get_cookie_name();
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( isset( $_COOKIE[ $cookie_name ] ) && is_array( json_decode( wp_unslash( $_COOKIE[ $cookie_name ] ), true ) ) ) {
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$ids = array_map( 'absint', json_decode( wp_unslash( $_COOKIE[ $cookie_name ] ), true ) );
}
}
return Fns::get_available_products_by_ids( $ids );
}
public function update_user_wishlist_ids( $product_ids ) {
$uid = get_current_user_id();
$product_ids = Fns::get_available_products_by_ids( $product_ids );
update_user_meta( $uid, Wishlist::KEY, $product_ids );
}
/**
* @param $product_id
*
* @return bool
*/
public function is_exists_in_wishlist( $product_id ) {
$id = $product_id;
$list = $this->get_wishlist_ids();
if ( is_array( $list ) ) {
return in_array( $id, $list, true );
} else {
return false;
}
}
/**
* @param WC_Product $product
*
* @return string
*/
public function availability_html( $product ) {
$html = '';
$availability = $product->get_availability();
if ( empty( $availability['availability'] ) ) {
$availability['availability'] = esc_html__( 'In stock', 'shopbuilder' );
}
if ( ! empty( $availability['availability'] ) ) {
ob_start();
wc_get_template(
'single-product/stock.php',
[
'product' => $product,
'class' => $availability['class'],
'availability' => $availability['availability'],
]
);
$html = ob_get_clean();
}
return apply_filters( 'woocommerce_get_stock_html', $html, $product );
}
/**
* Generate Cart button
*
* @param WC_Product $product
*/
public function add_to_cart_html( $product ) {
if ( ! $product ) {
return;
}
$defaults = [
'quantity' => 1,
'class' => implode(
' ',
array_filter(
[
'htcompare-cart-button button',
'product_type_' . $product->get_type(),
$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
$product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && $product->is_in_stock() ? 'ajax_add_to_cart' : '',
]
)
),
'attributes' => [
'data-product_id' => $product->get_id(),
'data-product_sku' => $product->get_sku(),
'aria-label' => $product->add_to_cart_description(),
'rel' => 'nofollow',
],
];
$args = apply_filters( 'woocommerce_loop_add_to_cart_args', $defaults, $product );
if ( isset( $args['attributes']['aria-label'] ) ) {
$args['attributes']['aria-label'] = wp_strip_all_tags( $args['attributes']['aria-label'] );
}
return apply_filters(
'woocommerce_loop_add_to_cart_link',
sprintf(
'%s',
esc_url( $product->add_to_cart_url() ),
esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ),
esc_attr( isset( $args['class'] ) ? $args['class'] : 'button' ),
isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
esc_html( $product->add_to_cart_text() )
),
$product,
$args
);
}
}