_name = $plugin_name; $this->define_hooks(); } /** * Define shortcode and hooks. */ private function define_hooks(): void { add_action( 'wc_ajax_tinvwl', [ $this, 'ajax_action' ] ); } /** * Perform AJAX action. */ public function ajax_action(): void { $post = filter_input_array( INPUT_POST, [ 'tinvwl-security' => FILTER_SANITIZE_FULL_SPECIAL_CHARS, 'tinvwl-action' => FILTER_SANITIZE_FULL_SPECIAL_CHARS, 'tinvwl-product_id' => FILTER_VALIDATE_INT, 'tinvwl-paged' => FILTER_VALIDATE_INT, 'tinvwl-per-page' => FILTER_VALIDATE_INT, 'tinvwl-sharekey' => FILTER_SANITIZE_FULL_SPECIAL_CHARS, 'tinvwl-products' => [ 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_FORCE_ARRAY, ], ] ); // Check for valid AJAX action if ( ! isset( $post['tinvwl-action'] ) || ! $post['tinvwl-action'] ) { return; } $wl = new TInvWL_Wishlist( $this->_name ); $wishlist = $wl->get_by_share_key( $post['tinvwl-sharekey'] ) ?? $wl->get_by_user_default()[0] ?? null; $guest_wishlist = ! is_user_logged_in() && ( $wl->get_by_sharekey_default()[0] ?? false ) ? $wl->get_by_sharekey_default()[0] : []; if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $post['tinvwl-security'] ) && wp_verify_nonce( $post['tinvwl-security'], 'wp_rest' ) ) { $this->wishlist_ajax_actions( $wishlist, $post, $guest_wishlist ); } else { $response = [ 'status' => false, 'msg' => [ __( 'Something went wrong', 'ti-woocommerce-wishlist' ) ], 'icon' => 'icon_big_times', ]; $response['msg'] = array_unique( $response['msg'] ); $response['msg'] = implode( '
', $response['msg'] ); if ( tinv_get_option( 'table', 'hide_popup' ) ) { unset( $response['msg'] ); } if ( ! empty( $response['msg'] ) ) { $response['msg'] = tinv_wishlist_template_html( 'ti-addedtowishlist-dialogbox.php', apply_filters( 'tinvwl_addtowishlist_dialog_box', $response, $post ) ); } wp_send_json( $response ); } } /** * Wishlist Ajax Actions * * @param array $wishlist * @param array $post * @param array $guest_wishlist * * @return void */ public function wishlist_ajax_actions( array $wishlist, array $post, array $guest_wishlist = [] ): void { do_action( 'tinvwl_ajax_actions_before', $wishlist, $post, $guest_wishlist ); $wishlist = ( ! $wishlist && $guest_wishlist ) ? $guest_wishlist : $wishlist; $post['wishlist_qty'] = 1; $action = $post['tinvwl-action']; $class = TInvWL_Public_AddToWishlist::instance(); $owner = $wishlist && isset( $wishlist['is_owner'] ) && $wishlist['is_owner']; $response = [ 'status' => false, 'msg' => [] ]; switch ( $action ) { case 'remove': if ( ! $wishlist['is_owner'] ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } $product = $post['tinvwl-product_id']; if ( 0 === $wishlist['ID'] ) { $wlp = TInvWL_Product_Local::instance(); } else { $wlp = new TInvWL_Product( $wishlist ); } if ( empty( $wlp ) ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } $product_data = $wlp->get_wishlist( array( 'ID' => $product ) ); $product_data = array_shift( $product_data ); if ( empty( $product_data ) ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } $title = sprintf( __( '“%s”', 'ti-woocommerce-wishlist' ), is_callable( array( $product_data['data'], 'get_name' ) ) ? $product_data['data']->get_name() : $product_data['data']->get_title() ); if ( $wlp->remove( $product_data ) ) { $response['status'] = true; $response['msg'][] = sprintf( __( '%s has been removed from the wishlist.', 'ti-woocommerce-wishlist' ), $title ); } else { $response['status'] = false; $response['msg'][] = sprintf( __( '%s has not been removed from the wishlist.', 'ti-woocommerce-wishlist' ), $title ); } break; case 'add_to_cart_single': $product_id = $post['tinvwl-product_id']; if ( 0 === $wishlist['ID'] ) { $wlp = TInvWL_Product_Local::instance(); } else { $wlp = new TInvWL_Product( $wishlist ); } if ( empty( $wlp ) ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } $product_data = $wlp->get_wishlist( [ 'ID' => $product_id ] ); $product_data = array_shift( $product_data ); if ( empty( $product_data ) ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } $product_data_obj = $product_data['data']; $title = sprintf( __( '“%s”', 'ti-woocommerce-wishlist' ), is_callable( [ $product_data_obj, 'get_name' ] ) ? $product_data_obj->get_name() : $product_data_obj->get_title() ); global $product; $_product_tmp = $product; // Store global product data. $product = $product_data_obj; // Override global product data. add_filter( 'clean_url', 'tinvwl_clean_url', 10, 2 ); $redirect_url = $product_data_obj->add_to_cart_url(); remove_filter( 'clean_url', 'tinvwl_clean_url', 10 ); $product = $_product_tmp; // Restore global product data. $quantity = apply_filters( 'tinvwl_product_add_to_cart_quantity', 1, $product_data_obj ); if ( apply_filters( 'tinvwl_product_add_to_cart_need_redirect', false, $product_data_obj, $redirect_url, $product_data ) ) { $response['redirect'] = apply_filters( 'tinvwl_product_add_to_cart_redirect_url', $redirect_url, $product_data_obj, $product_data ); } elseif ( apply_filters( 'tinvwl_allow_addtocart_in_wishlist', true, $wishlist, $owner ) ) { $add = TInvWL_Public_Cart::add( $wishlist, $product_id, $quantity ); if ( $add && ! isset( $add['error_code'] ) ) { $response['status'] = true; $response['msg'][] = sprintf( _n( '%s has been added to your cart.', '%s have been added to your cart.', 1, 'ti-woocommerce-wishlist' ), $title ); if ( tinv_get_option( 'processing', 'redirect_checkout' ) ) { $response['redirect'] = wc_get_checkout_url(); } if ( 'yes' === get_option( 'woocommerce_cart_redirect_after_add' ) ) { $response['redirect'] = wc_get_cart_url(); } } else { $response['status'] = false; $response['msg'][] = TInvWL_Public_Cart::cart_all_errors_message( [ $add ] ); } } break; case 'remove_selected': if ( ! $owner ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } if ( 0 === $wishlist['ID'] ) { $wlp = TInvWL_Product_Local::instance(); } else { $wlp = new TInvWL_Product( $wishlist ); } if ( empty( $wlp ) ) { $response['msg'][] = __( 'Something went wrong', 'ti-woocommerce-wishlist' ); break; } $products = $wlp->get_wishlist( array( 'ID' => $post['tinvwl-products'], 'count' => 9999999, ) ); $titles = []; foreach ( $products as $product ) { if ( $wlp->remove_product_from_wl( $product['wishlist_id'], $product['product_id'], $product['variation_id'], $product['meta'] ) ) { $titles[] = sprintf( __( '“%s”', 'ti-woocommerce-wishlist' ), is_callable( [ $product['data'], 'get_name' ] ) ? $product['data']->get_name() : $product['data']->get_title() ); } } if ( ! empty( $titles ) ) { $response['status'] = true; $response['msg'][] = sprintf( _n( '%s has been successfully removed from the wishlist.', '%s have been successfully removed from the wishlist.', count( $titles ), 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ); } break; case 'add_to_cart_selected': $products = $post['tinvwl-products']; $result = $errors = array(); foreach ( $products as $id ) { $wishlist_product = null; if ( 0 === $wishlist['ID'] ) { $wishlist_product = TInvWL_Product_Local::instance(); } else { $wishlist_product = new TInvWL_Product( $wishlist ); } $wishlist_item = $wishlist_product->get_wishlist( array( 'ID' => $id ) ); $wishlist_item = array_shift( $wishlist_item ); $product_data = wc_get_product( $wishlist_item['variation_id'] ?: $wishlist_item['product_id'] ); if ( ! $product_data || 'trash' === $product_data->get_status() ) { continue; } global $product; // Store global product data. $previous_product = $product; // Override global product data. $product = $product_data; add_filter( 'clean_url', 'tinvwl_clean_url', 10, 2 ); $redirect_url = $product_data->add_to_cart_url(); remove_filter( 'clean_url', 'tinvwl_clean_url', 10 ); // Restore global product data. $product = $previous_product; $quantity = apply_filters( 'tinvwl_product_add_to_cart_quantity', 1, $product_data ); $wishlist_item['quantity'] = $quantity; if ( apply_filters( 'tinvwl_product_add_to_cart_need_redirect', false, $product_data, $redirect_url, $wishlist_item ) ) { $cart_errors = TInvWL_Public_Cart::add_to_cart_errors( $product_data, $quantity ); $error_code = $cart_errors['error_code'] ?? 'default'; $errors[] = array( 'product' => $product_data, 'quantity' => $quantity, 'error_code' => $error_code, ); continue; } $wishlist_item = $wishlist_item['ID']; $add = TInvWL_Public_Cart::add( $wishlist, $wishlist_item, $quantity ); if ( $add && ! isset( $add['error_code'] ) ) { $result[] = $add; } else { $errors[] = $add; } } if ( ! empty( $errors ) ) { $response['msg'][] = TInvWL_Public_Cart::cart_all_errors_message( $errors ); } if ( ! empty( $result ) ) { $response['status'] = true; $titles = array(); $count = 0; foreach ( $result as $data ) { /* translators: %s: product name */ $titles[] = apply_filters( 'woocommerce_add_to_cart_qty_html', ( $data['quantity'] > 1 ? absint( $data['quantity'] ) . ' × ' : '' ), $data['product']->get_id() ) . apply_filters( 'woocommerce_add_to_cart_item_name_in_quotes', sprintf( _x( '“%s”', 'Item name in quotes', 'ti-woocommerce-wishlist' ), $data['product']->get_name() ), $data['product']->get_id() ); $count += $data['quantity']; } $titles = array_filter( $titles ); /* translators: %s: product name */ $response['msg'][] = sprintf( _n( '%s has been added to your cart.', '%s have been added to your cart.', $count, 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ); if ( tinv_get_option( 'processing', 'redirect_checkout' ) ) { $response['redirect'] = wc_get_checkout_url(); } if ( 'yes' === get_option( 'woocommerce_cart_redirect_after_add' ) ) { $response['redirect'] = wc_get_cart_url(); } } break; case 'add_to_cart_all': add_filter( 'tinvwl_before_get_current_product', [ 'TInvWL_Public_Wishlist_Buttons', 'get_all_products_fix_offset' ] ); $products = TInvWL_Public_Wishlist_Buttons::get_current_products( $wishlist, 9999999 ); $result = $errors = []; foreach ( $products as $_product ) { $product_data = wc_get_product( $_product['variation_id'] ?: $_product['product_id'] ); if ( ! $product_data || 'trash' === $product_data->get_status() ) { continue; } global $product; $_product_tmp = $product; // Store global product data. $product = $product_data; // Override global product data. add_filter( 'clean_url', 'tinvwl_clean_url', 10, 2 ); $redirect_url = $product_data->add_to_cart_url(); remove_filter( 'clean_url', 'tinvwl_clean_url', 10 ); $product = $_product_tmp; // Restore global product data. $quantity = apply_filters( 'tinvwl_product_add_to_cart_quantity', 1, $product_data ); $_product['quantity'] = $quantity; if ( apply_filters( 'tinvwl_product_add_to_cart_need_redirect', false, $product_data, $redirect_url, $_product ) ) { $cart_errors = TInvWL_Public_Cart::add_to_cart_errors( $product_data, $quantity ); $error_code = $cart_errors['error_code'] ?? 'default'; $errors[] = [ 'product' => $product_data, 'quantity' => $quantity, 'error_code' => $error_code, ]; continue; } $_product = $_product['ID']; $add = TInvWL_Public_Cart::add( $wishlist, $_product, $quantity ); if ( $add && ! isset( $add['error_code'] ) ) { $result[] = $add; } else { $errors[] = $add; } } if ( ! empty( $errors ) ) { $response['msg'][] = TInvWL_Public_Cart::cart_all_errors_message( $errors ); } if ( ! empty( $result ) ) { $response['status'] = true; $titles = []; $count = 0; foreach ( $result as $data ) { /* translators: %s: product name */ $titles[] = apply_filters( 'woocommerce_add_to_cart_qty_html', ( $data['quantity'] > 1 ? absint( $data['quantity'] ) . ' × ' : '' ), $data['product']->get_id() ) . apply_filters( 'woocommerce_add_to_cart_item_name_in_quotes', sprintf( _x( '“%s”', 'Item name in quotes', 'ti-woocommerce-wishlist' ), $data['product']->get_name() ), $data['product']->get_id() ); $count += $data['quantity']; } $titles = array_filter( $titles ); /* translators: %s: product name */ $response['msg'][] = sprintf( _n( '%s has been added to your cart.', '%s have been added to your cart.', $count, 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ); if ( tinv_get_option( 'processing', 'redirect_checkout' ) ) { $response['redirect'] = wc_get_checkout_url(); } if ( 'yes' === get_option( 'woocommerce_cart_redirect_after_add' ) ) { $response['redirect'] = wc_get_cart_url(); } } break; case 'get_data': $response['status'] = true; break; } $response['content'] = tinvwl_shortcode_view( [ 'paged' => $post['tinvwl-paged'], 'sharekey' => $post['tinvwl-sharekey'], 'lists_per_page' => $post['tinvwl-per-page'], ] ); $response['action'] = $action; $response['icon'] = $response['status'] ? 'icon_big_heart_check' : 'icon_big_times'; $response['msg'] = array_unique( $response['msg'] ); $response['msg'] = implode( '
', $response['msg'] ); if ( tinv_get_option( 'table', 'hide_popup' ) ) { unset( $response['msg'] ); } if ( ! empty( $response['msg'] ) ) { $response['msg'] = tinv_wishlist_template_html( 'ti-addedtowishlist-dialogbox.php', apply_filters( 'tinvwl_addtowishlist_dialog_box', $response, $post ) ); } $share_key = false; if ( $guest_wishlist ) { $share_key = $guest_wishlist['share_key']; } $response['wishlists_data'] = $class->get_wishlists_data( $share_key ); do_action( 'tinvwl_action_' . $action, $wishlist, $post['tinvwl-products'], $post['wishlist_qty'], $owner ); do_action( 'tinvwl_ajax_actions_after', $wishlist, $post, $guest_wishlist ); wp_send_json( $response ); } }