oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/Product/ProductFactory.php
2025-03-31 21:42:48 +02:00

177 lines
6.2 KiB
PHP

<?php
/**
* Product Factory.
*
* @package CTXFeed\V5\Product
*/
namespace CTXFeed\V5\Product;
use CTXFeed\V5\File\FileFactory;
use CTXFeed\V5\Filter\ValidateProduct;
use CTXFeed\V5\Helper\ProductHelper;
use CTXFeed\V5\Override\OverrideFactory;
use CTXFeed\V5\Utility\Logs;
use WC_Product;
/**
* Class ProductFactory
*
* @package CTXFeed\V5\Product
*/
class ProductFactory {
/**
* Get content for the specified products.
*
* Retrieves product information based on provided IDs, configuration, and structure.
*
* @param array $ids Array of product IDs.
* @param \CTXFeed\V5\Utility\Config $config Configuration object.
* @param array $structure Data structure for the content.
* @return \CTXFeed\V5\File\FileInfo Information about the fetched content.
* @throws \Exception If an error occurs during content retrieval.
*/
public static function get_content( $ids, $config, $structure ) {//phpcs:ignore
$product_info = array();
Logs::write_log( $config->get_feed_file_name(), 'Getting Products Information.' );
Logs::write_log( $config->get_feed_file_name(), 'Validating Product' );
/**
* Load Merchant Template Override File.
*
* Based current feed config all filters in the "ProductInfo" class will be added to respective class
* Example: If template is "google" then "Override\GoogleTemplate" class will be initialized
* and all filter from "ProductInfo" class will be applied for Google merchant specific requirement.
*/
OverrideFactory::TemplateOverride( $config );
if ( $config->get_feed_template() !== 'googlereview' ) {
foreach ( $ids as $id ) {
$product = ProductHelper::get_product_object( $id, $config );
// If product is a variation, then get the parent product.
$parent_product = null;
if($product instanceof WC_Product) {
if ( $product && $product->is_type( 'variation' ) ) {
$parent_product = wc_get_product( $product->get_parent_id() );
}
// Validate Product and add for feed.
if ( ! ValidateProduct::is_valid( $product, $config, $id ) ) {
continue;
}
$product_info[] = self::get_product_info( $product, $structure, $config, array(), $parent_product );
}else if( count( $product ) ) {
foreach ( $product as $variation ) {
if($variation instanceof WC_Product) {
if ( $variation && $variation->is_type( 'variation' ) ) {
$parent_product = wc_get_product( $variation->get_parent_id() );
}
// Validate Product and add for feed.
if ( ! ValidateProduct::is_valid( $variation, $config, $id ) ) {
continue;
}
$product_info[] = self::get_product_info( $variation, $structure, $config, array(), $parent_product );
}
}
}
}
} else {
$product_info[] = $structure;
}
return FileFactory::get_file_data( $product_info, $config );
}
/**
* Get product information.
*
* Processes and returns information for a given product based on the specified structure and configuration.
*
* @param \WC_Product $product The product object.
* @param array $structure The structure defining the attributes to retrieve.
* @param \CTXFeed\V5\Utility\Config $config Configuration object.
* @param array $info Additional information (if any).
* @param null $parent_product The parent product object (if any).
* @return array The processed product information.
*/
public static function get_product_info( $product, $structure, $config, $info, $parent_product = null ) {
$product_info = array();
foreach ( $structure as $merchant_attribute => $attribute ) {
if ( is_array( $attribute ) ) {
$product_info[ $merchant_attribute ] = self::get_product_info( $product, $attribute, $config, $info, $parent_product );
} elseif ( $config->get_feed_file_type() === 'xml' ) {
$product_info[ $merchant_attribute ] = ProductHelper::get_attribute_value_by_type( $attribute, $product, $config, $merchant_attribute, $parent_product );
} else {
$product_info[ $merchant_attribute ] = self::get_csv_attribute_value( $attribute, $product, $config, $merchant_attribute, $parent_product );
}
}
return $product_info;
}
/**
* Get CSV attribute value.
*
* Retrieves the value of a CSV-formatted attribute for a product.
*
* @param string $attribute The attribute to be processed.
* @param mixed $product The product object.
* @param \CTXFeed\V5\Utility\Config $config Configuration object.
* @param mixed $merchant_attribute Merchant-specific attribute information.
* @param null $parent_product The parent product object (if any).
* @return mixed The value of the attribute or void if not found.
*/
public static function get_csv_attribute_value(
$attribute,
$product,
$config,
$merchant_attribute,
$parent_product = null
) {
if ( ! $attribute ) {
$attribute = '';
}
$values = array();
// Check if attribute contains a comma and process accordingly
if ( strpos( $attribute, ',' ) !== false ) {
$separator = ',';
$attributes = explode( ',', $attribute );
foreach ( $attributes as $attr ) {
if ( strpos( $attr, ':' ) !== false ) {
$values[] = self::get_csv_attribute_value( $attr, $product, $config, $merchant_attribute );
} else {
$values[] = ProductHelper::get_attribute_value_by_type( $attr, $product, $config, $merchant_attribute, $parent_product );
}
}
return implode( $separator, array_filter( $values ) );
}
// Check if attribute contains a colon and process accordingly
if ( strpos( $attribute, ':' ) !== false ) {
$separator = ':';
$attributes = explode( ':', $attribute );
foreach ( $attributes as $attr ) {
$values[] = ProductHelper::get_attribute_value_by_type( $attr, $product, $config, $merchant_attribute, $parent_product );
}
return implode( $separator, array_filter( $values ) );
}
// Return the attribute value directly
return ProductHelper::get_attribute_value_by_type( $attribute, $product, $config, $merchant_attribute, $parent_product );
}
}