public function buildVariations($id, $item, $profile_details, $listing, $session) { // build variations $item->Variations = new VariationsType(); // get product variations // $listing = ListingsModel::getItem( $id ); $variations = ProductWrapper::getVariations($listing['post_id']); // get max_quantity from profile $max_quantity = isset($profile_details['max_quantity']) && intval($profile_details['max_quantity']) > 0 ? $profile_details['max_quantity'] : PHP_INT_MAX; // get variation attributes / item specifics map according to profile $specifics_map = $profile_details['item_specifics']; $collectedMPNs = array(); // loop each combination foreach ($variations as $var) { $newvar = new VariationType(); // handle price $newvar->StartPrice = self::dbSafeFloatval(ListingsModel::applyProfilePrice($var['price'], $profile_details['start_price'])); // handle StartPrice on parent product level if ($product_start_price = get_post_meta($listing['post_id'], '_ebay_start_price', true)) { $newvar->StartPrice = self::dbSafeFloatval($product_start_price); } // handle StartPrice on variation level if ($product_start_price = get_post_meta($var['post_id'], '_ebay_start_price', true)) { $newvar->StartPrice = self::dbSafeFloatval($product_start_price); } // handle variation quantity - if no quantity set in profile // if ( intval( $item->Quantity ) == 0 ) { if (intval($profile_details['quantity']) == 0) { $newvar->Quantity = min($max_quantity, intval($var['stock'])); } else { $newvar->Quantity = min($max_quantity, $item->Quantity); // should be removed in future versions } if ($newvar->Quantity < 0) { $newvar->Quantity = 0; } // prevent error for negative qty // handle sku if ($var['sku'] != '') { $newvar->SKU = $var['sku']; } // // add VariationSpecifics (v2) // $VariationSpecifics = new NameValueListArrayType(); // foreach ($var['variation_attributes'] as $name => $value) { // $NameValueList = new NameValueListType(); // $NameValueList->setName ( $name ); // $NameValueList->setValue( $value ); // $VariationSpecifics->addNameValueList( $NameValueList ); // } // $newvar->setVariationSpecifics( $VariationSpecifics ); // add VariationSpecifics (v3 - regard profile mapping) $VariationSpecifics = new NameValueListArrayType(); foreach ($var['variation_attributes'] as $name => $value) { // check for matching attribute name - replace woo attribute name with eBay attribute name foreach ($specifics_map as $spec) { if ($name == $spec['attribute']) { $name = $spec['name']; } } $NameValueList = new NameValueListType(); $NameValueList->setName($name); $NameValueList->setValue($value); $VariationSpecifics->addNameValueList($NameValueList); } $newvar->setVariationSpecifics($VariationSpecifics); // optional Variation.DiscountPriceInfo.OriginalRetailPrice $post_id = $var['post_id']; $start_price = $newvar->StartPrice; if (intval($profile_details['strikethrough_pricing']) != 0) { // mode 1 - use sale price if (1 == $profile_details['strikethrough_pricing']) { $original_price = ProductWrapper::getOriginalPrice($post_id); if ($original_price && $start_price != $original_price) { $newvar->DiscountPriceInfo = new DiscountPriceInfoType(); $newvar->DiscountPriceInfo->OriginalRetailPrice = new AmountType(); $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeValue($original_price); $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeAttribute('currencyID', $profile_details['currency']); } } // mode 2 - use MSRP if (2 == $profile_details['strikethrough_pricing']) { $msrp_price = get_post_meta($post_id, '_msrp', true); // variation if ($msrp_price && $start_price != $msrp_price) { $newvar->DiscountPriceInfo = new DiscountPriceInfoType(); $newvar->DiscountPriceInfo->OriginalRetailPrice = new AmountType(); $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeValue($msrp_price); $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeAttribute('currencyID', $profile_details['currency']); } } } // OriginalRetailPrice / STP // handle variation level Product ID (UPC/EAN) $autofill_missing_gtin = get_option('wplister_autofill_missing_gtin'); $DoesNotApplyText = WPLE_eBaySite::getSiteObj($this->site_id)->DoesNotApplyText; $DoesNotApplyText = empty($DoesNotApplyText) ? 'Does not apply' : $DoesNotApplyText; // set UPC from SKU - if enabled if ($var['sku'] && $profile_details['use_sku_as_upc'] == '1') { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setUPC($var['sku']); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } elseif ($product_upc = get_post_meta($post_id, '_ebay_upc', true)) { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setUPC($product_upc); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } elseif ($autofill_missing_gtin == 'upc') { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setUPC($DoesNotApplyText); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } // set EAN if ($product_ean = get_post_meta($post_id, '_ebay_ean', true)) { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setEAN($product_ean); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } elseif ($autofill_missing_gtin == 'ean') { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setEAN($DoesNotApplyText); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } // set ISBN if ($product_isbn = get_post_meta($post_id, '_ebay_isbn', true)) { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setISBN($product_isbn); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } elseif ($autofill_missing_gtin == 'isbn') { $VariationProductListingDetails = new VariationProductListingDetailsType(); $VariationProductListingDetails->setISBN($DoesNotApplyText); $newvar->setVariationProductListingDetails($VariationProductListingDetails); } // set MPN // Note: If Brand and MPN are being used to identify product variations in a multiple-variation listing, // the Brand must be specified at the item level (ItemSpecifics container) // and the MPN for each product variation must be specified at the variation level (VariationSpecifics container). // The Brand name must be the same for all variations within a single listing. if ($product_mpn = get_post_meta($post_id, '_ebay_mpn', true)) { $NameValueList = new NameValueListType(); $NameValueList->setName('MPN'); $NameValueList->setValue($product_mpn); $VariationSpecifics->addNameValueList($NameValueList); $newvar->setVariationSpecifics($VariationSpecifics); $collectedMPNs[] = $product_mpn; } $item->Variations->addVariation($newvar); } // each variation // build temporary array for VariationSpecificsSet $this->tmpVariationSpecificsSet = array(); foreach ($variations as $var) { foreach ($var['variation_attributes'] as $name => $value) { // check for matching attribute name - replace woo attribute name with eBay attribute name foreach ($specifics_map as $spec) { if ($name == $spec['attribute']) { $this->variationAttributes[] = $name; // remember original name to exclude in builtItemSpecifics() $name = $spec['name']; } } if (!is_array($this->tmpVariationSpecificsSet[$name])) { $this->tmpVariationSpecificsSet[$name] = array(); } if (!in_array($value, $this->tmpVariationSpecificsSet[$name], true)) { $this->tmpVariationSpecificsSet[$name][] = $value; } } } // add collected MPNs to tmp array foreach ($collectedMPNs as $value) { $name = 'MPN'; if (!is_array($this->tmpVariationSpecificsSet[$name])) { $this->tmpVariationSpecificsSet[$name] = array(); } if (!in_array($value, $this->tmpVariationSpecificsSet[$name], true)) { $this->tmpVariationSpecificsSet[$name][] = $value; } } // build VariationSpecificsSet $VariationSpecificsSet = new NameValueListArrayType(); foreach ($this->tmpVariationSpecificsSet as $name => $values) { $NameValueList = new NameValueListType(); $NameValueList->setName($name); foreach ($values as $value) { $NameValueList->addValue($value); } $VariationSpecificsSet->addNameValueList($NameValueList); } $item->Variations->setVariationSpecificsSet($VariationSpecificsSet); // build array of variation attributes, which will be needed in builtItemSpecifics() // $this->variationAttributes = array(); foreach ($this->tmpVariationSpecificsSet as $key => $value) { $this->variationAttributes[] = $key; } WPLE()->logger->debug('set variationAttributes: ' . print_r($this->variationAttributes, 1)); // select *one* VariationSpecificsSet for Pictures set // currently the first one is selected automatically, but there will be preferences for this later $VariationValuesForPictures = reset($this->tmpVariationSpecificsSet); $VariationNameForPictures = key($this->tmpVariationSpecificsSet); // apply variation image attribute from profile - if set $variation_image_attribute = isset($profile_details['variation_image_attribute']) ? $profile_details['variation_image_attribute'] : false; if ($variation_image_attribute && isset($this->tmpVariationSpecificsSet[$variation_image_attribute])) { $VariationValuesForPictures = $this->tmpVariationSpecificsSet[$variation_image_attribute]; $VariationNameForPictures = $variation_image_attribute; } // build Pictures $Pictures = new PicturesType(); $Pictures->setVariationSpecificName($VariationNameForPictures); foreach ($variations as $var) { $VariationValue = $var['variation_attributes'][$VariationNameForPictures]; if (in_array($VariationValue, $VariationValuesForPictures)) { $image_url = $this->encodeUrl($var['image']); // $image_url = $this->removeHttpsFromUrl( $image_url ); if (!$image_url) { continue; } WPLE()->logger->info("using variation image: " . $image_url); $VariationSpecificPictureSet = new VariationSpecificPictureSetType(); $VariationSpecificPictureSet->setVariationSpecificValue($VariationValue); $VariationSpecificPictureSet->addPictureURL($image_url); // check for additional variation images (WooCommerce Additional Variation Images Addon) if (class_exists('WC_Additional_Variation_Images')) { $additional_var_images = get_post_meta($var['post_id'], '_wc_additional_variation_images', true); $additional_var_images = empty($additional_var_images) ? false : explode(',', $additional_var_images); if (is_array($additional_var_images)) { foreach ($additional_var_images as $attachment_id) { // get URL from attachment ID $size = get_option('wplister_default_image_size', 'full'); $large_image_url = wp_get_attachment_image_src($attachment_id, $size); $image_url = $this->encodeUrl($large_image_url[0]); WPLE()->logger->info("found additional variation image: " . $image_url); // upload variation images if enabled if ($with_additional_images) { $image_url = $this->lm->uploadPictureToEPS($image_url, $id, $session); } // add variation image to picture set $VariationSpecificPictureSet->addPictureURL($image_url); WPLE()->logger->info("added additional variation image: " . $image_url); } } } // only list variation images if enabled if (@$profile_details['with_variation_images'] != '0') { $Pictures->addVariationSpecificPictureSet($VariationSpecificPictureSet); } // remove value from VariationValuesForPictures to avoid duplicates unset($VariationValuesForPictures[array_search($VariationValue, $VariationValuesForPictures)]); } } $item->Variations->setPictures($Pictures); // ebay doesn't allow different weight and dimensions for varations // so for calculated shipping services we just fetch those from the first variation // and overwrite // $isCalc = $profile_details['shipping_service_type'] == 'calc' ? true : false; $service_type = $profile_details['shipping_service_type']; $isCalc = in_array($service_type, array('calc', 'FlatDomesticCalculatedInternational', 'CalculatedDomesticFlatInternational')) ? true : false; if ($isCalc) { // get weight and dimensions from first variation $first_variation = reset($variations); $weight_major = $first_variation['weight_major']; $weight_minor = $first_variation['weight_minor']; $dimensions = $first_variation['dimensions']; $item->ShippingDetails->CalculatedShippingRate->setWeightMajor(self::dbSafeFloatval($weight_major)); $item->ShippingDetails->CalculatedShippingRate->setWeightMinor(self::dbSafeFloatval($weight_minor)); if (trim(@$dimensions['width']) != '') { $item->ShippingDetails->CalculatedShippingRate->setPackageWidth($dimensions['width']); } if (trim(@$dimensions['length']) != '') { $item->ShippingDetails->CalculatedShippingRate->setPackageLength($dimensions['length']); } if (trim(@$dimensions['height']) != '') { $item->ShippingDetails->CalculatedShippingRate->setPackageDepth($dimensions['height']); } // update ShippingPackageDetails with weight and dimensions of first variations $shippingPackageDetails = new ShipPackageDetailsType(); $shippingPackageDetails->setWeightMajor(self::dbSafeFloatval($weight_major)); $shippingPackageDetails->setWeightMinor(self::dbSafeFloatval($weight_minor)); if (trim(@$dimensions['width']) != '') { $shippingPackageDetails->setPackageWidth($dimensions['width']); } if (trim(@$dimensions['length']) != '') { $shippingPackageDetails->setPackageLength($dimensions['length']); } if (trim(@$dimensions['height']) != '') { $shippingPackageDetails->setPackageDepth($dimensions['height']); } $item->setShippingPackageDetails($shippingPackageDetails); // debug WPLE()->logger->info('first variations weight: ' . print_r($weight, 1)); WPLE()->logger->info('first variations dimensions: ' . print_r($dimensions, 1)); } // remove some settings from single item $item->SKU = null; $item->Quantity = null; $item->StartPrice = null; $item->BuyItNowPrice = null; return $item; /* this we should get: <Variations> <Variation> <SKU /> <StartPrice>15</StartPrice> <Quantity>1</Quantity> <VariationSpecifics> <NameValueList> <Name>Size</Name> <Value>large</Value> </NameValueList> </VariationSpecifics> </Variation> <Variation> <SKU /> <StartPrice>10</StartPrice> <Quantity>1</Quantity> <VariationSpecifics> <NameValueList> <Name>Size</Name> <Value>small</Value> </NameValueList> </VariationSpecifics> </Variation> <Pictures> <VariationSpecificName>Size</VariationSpecificName> <VariationSpecificPictureSet> <VariationSpecificValue>large</VariationSpecificValue> <PictureURL>http://www.example.com/wp-content/uploads/2011/09/grateful-dead.jpg</PictureURL> </VariationSpecificPictureSet> <VariationSpecificPictureSet> <VariationSpecificValue>small</VariationSpecificValue> <PictureURL>www.example.com/wp-content/uploads/2011/09/grateful-dead.jpg</PictureURL> </VariationSpecificPictureSet> </Pictures> <VariationSpecificsSet> <NameValueList> <Name>Size</Name> <Value>large</Value> <Value>small</Value> </NameValueList> </VariationSpecificsSet> </Variations> */ }