landing-klikaset/wp-content/plugins/unlimited-elements-for-elem.../provider/woocommerce_integrate.class...

1506 lines
36 KiB
PHP
Raw Permalink Normal View History

2024-05-06 11:04:37 +07:00
<?php
/**
* @package Unlimited Elements
* @author UniteCMS http://unitecms.net
* @copyright Copyright (c) 2016 UniteCMS
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
*/
//no direct accees
defined ('UNLIMITED_ELEMENTS_INC') or die ('restricted aceess');
class UniteCreatorWooIntegrate{
const POST_TYPE_PRODUCT = "product";
const PRODUCT_TYPE_VARIABLE = "variable";
private $currency;
private $currencySymbol;
private $urlCheckout;
private $urlCart;
private $urlSite;
private $urlCurrentPage;
private $optionIncludingTax;
private $isInited = false;
private static $instance;
/**
* constructor
*/
public function __construct(){
$this->init();
}
/**
* this action should be run inside the product from the widget editor
*/
public static function onInsideEditorWooProduct($productID){
if(self::isWooActive() == false)
return(false);
if(is_numeric($productID) == false)
return(false);
if(empty($productID))
return(false);
//run advanced product labels
if(class_exists("BeRocket_products_label")){
do_action('berocket_apl_set_label', true, $productID);
}
}
/**
* bottom product integrations
*/
public static function onInsideEditorWooProductBottom($productID){
//wishlist
UniteCreatorPluginIntegrations::putJetWooWishlistButton();
}
/**
* init actions on start, run on "plugins_loaded" filter
*/
public static function initActions(){
add_action("ue_woocommerce_product_integrations", array("UniteCreatorWooIntegrate", "onInsideEditorWooProduct"), 10, 1);
add_action("ue_woocommerce_product_integrations_bottom", array("UniteCreatorWooIntegrate", "onInsideEditorWooProductBottom"), 10, 1);
}
/**
* init if not inited
*/
private function init(){
if(self::isWooActive() == false)
return(false);
if($this->isInited == true)
return(false);
//init
$this->optionIncludingTax = get_option( 'woocommerce_tax_display_shop' );
$this->currency = get_woocommerce_currency();
$this->currencySymbol = get_woocommerce_currency_symbol($this->currency);
$this->urlCheckout = wc_get_checkout_url();
$this->urlCart = wc_get_cart_url();
$this->urlSite = home_url();
$this->urlCurrentPage = UniteFunctionsWPUC::getUrlCurrentPage();
$this->isInited = true;
/*
global $wp;
echo home_url($wp->request);
*/
}
/**
* return if acf plugin activated
*/
public static function isWooActive(){
if(class_exists('WooCommerce'))
return(true);
return(false);
}
/**
* check and init instance
*/
public static function getInstance(){
if(empty(self::$instance))
self::$instance = new UniteCreatorWooIntegrate();
return(self::$instance);
}
/**
* add to cart for variation
*/
private function addAddToCartForVariation($arrVariation){
$variationID = UniteFunctionsUC::getVal($arrVariation, "variation_id");
$sku = UniteFunctionsUC::getVal($arrVariation, "sku");
$params = "add-to-cart={$variationID}";
$urlAddCart = UniteFunctionsUC::addUrlParams($this->urlCurrentPage, $params);
$arrVariation["link_addcart_cart"] = UniteFunctionsUC::addUrlParams($this->urlCart, $params);
$arrVariation["link_addcart_checkout"] = UniteFunctionsUC::addUrlParams($this->urlCheckout, $params);
//add html ajax add to cart
$addCartAttributes = "href=\"{$urlAddCart}\" data-quantity=\"1\" class=\"uc-button-addcart product_type_simple add_to_cart_button ajax_add_to_cart\" data-product_id=\"{$variationID}\" data-product_sku=\"{$sku}\" rel=\"nofollow\"";
$arrVariation["addcart_ajax_attributes"] = $addCartAttributes;
return($arrVariation);
}
/**
* add add to cart data
*/
private function addAddToCartData($arrProduct, $productID, $productSku){
$params = "add-to-cart={$productID}";
$urlAddCart = UniteFunctionsUC::addUrlParams($this->urlCurrentPage, $params);
$type = UniteFunctionsUC::getVal($arrProduct, "woo_type");
$arrProduct["woo_link_addcart_cart"] = UniteFunctionsUC::addUrlParams($this->urlCart, $params);
$arrProduct["woo_link_addcart_checkout"] = UniteFunctionsUC::addUrlParams($this->urlCheckout, $params);
//add html ajax add to cart
$addCartAttributes = "href=\"{$urlAddCart}\" data-quantity=\"1\" class=\"uc-button-addcart product_type_simple add_to_cart_button ajax_add_to_cart\" data-product_id=\"{$productID}\" data-product_sku=\"{$productSku}\" rel=\"nofollow\"";
$addCartAttributesButton = "onclick=\"location.href={$urlAddCart}\" data-quantity=\"1\" class=\"uc-button-addcart product_type_simple add_to_cart_button ajax_add_to_cart\" data-product_id=\"{$productID}\" data-product_sku=\"{$productSku}\" rel=\"nofollow\"";
if($type == self::PRODUCT_TYPE_VARIABLE){
$urlProduct = get_permalink($productID);
$addCartAttributes = "href=\"{$urlProduct}\" class=\"uc-button-addcart\" ";
$addCartAttributesButton = "onclick=\"location.href={$urlProduct}\" data-quantity=\"1\" class=\"uc-button-addcart product_type_simple add_to_cart_button ajax_add_to_cart\" data-product_id=\"{$productID}\" data-product_sku=\"{$productSku}\" rel=\"nofollow\"";
}
$arrProduct["woo_addcart_ajax_attributes"] = $addCartAttributes;
$arrProduct["woo_addcart_ajax_attributes_button"] = $addCartAttributesButton;
return($arrProduct);
}
/**
* get child product
*/
public function getChildProducts($productID){
$productID = (int)$productID;
if(empty($productID))
return(array());
$objInfo = wc_get_product($productID);
if(empty($objInfo))
return(array());
$type = $objInfo->get_type();
if($type !== "grouped")
return(array());
$arrChildren = $objInfo->get_children();
if(empty($arrChildren))
return(array());
return($arrChildren);
}
/**
* add from/to prices to variable product
*/
private function addPricesFromTo($arrProduct, $arrPrices, $objProduct){
if(empty($arrPrices))
return($arrProduct);
foreach($arrPrices as $key=>$arrPriceNumbers){
if(empty($arrPriceNumbers)){
$arrProduct["woo_".$key."_from"] = 0;
$arrProduct["woo_".$key."_to"] = 0;
$arrProduct["woo_".$key."_from_id"] = null;
$arrProduct["woo_".$key."_to_id"] = null;
continue;
}
$arrIDs = array_keys($arrPriceNumbers);
$from = array_shift($arrPriceNumbers);
$fromID = $arrIDs[0];
if(empty($arrPriceNumbers)){
$to = $from;
$toID = $fromID;
}
else{
$to = $arrPriceNumbers[count($arrPriceNumbers) - 1];
$toID = $arrIDs[count($arrPriceNumbers) - 1];
}
$from = (float)$from;
$to = (float)$to;
$from = $this->modifyPrice($from, $objProduct);
$to = $this->modifyPrice($to, $objProduct);
$arrProduct["woo_".$key."_from"] = $from;
$arrProduct["woo_".$key."_to"] = $to;
$arrProduct["woo_".$key."_from_id"] = $fromID;
$arrProduct["woo_".$key."_to_id"] = $toID;
}
//check and clear sale prices
$regularPriceFrom = UniteFunctionsUC::getVal($arrProduct, "woo_regular_price_from");
$regularPriceTo = UniteFunctionsUC::getVal($arrProduct, "woo_regular_price_to");
$salePriceFrom = UniteFunctionsUC::getVal($arrProduct, "woo_sale_price_from");
if($regularPriceFrom === $salePriceFrom){
$arrProduct["woo_sale_price_from"] = null;
$arrProduct["woo_sale_price_to"] = null;
}else{
$regularPriceFrom = $this->modifyPrice($regularPriceFrom, $objProduct);
$regularPriceTo = $this->modifyPrice($regularPriceTo, $objProduct);
$arrProduct["woo_regular_price_from"] = $regularPriceFrom;
$arrProduct["woo_regular_price_to"] = $regularPriceTo;
}
return($arrProduct);
}
/**
* get array of property names
*/
private function getArrPropertyNames($prefix = "", $isAddVariableData = false){
$arrProperties = array(
$prefix."sku",
$prefix."price",
$prefix."regular_price",
$prefix."sale_price",
$prefix."stock_quantity",
$prefix."stock_status",
$prefix."weight",
$prefix."length",
$prefix."width",
$prefix."height",
$prefix."average_rating",
$prefix."review_count"
);
if($isAddVariableData == false)
return($arrProperties);
$arrVariable = array(
$prefix."regular_price_from",
$prefix."regular_price_to",
$prefix."sale_price_from",
$prefix."sale_price_to",
$prefix."price_from",
$prefix."price_to"
);
array_splice($arrProperties, 4, 0, $arrVariable);
return($arrProperties);
}
/**
* get attribute simple title
*/
private function getVariationAttributeTitle($slug, $value, $arrTitles){
$key = $slug."_".$value;
$title = UniteFunctionsUC::getVal($arrTitles, $key);
if(empty($title))
$title = UniteFunctionsUC::getVal($arrTitles, $slug);
//if not found - return simple text
if(empty($title)){
$slug = str_replace("attribute_", "", $slug);
$title = array("attr"=>$slug,"title"=>$value);
return($title);
}
if(is_array($title))
return($title);
//string type
$slug = str_replace("attribute_", "", $slug);
$arrTitle = array("attr"=>$title,"title"=>$value);
return($arrTitle);
}
/**
* add titles for variation
*/
private function addTitlesForVariation($arrVariation, $arrAttributeTitles){
$simpleTitle = "";
$titleKey = "";
$arrTitleParts = array();
$arrAttributes = UniteFunctionsUC::getVal($arrVariation, "attributes");
if(empty($arrAttributes))
return($arrVariation);
foreach($arrAttributes as $slug=>$value){
$arrTitle = $this->getVariationAttributeTitle($slug, $value, $arrAttributeTitles);
$attrTitle = UniteFunctionsUC::getVal($arrTitle, "attr");
$valueTitle = UniteFunctionsUC::getVal($arrTitle, "title");
if(!empty($simpleTitle))
$simpleTitle .= ", ";
$arrTitleParts[] = $arrTitle;
$simpleTitle .= $attrTitle." - ".$valueTitle;
//make the key
$value = strtolower($value);
$slug = str_replace("attribute_", "", $slug);
if(!empty($titleKey))
$titleKey .= "_";
$titleKey .= $slug."_".$value;
}
$arrVariation["title"] = $simpleTitle;
$arrVariation["title_key"] = $titleKey;
$arrVariation["title_parts"] = $arrTitleParts;
return($arrVariation);
}
/**
* modify variation for output
*/
private function modifyVariationForOutput($arrVariation, $arrAttributeTitles){
//add links
$arrVariation = $this->addAddToCartForVariation($arrVariation);
//add titles
$arrVariation = $this->addTitlesForVariation($arrVariation, $arrAttributeTitles);
return($arrVariation);
}
/**
* get attributes titles - in case that they are taxonomies
*/
private function getAttributeTitles_simple($arrOutput, $objAttribute){
$name = $objAttribute->get_name();
$slug = "attribute_".strtolower($name);
$arrOutput[$slug] = $name;
return($arrOutput);
}
/**
* get attributes titles - in case that they are taxonomies
*/
private function getAttributeTitles_tax($arrOutput, $objAttribute, $product){
$attribute_taxonomy = $objAttribute->get_taxonomy_object();
$attribute_values = wc_get_product_terms( $product->get_id(), $objAttribute->get_name(), array( 'fields' => 'all' ) );
$attribute_taxonomy = (array)$attribute_taxonomy;
if(empty($attribute_values))
return($arrOutput);
$attributeLabel = UniteFunctionsUC::getVal($attribute_taxonomy, "attribute_label");
foreach($attribute_values as $term){
$slug = $term->slug;
$taxonomy = $term->taxonomy;
$name = "attribute_".$taxonomy."_".$slug;
$termTitle = $term->name;
$title = array("attr"=>$attributeLabel,"title"=>$termTitle);
$arrOutput[$name] = $title;
} //foreach terms
return($arrOutput);
}
/**
* combine by name
*/
private function combineAttributesByName($arrAttributes){
if(empty($arrAttributes))
return($arrAttributes);
$arrCombined = array();
foreach($arrAttributes as $name=>$arr){
$name = UniteFunctionsUC::getVal($arr, "attr");
$value = UniteFunctionsUC::getVal($arr, "title");
$arrAttribute = UniteFunctionsUC::getVal($arrCombined, $name);
if(empty($arrAttribute))
$arrAttribute = array();
$arrAttribute[] = $value;
$arrCombined[$name] = $arrAttribute;
}
return($arrCombined);
}
/**
* get product attribute names
*
*/
private function getProductAttributeNames($product){
$arrAttributes = $product->get_attributes();
$arrOutput = array();
foreach($arrAttributes as $objAttribute){
$isTax = $objAttribute->is_taxonomy();
if($isTax == true)
$arrOutput = $this->getAttributeTitles_tax($arrOutput, $objAttribute, $product);
else
$arrOutput = $this->getAttributeTitles_simple($arrOutput, $objAttribute, $product);
} //foreach attributes
return($arrOutput);
}
/**
* convert combined attributes array to text
*/
private function convertCombinedAttributesToText($arrCombined, $sap = ":", $sapValues = ","){
$arrText = array();
foreach($arrCombined as $name=>$arrValues){
$strValues = implode($sapValues, $arrValues);
$text = "{$name}{$sap} $strValues";
$arrText[] = $text;
}
return($arrText);
}
/**
* get product attributes
*/
public function getProductAttributes($productID){
if(function_exists("wc_get_product") == false)
return(array());
$product = wc_get_product($productID);
if(empty($product))
return(array());
$arrAttributeTitles = $this->getProductAttributeNames($product);
$arrCombined = $this->combineAttributesByName($arrAttributeTitles);
if(empty($arrCombined))
return($arrCombined);
$arrText = $this->convertCombinedAttributesToText($arrCombined);
return($arrText);
}
/**
* get variations array
*/
public function getProductVariations($productID){
if(function_exists("wc_get_product") == false)
return(array());
$product = wc_get_product($productID);
if(empty($product))
return(array());
$type = $product->get_type();
if($type != "variable")
return(array());
//variable data
$variations = $product->get_available_variations();
if(empty($variations) || is_array($variations) == false)
return(array());
$arrAttributeTitles = $this->getProductAttributeNames($product);
//add add to cart links
foreach($variations as $key=>$arrVariation){
$arrVariation = $this->modifyVariationForOutput($arrVariation, $arrAttributeTitles);
$variations[$key] = $arrVariation;
}
return($variations);
}
/**
* get first gallery image id
*/
public function getFirstGalleryImageID($productID){
if(function_exists("wc_get_product") == false)
return(null);
$product = wc_get_product($productID);
if(empty($product))
return(null);
$arrAttachmentIDs = $product->get_gallery_image_ids();
if(empty($arrAttachmentIDs))
return(null);
$firstID = $arrAttachmentIDs[0];
return($firstID);
}
/**
* get first gallery image
*/
public function getFirstGalleryImage($productID, $size){
$imageID = self::getFirstGalleryImageID($productID);
if(empty($imageID))
return(null);
$urlImage = UniteFunctionsWPUC::getUrlAttachmentImage($imageID,$size);
return($urlImage);
}
/**
*
* get product gallery
*/
public function getProductGallery($productID){
if(function_exists("wc_get_product") == false)
return(array());
$product = wc_get_product($productID);
if(empty($product))
return(array());
$arrAttachmentIDs = $product->get_gallery_image_ids();
if(empty($arrAttachmentIDs))
return(array());
$arrImages = array();
foreach($arrAttachmentIDs as $id){
$data = UniteFunctionsWPUC::getAttachmentData($id);
$arrImages[] = $data;
}
return($arrImages);
}
/**
* modify price
*/
private function modifyPrice($price, $product){
if(empty($price))
return($price);
if($this->optionIncludingTax == "incl"){
$price = wc_get_price_including_tax(
$product,
array(
'qty' => 1,
'price' => $price,
));
}
else{
$price = wc_get_price_excluding_tax(
$product,
array(
'qty' => 1,
'price' => $price,
));
}
return($price);
}
/**
* get product data
*/
private function getProductData($productID){
if(function_exists("wc_get_product") == false)
return(null);
//wc_get_ac
$objInfo = wc_get_product($productID);
if(empty($objInfo))
return(null);
$arrData = $objInfo->get_data();
$type = $objInfo->get_type();
$arrProperties = $this->getArrPropertyNames();
$productSku = UniteFunctionsUC::getVal($arrData, "sku");
$salePrice = UniteFunctionsUC::getVal($arrData, "sale_price");
$regularPrice = UniteFunctionsUC::getVal($arrData, "regular_price");
$price = UniteFunctionsUC::getVal($arrData, "price");
$price = apply_filters("woocommerce_product_get_price", $price, $objInfo);
$salePrice = apply_filters("woocommerce_product_get_sale_price", $salePrice, $objInfo);
$regularPrice = apply_filters("woocommerce_product_get_regular_price", $regularPrice, $objInfo);
$salePrice = $this->modifyPrice($salePrice, $objInfo);
$regularPrice = $this->modifyPrice($regularPrice, $objInfo);
$price = $this->modifyPrice($price, $objInfo);
$priceNoTax = wc_get_price_excluding_tax($objInfo);
$priceWithTax = wc_get_price_including_tax($objInfo);
if(empty($regularPrice) && !empty($price))
$regularPrice = $price;
$arrData["regular_price"] = $regularPrice;
$arrData["price"] = $price;
$arrData["sale_price"] = $salePrice;
$arrProduct = array();
$arrProduct["woo_type"] = $type;
foreach($arrProperties as $propertyName){
$value = UniteFunctionsUC::getVal($arrData, $propertyName);
if(is_array($value) == true)
continue;
$arrProduct["woo_".$propertyName] = $value;
}
//add the tax related variables
$arrProduct["woo_price_notax"] = $priceNoTax;
$arrProduct["woo_price_withtax"] = $priceWithTax;
//make the rating stars array
$arrWooStars = array();
$rating = UniteFunctionsUC::getVal($arrData, "average_rating");
$rating = floatval($rating);
$arrWooStars = HelperHtmlUC::getRatingArray($rating);
$arrProduct["woo_rating_stars"] = $arrWooStars;
$arrProduct["woo_rating_num"] = $rating;
//add prices of variations
if($type == self::PRODUCT_TYPE_VARIABLE){
$arrPrices = $objInfo->get_variation_prices();
$arrProduct = $this->addPricesFromTo($arrProduct, $arrPrices, $objInfo);
$arrProduct["woo_price"] = $arrProduct["woo_price_from"];
$arrProduct["woo_price_id"] = $arrProduct["woo_price_from_id"];
$arrProduct["woo_regular_price"] = $arrProduct["woo_regular_price_from"];
$arrProduct["woo_regular_price_id"] = $arrProduct["woo_regular_price_from_id"];
$arrProduct["woo_sale_price"] = $arrProduct["woo_sale_price_from"];
$arrProduct["woo_sale_price_id"] = $arrProduct["woo_sale_price_from_id"];
}
$finalPrice = UniteFunctionsUC::getVal($arrProduct, "woo_price");
$regularPrice = UniteFunctionsUC::getVal($arrProduct, "woo_regular_price");
//empty the sale price, if the final price equal regular price
if($finalPrice == $regularPrice)
$arrProduct["woo_sale_price"] = "";
//count the discout price
$discountPercent = 0;
if(!empty($finalPrice) && $finalPrice < $regularPrice){
$discountPercent = ($regularPrice-$finalPrice)/$regularPrice*100;
$discountPercent = round($discountPercent);
}
$arrProduct["woo_discount_percent"] = $discountPercent;
//add currency
$arrProduct["woo_currency"] = $this->currency;
$arrProduct["woo_currency_symbol"] = $this->currencySymbol;
//put add to cart link
$arrProduct = $this->addAddToCartData($arrProduct, $productID, $productSku);
return($arrProduct);
}
/**
* get woocommerce keys without post
*/
private function getWooProductKeysNoPost(){
$arrProperties = $this->getArrPropertyNames("woo_", true);
$arrKeys = array();
$arrKeys[] = "woo_type";
$arrKeys += $arrProperties;
$arrKeys[] = "woo_price_notax";
$arrKeys[] = "woo_price_withtax";
$arrKeys[] = "woo_rating_stars";
$arrKeys[] = "woo_discount_percent";
$arrKeys[] = "woo_currency";
$arrKeys[] = "woo_currency_symbol";
$arrKeys[] = "woo_link_addcart_cart";
$arrKeys[] = "woo_link_addcart_checkout";
$arrKeys[] = "woo_addcart_ajax_attributes";
return($arrKeys);
}
/**
* get woo data by type
*/
private function getWooData($postType, $postID){
if(self::isWooActive() == false)
return(null);
switch($postType){
case self::POST_TYPE_PRODUCT:
$arrData = $this->getProductData($postID);
return($arrData);
break;
default:
return(null);
break;
}
}
/**
* get the endpoints - url's
*/
public static function getWooEndpoint($type){
switch($type){
case "cart":
$url = wc_get_cart_url();
break;
case "checkout":
$url = wc_get_checkout_url();
break;
case "myaccount":
$myAccountID = get_option( 'woocommerce_myaccount_page_id' );
$url = "";
if(!empty($myAccountID))
$url = get_permalink($myAccountID);
break;
case "shop":
$url = "";
$shopPageID = wc_get_page_id($type);
if(!empty($shopPageID) && $shopPageID != -1)
$url = get_permalink($shopPageID);
break;
default:
$type = esc_html($type);
UniteFunctionsUC::throwError("get_woo_endpoints error: wrong endpoint type: $type,
allowed endpoints are: cart, checkout, myaccount, shop");
break;
}
return($url);
}
/**
* get woo commerce data by type
*/
public static function getWooDataByType($postType, $postID){
$objInstance = self::getInstance();
$response = $objInstance->getWooData($postType, $postID);
return($response);
}
/**
* get keys by post id
*/
private function getWooKeys($postID){
if(self::isWooActive() == false)
return(null);
$post = get_post($postID);
if(empty($post))
return(null);
$postType = $post->post_type;
$arrData = self::getWooDataByType($postType, $postID);
if(empty($arrData))
return(false);
$arrKeys = array_keys($arrData);
return($arrKeys);
}
/**
* get woo keys by post id
*/
public static function getWooKeysByPostID($postID){
$instance = self::getInstance();
$response = $instance->getWooKeys($postID);
return($response);
}
/**
* get woo keys without post id
*/
public static function getWooKeysNoPost(){
$instance = self::getInstance();
$response = $instance->getWooProductKeysNoPost();
return($response);
}
/**
* get default number of posts in catalog
*/
public static function getDefaultCatalogNumPosts(){
if(function_exists("wc_get_default_products_per_row") == false)
return(16);
$numProducts = wc_get_default_products_per_row() * wc_get_default_product_rows_per_page();
return($numProducts);
}
/**
* get product ids from current post content
*/
public function getProductIDsFromCurrentPostContent(){
if(is_singular() == false)
return(false);
$post = get_post();
if(empty($post))
return(false);
$content = $post->post_content;
if(empty($content))
return(false);
$arrLinks = UniteFunctionsUC::parseHTMLGetLinks($content);
if(empty($arrLinks))
return(false);
$arrPostIDs = array();
foreach($arrLinks as $link){
$postID = url_to_postid($link);
if(empty($postID))
continue;
$arrPostIDs[] = $postID;
}
return($arrPostIDs);
}
private function __________VARIATIONS________(){}
/**
* get variation terms from query args
* todo: Finish this function
*/
public function getVariationTermsFromQueryQrgs($args){
$postType = UniteFunctionsUC::getVal($args, "post_type");
if($postType != "product")
return(array());
$taxQuery = UniteFunctionsUC::getVal($args, "tax_query");
if(empty($taxQuery))
return(array());
dmp("get terms array from terms query");
dmp($taxQuery);
exit();
}
/**
* put product variation swatches html. used inside woo grid
* todo: Finish this function
*/
public function putProductVariationSwatchesHTML($productID){
$product = wc_get_product($productID);
$attributes = $product->get_attributes();
$available_variations = $product->get_available_variations();
dmp($available_variations);
exit();
}
private function __________CART________(){}
/**
* get product id's in cart
*/
public function getCartProductIDs(){
$isActive = self::isWooActive();
if($isActive == false)
return(array());
$arrCartItems = WC()->cart->get_cart();
$arrIDsAssoc = array();
foreach($arrCartItems as $item){
$productID = UniteFunctionsUC::getVal($item, "product_id");
if(empty($productID))
continue;
$arrIDsAssoc[$productID] = true;
}
$arrIDs = array_keys($arrIDsAssoc);
return($arrIDs);
}
/**
* get total number of cart products - with the quantity
*/
public function getCartNumProducts(){
$arrItems = WC()->cart->get_cart();
$numTotal = 0;
foreach($arrItems as $item){
$quantity = UniteFunctionsUC::getVal($item, "quantity");
$numTotal += $quantity;
}
return($numTotal);
}
/**
* get cart data
*/
public function getCartData(){
$arrProducts = $this->getCartProductIDs();
$numProducts = count($arrProducts);
$output = array();
$output["num_products"] = $numProducts;
return($output);
}
/**
* get related product id's from selected to cart products
*/
public function getRelatedProductsFromCart($limit,$arrPostsNotIn = array()){
$isActive = self::isWooActive();
if($isActive == false)
return(array());
$arrIDs = $this->getCartProductIDs();
if(empty($arrIDs))
return(array());
$arrRelatedTotal = array();
$arrPostsNotIn = array_merge($arrPostsNotIn,$arrIDs);
foreach($arrIDs as $productID){
$arrRelated = wc_get_related_products($productID, $limit, $arrPostsNotIn);
$arrRelatedTotal = array_merge($arrRelatedTotal, $arrRelated);
}
if(empty($arrRelatedTotal))
return(array());
$arrRelatedTotal = array_unique($arrRelatedTotal);
array_rand($arrRelatedTotal);
if(count($arrRelatedTotal) > $limit)
$arrRelatedTotal = array_slice($arrRelatedTotal, 0, $limit);
return($arrRelatedTotal);
}
/**
* remove from cart - from ajax request
*/
public function removeFromCartFromData(){
try{
if(self::isWooActive() == false)
UniteFunctionsUC::throwError("woocommerce not active");
$itemKey = UniteFunctionsUC::getGetVar("key","",UniteFunctionsUC::SANITIZE_KEY);
UniteFunctionsUC::validateNotEmpty($itemKey,"cart item key");
//remove from cart
$cart = WC()->cart;
//validate item exists
$item = $cart->get_cart_item($itemKey);
if(empty($item))
UniteFunctionsUC::throwError("Cart Item not found");
$success = $cart->remove_cart_item($itemKey);
if($success == false)
UniteFunctionsUC::throwError("Cart item not exists.");
$cart->calculate_totals();
//get the output
$strFragments = WC_AJAX::get_refreshed_fragments();
}catch(Exception $e){
$message = $e->getMessage();
HelperUC::ajaxResponseError($message);
}
}
/**
* update cart quantity
*/
public function updateCartQuantityFromData(){
try{
if(self::isWooActive() == false)
UniteFunctionsUC::throwError("woocommerce not active");
$itemKey = UniteFunctionsUC::getGetVar("key","",UniteFunctionsUC::SANITIZE_KEY);
UniteFunctionsUC::validateNotEmpty($itemKey,"cart item key");
$quantity = UniteFunctionsUC::getGetVar("quantity","",UniteFunctionsUC::SANITIZE_ID);
UniteFunctionsUC::validateNotEmpty($itemKey,"cart quantity");
if(empty($quantity))
$quantity = 0;
if(is_numeric($quantity) == false)
UniteFunctionsUC::throwError("quantiy needs to be numeric");
//update quantity
$cart = WC()->cart;
//validate item exists
$item = $cart->get_cart_item($itemKey);
if(empty($item))
UniteFunctionsUC::throwError("Cart Item not found");
$success = $cart->set_quantity( $itemKey, $quantity, true);
if($success == false)
UniteFunctionsUC::throwError("Cart item not exists, or unable to update quantity.");
//get the output
$strFragments = WC_AJAX::get_refreshed_fragments();
}catch(Exception $e){
$message = $e->getMessage();
HelperUC::ajaxResponseError($message);
}
}
/**
* output cart fragments
*/
public function outputCartFragments(){
$strFragments = WC_AJAX::get_refreshed_fragments();
}
private function __________CART_HTML________(){}
/**
* get cart html - use for mini cart for example
*/
public function getCartItemsHtml(){
if(self::isWooActive() == false)
return("");
$arrCartItems = WC()->cart->get_cart();
if(empty($arrCartItems))
$arrCartItems = array();
$html = "<div class='ue-mini-cart-items-holder'>";
foreach($arrCartItems as $cart_item_key=>$cart_item){
$wc_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
$wc_product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
$wc_product_link = apply_filters( 'woocommerce_cart_item_permalink', $wc_product->is_visible() ? $wc_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );
//$item_thumbnail = $wc_product->get_image();
$imageID = $wc_product->get_image_id();
$urlImage = null;
if(!empty($imageID))
$urlImage = wp_get_attachment_image_url( $imageID, UniteFunctionsWPUC::THUMB_SMALL );
if(empty($urlImage))
$urlImage = GlobalsUC::$url_no_image_placeholder;
$item_name = $wc_product->get_name();
$product_link = apply_filters( 'woocommerce_cart_item_permalink', $wc_product->is_visible() ? $wc_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );
$price = WC()->cart->get_product_price( $wc_product );
$quantity = $cart_item['quantity'];
$priceHtml = wc_price( $cart_item['line_subtotal']+$cart_item['line_subtotal_tax'] );
$imageHTML = "";
if(!empty($urlImage))
$imageHTML = "<img class=\"ue-mini-cart-item-image\" src=\"{$urlImage}\" >";
$htmlItem = "
<div class=\"ue-mini-cart-item\" data-key=\"{$cart_item_key}\">
{$imageHTML}
<div class=\"ue-mini-cart-item-content\">
<div class=\"ue-mini-cart-content-wrapper\">
<div class=\"ue-mini-cart-item-title-text\">{$item_name}</div>
<div>
<span class=\"ue_mini_qty\">{$quantity} x</span>
<span class=\"ue_mini_price\">{$priceHtml}</span>
</div>
<div class=\"ue_mini_quantity_input\">
<span class=\"ue_mini_minus\">-</span>
<input class=\"ue_mini_input\" type=\"number\" value=\"{$quantity}\"/>
<span class=\"ue_mini_plus\">+</span>
</div>
</div>
<div class=\"ue-mini-cart-item-delete\"><i class=\"far fa-trash-alt\"></i></div>
</div>
</div>
";
$html .= $htmlItem;
}
$html .= "</div>";
return($html);
}
/**
* get cart subtotal html
*/
public function getCartTotalsHtml($isSecond = false){
if($this->isWooActive() == false)
return(false);
if(empty(WC()->cart)){
$subtotal = 0;
}else{
$arrTotals = WC()->cart->get_totals();
$subtotal = UniteFunctionsUC::getVal($arrTotals, "subtotal");
$subtotalTax = UniteFunctionsUC::getVal($arrTotals, "subtotal_tax");
$subtotalWithTax = $subtotal + $subtotalTax;
}
$subtotalHTML = wc_price($subtotalWithTax);
$strNum = "";
if($isSecond)
$strNum = "2";
$html = "
<div class=\"ue-mini-cart-totals-holder{$strNum}\">
<div class=\"uc-minicart-totals__subtotal\">{$subtotalHTML}</div>
</div>";
return($html);
}
/*
* get cart number of products html
*/
public function getCartNumProductsHtml(){
$numProducts = $this->getCartNumProducts();
$addClass = "";
if($numProducts == 0)
$addClass = "ue-mini-cart-numitems__empty";
$html = "
<div class=\"ue-mini-cart-numitems-holder\">
<div class=\"ue-mini-cart-numitems $addClass\">
$numProducts
</div>
</div>
";
return($html);
}
/**
* check the cart fragment (on ajax or not)
*/
public static function onAddCartFragment($fragment){
$objWoo = self::getInstance();
$htmlItems = $objWoo->getCartItemsHtml();
$htmlTotals = $objWoo->getCartTotalsHtml();
$htmlTotals2 = $objWoo->getCartTotalsHtml(true);
$htmlNumItems = $objWoo->getCartNumProductsHtml();
$fragment[".ue-mini-cart-items-holder"] = $htmlItems;
$fragment[".ue-mini-cart-totals-holder"] = $htmlTotals;
$fragment[".ue-mini-cart-totals-holder2"] = $htmlTotals2;
$fragment[".ue-mini-cart-numitems-holder"] = $htmlNumItems;
return($fragment);
}
/**
* echo some cart html
*/
public function putCartHtml($type){
switch($type){
case "items":
$html = $this->getCartItemsHtml();
break;
case "total":
$html = $this->getCartTotalsHtml();
break;
case "total2":
$html = $this->getCartTotalsHtml(true);
break;
case "num_products":
$html = $this->getCartNumProductsHtml();
break;
default:
$type = esc_html($type);
$message = "Wrong cart html type: $type";
$html = HelperHtmlUC::getErrorMessageHtml($message,"",true);
break;
}
echo $html;
}
/**
* init cart integration
*/
public static function initMiniCartIntegration(){
add_filter( 'woocommerce_add_to_cart_fragments', array("UniteCreatorWooIntegrate", "onAddCartFragment") );
}
}