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

1965 lines
57 KiB
PHP

<?php
namespace CTXFeed\V5\Product;
use CTXFeed\V5\Helper\CommonHelper;
use CTXFeed\V5\Helper\ProductHelper;
use CTXFeed\V5\Price\PriceFactory;
use CTXFeed\V5\Shipping\ShippingFactory;
use CTXFeed\V5\Tax\TaxFactory;
use CTXFeed\V5\Utility\Settings;
use Exception;
use RankMath\Helper;
use WPSEO_Meta;
use WPSEO_Option_Titles;
use WPSEO_Primary_Term;
use CTXFeed\V5\Common\Helper as CTX_Helper;
class ProductInfo {
/**
* @var \WC_Product|\WC_Product_Variation|\WC_Product_Simple|\WC_Product_Grouped|\WC_Product_External|\WC_Product_Variable
*/
private $product;
/**
* @var \WC_Product_Variable
*/
private $parent_product;
/**
* @var \CTXFeed\V5\Utility\Config
*/
private $config;
/**
* ProductInfos constructor.
*
* @param \WC_Product $product Product object.
* @param \CTXFeed\V5\Utility\Config $config Config object.
* @param \WC_Product_Variable $parent_product Parent product object.
* @param array $children Optional. Array of product variations.
*/
public function __construct( $product, $config, $parent_product = null, $children = array() ) {
$this->product = $product;
$this->parent_product = $parent_product;
$this->config = $config;
}
/**
* Get product id.
*
* @return int|null
* @since 8.0.0
*/
public function id() {
return apply_filters( 'woo_feed_filter_product_id', $this->product->get_id(), $this->product, $this->config );
}
/**
* Get original product id for translated products, when WPML is active.
* If WPML is not installed, then return the same id.
* If WPML is installed, then return the original product id.
*
* This attribute is only applicable for WPML.
*
* @return int|null
* @since 8.0.0
*/
public function parent_id() {
return apply_filters( 'woo_feed_original_post_id', $this->product->get_id(), $this->product, $this->config );
}
/**
* Get product title.
*
* @return string
* @since 8.0.0
*/
public function title() {
$title = CommonHelper::clean_content( $this->product->get_name() );
// Add all available variation attributes to variation title.
if ( $this->product->is_type( 'variation' ) && ! empty( $this->product->get_attributes() ) && $this->parent_product ) {
$title = $this->parent_product->get_title();
/**
* Translate press plugin support.
*/
$attributes = [];
foreach ( $this->product->get_attributes() as $slug => $value ) {
$attribute = $this->product->get_attribute( $slug );
if ( ! empty( $attribute ) ) {
$attributes[ $slug ] = $attribute;
}
}
// set variation attributes with separator.
$separator = apply_filters( 'woo_feed_attribute_separator', ' , ', $this->config, $this->product );
$variation_attributes = implode( $separator, $attributes );
// get product title with variation attributes merger.
$product_title_and_attribute_merger = apply_filters( "woo_feed_product_title_and_attributes_merger", " - ", $this->product, $this->config );
/**
* Translate press plugin support.
*
* @since 8.0.0
* @package CTXFeed
* @subpackage CTXFeed/V5/Product
* @see https://webappick.atlassian.net/browse/CBT-324
* @see https://webappick.atlassian.net/browse/CBT-304
*/
if ( class_exists( 'TRP_Translate_Press' ) ) {
$title = apply_filters( 'woo_feed_filter_product_title', $title, $this->product, $this->config );
// Merge product title with variation attributes.
if ( ! empty( $variation_attributes ) ) {
$variation_attributes = explode('-', $variation_attributes);
if(!empty($variation_attributes)){
foreach($variation_attributes as $key => $value){
$variation_attribute = apply_filters( 'woo_feed_filter_product_title', $value, $this->product, $this->config );
$title .= $product_title_and_attribute_merger . $variation_attribute;
}
}
}
return $title;
} else {
// Merge product title with variation attributes.
if ( ! empty( $variation_attributes ) ) {
$title .= $product_title_and_attribute_merger . $variation_attributes;
}
}
}
return apply_filters( 'woo_feed_filter_product_title', $title, $this->product, $this->config );
}
/**
* Get product parent title.
*
* @return string
* @since 8.0.0
*/
public function parent_title() {
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$name = CommonHelper::clean_content( $this->parent_product->get_name() );
} else {
$name = $this->title();
}
return apply_filters( 'woo_feed_filter_product_parent_title', $name, $this->product, $this->config );
}
/**
* Get product description.
*
* @return string
* @since 8.0.0
*/
public function description() {
/**
* Translate press plugin support.
*
* @since 8.0.0
* @package CTXFeed
* @subpackage CTXFeed/V5/Product
* @see https://webappick.atlassian.net/browse/CBT-304
*/
if ( class_exists( 'TRP_Translate_Press' ) ) {
$description = $this->product->get_description();
// For variation product.
if ( ! is_null( $this->parent_product ) && $this->product->is_type( 'variation' ) && empty( $description ) ) {
$description = $this->parent_product->get_description();
}
} else {
$description = CommonHelper::clean_content( $this->product->get_description() );
// For variation product.
if ( ! is_null( $this->parent_product ) && $this->product->is_type( 'variation' ) && empty( $description ) ) {
$description = CommonHelper::clean_content( $this->parent_product->get_description() );
}
}
return apply_filters( 'woo_feed_filter_product_description', $description, $this->product, $this->config, $this->parent_product );
}
/**
* Get product description with HTML.
*
* @return string
* @since 8.0.0
*/
public function description_with_html() {
$description = $this->product->get_description();
if ( empty( $description ) ) {
$description = $this->product->get_short_description();
}
// For variation product.
if ( ! is_null( $this->parent_product ) && $this->product->is_type( 'variation' ) ) {
$description = $this->parent_product->get_description();
if ( empty( $description ) ) {
$description = $this->parent_product->get_short_description();
}
}
// Remove spacial characters.
$description = wp_check_invalid_utf8( wp_specialchars_decode( $description ), true );
return apply_filters( 'woo_feed_filter_product_description_with_html', $description, $this->product, $this->config );
}
/**
* Get product short description.
*
* @return string
* @since 8.0.0
*/
public function short_description() {
$description = CommonHelper::clean_content( $this->product->get_short_description() );
// For variation product.
if ( empty( $description ) && ! is_null( $this->parent_product ) && $this->product->is_type( 'variation' ) ) {
$description = CommonHelper::clean_content( $this->parent_product->get_short_description() );
}
return apply_filters( 'woo_feed_filter_product_short_description', $description, $this->product, $this->config, $this->parent_product );
}
/**
* Get product primary category name.
* If the category is "Clothing > Shirt > T-shirt", then it will return "Clothing".
*
* @return string
* @since 8.0.0
*/
public function primary_category() {
$primary_category = '';
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$categories = $this->parent_product->get_category_ids();
} else {
$categories = $this->product->get_category_ids();
}
if ( is_array( $categories ) && ! empty( $categories ) ) {
// $categories = array_reverse( $categories );
sort( $categories );
$primary_category = get_term_by( 'id', $categories[0], 'product_cat' );
$primary_category = ( $primary_category ) ? $primary_category->name : $primary_category;
//$primary_category = $primary_category->name;
} else {
// Get the default WooCommerce category
$default_category = get_term_by( 'name', 'Uncategorized', 'product_cat' );
$primary_category = ( $default_category ) ? $default_category->name : $primary_category;
//$primary_category = $default_category->name;
}
return apply_filters( 'woo_feed_filter_product_primary_category', $primary_category, $this->product, $this->config );
}
/**
* Get product categories.
*
* @return array
* @since 1.0.0
* @deprecated 8.0.0
*/
public function product_type() {
// Notify that this function is deprecated
// This message is generating huge amount of error log, so we are commenting it out.
// _deprecated_function( __FUNCTION__, '8.0.0', 'categories' );
// Optionally, you can still call the new function from the old one
return $this->categories();
}
/**
* Get product categories.
*
* @return array
* @since 8.0.0
*/
public function categories() {
$id = $this->product->get_id();
if ( $this->product->is_type( 'variation' ) ) {
$id = $this->product->get_parent_id();
}
// Get child categories of the current parent ID
//$categories = wp_strip_all_tags( wc_get_product_category_list( $id, ' > ' ) );
$categories = '';
$term_list = get_the_terms( $id, 'product_cat' );
$separator = apply_filters( 'woo_feed_product_type_separator', ' > ', $this->config, $this->product );
if ( is_array( $term_list ) ) {
$col = array_column( $term_list, "parent" );
array_multisort( $col, SORT_ASC, $term_list );
$term_list = array_column( $term_list, "name" );
$categories = implode( $separator, $term_list );
}
return apply_filters( 'woo_feed_filter_product_categories', $categories, $this->product, $this->config );
}
/**
* Format term ids to names.
*
* @param array $term_ids Term IDs to format.
* @param string $taxonomy Taxonomy name.
*
* @return string
* @since 3.1.0
*/
public function format_term_ids( $term_ids, $taxonomy, $separator ) {
$term_ids = wp_parse_id_list( $term_ids );
if ( ! count( $term_ids ) ) {
return '';
}
$formatted_terms = array();
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
foreach ( $term_ids as $term_id ) {
$formatted_term = array();
$ancestor_ids = array_reverse( get_ancestors( $term_id, $taxonomy ) );
foreach ( $ancestor_ids as $ancestor_id ) {
$term = get_term( $ancestor_id, $taxonomy );
if ( $term && ! is_wp_error( $term ) ) {
$formatted_term[] = $term->name;
}
}
$term = get_term( $term_id, $taxonomy );
if ( $term && ! is_wp_error( $term ) ) {
$formatted_term[] = $term->name;
}
$formatted_terms[] = implode( $separator, $formatted_term );
}
} else {
foreach ( $term_ids as $term_id ) {
$term = get_term( $term_id, $taxonomy );
if ( $term && ! is_wp_error( $term ) ) {
$formatted_terms[] = $term->name;
}
}
}
$formatted_value = '';
if ( count( $formatted_terms ) == 1 ) {
$formatted_value = $formatted_terms[0];
} else {
foreach ( $formatted_terms as $terms ) {
// Ensure that the item is a string
if ( is_string( $terms ) && strlen( $terms ) > strlen( $formatted_value ) ) {
$formatted_value = $terms;
}
}
}
return $formatted_value;
}
/**
* Get product primary category id.
* If the category is "Clothing > Shirt > T-shirt", then it will return term_id of "Clothing".
*
* @return string
* @since 8.0.0
*/
public function primary_category_id() {
$primary_category = '';
$categories = $this->product->get_category_ids();
if ( ! empty( $categories ) ) {
$primary_category = get_term_by( 'id', $categories[0], 'product_cat' );
$primary_category = $primary_category->term_id;
} else {
// Get the default WooCommerce category
$default_category = get_term_by( 'name', 'Uncategorized', 'product_cat' );
$primary_category = $default_category->term_id;
}
return apply_filters( 'woo_feed_filter_product_primary_category_id', $primary_category, $this->product, $this->config );
}
/**
* Get product child category name.
* If the category is "Clothing > Shirt > T-shirt", then it will return "T-shirt".
*
* @return string
* @since 8.0.0
*/
public function child_category() {
$child_category = '';
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$categories = $this->parent_product->get_category_ids();
} else {
$categories = $this->product->get_category_ids();
}
if ( ! empty( $categories ) ) {
sort( $categories );
$categories = array_reverse( $categories );
$child_category = get_term_by( 'id', $categories[0], 'product_cat' );
$child_category = ( $child_category ) ? $child_category->name : $child_category;
//$child_category = $child_category->name;
} else {
// Get the default WooCommerce category
$default_category = get_term_by( 'name', 'Uncategorized', 'product_cat' );
$child_category = ( $default_category ) ? $default_category->name : $child_category;
//$child_category = $default_category->name;
}
return apply_filters( 'woo_feed_filter_product_child_category', $child_category, $this->product, $this->config );
}
/**
* Get product child category id.
* If the category is "Clothing > Shirt > T-shirt", then it will return term_id of "T-shirt".
*
* @return string
* @since 8.0.0
*/
public function child_category_id() {
$child_category = '';
$categories = $this->product->get_category_ids();
if ( ! empty( $categories ) ) {
$categories = array_reverse( $categories );
$child_category = get_term_by( 'id', $categories[0], 'product_cat' );
$child_category = $child_category->term_id;
} else {
// Get the default WooCommerce category
$default_category = get_term_by( 'name', 'Uncategorized', 'product_cat' );
$child_category = $default_category->term_id;
}
return apply_filters( 'woo_feed_filter_product_child_category_id', $child_category, $this->product, $this->config );
}
/**
* Get product status.
*
* @return array
* @since 8.0.0
*/
public function product_status() {
$product_status = $this->product->get_status();
return apply_filters( 'woo_feed_filter_product_status', $product_status, $this->product, $this->config );
}
/**
* Get product featured status.
*
* @return array
* @since 8.0.0
*/
public function featured_status() {
$featured_status = 'no';
if ( $this->product->is_featured() ) {
$featured_status = 'yes';
}
return apply_filters( 'woo_feed_filter_featured_status', $featured_status, $this->product, $this->config );
}
/**
* Get product full category.
*
* @return mixed|void
*/
public function product_full_cat() {
// $id = $this->product->get_id();
// if ( $this->product->is_type( 'variation' ) ) {
// $id = $this->product->get_parent_id();
// }
//
// $separator = apply_filters( 'woo_feed_product_type_separator', ' > ', $this->config, $this->product );
//
// $product_type = wp_strip_all_tags( wc_get_product_category_list( $id, $separator ) );
$term_ids = $this->product->get_category_ids();
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$term_ids = $this->parent_product->get_category_ids();
}
$separator = apply_filters( 'woo_feed_product_type_separator', ' > ', $this->config, $this->product );
$product_type = $this->format_term_ids( $term_ids, 'product_cat', $separator );
return apply_filters( 'woo_feed_filter_product_local_category', htmlspecialchars_decode( $product_type ), $this->product, $this->config );
}
/**
* Get product canonical permalink.
*
* @return string
* @since 8.0.0
*/
public function canonical_link() {
$permalink = $this->parent_link();
return apply_filters( 'woo_feed_filter_product_canonical_link', $permalink, $this->product, $this->config );
}
/**
* Get product parent permalink.
*
* @return string
* @since 8.0.0
*/
public function parent_link() {
$permalink = $this->product->get_permalink();
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$permalink = $this->parent_product->get_permalink();
}
// Add UTM parameter.
if ( $this->config->get_campaign_parameters() ) {
$permalink = CommonHelper::add_utm_parameter( $this->config->get_campaign_parameters(), $permalink );
}
return apply_filters( 'woo_feed_filter_product_parent_link', $permalink, $this->product, $this->config );
}
/**
* Get external product URL.
*
* @return string
* @since 8.0.0
*/
public function ex_link() {
$external_product_url = '';
if ( $this->product->is_type( 'external' ) ) {
$external_product_url = $this->product->get_product_url();
}
return apply_filters( 'woo_feed_filter_product_ex_link', $external_product_url, $this->product, $this->config );
}
/**
* Get product main image url.
*
* @return string
* @since 8.0.0
*/
/*public function image() {
$image_link = wp_get_attachment_url( $this->product->get_image_id() );
$image_link = CTX_Helper::woo_feed_get_formatted_url( $image_link );
error_log( print_r( ['$image_link'=>$image_link], true ) );
return apply_filters( 'woo_feed_filter_product_image', $image_link, $this->product, $this->config );
}*/
public function image() {
$image = '';
if ( $this->product->is_type( 'variation' ) ) {
// Variation product type
if ( has_post_thumbnail( $this->product->get_id() ) ) {
$getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $this->product->get_id() ), 'single-post-thumbnail' );
$image = CTX_Helper::woo_feed_get_formatted_url( $getImage[0] );
} elseif ( has_post_thumbnail( $this->product->get_parent_id() ) ) {
$getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $this->product->get_parent_id() ), 'single-post-thumbnail' );
$image = CTX_Helper::woo_feed_get_formatted_url( $getImage[0] );
}
} elseif ( has_post_thumbnail( $this->product->get_id() ) ) { // All product type except variation
$getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $this->product->get_id() ), 'single-post-thumbnail' );
$image = isset( $getImage[0] ) ? CTX_Helper::woo_feed_get_formatted_url( $getImage[0] ) : '';
}
return apply_filters( 'woo_feed_filter_product_image', $image, $this->product, $this->config );
}
/**
* Get product featured image url.
*
* @return string
* @since 8.0.0
*/
/*public function feature_image() {
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$image_link = wp_get_attachment_url( $this->parent_product->get_image_id() );
if ( empty( $image_link ) ) {
$image_link = wp_get_attachment_url( $this->product->get_image_id() );
}
} else {
$image_link = wp_get_attachment_url( $this->product->get_image_id() );
}
return apply_filters( 'woo_feed_filter_product_feature_image', $image_link, $this->product, $this->config );
}*/
public function feature_image() {
$id = $this->product->get_id();
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$id = $this->product->get_parent_id();
}
$getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $id ), 'single-post-thumbnail' );
$image = isset( $getImage[0] ) ? CTX_Helper::woo_feed_get_formatted_url( $getImage[0] ) : '';
return apply_filters( 'woo_feed_filter_product_feature_image', $image, $this->product, $this->config );
}
/**
* Get product condition.
*
* @return string
* @since 8.0.0
*/
public function condition() {
return apply_filters( 'woo_feed_product_condition', 'new', $this->product, $this->config );
}
/**
* Get a product type.
*
* @return string
* @since 8.0.0
*/
public function type() {
return apply_filters( 'woo_feed_filter_product_type', $this->product->get_type(), $this->product, $this->config );
}
/**
* Get product is a bundle.
*
* @return string
* @since 8.0.0
*/
public function is_bundle() {
$is_bundle = 'no';
$type = $this->product->get_type();
if ( in_array( $type, array( 'bundle', 'bundled', 'yith_bundle', 'woosb' ), true ) ) {
$is_bundle = 'yes';
}
return apply_filters( 'woo_feed_filter_product_is_bundle', $is_bundle, $this->product, $this->config );
}
/**
* Get product is a multipack.
*
* @return string
* @since 8.0.0
*/
public function multipack() {
$is_multipack = '';
if ( $this->product->is_type( 'grouped' ) && ! empty( $this->product->get_children() ) ) {
$is_multipack = count( $this->product->get_children() );
}
return apply_filters( 'woo_feed_filter_product_is_multipack', $is_multipack, $this->product, $this->config );
}
/**
* Get product visibility.
*
* @return string
* @since 8.0.0
*/
public function visibility() {
return apply_filters( 'woo_feed_filter_product_visibility', $this->product->get_catalog_visibility(), $this->product, $this->config );
}
/**
* Get product rating total.
*
* @return string
* @since 8.0.0
*/
public function rating_total() {
return apply_filters( 'woo_feed_filter_product_rating_total', $this->product->get_rating_count(), $this->product, $this->config );
}
/**
* Get product rating average.
*
* @return string
* @since 8.0.0
*/
public function rating_average() {
return apply_filters( 'woo_feed_filter_product_rating_average', $this->product->get_average_rating(), $this->product, $this->config );
}
/**
* Get product total sold.
*
* @return string
* @since 8.0.0
*/
public function total_sold() {
return apply_filters( 'woo_feed_filter_product_total_sold', $this->product->get_total_sales(), $this->product, $this->config );
}
/**
* Get comma separated product tags.
*
* @return string
* @since 8.0.0
*/
public function tags() {
$tags = '';
if ( $this->product->is_type( 'variation' ) ) {
$tags = wp_strip_all_tags( wc_get_product_tag_list( $this->product->get_parent_id(), ',', '', '' ) );
} else {
$tags = wp_strip_all_tags( wc_get_product_tag_list( $this->product->get_id(), ',', '', '' ) );
}
return apply_filters( 'woo_feed_filter_product_tags', $tags, $this->product, $this->config );
}
/**
* Get product group id.
*
* @return int
* @since 8.0.0
*/
public function item_group_id() {
$id = $this->product->get_id();
if ( $this->product->is_type( 'variation' ) ) {
$id = $this->product->get_parent_id();
}
return apply_filters( 'woo_feed_filter_product_item_group_id', $id, $this->product, $this->config );
}
/**
* Get product SKU.
*
* @return string
* @since 8.0.0
*/
public function sku() {
return apply_filters( 'woo_feed_filter_product_sku', $this->product->get_sku(), $this->product, $this->config );
}
/**
* Get product SKU_ID.
*
* @return string
* @since 8.0.0
*/
public function sku_id() {
$sku = $this->product->get_sku();
$id = $this->product->get_id();
$sku_id = $id;
if ( ! empty( $sku ) ) {
$sku_id = $sku . '_' . $id;
}
return apply_filters( 'woo_feed_filter_product_sku_id', $sku_id, $this->product, $this->config );
}
/**
* Get product parent SKU.
*
* @return string
* @since 8.0.0
*/
public function parent_sku() {
$parent_sku = $this->product->get_sku();
if ( $this->product->is_type( 'variation' ) && $this->parent_product ) {
$parent_sku = $this->parent_product->get_sku();
}
return apply_filters( 'woo_feed_filter_product_parent_sku', $parent_sku, $this->product, $this->config );
}
/**
* Get product availability status.
*
* @return string
* @since 8.0.0
*/
public function availability() {
$status = $this->product->get_stock_status();
if ( 'instock' === $status ) {
$status = 'in stock';
} elseif ( 'outofstock' === $status ) {
$status = 'out of stock';
} elseif ( 'onbackorder' === $status ) {
$status = 'backorder';
}
return apply_filters( 'woo_feed_filter_product_availability', $status, $this->product, $this->config );
}
/**
* Get product availability date.
*
* @return string
* @since 8.0.0
*/
public function availability_date() {
$availability_date_settings = Settings::get( 'woo_feed_identifier' );
$availability_date_status = $availability_date_settings['availability_date'];
if ( $availability_date_status === 'disable' || $this->product->get_stock_status() !== 'onbackorder' ) {
return '';
}
$meta_field_name = 'woo_feed_availability_date';
if ( $this->product->is_type( 'variation' ) ) {
$meta_field_name .= '_var';
}
$availability_date = get_post_meta( $this->product->get_id(), $meta_field_name, true );
$availability_date = gmdate( 'c', strtotime( $availability_date ) );
return apply_filters( 'woo_feed_filter_product_availability_date', $availability_date, $this->product, $this->config );
}
/**
* Get product availability date.
*
* @return string
* @since 8.0.0
*/
public function add_to_cart_link() {
$cart_parameters = array( 'add-to-cart' => $this->product->get_id() );
$add_to_cart_link = $this->product->add_to_cart_url();
$add_to_cart_link = add_query_arg( $cart_parameters, $add_to_cart_link );
$utm_parameters = $this->config->get_campaign_parameters();
$add_to_cart_link = CommonHelper::add_utm_parameter( $utm_parameters, $add_to_cart_link );
return apply_filters( 'woo_feed_filter_product_add_to_cart_link', $add_to_cart_link, $this->product, $this->config );
}
/**
* Get a permalink with UTM parameter.
*
* @return array
* @since 8.0.0
*/
public function link() {
$permalink = $this->product->get_permalink();
// Add UTM parameter.
if ( $this->config->get_campaign_parameters() ) {
$permalink = CommonHelper::add_utm_parameter( $this->config->get_campaign_parameters(), $permalink );
}
return apply_filters( 'woo_feed_filter_product_link', $permalink, $this->product, $this->config );
}
/**
* Get product quantity.
*
* @return int
* @since 8.0.0
*/
public function quantity() {// phpcs:ignore
$quantity = $this->product->get_stock_quantity();
$status = $this->product->get_stock_status();
if ( 'instock' === $status && $quantity === null) {
$quantity = 1;
}
if ( 'outofstock' === $status && $quantity === null ) {
$quantity = 0;
}
if ( $this->product->is_type( 'variable' ) ) {
$variable_qty_type = $this->config->variable_quantity;
// Get the IDs of the product variations
$variation_ids = $this->product->get_visible_children();
// Use array_map to get the quantities of each variation
$variations_quantities = array_map(
static function ( $variation_id ) {
$stock = get_post_meta( $variation_id, '_stock', true );
if ( $stock === '' ) {
$stock = 0;
}
return $stock;
},
$variation_ids
);
if ( empty( $variations_quantities ) ) {
$quantity = 0;
} elseif ( $variable_qty_type === 'min' ) {
$quantity = min( $variations_quantities );
} elseif ( $variable_qty_type === 'max' ) {
$quantity = max( $variations_quantities );
} elseif ( $variable_qty_type === 'first' ) {
$quantity = $variations_quantities[0];
} else {
$quantity = array_sum( $variations_quantities );
}
}
return apply_filters( 'woo_feed_filter_product_quantity', $quantity, $this->product, $this->config );
}
/**
* Get Store Currency.
*
* @return string
*/
public function currency() {
$store_currency = get_option( 'woocommerce_currency' );
return apply_filters( 'woo_feed_filter_product_currency', $store_currency, $this->product, $this->config );
}
/**
* Get Product Price.
*
* @return mixed
*/
public function current_price() {
$price = PriceFactory::get( $this->product, $this->config )->price();
return apply_filters( 'woo_feed_filter_product_price', $price, $this->product, $this->config, false, 'price' );
}
/**
* Get Product Regular Price.
*
* @return mixed
*/
public function price() {
$regular_price = PriceFactory::get( $this->product, $this->config )->regular_price();
return apply_filters( 'woo_feed_filter_product_regular_price', $regular_price, $this->product, $this->config, false, 'regular_price' );
}
/**
* Get Product Regular Price with Tax.
*
* @return mixed
*/
public function price_with_tax() {
$regular_price = PriceFactory::get( $this->product, $this->config )->regular_price( true );
return apply_filters( 'woo_feed_filter_product_regular_price_with_tax', $regular_price, $this->product, $this->config, true, 'regular_price' );
}
/**
* Get Product Price with Tax.
*
* @return mixed
*/
public function current_price_with_tax() {
$price = PriceFactory::get( $this->product, $this->config )->price( true );
return apply_filters( 'woo_feed_filter_product_price_with_tax', $price, $this->product, $this->config, true, 'price' );
}
/**
* Get Product Sale Price with Tax.
*
* @return mixed
*/
public function sale_price_with_tax() {
$sale_price = PriceFactory::get( $this->product, $this->config )->sale_price( true );
return apply_filters( 'woo_feed_filter_product_sale_price_with_tax', $sale_price, $this->product, $this->config, true, 'sale_price' );
}
/**
* Get Product Sale Price.
*
* @return mixed
*/
public function sale_price() {
$sale_price = PriceFactory::get( $this->product, $this->config )->sale_price();
return apply_filters( 'woo_feed_filter_product_sale_price', $sale_price, $this->product, $this->config, false, 'sale_price' );
}
/**
* Get Product Weight.
*
* @return string
*/
public function weight() {
$weight = '';
$weight_unit = get_option( 'woocommerce_weight_unit' );
if ( $this->product->get_weight() ) {
$weight = $this->product->get_weight() . ' ' . $weight_unit;
}
return apply_filters( 'woo_feed_filter_product_weight', $weight, $this->product, $this->config );
}
/**
* Get Weight Unit.
*
* @return string
*/
public function weight_unit() {
return apply_filters( 'woo_feed_filter_product_weight_unit', get_option( 'woocommerce_weight_unit' ), $this->product, $this->config );
}
/**
* Get Product Width.
*
* @return string
*/
public function width() {
$width = '';
$dimension_unit = get_option( 'woocommerce_dimension_unit' );
if ( $this->product->get_width() ) {
$width = $this->product->get_width() . " $dimension_unit";
}
return apply_filters( 'woo_feed_filter_product_width', $width, $this->product, $this->config );
}
/**
* Get Product Height.
*
* @return string
*/
public function height() {
$height = '';
if ( $this->product->get_height() ) {
$dimension_unit = get_option( 'woocommerce_dimension_unit' );
$height = $this->product->get_height() . " $dimension_unit";
}
return apply_filters( 'woo_feed_filter_product_height', $height, $this->product, $this->config );
}
/**
* Get Product Length.
*
* @return string
*/
public function length() {
$length = '';
$dimension_unit = get_option( 'woocommerce_dimension_unit' );
if ( $this->product->get_length() ) {
$length = $this->product->get_length() . " $dimension_unit";
}
return apply_filters( 'woo_feed_filter_product_length', $length, $this->product, $this->config );
}
/**
* Get Product checkout template URL.
*
* @return mixed|void
*/
public function checkout_link_template() {
if ( $this->config->get_feed_file_type() === 'xml' ) {
$checkout_link_url = wc_get_checkout_url() . $this->product->get_id();
} else {
$checkout_link_url = wc_get_page_permalink( 'cart' ) . "?productId=" . $this->product->get_id();
}
return apply_filters( 'woo_feed_filter_product_checkout_link_url', $checkout_link_url, $this->product, $this->config );
}
/** Google Formatted Shipping info
*
* @return string
* @throws \Exception
*/
public function shipping( $key = '' ) {
try {
return ( ShippingFactory::get( $this->product, $this->config ) )->get_shipping( $key );
// return apply_filters( 'woo_feed_filter_product_shipping', $shipping, $this->product, $this->config );
} catch ( Exception $e ) {
}
}
/**
* Get Shipping Cost.
*
* @throws \Exception
*/
public function shipping_cost() {
// Get config to which shipping price to return (first, highest or lowest)
$shipping = ( ShippingFactory::get( $this->product, $this->config ) )->get_shipping_info();
$price = "0";
if ( ! empty( $shipping ) ) {
if ( isset( $this->config->shipping_price ) ) {
if ( 'highest' === $this->config->shipping_price ) {
$price = max( wp_list_pluck( $shipping, 'price' ) );
} elseif ( 'lowest' === $this->config->shipping_price ) {
$price = min( wp_list_pluck( $shipping, 'price' ) );
} else {
$shipping_prices = wp_list_pluck( $shipping, 'price' );
$price = reset( $shipping_prices );
}
} else {
$shipping_prices = wp_list_pluck( $shipping, 'price' );
$price = reset( $shipping_prices );
}
}
return apply_filters( 'woo_feed_filter_product_shipping_cost', $price, $this->product, $this->config );
}
/**
* Get Product Shipping Class
*
* @return mixed
* @since 3.2.0
*/
public function shipping_class() {
return apply_filters( 'woo_feed_filter_product_shipping_class', $this->product->get_shipping_class(), $this->product, $this->config );
}
/**
* Get author name.
*
* @return string
*/
public function author_name() {
$post = get_post( $this->product->get_id() );
return get_the_author_meta( 'user_login', $post->post_author );
}
/**
* Get Author Email.
*
* @return string
*/
public function author_email() {
$post = get_post( $this->product->get_id() );
return get_the_author_meta( 'user_email', $post->post_author );
}
/**
* Get Date Created.
*
* @return mixed|void
*/
public function date_created() {
$date_created = gmdate( 'Y-m-d', strtotime( $this->product->get_date_created() ) );
return apply_filters( 'woo_feed_filter_product_date_created', $date_created, $this->product, $this->config );
}
/**
* Get Date updated.
*
* @return mixed|void
*/
public function date_updated() {
$date_updated = gmdate( 'Y-m-d', strtotime( $this->product->get_date_modified() ) );
return apply_filters( 'woo_feed_filter_product_date_updated', $date_updated, $this->product, $this->config );
}
/** Get Google Sale Price effective date.
*
* @return string
*/
public function sale_price_effective_date() {
$effective_date = '';
$from = $this->sale_price_sdate();
$to = $this->sale_price_edate();
if ( ! empty( $from ) && ! empty( $to ) ) {
$from = gmdate( 'c', strtotime( $from ) );
$to = gmdate( 'c', strtotime( $to ) );
$effective_date = $from . '/' . $to;
}
return apply_filters( 'woo_feed_filter_product_sale_price_effective_date', $effective_date, $this->product, $this->config );
}
/**
* Get Product Sale Price start date.
*
* @return string|null
*/
public function sale_price_sdate() {
$sale_price_sdate = '';
$start_date = $this->product->get_date_on_sale_from();
if ( $start_date instanceof \WC_DateTime ) {
$sale_price_sdate = $start_date->date_i18n();
}
return apply_filters( 'woo_feed_filter_product_sale_price_sdate', $sale_price_sdate, $this->product, $this->config );
}
/**
* Get Product Sale Price End Date.
*
* @return mixed|void
*/
public function sale_price_edate() {
$sale_price_edate = '';
$end_date = $this->product->get_date_on_sale_to();
if ( $end_date instanceof \WC_DateTime ) {
$sale_price_edate = $end_date->date_i18n();
}
return apply_filters( 'woo_feed_filter_product_sale_price_edate', $sale_price_edate, $this->product, $this->config );
}
/**
* Get product subscription period.
*
* @return string
* @since 8.0.0
*/
public function subscription_period() {
if ( class_exists( 'WC_Subscriptions' ) ) {
return ProductHelper::get_product_meta( '_subscription_period', $this->product, $this->config );
}
return '';
}
/**
* Get product subscription period interval.
*
* @return string
* @since 8.0.0
*/
public function subscription_period_interval() {
if ( class_exists( 'WC_Subscriptions' ) ) {
return ProductHelper::get_product_meta( '_subscription_period_interval', $this->product, $this->config );
}
return '';
}
/**
* Get product subscription amount.
*
* @return string
* @since 8.0.0
*/
public function subscription_amount() {
return $this->product->get_price();
}
/**
* Get product installment amount.
*
* @return string
* @since 8.0.0
*/
public function installment_amount() {
return $this->product->get_price();
}
/**
* Get product installment period.
*
* @return string
* @since 8.0.0
*/
public function installment_months() {
if ( class_exists( 'WC_Subscriptions' ) ) {
return ProductHelper::get_product_meta( '_subscription_length', $this->product, $this->config );
}
return '';
}
/**
* Get product unit price measure.
*
* @return string
* @since 8.0.0
*/
public function unit_price_measure() {
$unit_price_measure = '';
$identifiers = Settings::get( 'woo_feed_identifier' );
if ( 'enable' === $identifiers['unit_pricing_base_measure']
&& 'enable' === $identifiers['unit_pricing_measure']
&& 'enable' === $identifiers['unit']
) {
$unit = ProductHelper::get_custom_field( 'woo_feed_unit', $this->product, $this->config );
$unit_price_measure = ProductHelper::get_custom_field( 'woo_feed_unit_pricing_measure', $this->product, $this->config );
if ( ! empty( $unit_price_measure ) ) {
$unit_price_measure .= ' ' . $unit;
}
}
// For WooCommerce Germanized Plugin
// TODO:: Move to compatibility class
if ( empty( $unit_price_measure ) && class_exists( 'WooCommerce_Germanized' ) ) {
$unit = ProductHelper::get_product_meta( '_unit', $this->product, $this->config );
$unit_price_measure = ProductHelper::get_product_meta( '_unit_product', $this->product, $this->config );
$unit_price_measure .= ' ' . $unit;
}
return apply_filters( 'woo_feed_filter_unit_price_measure', $unit_price_measure, $this->product, $this->config );
}
/**
* Get product unit price base measure.
*
* @return string
* @since 8.0.0
*/
public function unit_price_base_measure() {
$unit_price_base_measure = '';
$identifiers = Settings::get( 'woo_feed_identifier' );
if ( 'enable' === $identifiers['unit_pricing_base_measure']
&& 'enable' === $identifiers['unit_pricing_measure']
&& 'enable' === $identifiers['unit']
) {
$unit = ProductHelper::get_custom_filed( 'woo_feed_unit', $this->product, $this->config );
$unit_price_base_measure = ProductHelper::get_custom_filed( 'woo_feed_unit_pricing_base_measure', $this->product, $this->config );
$unit_price_base_measure .= ' ' . $unit;
}
// For WooCommerce Germanized Plugin
// TODO:: Move to compatibility class
if ( empty( $unit_price_base_measure ) && class_exists( 'WooCommerce_Germanized' ) ) {
$unit = ProductHelper::get_product_meta( '_unit', $this->product, $this->config );
$unit_price_base_measure = ProductHelper::get_product_meta( '_unit_base', $this->product, $this->config );
$unit_price_base_measure .= ' ' . $unit;
}
return apply_filters( 'woo_feed_filter_unit_price_base_measure', $unit_price_base_measure, $this->product, $this->config );
}
/**
* Get product GTIN for WooCommerce_Germanized plugin.
*
* @return string
* @since 8.0.0
*/
public function wc_germanized_gtin() {
$wc_germanized_gtin = '';
$wc_germanized_gtin = ProductHelper::get_product_meta( '_ts_gtin', $this->product, $this->config );
return apply_filters( 'woo_feed_filter_wc_germanized_gtin', $wc_germanized_gtin, $this->product, $this->config );
}
/**
* Get product unit price measure for WooCommerce_Germanized plugin.
*
* @return string
* @since 8.0.0
*/
public function wc_germanized_unit_price_measure() {
$wc_germanized_unit_price_measure = '';
$wc_germanized_unit_price_measure = ProductHelper::get_product_meta( '_unit_product', $this->product, $this->config );
return apply_filters( 'woo_feed_filter_wc_germanized_unit_price_measure', $wc_germanized_unit_price_measure, $this->product, $this->config );
}
/**
* Get product unit price base measure for WooCommerce_Germanized plugin.
*
* @return string
* @since 8.0.0
*/
public function wc_germanized_unit_price_base_measure() {
$wc_germanized_unit_price_base_measure = '';
$wc_germanized_unit_price_base_measure = ProductHelper::get_product_meta( '_unit_base', $this->product, $this->config );
return apply_filters( 'woo_feed_filter_wc_germanized_unit_price_base_measure', $wc_germanized_unit_price_base_measure, $this->product, $this->config );
}
/**
* Get product MPN for WooCommerce_Germanized plugin.
*
* @return string
* @since 8.0.0
*/
public function wc_germanized_mpn() {
$wc_germanized_mpn = '';
$wc_germanized_mpn = ProductHelper::get_product_meta( '_ts_mpn', $this->product, $this->config );
return apply_filters( 'woo_feed_filter_wc_germanized_mpn', $wc_germanized_mpn, $this->product, $this->config );
}
public function yoast_primary_category() {
$primary_category = '';
$product_id = CommonHelper::parent_product_id( $this->product );
if ( class_exists( 'WPSEO_Frontend' ) ) {
$primary_term_id = yoast_get_primary_term_id( 'product_cat', $product_id );
$term = get_term( $primary_term_id );
if ( ! is_wp_error( $term ) && ! empty( $term ) ) {
$primary_category = $term->name;
}
}
return apply_filters( 'woo_feed_filter_product_yoast_primary_category', $primary_category, $this->product, $this->config );
}
# SEO Plugins
/**
* Get product Yoast WP SEO title.
*
* @return string
* @since 8.0.0
*/
public function yoast_wpseo_title() {
$product_id = $this->product->get_id();
if ( $this->product->is_type( 'variation' ) ) {
$product_id = $this->product->get_parent_id();
}
$yoast_title = $this->title();
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_title = get_post_meta( $product_id, '_yoast_wpseo_title', true );
// Get an instance of WPSEO_Replace_Vars
$replace_vars = new \WPSEO_Replace_Vars;
// Replace variables in the title
$yoast_title = $replace_vars->replace( $yoast_title, get_post( $product_id ) );
}
return apply_filters( 'woo_feed_filter_product_yoast_wpseo_title', $yoast_title, $this->product, $this->config );
}
/**
* Get product Yoast WP SEO description.
*
* @return string
* @since 8.0.0
*/
public function yoast_wpseo_metadesc() {
$product_id = $this->product->get_id();
if ( $this->product->is_type( 'variation' ) ) {
$product_id = $this->product->get_parent_id();
}
$meta_description = $this->description();
if ( class_exists( 'WPSEO_Frontend' ) ) {
$meta_description = get_post_meta( $product_id, '_yoast_wpseo_metadesc', true );
// Get an instance of WPSEO_Replace_Vars
$replace_vars = new \WPSEO_Replace_Vars;
// Replace variables in the title
$meta_description = $replace_vars->replace( $meta_description, get_post( $product_id ) );
}
return apply_filters( 'woo_feed_filter_product_yoast_wpseo_metadesc', $meta_description, $this->product, $this->config );
}
# SEO Plugins
/**
* Get product Yoast WP SEO canonical URL.
*
* @return string
* @since 8.0.0
*/
public function yoast_canonical_url() {
$product_id = $this->product->get_id();
if ( $this->product->is_type( 'variation' ) ) {
$product_id = $this->product->get_parent_id();
}
$yoast_canonical_url = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_canonical_url = get_post_meta( $product_id, '_yoast_wpseo_canonical', true );
}
return apply_filters( 'woo_feed_filter_product_yoast_canonical_url', $yoast_canonical_url, $this->product, $this->config );
}
/**
* Get product Yoast WP SEO GTIN8.
*
* @return string
* @since 8.0.0
*/
public function yoast_gtin8() {
$yoast_gtin8_value = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_gtin8_value = woo_feed_get_yoast_identifiers_value( 'gtin8', $this->product );
}
return apply_filters( 'yoast_gtin8_attribute_value', $yoast_gtin8_value, $this->product );
}
/**
* Get product Yoast WP SEO GTIN12.
*
* @return string
* @since 8.0.0
*/
public function yoast_gtin12() {
$yoast_gtin8_value = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_gtin8_value = woo_feed_get_yoast_identifiers_value( 'gtin12', $this->product );
}
return apply_filters( 'yoast_gtin12_attribute_value', $yoast_gtin8_value, $this->product );
}
/**
* Get product Yoast WP SEO GTIN13.
*
* @return string
* @since 8.0.0
*/
public function yoast_gtin13() {
$yoast_gtin8_value = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_gtin8_value = woo_feed_get_yoast_identifiers_value( 'gtin13', $this->product );
}
return apply_filters( 'yoast_gtin13_attribute_value', $yoast_gtin8_value, $this->product );
}
/**
* Get product Yoast WP SEO GTIN14.
*
* @return string
* @since 8.0.0
*/
public function yoast_gtin14() {
$yoast_gtin8_value = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_gtin8_value = woo_feed_get_yoast_identifiers_value( 'gtin14', $this->product );
}
return apply_filters( 'yoast_gtin14_attribute_value', $yoast_gtin8_value, $this->product );
}
/**
* Get product Yoast WP SEO ISBN.
*
* @return string
* @since 8.0.0
*/
public function yoast_isbn() {
$yoast_gtin8_value = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_gtin8_value = woo_feed_get_yoast_identifiers_value( 'isbn', $this->product );
}
return apply_filters( 'yoast_isbn_attribute_value', $yoast_gtin8_value, $this->product );
}
/**
* Get product Yoast WP SEO MPN.
*
* @return string
* @since 8.0.0
*/
public function yoast_mpn() {
$yoast_gtin8_value = '';
if ( class_exists( 'WPSEO_Frontend' ) ) {
$yoast_gtin8_value = woo_feed_get_yoast_identifiers_value( 'mpn', $this->product );
}
return apply_filters( 'yoast_mpn_attribute_value', $yoast_gtin8_value, $this->product );
}
/**
* Get product Rank Math Title.
*
* @return string
* @since 8.0.0
*/
public function rank_math_title() {
$rank_title = '';
if ( class_exists( 'RankMath' ) ) {
$title = get_post_meta( $this->product->get_id(), 'rank_math_title', true );
if ( empty( $title ) ) {
$title_format = Helper::get_settings( "titles.pt_product_title" );
$title_format = $title_format ? $title_format : '%title%';
$sep = Helper::get_settings( 'titles.title_separator' );
$rank_title = str_replace( '%title%', $this->product->get_title(), $title_format );
$rank_title = str_replace( '%sep%', $sep, $rank_title );
$rank_title = str_replace( '%page%', '', $rank_title );
$rank_title = str_replace( '%sitename%', get_bloginfo( 'name' ), $rank_title );
} else {
$rank_title = $title;
}
}
return apply_filters( 'woo_feed_filter_product_rank_math_title', $rank_title, $this->product, $this->config );
}
/**
* Get product Rank Math Description.
*
* @return string
* @since 8.0.0
*/
public function rank_math_description() {
$description = '';
if ( class_exists( 'RankMath' ) ) {
$description = get_post_meta( $this->product->get_id(), 'rank_math_description' );
$desc_format = Helper::get_settings( "titles.pt_post_description" );
if ( empty( $description ) ) {
if ( ! empty( $desc_format ) && strpos( (string) $desc_format, 'excerpt' ) !== false ) {
$description = str_replace( '%excerpt%', get_the_excerpt( $this->product->get_id() ), $desc_format );
}
// Get Variation Description
if ( empty( $description ) && $this->product->is_type( 'variation' ) && $this->parent_product ) {
$description = $this->parent_product->get_description();
}
}
if ( is_array( $description ) ) {
$description = reset( $description );
}
$description = CommonHelper::remove_shortcodes( $description );
//strip tags and spacial characters
$strip_description = CommonHelper::strip_all_tags( wp_specialchars_decode( $description ) );
$description = ! empty( strlen( $strip_description ) ) && 0 < strlen( $strip_description ) ? $strip_description : $description;
}
return apply_filters( 'woo_feed_filter_product_rank_math_description', $description, $this->product, $this->config );
}
/**
* Get product Rank Math Canonical URL.
*
* @return string
* @since 8.0.0
*/
public function rank_math_canonical_url() {
$canonical_url = '';
if ( class_exists( 'RankMath' ) ) {
$post_canonical_url = get_post_meta( $this->product->get_id(), 'rank_math_canonical_url' );
if ( empty( $post_canonical_url ) ) {
$canonical_url = get_the_permalink( $this->product->get_id() );
} else {
$canonical_url = $post_canonical_url;
}
if ( is_array( $canonical_url ) ) {
$canonical_url = reset( $canonical_url );
}
}
return apply_filters( 'woo_feed_filter_product_rank_math_canonical_url', $canonical_url, $this->product, $this->config );
}
/**
* Get product Rank Math GTIN.
*
* @return string
* @since 8.0.0
*/
public function rank_math_gtin() {
$product_id = CommonHelper::parent_product_id( $this->product );
$rankmath_gtin_value = get_post_meta( $product_id, '_rank_math_gtin_code' );
$rankmath_gtin_value = ! empty( $rankmath_gtin_value ) && is_array( $rankmath_gtin_value ) ? $rankmath_gtin_value[0] : '';
return apply_filters( 'rankmath_gtin_attribute_value', $rankmath_gtin_value, $this->product, $this->config );
}
public function _aioseop_title() {
$title = '';
if ( is_plugin_active( 'all-in-one-seo-pack/all_in_one_seo_pack.php' ) && class_exists( 'AIOSEO\Plugin\Common\Models\Post' ) ) {
$post = \AIOSEO\Plugin\Common\Models\Post::getPost( $this->product->get_id() );
$title = ! empty( $post->title ) ? $post->title : aioseo()->meta->title->getPostTypeTitle( 'product' );
}
$title = ! empty( $title ) ? $title : $this->title();
return apply_filters( 'woo_feed_filter_product_aioseop_title', $title, $this->product, $this->config );
}
public function _aioseop_description() {
$description = '';
if ( is_plugin_active( 'all-in-one-seo-pack/all_in_one_seo_pack.php' ) && class_exists( 'AIOSEO\Plugin\Common\Models\Post' ) ) {
$post = \AIOSEO\Plugin\Common\Models\Post::getPost( $this->product->get_id() );
$description = ! empty( $post->description ) ? $post->description : aioseo()->meta->description->getPostTypeDescription( 'product' );
}
if ( empty( $description ) ) {
$description = $this->description();
}
return apply_filters( 'woo_feed_filter_product_aioseop_description', $description, $this->product, $this->config );
}
public function _aioseop_canonical_url() {
$aioseop_canonical_url = '';
if ( is_plugin_active( 'all-in-one-seo-pack/all_in_one_seo_pack.php' ) && class_exists( 'AIOSEO\Plugin\Common\Models\Post' ) ) {
$post = \AIOSEO\Plugin\Common\Models\Post::getPost( $this->product->get_id() );
$aioseop_canonical_url = $post->canonical_url;
}
return apply_filters( 'woo_feed_filter_product_aioseop_canonical_url', $aioseop_canonical_url, $this->product, $this->config );
}
public function tax( $key = '' ) {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$tax = TaxFactory::get( $this->product, $this->config )->merchant_formatted_tax( $key );
// GoogleTax and CustomTax class is available.
// For others merchant use filter hook to modify value.
return apply_filters( 'woo_feed_filter_product_tax', $tax, $this->product, $this->config, $taxes );
}
############# TAX #############
public function tax_class() {
return apply_filters( 'woo_feed_filter_product_tax_class', $this->product->get_tax_class(), $this->product, $this->config );
}
public function tax_status() {
return apply_filters( 'woo_feed_filter_product_tax_status', $this->product->get_tax_status(), $this->product, $this->config );
}
public function tax_country() {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$country = "";
if ( isset( $taxes[ $taxClass ] ) && ! empty( $taxes[ $taxClass ] ) ) {
$rates = array_values( $taxes[ $taxClass ] );
$country = $rates[0]['country'];
}
return apply_filters( 'woo_feed_filter_product_tax_country', $country, $this->product, $this->config, $taxes );
}
public function tax_state() {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$state = "";
if ( isset( $taxes[ $taxClass ] ) && ! empty( $taxes[ $taxClass ] ) ) {
$rates = array_values( $taxes[ $taxClass ] );
$state = $rates[0]['state'];
}
return apply_filters( 'woo_feed_filter_product_tax_state', $state, $this->product, $this->config, $taxes );
}
public function tax_postcode() {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$postcode = "";
if ( isset( $taxes[ $taxClass ] ) && ! empty( $taxes[ $taxClass ] ) ) {
$rates = array_values( $taxes[ $taxClass ] );
$postcode = $rates[0]['postcode'];
}
return apply_filters( 'woo_feed_filter_product_tax_postcode', $postcode, $this->product, $this->config, $taxes );
}
public function tax_city() {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$city = "";
if ( isset( $taxes[ $taxClass ] ) && ! empty( $taxes[ $taxClass ] ) ) {
$rates = array_values( $taxes[ $taxClass ] );
$city = $rates[0]['city'];
}
return apply_filters( 'woo_feed_filter_product_tax_city', $city, $this->product, $this->config, $taxes );
}
public function tax_rate() {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$rate = "";
if ( isset( $taxes[ $taxClass ] ) && ! empty( $taxes[ $taxClass ] ) ) {
$rates = array_values( $taxes[ $taxClass ] );
$rate = $rates[0]['rate'];
}
return apply_filters( 'woo_feed_filter_product_tax_rate', $rate, $this->product, $this->config, $taxes );
}
public function tax_label() {
$taxes = TaxFactory::get( $this->product, $this->config )->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$label = "";
if ( isset( $taxes[ $taxClass ] ) && ! empty( $taxes[ $taxClass ] ) ) {
$rates = array_values( $taxes[ $taxClass ] );
$label = $rates[0]['label'];
}
return apply_filters( 'woo_feed_filter_product_tax_label', $label, $this->product, $this->config, $taxes );
}
/**
* Custom Template 2 images loop
*
* @return array
*/
public function custom_xml_images() {
$separator = apply_filters( 'woo_feed_filter_category_separator', ' > ', $this->product, $this->config );
$images = $this->images( '', $separator );
return $images;
}
# Custom XML Template
/**
* Get product gallery image urls.
*
* @return string Comma separated image urls.
* @since 8.0.0
*/
public function images( $additional_image = '', $separator = ',' ) {
$img_urls = ProductHelper::get_product_gallery( $this->product );
$separator = apply_filters( 'woo_feed_filter_category_separator', $separator, $this->product, $this->config );
// Return Specific Additional Image URL
if ( '' !== $additional_image ) {
if ( array_key_exists( $additional_image, $img_urls ) ) {
$images = $img_urls[ $additional_image ];
} else {
$images = '';
}
} else {
if ( "idealo" === $this->config->get_feed_template() ) {
$separator = ';';
}
$images = implode( $separator, array_filter( $img_urls ) );
}
return apply_filters( 'woo_feed_filter_product_images', $images, $this->product, $this->config );
}
/**
* Custom Template 2 attributes loop
*
* @return array
*/
public function custom_xml_attributes() {
$getAttributes = $this->product->get_attributes();
$attributes = [];
if ( ! empty( $getAttributes ) ) {
foreach ( $getAttributes as $key => $attribute ) {
$attributes[ $key ]['name'] = wc_attribute_label( $key );
$attributes[ $key ]['value'] = $this->product->get_attribute( wc_attribute_label( $key ) );
}
}
return $attributes;
}
public function custom_xml_shipping() {
}
public function custom_xml_tax() {
}
public function custom_xml_categories() {
$output = []; // Initialising
$taxonomy = 'product_cat'; // Taxonomy for product category
// Get the product categories terms ids in the product:
$terms_ids = wp_get_post_terms( $this->product->get_id(), $taxonomy, array( 'fields' => 'ids' ) );
// Loop though terms ids (product categories)
foreach ( $terms_ids as $term_id ) {
$term_names = []; // Initialising category array
// Loop through product category ancestors
foreach ( get_ancestors( $term_id, $taxonomy ) as $ancestor_id ) {
// Add the ancestor's term names to the category array
$term_names[] = get_term( $ancestor_id, $taxonomy )->name;
}
// Add the product category term name to the category array
$term_names[] = get_term( $term_id, $taxonomy )->name;
// Get category separator
$separator = apply_filters( 'woo_feed_filter_category_separator', ' > ', $this->product, $this->config );
// Add the formatted ancestors with the product category to main array
$output[] = implode( $separator, $term_names );
}
return $output;
}
/**
* Get product is a bundle.
*
* @return string
* @since 8.0.0
*/
public function gtin_upc_ean_isbn() {
$gtin_upc_ean_isbn = get_post_meta( $this->product->get_id(), '_global_unique_id', true );
return apply_filters( 'woo_feed_filter_product_gtin_upc_ean_isbn', $gtin_upc_ean_isbn, $this->product, $this->config );
}
}