Skip to content

Instantly share code, notes, and snippets.

@dhilditch
Created July 17, 2019 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dhilditch/b051cb242e46ae657ed2359e2154d8d7 to your computer and use it in GitHub Desktop.
Save dhilditch/b051cb242e46ae657ed2359e2154d8d7 to your computer and use it in GitHub Desktop.
Performance improvement for Yith Wishlist by amending yith-woocommerce-wishlist/includes/class.yith-wcwl.php
<?php
/**
* Main class
*
* @author Your Inspiration Themes
* @package YITH WooCommerce Wishlist
* @version 2.0.9
*/
if ( ! defined( 'YITH_WCWL' ) ) {
exit;
} // Exit if accessed directly
if ( ! class_exists( 'YITH_WCWL' ) ) {
/**
* WooCommerce Wishlist
*
* @since 1.0.0
*/
class YITH_WCWL {
/**
* Single instance of the class
*
* @var \YITH_WCWL
* @since 2.0.0
*/
protected static $instance;
/**
* Errors array
*
* @var array
* @since 1.0.0
*/
public $errors;
/**
* Last operation token
*
* @var string
* @since 2.0.0
*/
public $last_operation_token;
/**
* Details array
*
* @var array
* @since 1.0.0
*/
public $details;
/**
* Messages array
*
* @var array
* @since 1.0.0
*/
public $messages;
/**
* Query string parameter used to generate Wishlist urls
*
* @var string
* @since 2.1.2
*/
public $wishlist_param = 'wishlist-action';
/**
* Returns single instance of the class
*
* @return \YITH_WCWL
* @since 2.0.0
*/
public static function get_instance(){
if( is_null( self::$instance ) ){
self::$instance = new self( $_REQUEST );
}
return self::$instance;
}
/**
* Constructor.
*
* @param array $details
* @return \YITH_WCWL
* @since 1.0.0
*/
public function __construct( $details ) {
// set details for actions
$this->details = $details;
// init main plugin classes
$this->wcwl_init = YITH_WCWL_Init();
if( is_admin() ){
$this->wcwl_admin_init = YITH_WCWL_Admin_Init();
}
// load plugin-fw
add_action( 'plugins_loaded', array( $this, 'plugin_fw_loader' ), 15 );
add_action( 'plugins_loaded', array( $this, 'privacy_loader' ), 20 );
// add rewrite rule
add_action( 'init', array( $this, 'add_rewrite_rules' ), 0 );
add_filter( 'query_vars', array( $this, 'add_public_query_var' ) );
// add to wishlist
add_action( 'init', array( $this, 'add_to_wishlist' ) );
add_action( 'wp_ajax_add_to_wishlist', array( $this, 'add_to_wishlist_ajax' ) );
add_action( 'wp_ajax_nopriv_add_to_wishlist', array( $this, 'add_to_wishlist_ajax' ) );
// remove from wishlist
add_action( 'init', array( $this, 'remove_from_wishlist' ) );
add_action( 'wp_ajax_remove_from_wishlist', array( $this, 'remove_from_wishlist_ajax' ) );
add_action( 'wp_ajax_nopriv_remove_from_wishlist', array( $this, 'remove_from_wishlist_ajax' ) );
// add to wishlist and reload
add_action( 'wp_ajax_reload_wishlist_and_adding_elem', array( $this, 'reload_wishlist_and_adding_elem_ajax' ) );
add_action( 'wp_ajax_nopriv_reload_wishlist_and_adding_elem', array( $this, 'reload_wishlist_and_adding_elem_ajax' ) );
// remove from wishlist after add to cart
add_action( 'woocommerce_add_to_cart', array( $this, 'remove_from_wishlist_after_add_to_cart' ) );
// redirect to cart after add to cart in wishlist view
add_filter( 'woocommerce_product_add_to_cart_url', array( $this, 'redirect_to_cart' ), 10, 2 );
add_filter( 'woocommerce_add_to_cart_redirect', array( $this, 'yith_wfbt_redirect_after_add_to_cart' ), 10, 1 );
// print notices in wishlist page
add_action( 'yith_wcwl_before_wishlist_title', array( $this, 'print_notices' ) );
// add filter for font-awesome compatibility
add_filter( 'option_yith_wcwl_add_to_wishlist_icon', array( $this, 'update_font_awesome_classes' ) );
add_filter( 'option_yith_wcwl_add_to_cart_icon', array( $this, 'update_font_awesome_classes' ) );
}
/* === PLUGIN FW LOADER === */
/**
* Loads plugin fw, if not yet created
*
* @return void
* @since 2.0.0
*/
public function plugin_fw_loader() {
if ( ! defined( 'YIT_CORE_PLUGIN' ) ) {
global $plugin_fw_data;
if( ! empty( $plugin_fw_data ) ){
$plugin_fw_file = array_shift( $plugin_fw_data );
require_once( $plugin_fw_file );
}
}
}
/* === PRIVACY LOADER === */
/**
* Loads privacy class
*
* @return void
* @since 2.0.0
*/
public function privacy_loader() {
if( class_exists( 'YITH_Privacy_Plugin_Abstract' ) ) {
require_once( YITH_WCWL_INC . 'class.yith-wcwl-privacy.php' );
new YITH_WCWL_Privacy();
}
}
/* === ITEMS METHODS === */
/**
* Add a product in the wishlist.
*
* @return string "error", "true" or "exists"
* @since 1.0.0
*/
public function add() {
global $wpdb, $sitepress;
$prod_id = ( isset( $this->details['add_to_wishlist'] ) && is_numeric( $this->details['add_to_wishlist'] ) ) ? $this->details['add_to_wishlist'] : false;
$wishlist_id = ( isset( $this->details['wishlist_id'] ) && strcmp( $this->details['wishlist_id'], 0 ) != 0 ) ? $this->details['wishlist_id'] : false;
$quantity = ( isset( $this->details['quantity'] ) ) ? ( int ) $this->details['quantity'] : 1;
$user_id = ( ! empty( $this->details['user_id'] ) ) ? $this->details['user_id'] : false;
$dateadded = ( ! empty( $this->details['$dateadded'] ) ) ? $this->details['$dateadded'] : '';
do_action( 'yith_wcwl_adding_to_wishlist', $prod_id, $wishlist_id, $user_id );
// filtering params
$prod_id = apply_filters( 'yith_wcwl_adding_to_wishlist_prod_id', $prod_id );
$wishlist_id = apply_filters( 'yith_wcwl_adding_to_wishlist_wishlist_id', $wishlist_id );
$quantity = apply_filters( 'yith_wcwl_adding_to_wishlist_quantity', $quantity );
$user_id = apply_filters( 'yith_wcwl_adding_to_wishlist_user_id', $user_id );
$dateadded = apply_filters( 'yith_wcwl_adding_to_wishlist_dateadded', $dateadded );
if( defined('ICL_SITEPRESS_VERSION') ) {
$prod_id = yit_wpml_object_id( $prod_id, 'product', true, $sitepress->get_default_language() );
}
if ( $prod_id == false ) {
$this->errors[] = __( 'An error occurred while adding products to the wishlist.', 'yith-woocommerce-wishlist' );
return "error";
}
//check for existence, product ID, variation ID, variation data, and other cart item data
if( strcmp( $wishlist_id, 'new' ) != 0 && $this->is_product_in_wishlist( $prod_id, $wishlist_id ) ) {
if( $wishlist_id != false ){
$wishlist = $this->get_wishlist_detail( $wishlist_id );
$this->last_operation_token = $wishlist['wishlist_token'];
}
else{
$this->last_operation_token = false;
}
return "exists";
}
if( $user_id != false ) {
$insert_args = array(
'prod_id' => $prod_id,
'user_id' => $user_id,
'quantity' => $quantity,
'dateadded' => ! empty( $dateadded ) ? $dateadded : date( 'Y-m-d H:i:s' )
);
if( ! empty( $wishlist_id ) && strcmp( $wishlist_id, 'new' ) != 0 ){
$insert_args[ 'wishlist_id' ] = $wishlist_id;
$wishlist = $this->get_wishlist_detail( $insert_args[ 'wishlist_id' ] );
$this->last_operation_token = $wishlist['wishlist_token'];
}
elseif( strcmp( $wishlist_id, 'new' ) == 0 ){
$response = function_exists( 'YITH_WCWL_Premium' ) ? YITH_WCWL_Premium()->add_wishlist() : $this->add_wishlist();
if( $response == "error" ){
return "error";
}
else{
$insert_args[ 'wishlist_id' ] = $response;
$wishlist = $this->get_wishlist_detail( $insert_args[ 'wishlist_id' ] );
$this->last_operation_token = $wishlist['wishlist_token'];
}
}
elseif( empty( $wishlist_id ) ){
$wishlist_id = $this->generate_default_wishlist( $user_id );
$insert_args[ 'wishlist_id' ] = $wishlist_id;
if( $this->is_product_in_wishlist( $prod_id, $wishlist_id ) ){
return "exists";
}
}
$result = $wpdb->insert( $wpdb->yith_wcwl_items, $insert_args );
if( $result ){
if( $this->last_operation_token ) {
delete_transient( 'yith_wcwl_wishlist_count_' . $this->last_operation_token );
}
if( $user_id ) {
delete_transient( 'yith_wcwl_user_default_count_' . $user_id );
delete_transient( 'yith_wcwl_user_total_count_' . $user_id );
}
}
}
else {
$cookie = array(
'prod_id' => $prod_id,
'quantity' => $quantity,
'wishlist_id' => $wishlist_id,
'dateadded' => ! empty( $dateadded ) ? $dateadded : date( 'Y-m-d H:i:s' )
);
$wishlist = yith_getcookie( 'yith_wcwl_products' );
$found = $this->is_product_in_wishlist( $prod_id, $wishlist_id );
if( ! $found ){
$wishlist[] = $cookie;
}
yith_setcookie( 'yith_wcwl_products', $wishlist );
$result = true;
}
if( $result ) {
do_action( 'yith_wcwl_added_to_wishlist', $prod_id, $wishlist_id, $user_id );
return "true";
}
else {
$this->errors[] = __( 'An error occurred while adding products to wishlist.', 'yith-woocommerce-wishlist' );
return "error";
}
}
/**
* Remove an entry from the wishlist.
*
* @param $id int|bool Deprecated
*
* @return bool
* @since 1.0.0
*/
public function remove( $id = false ) {
global $wpdb, $sitepress;
if( ! empty( $id ) ) {
_deprecated_argument( 'YITH_WCWL->remove()', '2.0.0', __( 'The "Remove" option now does not require any parameter' ) );
}
$prod_id = ( isset( $this->details['remove_from_wishlist'] ) && is_numeric( $this->details['remove_from_wishlist'] ) ) ? $this->details['remove_from_wishlist'] : false;
$wishlist_id = ( isset( $this->details['wishlist_id'] ) && is_numeric( $this->details['wishlist_id'] ) ) ? $this->details['wishlist_id'] : false;
$user_id = ( ! empty( $this->details['user_id'] ) ) ? $this->details['user_id'] : false;
do_action( 'yith_wcwl_removing_from_wishlist', $prod_id, $wishlist_id, $user_id );
if( defined('ICL_SITEPRESS_VERSION') ) {
$prod_id = yit_wpml_object_id( $prod_id, 'product', true, $sitepress->get_default_language() );
}
if( $prod_id == false ){
return false;
}
if ( is_user_logged_in() ) {
$sql = "DELETE FROM {$wpdb->yith_wcwl_items} WHERE user_id = %d AND prod_id = %d";
$sql_args = array(
$user_id,
$prod_id
);
if( empty( $wishlist_id ) ){
$wishlist_id = $this->generate_default_wishlist( get_current_user_id() );
}
$wishlist = $this->get_wishlist_detail( $wishlist_id );
$this->last_operation_token = $wishlist['wishlist_token'];
$sql .= " AND wishlist_id = %d";
$sql_args[] = $wishlist_id;
$result = $wpdb->query( $wpdb->prepare( $sql, $sql_args ) );
if ( $result ) {
if( $this->last_operation_token ) {
delete_transient( 'yith_wcwl_wishlist_count_' . $this->last_operation_token );
}
if( $user_id ) {
delete_transient( 'yith_wcwl_user_default_count_' . $user_id );
delete_transient( 'yith_wcwl_user_total_count_' . $user_id );
}
$result = true;
}
else {
$this->errors[] = __( 'An error occurred while removing products from the wishlist', 'yith-woocommerce-wishlist' );
$result = false;
}
}
else {
$wishlist = yith_getcookie( 'yith_wcwl_products' );
foreach( $wishlist as $key => $item ){
if( $item['wishlist_id'] == $wishlist_id && $item['prod_id'] == $prod_id ){
unset( $wishlist[ $key ] );
}
}
yith_setcookie( 'yith_wcwl_products', $wishlist );
$result = true;
}
if( $result ){
do_action( 'yith_wcwl_removed_from_wishlist', $prod_id, $wishlist_id, $user_id );
}
return $result;
}
/**
* Check if the product exists in the wishlist.
*
* @param int $product_id Product id to check
* @param int|bool $wishlist_id Wishlist where to search (use false to search in default wishlist)
* @return bool
* @since 1.0.0
*/
public function is_product_in_wishlist( $product_id, $wishlist_id = false ) {
global $wpdb, $sitepress;
$exists = false;
if( defined('ICL_SITEPRESS_VERSION') ) {
$product_id = yit_wpml_object_id( $product_id, 'product', true, $sitepress->get_default_language() );
}
if( is_user_logged_in() ) {
$user_id = ( $this->details['user_id'] ) ? $this->details['user_id'] : get_current_user_id();
$sql = "SELECT COUNT(*) as `cnt` FROM `{$wpdb->yith_wcwl_items}` WHERE `prod_id` = %d AND `user_id` = %d";
$sql_args = array(
$product_id,
$user_id
);
if( $wishlist_id != false ){
$sql .= " AND `wishlist_id` = %d";
$sql_args[] = $wishlist_id;
}
elseif( $default_wishlist_id = $this->generate_default_wishlist( get_current_user_id() ) ){
$sql .= " AND `wishlist_id` = %d";
$sql_args[] = $default_wishlist_id;
}
else{
$sql .= " AND `wishlist_id` IS NULL";
}
$results = $wpdb->get_var( $wpdb->prepare( $sql, $sql_args ) );
$exists = (bool) ( $results > 0 );
}
else {
$wishlist = yith_getcookie( 'yith_wcwl_products' );
if( $wishlist && is_array( $wishlist ) ) {
foreach ( $wishlist as $key => $item ) {
if ( $item['wishlist_id'] == $wishlist_id && $item['prod_id'] == $product_id ) {
$exists = true;
}
}
}
}
return apply_filters( 'yith_wcwl_is_product_in_wishlist', $exists, $product_id, $wishlist_id );
}
/**
* Retrieve elements of the wishlist for a specific user
*
* @param $args mixed Arguments array; it may contains any of the following:<br/>
* [<br/>
* 'user_id' // Owner of the wishlist; default to current user logged in (if any), or false for cookie wishlist<br/>
* 'product_id' // Product to search in the wishlist<br/>
* 'wishlist_id' // wishlist_id for a specific wishlist, false for default, or all for any wishlist<br/>
* 'wishlist_token' // wishlist token, or false as default<br/>
* 'wishlist_visibility' // all, visible, public, shared, private<br/>
* 'is_default' => // whether searched wishlist should be default one <br/>
* 'id' => false, // only for table select<br/>
* 'limit' => false, // pagination param; number of items per page. 0 to get all items<br/>
* 'offset' => 0 // pagination param; offset for the current set. 0 to start from the first item<br/>
* ]
*
* @return array
* @since 2.0.0
*/
public function get_products( $args = array() ) {
global $wpdb;
$default = array(
'user_id' => ( is_user_logged_in() ) ? get_current_user_id(): false,
'product_id' => false,
'wishlist_id' => false, //wishlist_id for a specific wishlist, false for default, or all for any wishlist
'wishlist_token' => false,
'wishlist_visibility' => apply_filters( 'yith_wcwl_wishlist_visibility_string_value', 'all'), // all, visible, public, shared, private
'is_default' => false,
'id' => false, // only for table select
'limit' => false,
'offset' => 0
);
$args = wp_parse_args( $args, $default );
extract( $args );
if( ! empty( $user_id ) || ! empty( $wishlist_token ) || ! empty( $wishlist_id ) ) {
$hidden_products = yith_wcwl_get_hidden_products();
$sql = "SELECT *, i.dateadded AS dateadded
FROM `{$wpdb->yith_wcwl_items}` AS i
LEFT JOIN {$wpdb->yith_wcwl_wishlists} AS l ON l.`ID` = i.`wishlist_id`
INNER JOIN {$wpdb->posts} AS p ON p.ID = i.prod_id
WHERE 1 AND p.post_type = %s AND p.post_status = %s";
$sql .= $hidden_products ? " AND p.ID NOT IN ( " . implode( ', ', array_filter( $hidden_products, 'esc_sql' ) ) . " )" : "";
$sql_args = array(
'product',
'publish'
);
if( ! empty( $user_id ) ){
$sql .= " AND i.`user_id` = %d";
$sql_args[] = $user_id;
}
if( ! empty( $product_id ) ){
$sql .= " AND i.`prod_id` = %d";
$sql_args[] = $product_id;
}
if( ! empty( $wishlist_id ) && $wishlist_id != 'all' ){
$sql .= " AND i.`wishlist_id` = %d";
$sql_args[] = $wishlist_id;
}
elseif( ( empty( $wishlist_id ) ) && empty( $wishlist_token ) && empty( $is_default ) ){
$sql .= " AND i.`wishlist_id` IS NULL";
}
if( ! empty( $wishlist_token ) ){
$sql .= " AND l.`wishlist_token` = %s";
$sql_args[] = $wishlist_token;
}
if( ! empty( $wishlist_visibility ) && $wishlist_visibility != 'all' ){
switch( $wishlist_visibility ){
case 'visible':
$sql .= " AND ( l.`wishlist_privacy` = %d OR l.`wishlist_privacy` = %d )";
$sql_args[] = 0;
$sql_args[] = 1;
break;
case 'public':
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 0;
break;
case 'shared':
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 1;
break;
case 'private':
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 2;
break;
default:
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 0;
break;
}
}
if( ! empty( $is_default ) ){
if( ! empty( $user_id ) ){
$this->generate_default_wishlist( $user_id );
}
$sql .= " AND l.`is_default` = %d";
$sql_args[] = $is_default;
}
if( ! empty( $id ) ){
$sql .= " AND `i.ID` = %d";
$sql_args[] = $id;
}
$sql .= " GROUP BY i.prod_id, l.ID";
if( ! empty( $limit ) && isset( $offset ) ){
$sql .= " LIMIT %d, %d";
$sql_args[] = $offset;
$sql_args[] = $limit;
}
$wishlist = $wpdb->get_results( $wpdb->prepare( $sql, $sql_args ), ARRAY_A );
}
else{
$wishlist = yith_getcookie( 'yith_wcwl_products' );
$hidden_products = yith_wcwl_get_hidden_products();
$wishlist_product_ids = "";
$wishlistsep = "";
foreach( $wishlist as $key => $cookie ){
$wishlist_product_ids .= $wishlistsep;
if (is_int($cookie['prod_id'])) {
$wishlist_product_ids .= (int)$cookie['prod_id'];
}
$wishlistsep = ",";
}
if (empty($wishlist_product_ids)) {
$wishlist_product_ids = " AND 1 = 2 "; // if nothing in wishlist, we do AND 1=2 to return empty set
} else {
$wishlist_product_ids = ' AND p.ID IN (' . $wishlist_product_ids . ') ';
}
$query = "SELECT ID FROM {$wpdb->posts} AS p
WHERE post_type = %s AND post_status = %s" . $wishlist_product_ids; //added restriction to check only for products in wishlist
$query .= ! empty( $hidden_products ) ? ( " AND p.ID NOT IN ( " . implode( ', ', array_filter( $hidden_products, 'esc_sql' ) ). " )" ) : "";
$query_args = array(
'product',
'publish'
);
$existing_products = $wpdb->get_col( $wpdb->prepare( $query, $query_args ) );
foreach( $wishlist as $key => $cookie ){
if( ! in_array( $cookie['prod_id'], $existing_products ) ){
unset( $wishlist[ $key ] );
}
if( ! empty( $product_id ) && $cookie['prod_id'] != $product_id ){
unset( $wishlist[ $key ] );
}
if( ( ! empty( $wishlist_id ) && $wishlist_id != 'all' ) && $cookie['wishlist_id'] != $wishlist_id ){
unset( $wishlist[ $key ] );
}
}
if( ! empty( $limit ) && isset( $offset ) ){
$wishlist = array_slice( $wishlist, $offset, $limit );
}
}
return apply_filters( 'yith_wcwl_get_products', $wishlist, $args );
}
/**
* Retrieve the number of products in the wishlist.
*
* @param $wishlist_token string|bool Wishlist token if any; false for default wishlist
*
* @return int
* @since 1.0.0
*/
public function count_products( $wishlist_token = false ) {
global $wpdb;
if( is_user_logged_in() || $wishlist_token != false ) {
if( ! empty( $wishlist_token ) ) {
$count = get_transient( 'yith_wcwl_wishlist_count_' . $wishlist_token );
}
else{
$count = get_transient( 'yith_wcwl_user_default_count_' . get_current_user_id() );
}
if( false === $count ){
$hidden_products = yith_wcwl_get_hidden_products();
$sql = "SELECT i.`prod_id` AS `cnt`
FROM `{$wpdb->yith_wcwl_items}` AS i
LEFT JOIN `{$wpdb->yith_wcwl_wishlists}` AS l ON l.ID = i.wishlist_id
INNER JOIN `{$wpdb->posts}` AS p ON i.`prod_id` = p.`ID`
WHERE p.`post_type` = %s AND p.`post_status` = %s";
$sql .= $hidden_products ? " AND p.ID NOT IN ( " . implode( ', ', array_filter( $hidden_products, 'esc_sql' ) ) . " )" : "";
$args = array(
'product',
'publish'
);
if ( ! empty( $wishlist_token ) ) {
$sql .= " AND l.`wishlist_token` = %s";
$args[] = $wishlist_token;
} else {
$sql .= " AND l.`is_default` = %d AND l.`user_id` = %d";
$args[] = 1;
$args[] = get_current_user_id();
}
$sql .= " GROUP BY i.prod_id, l.ID";
$query = $wpdb->prepare( $sql, $args );
$count = count( $wpdb->get_col( $query ) );
$transient_name = ! empty( $wishlist_token ) ? ( 'yith_wcwl_wishlist_count_' . $wishlist_token ) : ( 'yith_wcwl_user_default_count_' . get_current_user_id() );
set_transient( $transient_name, $count, WEEK_IN_SECONDS );
}
return $count;
}
else {
$wishlist = yith_getcookie( 'yith_wcwl_products' );
$hidden_products = yith_wcwl_get_hidden_products();
$wishlist_product_ids = "";
$wishlistsep = "";
foreach( $wishlist as $key => $cookie ){
$wishlist_product_ids .= $wishlistsep;
if (is_int($cookie['prod_id'])) {
$wishlist_product_ids .= (int)$cookie['prod_id'];
}
$wishlistsep = ",";
}
if (empty($wishlist_product_ids)) {
$wishlist_product_ids = " AND 1 = 2 "; // if nothing in wishlist, we do AND 1=2 to return empty set
} else {
$wishlist_product_ids = ' AND p.ID IN (' . $wishlist_product_ids . ') ';
}
$query = "SELECT ID FROM {$wpdb->posts} AS p
WHERE post_type = %s AND post_status = %s" . $wishlist_product_ids; //added restriction to check only for products in wishlist
$query .= ! empty( $hidden_products ) ? ( " AND p.ID NOT IN ( " . implode( ', ', array_filter( $hidden_products, 'esc_sql' ) ). " )" ) : "";
$query_args = array(
'product',
'publish'
);
$existing_products = $wpdb->get_col( $wpdb->prepare( $query, $query_args ) );
$wishlist_products = array();
if( ! empty( $wishlist ) ){
foreach( $wishlist as $elem ){
$wishlist_products[] = $elem['prod_id'];
}
}
$wishlist_products = array_intersect( $wishlist_products, $existing_products );
return count( $wishlist_products );
}
}
/**
* Count all user items in wishlists
*
* @return int Count of items added all over wishlist from current user
* @since 2.0.12
*/
public function count_all_products() {
global $wpdb;
if( is_user_logged_in() ) {
$user_id = get_current_user_id();
if( false === $count = get_transient( 'yith_wcwl_user_total_count_' . $user_id ) ) {
$hidden_products = yith_wcwl_get_hidden_products();
$sql = "SELECT COUNT( i.`prod_id` ) AS `cnt`
FROM `{$wpdb->yith_wcwl_items}` AS i
WHERE i.`user_id` = %d AND i.`prod_id` IN (
SELECT ID
FROM {$wpdb->posts} AS p
WHERE p.`post_type` = %s AND p.`post_status` = %s";
$sql .= ! empty( $hidden_products ) ? ( " AND p.ID NOT IN ( " . implode( ', ', array_filter( $hidden_products, 'esc_sql' ) ). " )" ) : "";
$sql .= ")";
$query = $wpdb->prepare( $sql, array( $user_id, 'product', 'publish' ) );
$count = $wpdb->get_var( $query );
set_transient( 'yith_wcwl_user_total_count_' . $user_id, $count, WEEK_IN_SECONDS );
}
return $count;
}
else {
$wishlist = yith_getcookie( 'yith_wcwl_products' );
$hidden_products = yith_wcwl_get_hidden_products();
$wishlist_product_ids = "";
$wishlistsep = "";
foreach( $wishlist as $key => $cookie ){
$wishlist_product_ids .= $wishlistsep;
if (is_int($cookie['prod_id'])) {
$wishlist_product_ids .= (int)$cookie['prod_id'];
}
$wishlistsep = ",";
}
if (empty($wishlist_product_ids)) {
$wishlist_product_ids = " AND 1 = 2 "; // if nothing in wishlist, we do AND 1=2 to return empty set
} else {
$wishlist_product_ids = ' AND p.ID IN (' . $wishlist_product_ids . ') ';
}
$query = "SELECT ID FROM {$wpdb->posts} AS p
WHERE post_type = %s AND post_status = %s" . $wishlist_product_ids; //added restriction to check only for products in wishlist
$query .= ! empty( $hidden_products ) ? ( " AND p.ID NOT IN ( " . implode( ', ', array_filter( $hidden_products, 'esc_sql' ) ). " )" ) : "";
$query_args = array(
'product',
'publish'
);
$existing_products = $wpdb->get_col( $wpdb->prepare( $query, $query_args ) );
$wishlist_products = array();
if( ! empty( $wishlist ) ){
foreach( $wishlist as $elem ){
$wishlist_products[] = $elem['prod_id'];
}
}
$wishlist_products = array_intersect( $wishlist_products, $existing_products );
return count( $wishlist_products );
}
}
/**
* Count number of times a product was added to users wishlists
*
* @param $product_id int|bool Product id; false will force method to use global product
*
* @return int Number of times the product was added to wishlist
* @since 2.0.13
*/
public function count_add_to_wishlist( $product_id = false ) {
global $product, $wpdb;
$product_id = ! ( $product_id ) ? yit_get_product_id( $product ) : $product_id;
if( ! $product_id ){
return 0;
}
$query = "SELECT COUNT( DISTINCT( user_id ) ) FROM {$wpdb->yith_wcwl_items} WHERE prod_id = %d";
$res = $wpdb->get_var( $wpdb->prepare( $query, $product_id ) );
return $res;
}
/**
* Count product occurrences in users wishlists
*
* @param $product_id int
*
* @return int
* @since 2.0.0
*/
public function count_product_occurrences( $product_id ) {
global $wpdb;
$sql = "SELECT COUNT(*) FROM {$wpdb->yith_wcwl_items} WHERE `prod_id` = %d";
return $wpdb->get_var( $wpdb->prepare( $sql, $product_id ) );
}
/**
* Retrieve details of a product in the wishlist.
*
* @param int $product_id
* @param int|bool $wishlist_id
* @return array
* @since 1.0.0
*/
public function get_product_details( $product_id, $wishlist_id = false ) {
return $this->get_products(
array(
'prod_id' => $product_id,
'wishlist_id' => $wishlist_id
)
);
}
/* === WISHLISTS METHODS === */
/**
* Add a new wishlist for the user.
*
* @return string "error", "exists" or id of the inserted wishlist
* @since 2.0.0
*/
public function add_wishlist() {
$user_id = ( ! empty( $this->details['user_id'] ) ) ? $this->details['user_id'] : false;
if( $user_id == false ){
$this->errors[] = __( 'You need to log in before creating a new wishlist', 'yith-woocommerce-wishlist' );
return "error";
}
return $this->generate_default_wishlist( $user_id );
}
/**
* Update wishlist with arguments passed as second parameter
*
* @param $wishlist_id int
* @param $args array Array of parameters to user in $wpdb->update
* @return bool
* @since 2.0.0
*/
public function update_wishlist( $wishlist_id, $args = array() ) {
return false;
}
/**
* Delete indicated wishlist
*
* @param $wishlist_id int
* @return bool
* @since 2.0.0
*/
public function remove_wishlist( $wishlist_id ) {
return false;
}
/**
* Retrieve all the wishlist matching specified arguments
*
* @param $args mixed Array of valid arguments<br/>
* [<br/>
* 'id' // Wishlist id to search, if any<br/>
* 'user_id' // User owner<br/>
* 'wishlist_slug' // Slug of the wishlist to search<br/>
* 'wishlist_name' // Name of the wishlist to search<br/>
* 'wishlist_token' // Token of the wishlist to search<br/>
* 'wishlist_visibility' // Wishlist visibility: all, visible, public, shared, private<br/>
* 'user_search' // String to match against first name / last name or email of the wishlist owner<br/>
* 'is_default' // Whether wishlist should be default or not<br/>
* 'orderby' // Column used to sort final result (could be any wishlist lists column)<br/>
* 'order' // Sorting order<br/>
* 'limit' // Pagination param: maximum number of elements in the set. 0 to retrieve all elements<br/>
* 'offset' // Pagination param: offset for the current set. 0 to start from the first item<br/>
* 'show_empty' // Whether to show empty lists os not<br/>
* ]
*
* @return array
* @since 2.0.0
*/
public function get_wishlists( $args = array() ){
global $wpdb;
$default = array(
'id' => false,
'user_id' => ( is_user_logged_in() ) ? get_current_user_id(): false,
'wishlist_slug' => false,
'wishlist_name' => false,
'wishlist_token' => false,
'wishlist_visibility' => apply_filters( 'yith_wcwl_wishlist_visibility_string_value', 'all'), // all, visible, public, shared, private
'user_search' => false,
'is_default' => false,
'orderby' => 'ID',
'order' => 'DESC',
'limit' => false,
'offset' => 0,
'show_empty' => true
);
$args = wp_parse_args( $args, $default );
extract( $args );
$sql = "SELECT l.*";
if( ! empty( $user_search ) ){
$sql .= ", u.user_email, umn.meta_value AS first_name, ums.meta_value AS last_name";
}
$sql .= " FROM `{$wpdb->yith_wcwl_wishlists}` AS l";
if( ! empty( $user_search ) || ( ! empty($orderby ) && $orderby == 'user_login' ) ) {
$sql .= " LEFT JOIN `{$wpdb->users}` AS u ON l.`user_id` = u.ID";
}
if( ! empty( $user_search ) ){
$sql .= " LEFT JOIN `{$wpdb->usermeta}` AS umn ON umn.`user_id` = u.`ID`";
$sql .= " LEFT JOIN `{$wpdb->usermeta}` AS ums ON ums.`user_id` = u.`ID`";
}
$sql .= " WHERE 1";
if( ! empty( $user_id ) ){
$sql .= " AND l.`user_id` = %d";
$sql_args = array(
$user_id
);
}
if( ! empty( $user_search ) ){
$sql .= " AND ( umn.`meta_key` LIKE %s AND ums.`meta_key` LIKE %s AND ( u.`user_email` LIKE %s OR umn.`meta_value` LIKE %s OR ums.`meta_value` LIKE %s ) )";
$sql_args[] = 'first_name';
$sql_args[] = 'last_name';
$sql_args[] = "%" . esc_sql( $user_search ) . "%";
$sql_args[] = "%" . esc_sql( $user_search ) . "%";
$sql_args[] = "%" . esc_sql( $user_search ) . "%";
}
if( ! empty( $is_default ) ){
$sql .= " AND l.`is_default` = %d";
$sql_args[] = $is_default;
}
if( ! empty( $id ) ){
$sql .= " AND l.`ID` = %d";
$sql_args[] = $id;
}
if( isset( $wishlist_slug ) && $wishlist_slug !== false ){
$sql .= " AND l.`wishlist_slug` = %s";
$sql_args[] = sanitize_title_with_dashes( $wishlist_slug );
}
if( ! empty( $wishlist_token ) ){
$sql .= " AND l.`wishlist_token` = %s";
$sql_args[] = $wishlist_token;
}
if( ! empty( $wishlist_name ) ){
$sql .= " AND l.`wishlist_name` LIKE %s";
$sql_args[] = "%" . esc_sql( $wishlist_name ) . "%";
}
if( ! empty( $wishlist_visibility ) && $wishlist_visibility != 'all' ){
switch( $wishlist_visibility ){
case 'visible':
$sql .= " AND ( l.`wishlist_privacy` = %d OR l.`is_public` = %d )";
$sql_args[] = 0;
$sql_args[] = 1;
break;
case 'public':
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 0;
break;
case 'shared':
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 1;
break;
case 'private':
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 2;
break;
default:
$sql .= " AND l.`wishlist_privacy` = %d";
$sql_args[] = 0;
break;
}
}
if( empty( $show_empty ) ){
$sql .= " AND l.`ID` IN ( SELECT wishlist_id FROM {$wpdb->yith_wcwl_items} )";
}
if( ! empty( $orderby ) && isset( $order ) ) {
$sql .= " ORDER BY " . esc_sql( $orderby ) . " " . esc_sql( $order );
}
if( ! empty( $limit ) && isset( $offset ) ){
$sql .= " LIMIT %d, %d";
$sql_args[] = $offset;
$sql_args[] = $limit;
}
if( ! empty( $sql_args ) ){
$sql = $wpdb->prepare( $sql, $sql_args );
}
$lists = $wpdb->get_results( $sql, ARRAY_A );
return $lists;
}
/**
* Returns details of a wishlist, searching it by wishlist id
*
* @param $wishlist_id int
* @return array
* @since 2.0.0
*/
public function get_wishlist_detail( $wishlist_id ) {
global $wpdb;
$sql = "SELECT * FROM {$wpdb->yith_wcwl_wishlists} WHERE `ID` = %d";
return $wpdb->get_row( $wpdb->prepare( $sql, $wishlist_id ), ARRAY_A );
}
/**
* Returns details of a wishlist, searching it by wishlist token
*
* @param $wishlist_token string
* @return array
* @since 2.0.0
*/
public function get_wishlist_detail_by_token( $wishlist_token ) {
global $wpdb;
$sql = "SELECT * FROM {$wpdb->yith_wcwl_wishlists} WHERE `wishlist_token` = %s";
return $wpdb->get_row( $wpdb->prepare( $sql, $wishlist_token ), ARRAY_A );
}
/**
* Generate default wishlist for a specific user, adding all NULL items of the user to it
*
* @param $user_id int
* @return int Default wishlist id
* @since 2.0.0
*/
public function generate_default_wishlist( $user_id ){
global $wpdb;
$wishlists = $this->get_wishlists( array(
'user_id' => $user_id,
'is_default' => 1
) );
if( ! empty( $wishlists ) ){
$default_user_wishlist = $wishlists[0]['ID'];
$this->last_operation_token = $wishlists[0]['wishlist_token'];
do_action('yith_wcwl_default_user_wishlist', $user_id, $wishlists);
}
else{
$token = $this->generate_wishlist_token();
$this->last_operation_token = $token;
$wpdb->insert( $wpdb->yith_wcwl_wishlists, array(
'user_id' => apply_filters( 'yith_wcwl_default_wishlist_user_id', $user_id ),
'wishlist_slug' => apply_filters( 'yith_wcwl_default_wishlist_slug', '' ),
'wishlist_token' => $token,
'wishlist_name' => apply_filters( 'yith_wcwl_default_wishlist_name', '' ),
'wishlist_privacy' => apply_filters( 'yith_wcwl_default_wishlist_privacy', 0 ),
'is_default' => 1
) );
$default_user_wishlist = $wpdb->insert_id;
}
$sql = "UPDATE {$wpdb->yith_wcwl_items} SET wishlist_id = %d WHERE user_id = %d AND wishlist_id IS NULL";
$sql_args = array(
$default_user_wishlist,
$user_id
);
$wpdb->query( $wpdb->prepare( $sql, $sql_args ) );
return $default_user_wishlist;
}
/**
* Generate a token to visit wishlist
*
* @return string token
* @since 2.0.0
*/
public function generate_wishlist_token(){
global $wpdb;
$count = 0;
$sql = "SELECT COUNT(*) FROM `{$wpdb->yith_wcwl_wishlists}` WHERE `wishlist_token` = %s";
do {
$dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$nchars = 12;
$token = "";
for( $i = 0; $i <= $nchars - 1; $i++ ){
$token .= $dictionary[ mt_rand( 0, strlen( $dictionary ) - 1 ) ];
}
$count = $wpdb->get_var( $wpdb->prepare( $sql, $token ) );
}
while( $count != 0 );
return $token;
}
/**
* Returns an array of users that created and populated a public wishlist
*
* @param $args mixed Array of valid arguments<br/>
* [<br/>
* 'search' // String to match against first name / last name / user login or user email of wishlist owner<br/>
* 'limit' // Pagination param: number of items to show in one page. 0 to show all items<br/>
* 'offset' // Pagination param: offset for the current set. 0 to start from the first item<br/>
* ]
* @return array
* @since 2.0.0
*/
public function get_users_with_wishlist( $args = array() ){
global $wpdb;
$default = array(
'search' => false,
'limit' => false,
'offset' => 0
);
$args = wp_parse_args( $args, $default );
extract( $args );
$sql = "SELECT DISTINCT i.user_id
FROM {$wpdb->yith_wcwl_items} AS i
LEFT JOIN {$wpdb->yith_wcwl_wishlists} AS l ON i.wishlist_id = l.ID";
if( ! empty( $search ) ){
$sql .= " LEFT JOIN `{$wpdb->users}` AS u ON l.`user_id` = u.ID";
$sql .= " LEFT JOIN `{$wpdb->usermeta}` AS umn ON umn.`user_id` = u.`ID`";
$sql .= " LEFT JOIN `{$wpdb->usermeta}` AS ums ON ums.`user_id` = u.`ID`";
}
$sql .= " WHERE l.wishlist_privacy = %d";
$sql_args = array( 0 );
if( ! empty( $search ) ){
$sql .= " AND ( umn.`meta_key` LIKE %s AND ums.`meta_key` LIKE %s AND ( u.`user_email` LIKE %s OR u.`user_login` LIKE %s OR umn.`meta_value` LIKE %s OR ums.`meta_value` LIKE %s ) )";
$sql_args[] = 'first_name';
$sql_args[] = 'last_name';
$sql_args[] = "%" . esc_sql( $search ) . "%";
$sql_args[] = "%" . esc_sql( $search ) . "%";
$sql_args[] = "%" . esc_sql( $search ) . "%";
$sql_args[] = "%" . esc_sql( $search ) . "%";
}
if( ! empty( $limit ) && isset( $offset ) ){
$sql .= " LIMIT " . $offset . ", " . $limit;
}
$res = $wpdb->get_col( $wpdb->prepare( $sql, $sql_args ) );
return $res;
}
/**
* Count users that have public wishlists
*
* @param $search string
* @return int
* @since 2.0.0
*/
public function count_users_with_wishlists( $search ){
return count( $this->get_users_with_wishlist( array( 'search' => $search ) ) );
}
/* === GENERAL METHODS === */
/**
* Add rewrite rules for wishlist
*
* @return void
* @since 2.0.0
*/
public function add_rewrite_rules() {
global $wp_query;
// filter wishlist param
$this->wishlist_param = apply_filters( 'yith_wcwl_wishlist_param', $this->wishlist_param );
$wishlist_page_id = isset( $_POST['yith_wcwl_wishlist_page_id'] ) ? $_POST['yith_wcwl_wishlist_page_id'] : get_option( 'yith_wcwl_wishlist_page_id' );
$wishlist_page_id = yith_wcwl_object_id( $wishlist_page_id );
if( empty( $wishlist_page_id ) ){
return;
}
$wishlist_page = get_post( $wishlist_page_id );
$wishlist_page_slug = $wishlist_page ? $wishlist_page->post_name : false;
if ( empty( $wishlist_page_slug ) ){
return;
}
if( defined( 'POLYLANG_VERSION' ) || defined( 'ICL_PLUGIN_PATH' ) ){
return;
}
$regex_paged = '(([^/]+/)*' . $wishlist_page_slug . ')(/(.*))?/page/([0-9]{1,})/?$';
$regex_simple = '(([^/]+/)*' . $wishlist_page_slug . ')(/(.*))?/?$';
add_rewrite_rule( $regex_paged, 'index.php?pagename=$matches[1]&' . $this->wishlist_param . '=$matches[4]&paged=$matches[5]', 'top' );
add_rewrite_rule( $regex_simple, 'index.php?pagename=$matches[1]&' . $this->wishlist_param . '=$matches[4]', 'top' );
$rewrite_rules = get_option( 'rewrite_rules' );
if( ! is_array( $rewrite_rules ) || ! array_key_exists( $regex_paged, $rewrite_rules ) || ! array_key_exists( $regex_simple, $rewrite_rules ) ){
flush_rewrite_rules();
}
}
/**
* Adds public query var for wishlist
*
* @param $public_var array
* @return array
* @since 2.0.0
*/
public function add_public_query_var( $public_var ) {
$public_var[] = $this->wishlist_param;
$public_var[] = 'wishlist_id';
return $public_var;
}
/**
* Get all errors in HTML mode or simple string.
*
* @param bool $html
* @return string
* @since 1.0.0
*/
public function get_errors( $html = true ) {
return implode( ( $html ? '<br />' : ', ' ), $this->errors );
}
/**
* Build wishlist page URL.
*
* @param $action string
*
* @return string
* @since 1.0.0
*/
public function get_wishlist_url( $action = '' ) {
global $sitepress;
$wishlist_page_id = yith_wcwl_object_id( get_option( 'yith_wcwl_wishlist_page_id' ) );
$wishlist_permalink = get_the_permalink( $wishlist_page_id );
$action_params = explode( '/', $action );
$view = $action_params[0];
$data = isset( $action_params[1] ) ? $action_params[1] : '';
if( $action == 'view' && empty( $data ) ){
return $wishlist_permalink;
}
if( get_option( 'permalink_structure' ) && ! defined( 'ICL_PLUGIN_PATH' ) && ! defined( 'POLYLANG_VERSION' ) ) {
$wishlist_permalink = trailingslashit( $wishlist_permalink );
$base_url = trailingslashit( $wishlist_permalink . $action );
}
else{
$base_url = $wishlist_permalink;
$params = array();
if( ! empty( $data ) ){
$params[ $this->wishlist_param ] = $view;
if( $view == 'view' ){
$params['wishlist_id'] = $data;
}
elseif( $view == 'user' ){
$params['user_id'] = $data;
}
}
else{
$params[ $this->wishlist_param ] = $view;
}
$base_url = add_query_arg( $params, $base_url );
}
if( defined( 'ICL_PLUGIN_PATH' ) && $sitepress->get_current_language() != $sitepress->get_default_language() ){
$base_url = add_query_arg( 'lang', $sitepress->get_current_language(), $base_url );
}
return apply_filters( 'yith_wcwl_wishlist_page_url', esc_url_raw( $base_url ), $action );
}
/**
* Build the URL used to remove an item from the wishlist.
*
* @param int $item_id
* @return string
* @since 1.0.0
*/
public function get_remove_url( $item_id ) {
return esc_url( add_query_arg( 'remove_from_wishlist', $item_id ) );
}
/**
* Build the URL used to add an item in the wishlist.
*
* @return string
* @since 1.0.0
*/
public function get_addtowishlist_url() {
_deprecated_function( 'YITH_WCWL::get_addtowishlist_url', '2.0.16' );
global $product;
return esc_url( add_query_arg( 'add_to_wishlist', yit_get_product_id( $product ) ) );
}
/**
* Build the URL used to add an item to the cart from the wishlist.
*
* @param int $id
* @param int|string $user_id
* @return string
* @since 1.0.0
*/
public function get_addtocart_url( $id, $user_id = '' ) {
_deprecated_function( 'YITH_WCWL::get_addtocart_url', '2.0.0' );
$product = wc_get_product( $id );
if ( $product->is_type( 'variable' ) ) {
return get_permalink( $id );
}
$url = YITH_WCWL_URL . 'add-to-cart.php?wishlist_item_id=' . rtrim( $id, '_' );
if( $user_id != '' ) {
$url .= '&id=' . $user_id;
}
return $url;
}
/**
* Build the URL used for an external/affiliate product.
*
* @deprecated
* @param $id
* @return string
*/
public function get_affiliate_product_url( $id ) {
_deprecated_function( 'YITH_WCWL::get_affiliate_product_url', '2.0.0' );
return get_post_meta( $id, '_product_url', true );
}
/**
* Build an URL with the nonce added.
*
* @param string $action
* @param string $url
* @return string
* @since 1.0.0
*/
public function get_nonce_url( $action, $url = '' ) {
_deprecated_function( 'YITH_WCWL::get_nonce_url', '2.0.16' );
return esc_url( add_query_arg( '_n', wp_create_nonce( 'yith-wcwl-' . $action ), $url ) );
}
/**
* Prints wc notice for wishlist pages
*
* @return void
* @since 2.0.5
*/
public function print_notices() {
if( function_exists( 'wc_print_notices' ) ) {
wc_print_notices();
}
}
/* === FONTAWESOME FIX === */
/**
* Modernize font-awesome class, for old wishlist users
*
* @param $class string Original font-awesome class
* @return string Filtered font-awesome class
* @since 2.0.2
*/
public function update_font_awesome_classes( $class ) {
$exceptions = array(
'icon-envelope' => 'fa-envelope-o',
'icon-star-empty' => 'fa-star-o',
'icon-ok' => 'fa-check',
'icon-zoom-in' => 'fa-search-plus',
'icon-zoom-out' => 'fa-search-minus',
'icon-off' => 'fa-power-off',
'icon-trash' => 'fa-trash-o',
'icon-share' => 'fa-share-square-o',
'icon-check' => 'fa-check-square-o',
'icon-move' => 'fa-arrows',
'icon-file' => 'fa-file-o',
'icon-time' => 'fa-clock-o',
'icon-download-alt' => 'fa-download',
'icon-download' => 'fa-arrow-circle-o-down',
'icon-upload' => 'fa-arrow-circle-o-up',
'icon-play-circle' => 'fa-play-circle-o',
'icon-indent-left' => 'fa-dedent',
'icon-indent-right' => 'fa-indent',
'icon-facetime-video' => 'fa-video-camera',
'icon-picture' => 'fa-picture-o',
'icon-plus-sign' => 'fa-plus-circle',
'icon-minus-sign' => 'fa-minus-circle',
'icon-remove-sign' => 'fa-times-circle',
'icon-ok-sign' => 'fa-check-circle',
'icon-question-sign' => 'fa-question-circle',
'icon-info-sign' => 'fa-info-circle',
'icon-screenshot' => 'fa-crosshairs',
'icon-remove-circle' => 'fa-times-circle-o',
'icon-ok-circle' => 'fa-check-circle-o',
'icon-ban-circle' => 'fa-ban',
'icon-share-alt' => 'fa-share',
'icon-resize-full' => 'fa-expand',
'icon-resize-small' => 'fa-compress',
'icon-exclamation-sign' => 'fa-exclamation-circle',
'icon-eye-open' => 'fa-eye',
'icon-eye-close' => 'fa-eye-slash',
'icon-warning-sign' => 'fa-warning',
'icon-folder-close' => 'fa-folder',
'icon-resize-vertical' => 'fa-arrows-v',
'icon-resize-horizontal' => 'fa-arrows-h',
'icon-twitter-sign' => 'fa-twitter-square',
'icon-facebook-sign' => 'fa-facebook-square',
'icon-thumbs-up' => 'fa-thumbs-o-up',
'icon-thumbs-down' => 'fa-thumbs-o-down',
'icon-heart-empty' => 'fa-heart-o',
'icon-signout' => 'fa-sign-out',
'icon-linkedin-sign' => 'fa-linkedin-square',
'icon-pushpin' => 'fa-thumb-tack',
'icon-signin' => 'fa-sign-in',
'icon-github-sign' => 'fa-github-square',
'icon-upload-alt' => 'fa-upload',
'icon-lemon' => 'fa-lemon-o',
'icon-check-empty' => 'fa-square-o',
'icon-bookmark-empty' => 'fa-bookmark-o',
'icon-phone-sign' => 'fa-phone-square',
'icon-hdd' => 'fa-hdd-o',
'icon-hand-right' => 'fa-hand-o-right',
'icon-hand-left' => 'fa-hand-o-left',
'icon-hand-up' => 'fa-hand-o-up',
'icon-hand-down' => 'fa-hand-o-down',
'icon-circle-arrow-left' => 'fa-arrow-circle-left',
'icon-circle-arrow-right' => 'fa-arrow-circle-right',
'icon-circle-arrow-up' => 'fa-arrow-circle-up',
'icon-circle-arrow-down' => 'fa-arrow-circle-down',
'icon-fullscreen' => 'fa-arrows-alt',
'icon-beaker' => 'fa-flask',
'icon-paper-clip' => 'fa-paperclip',
'icon-sign-blank' => 'fa-square',
'icon-pinterest-sign' => 'fa-pinterest-square',
'icon-google-plus-sign' => 'fa-google-plus-square',
'icon-envelope-alt' => 'fa-envelope',
'icon-comment-alt' => 'fa-comment-o',
'icon-comments-alt' => 'fa-comments-o'
);
if( in_array( $class, array_keys( $exceptions ) ) ){
$class = $exceptions[ $class ];
}
$class = str_replace( 'icon-', 'fa-', $class );
return $class;
}
/* === REQUEST HANDLING METHODS === */
/**
* Adds an element to wishlist when default AJAX method cannot be used
*
* @return void
* @since 2.0.0
*/
public function add_to_wishlist(){
// add item to wishlist when javascript is not enabled
if( isset( $_GET['add_to_wishlist'] ) ) {
$this->add();
}
}
/**
* Removes an element from wishlist when default AJAX method cannot be used
*
* @return void
* @since 2.0.0
*/
public function remove_from_wishlist(){
// remove item from wishlist when javascript is not enabled
if( isset( $_GET['remove_from_wishlist'] ) ){
$this->remove();
}
}
/**
* Removes an element after add to cart, if option is enabled in panel
*
* @return void
* @since 2.0.0
*/
public function remove_from_wishlist_after_add_to_cart() {
if( get_option( 'yith_wcwl_remove_after_add_to_cart' ) == 'yes' ){
if( isset( $_REQUEST['remove_from_wishlist_after_add_to_cart'] ) ) {
$this->details['remove_from_wishlist'] = $_REQUEST['remove_from_wishlist_after_add_to_cart'];
if ( isset( $_REQUEST['wishlist_id'] ) ) {
$this->details['wishlist_id'] = $_REQUEST['wishlist_id'];
}
}
elseif( yith_wcwl_is_wishlist() ){
$this->details['remove_from_wishlist'] = $_REQUEST['add-to-cart'];
if ( isset( $_REQUEST['wishlist_id'] ) ) {
$this->details['wishlist_id'] = $_REQUEST['wishlist_id'];
}
}
$this->remove();
}
}
/**
* Redirect to cart after "Add to cart" button pressed on wishlist table
*
* @param $url string Original redirect url
* @param $product \WC_Product Product added to cart
* @return string Redirect url
* @since 2.0.0
*/
public function redirect_to_cart( $url, $product ) {
global $yith_wcwl_wishlist_token;
$wishlist = $this->get_wishlist_detail_by_token( $yith_wcwl_wishlist_token );
$wishlist_id = $wishlist['ID'];
if( $product->is_type( 'simple' ) && get_option( 'yith_wcwl_redirect_cart' ) == 'yes' ){
if( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) && yith_wcwl_is_wishlist() ){
$url = add_query_arg( 'add-to-cart', yit_get_product_id( $product ), wc_get_cart_url() );
}
}
if( ! $product->is_type( 'external' ) && get_option( 'yith_wcwl_remove_after_add_to_cart' ) == 'yes' ){
if( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) && yith_wcwl_is_wishlist() ) {
$url = add_query_arg(
array(
'remove_from_wishlist_after_add_to_cart' => yit_get_product_id( $product ),
'wishlist_id' => $wishlist_id,
'wishlist_token' => $yith_wcwl_wishlist_token
),
$url
);
}
}
return apply_filters( 'yit_wcwl_add_to_cart_redirect_url', esc_url( $url ) );
}
/**
* AJAX: add to wishlist action
*
* @return void
* @since 1.0.0
*/
public function add_to_wishlist_ajax() {
$return = $this->add();
$message = '';
$user_id = isset( $this->details['user_id'] ) ? $this->details['user_id'] : false;
$wishlists = array();
if( $return == 'true' ){
$message = apply_filters( 'yith_wcwl_product_added_to_wishlist_message', get_option( 'yith_wcwl_product_added_text' ) );
}
elseif( $return == 'exists' ){
$message = apply_filters( 'yith_wcwl_product_already_in_wishlist_message', get_option( 'yith_wcwl_already_in_wishlist_text' ) );
}
elseif( count( $this->errors ) > 0 ){
$message = apply_filters( 'yith_wcwl_error_adding_to_wishlist_message', $this->get_errors() );
}
if( $user_id != false ){
$wishlists = $this->get_wishlists( array( 'user_id' => $user_id ) );
}
wp_send_json(
array(
'result' => $return,
'message' => $message,
'user_wishlists' => $wishlists,
'wishlist_url' => $this->get_wishlist_url( 'view' . ( isset( $this->last_operation_token ) ? ( '/' . $this->last_operation_token ) : false ) ),
)
);
}
/**
* AJAX: remove from wishlist action
*
* @return void
* @since 1.0.0
*/
public function remove_from_wishlist_ajax() {
$wishlist_token = isset( $this->details['wishlist_token'] ) ? $this->details['wishlist_token'] : false;
$count = $this->count_products( $wishlist_token );
$message = '';
if( $count != 0 ) {
if ( $this->remove() ) {
$message = apply_filters( 'yith_wcwl_product_removed_text', __( 'Product successfully removed.', 'yith-woocommerce-wishlist' ) );
$count --;
}
else {
$message = apply_filters( 'yith_wcwl_unable_to_remove_product_message', __( 'Error. Unable to remove the product from the wishlist.', 'yith-woocommerce-wishlist' ) );
}
}
else{
$message = apply_filters( 'yith_wcwl_no_product_to_remove_message', __( 'No products were added to the wishlist', 'yith-woocommerce-wishlist' ) );
}
wc_add_notice( $message );
$atts = array( 'wishlist_id' => $wishlist_token );
if( isset( $this->details['pagination'] ) ){
$atts['pagination'] = $this->details['pagination'];
}
if( isset( $this->details['per_page'] ) ){
$atts['per_page'] = $this->details['per_page'];
}
echo YITH_WCWL_Shortcode::wishlist( $atts );
die();
}
/*******************************************
* INTEGRATION WC Frequently Bought Together
*******************************************/
/**
* AJAX: reload wishlist and adding elem action
*
* @return void
* @since 1.0.0
*/
public function reload_wishlist_and_adding_elem_ajax() {
$return = $this->add();
$message = '';
$type_msg = 'success';
if( $return == 'true' ){
$message = apply_filters( 'yith_wcwl_product_added_to_wishlist_message', get_option( 'yith_wcwl_product_added_text' ) );
}
elseif( $return == 'exists' ){
$message = apply_filters( 'yith_wcwl_product_already_in_wishlist_message', get_option( 'yith_wcwl_already_in_wishlist_text' ) );
$type_msg = 'error';
}
else {
$message = apply_filters( 'yith_wcwl_product_removed_text', __( 'An error as occurred.', 'yith-woocommerce-wishlist' ) );
$type_msg = 'error';
}
$wishlist_token = isset( $this->details['wishlist_token'] ) ? $this->details['wishlist_token'] : false;
$atts = array( 'wishlist_id' => $wishlist_token );
if( isset( $this->details['pagination'] ) ){
$atts['pagination'] = $this->details['pagination'];
}
if( isset( $this->details['per_page'] ) ){
$atts['per_page'] = $this->details['per_page'];
}
ob_start();
wc_add_notice( $message, $type_msg );
echo '<div>'. YITH_WCWL_Shortcode::wishlist( $atts ) . '</div>';
echo ob_get_clean();
die();
}
/**
* redirect after add to cart from YITH WooCommerce Frequently Bought Together Premium shortcode
*
* @since 1.0.0
*/
public function yith_wfbt_redirect_after_add_to_cart( $url ){
if( ! isset( $_REQUEST['yith_wfbt_shortcode'] ) ) {
return $url;
}
$cart_url = function_exists( 'wc_get_cart_url' ) ? wc_get_cart_url() : WC()->cart->get_cart_url();
return get_option( 'yith_wcwl_redirect_cart' ) == 'yes' ? $cart_url : $this->get_wishlist_url();
}
}
}
/**
* Unique access to instance of YITH_WCWL class
*
* @return \YITH_WCWL
* @since 2.0.0
*/
function YITH_WCWL(){
return YITH_WCWL::get_instance();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment