oont-contents/plugins/webappick-product-feed-for-woocommerce/includes/classes/class-woo-feed-product-attributes.php
2025-03-31 21:42:48 +02:00

817 lines
29 KiB
PHP

<?php
/**
* The file that defines the merchants attributes
*
* A class definition that includes attributes and functions used across the
* admin area.
*
* @link https://webappick.com/
* @since 1.0.0
*
* @package Woo_Feed
* @subpackage Woo_Feed/includes
* @author Ohidul Islam <wahid@webappick.com>
*/
class Woo_Feed_Product_Attributes {
/**
* Hold Product Attributes.
*
* @var $attributes
*/
public $attributes;
/**
* Get Product Attributes
* @return string
*/
public function getAttributes( $selected = '' ) {
$attributeDropdown = $this->get_cached_dropdown( 'woo_feed_product_attribute_dropdown', $selected );
if ( false === $attributeDropdown ) {
return $this->cache_dropdown( 'woo_feed_product_attribute_dropdown', $this->setAttributes(), $selected, __( 'Select Attributes', 'woo-feed' ) );
}
return $attributeDropdown;
}
/**
* Get Cached Dropdown Entries
*
* @param string $key cache key
* @param string $selected selected option
*
* @return string|false
*/
protected function get_cached_dropdown( $key, $selected = '' ) {
$options = woo_feed_get_cached_data( $key );
if ( $selected !== '' ) {
$selected = esc_attr( $selected );
$options = str_replace( "value=\"{$selected}\"", "value=\"{$selected}\" selected", $options );
}
return empty( $options ) ? false : $options;
}
/**
* Create dropdown options and cache for next use
*
* @param string $cache_key cache key
* @param array $items dropdown items
* @param string $selected selected option
* @param string $default default option
*
* @return string
*/
protected function cache_dropdown( $cache_key, $items, $selected = '', $default = '' ) {
if ( empty( $items ) || ! is_array( $items ) ) {
return '';
}
if ( ! empty( $default ) ) {
$options = '<option value="" class="disabled" selected>' . esc_html( $default ) . '</option>';
} else {
$options = '<option></option>';
}
foreach ( $items as $item ) {
if ( ! empty( $item['options'] ) ) {
$options .= "<optgroup label=\"{$item['optionGroup']}\">";
foreach ( $item['options'] as $option_key => $option ) {
$options .= sprintf( '<option value="%s">%s</option>', $option_key, $option );
}
}
$options .= '</optgroup>';
}
woo_feed_set_cache_data( $cache_key, $options );
if ( $selected !== '' ) {
$selected = esc_attr( $selected );
$options = str_replace( "value=\"{$selected}\"", "value=\"{$selected}\" selected", $options );
}
return $options;
}
protected function setAttributes() {
$attributes = [];
$primaryAttributes = [
'optionGroup' => esc_html__( 'Primary Attributes', 'woo-feed' ),
'options' => [
'id' => esc_html__( 'Product Id', 'woo-feed' ),
'title' => esc_html__( 'Product Title', 'woo-feed' ),
'parent_title' => esc_html__( 'Parent Title', 'woo-feed' ),
'description' => esc_html__( 'Product Description', 'woo-feed' ),
'description_with_html' => esc_html__( 'Product Description (with HTML)', 'woo-feed' ),
'short_description' => esc_html__( 'Product Short Description', 'woo-feed' ),
'primary_category' => esc_html__( 'Parent Category', 'woo-feed' ),
'primary_category_id' => esc_html__( 'Parent Category ID', 'woo-feed' ),
'child_category' => esc_html__( 'Child Category', 'woo-feed' ),
'child_category_id' => esc_html__( 'Child Category ID', 'woo-feed' ),
'product_type' => esc_html__( 'Product Category [Category Path]', 'woo-feed' ),
'product_full_cat' => esc_html__( 'Product Full Category [Category Full Path]', 'woo-feed' ),
'link' => esc_html__( 'Product URL', 'woo-feed' ),
'parent_link' => esc_html__( 'Parent URL', 'woo-feed' ),
'canonical_link' => esc_html__( 'Canonical URL', 'woo-feed' ),
'ex_link' => esc_html__( 'External Product URL', 'woo-feed' ),
'add_to_cart_link' => esc_html__( 'Add to Cart URL', 'woo-feed' ),
'item_group_id' => esc_html__( 'Parent Id [Group Id]', 'woo-feed' ),
'sku' => esc_html__( 'SKU', 'woo-feed' ),
'sku_id' => esc_html__( 'SKU_ID', 'woo-feed' ),
'parent_sku' => esc_html__( 'Parent SKU', 'woo-feed' ),
'availability' => esc_html__( 'Availability', 'woo-feed' ),
'availability_date' => esc_html__( 'Availability Date', 'woo-feed' ),
'quantity' => esc_html__( 'Quantity', 'woo-feed' ),
'reviewer_name' => esc_html__( 'Reviewer Name', 'woo-feed' ),
'weight' => esc_html__( 'Weight', 'woo-feed' ),
'weight_unit' => esc_html__( 'Weight Unit', 'woo-feed' ),
'width' => esc_html__( 'Width', 'woo-feed' ),
'height' => esc_html__( 'Height', 'woo-feed' ),
'length' => esc_html__( 'Length', 'woo-feed' ),
'type' => esc_html__( 'Product Type', 'woo-feed' ),
'visibility' => esc_html__( 'Visibility', 'woo-feed' ),
'rating_total' => esc_html__( 'Total Rating', 'woo-feed' ),
'rating_average' => esc_html__( 'Average Rating', 'woo-feed' ),
'tags' => esc_html__( 'Tags', 'woo-feed' ),
'is_bundle' => esc_html__( 'Is Bundle', 'woo-feed' ),
'author_name' => esc_html__( 'Author Name', 'woo-feed' ),
'author_email' => esc_html__( 'Author Email', 'woo-feed' ),
'date_created' => esc_html__( 'Date Created', 'woo-feed' ),
'date_updated' => esc_html__( 'Date Updated', 'woo-feed' ),
'product_status' => esc_html__( 'Product Status', 'woo-feed' ),
'featured_status' => esc_html__( 'Featured Status', 'woo-feed' ),
]
];
$attributes [] = $primaryAttributes;
$imageAttributes = [
'optionGroup' => esc_html__( 'Images', 'woo-feed' ),
'options' => [
'image' => esc_html__( 'Main Image', 'woo-feed' ),
'feature_image' => esc_html__( 'Featured Image', 'woo-feed' ),
'images' => esc_html__( 'Images [Comma Separated]', 'woo-feed' ),
'image_1' => esc_html__( 'Additional Image 1', 'woo-feed' ),
'image_2' => esc_html__( 'Additional Image 2', 'woo-feed' ),
'image_3' => esc_html__( 'Additional Image 3', 'woo-feed' ),
'image_4' => esc_html__( 'Additional Image 4', 'woo-feed' ),
'image_5' => esc_html__( 'Additional Image 5', 'woo-feed' ),
'image_6' => esc_html__( 'Additional Image 6', 'woo-feed' ),
'image_7' => esc_html__( 'Additional Image 7', 'woo-feed' ),
'image_8' => esc_html__( 'Additional Image 8', 'woo-feed' ),
'image_9' => esc_html__( 'Additional Image 9', 'woo-feed' ),
'image_10' => esc_html__( 'Additional Image 10', 'woo-feed' ),
],
];
$attributes [] = $imageAttributes;
$priceAttributes = [
'optionGroup' => esc_html__( 'Price', 'woo-feed' ),
'options' => [
'currency' => esc_html__( 'Currency', 'woo-feed' ),
'price' => esc_html__( 'Regular Price', 'woo-feed' ),
'current_price' => esc_html__( 'Price', 'woo-feed' ),
'sale_price' => esc_html__( 'Sale Price', 'woo-feed' ),
'price_with_tax' => esc_html__( 'Regular Price With Tax', 'woo-feed' ),
'current_price_with_tax' => esc_html__( 'Price With Tax', 'woo-feed' ),
'sale_price_with_tax' => esc_html__( 'Sale Price With Tax', 'woo-feed' ),
'sale_price_sdate' => esc_html__( 'Sale Start Date', 'woo-feed' ),
'sale_price_edate' => esc_html__( 'Sale End Date', 'woo-feed' ),
'sale_price_effective_date' => esc_html__( 'Sale Price Effective Date', 'woo-feed' ),
],
];
$attributes [] = $priceAttributes;
$shippingAttributes = [
'optionGroup' => esc_html__( 'Shipping', 'woo-feed' ),
'options' => [
'shipping' => esc_html__( 'Shipping (Google Format)', 'woo-feed' ),
'shipping_class' => esc_html__( 'Shipping Class', 'woo-feed' ),
// 'shipping_zone_name' => esc_html__( 'Shipping Zone Name', 'woo-feed' ),
// 'shipping_country' => esc_html__( 'Shipping Country', 'woo-feed' ),
// 'shipping_region' => esc_html__( 'Shipping Regions', 'woo-feed' ),
// 'shipping_postcode' => esc_html__( 'Shipping Postcodes', 'woo-feed' ),
// 'shipping_service' => esc_html__( 'Shipping Method Name', 'woo-feed' ),
// 'shipping_price' => esc_html__( 'Shipping Cost', 'woo-feed' ),
],
];
$attributes [] = $shippingAttributes;
$taxAttributes = [
'optionGroup' => esc_html__( 'Tax', 'woo-feed' ),
'options' => [
'tax' => esc_html__( 'Tax (Google Format)', 'woo-feed' ),
'tax_class' => esc_html__( 'Tax Class', 'woo-feed' ),
// 'tax_status' => esc_html__( 'Tax Status', 'woo-feed' ),
// 'tax_country' => esc_html__( 'Tax Country', 'woo-feed' ),
// 'tax_state' => esc_html__( 'Tax State', 'woo-feed' ),
// 'tax_postcode' => esc_html__( 'Tax Postcodes', 'woo-feed' ),
// 'tax_city' => esc_html__( 'Tax City', 'woo-feed' ),
// 'tax_rate' => esc_html__( 'Tax Rate', 'woo-feed' ),
// 'tax_label' => esc_html__( 'Tax Name', 'woo-feed' ),
],
];
$attributes [] = $taxAttributes;
$subscriptionAttributes = [
'optionGroup' => esc_html__( 'Subscription & Installment', 'woo-feed' ),
'options' => [
'subscription_period' => esc_html__( 'Subscription Period', 'woo-feed' ),
'subscription_period_interval' => esc_html__( 'Subscription Period Length', 'woo-feed' ),
'subscription_amount' => esc_html__( 'Subscription Amount', 'woo-feed' ),
'installment_months' => esc_html__( 'Installment Months', 'woo-feed' ),
'installment_amount' => esc_html__( 'Installment Amount', 'woo-feed' ),
],
];
$customXMLAttributes = [
'optionGroup' => esc_html__( 'Custom Template 2 (XML)', 'woo-feed' ),
'options' => [
'custom_xml_variations' => esc_html__( 'Product Variations', 'woo-feed' ),
'custom_xml_images' => esc_html__( 'Product Gallery Images', 'woo-feed' ),
'custom_xml_categories' => esc_html__( 'Product Categories', 'woo-feed' ),
]
];
/**
* Add subscription attributes if WooCommerce Subscription plugin installed.
* @link https://woocommerce.com/products/woocommerce-subscriptions/
*/
if ( class_exists( 'WC_Subscriptions' ) ) {
$attributes[] = $subscriptionAttributes;
}
$attributes[] = $this->getPluginsCustomFields();
$attributes[] = $this->getUnitPriceAttributes();
$attributes[] = $this->getSeoPluginAttributes();
$attributes[] = $this->getGlobalAttributes();
$attributes[] = $this->getCustomAttributes();
$attributes[] = $this->getAllTaxonomy();
$attributes[] = $this->getAllOptions();
// Category Mapping
$attributes[] = $this->getCategoryMappedAttributes();
// ACF Plugin custom fields getACFAttributes
$attributes[] = $this->getACFAttributes();
// Custom Fields & Post Metas
$attributes[] = $this->getProductMetaKeyAttributes();
if(class_exists('Woo_Feed_Products_v3_Pro')){
$attributes [] = $this->getMultiLanguageAttributes();
$attributes [] = $this->getMultiVendorAttributes();
// Dynamic Attributes
$attributes[] = $this->getDynamicAttributes();
// Attribute Mappings
$attributes[] = $this->getCustomMappedAttributes();
// Custom Template 2 Attributes
$attributes [] = $customXMLAttributes;
}
return apply_filters( 'woo_feed_product_attribute_dropdown', $attributes );
}
/**
* Get CTX Feed plugins Custom Fields.
*
* @return array
*/
protected function getPluginsCustomFields() {
$custom_fields = woo_feed_product_custom_fields();
$custom_identifier_filter = new Woo_Feed_Custom_Identifier_Filter( $custom_fields );
$custom_identifier = iterator_to_array( $custom_identifier_filter );
$activeAttributes = [ 'optionGroup' => esc_html__( 'Custom Fields by CTX Feed', 'woo-feed' ), ];
if ( ! empty( $custom_identifier ) ) {
foreach ( $custom_identifier as $key => $value ) {
$activeAttributes['options'][ 'woo_feed_identifier_' . sanitize_text_field( wp_unslash( $key ) ) ] = sanitize_text_field( $value[0] );
}
}
return ! empty( $activeAttributes['options'] ) ? $activeAttributes : [];
}
/**
* Get Unit Price Attributes.
*
* @return array
*/
protected function getUnitPriceAttributes() {
$unitPriceAttributes = [
'optionGroup' => esc_html__( 'Unit Price (CTX Feed)', 'woo-feed' ),
'options' => [
'unit_price_unit' => esc_html__( 'Unit', 'woo-feed' ),
],
];
/**
* Get Germanized for WooCommerce plugins unit attributes.
* @link https://wordpress.org/plugins/woocommerce-germanized/
*/
if ( class_exists( 'WooCommerce_Germanized' ) ) {
$wcUnitPriceAttributes = [
'optionGroup' => esc_html__( 'Unit Price (WooCommerce Germanized)', 'woo-feed' ),
'options' => [
'wc_germanized_unit_price_measure' => esc_html__( 'Unit Price Measure', 'woo-feed' ),
'wc_germanized_unit_price_base_measure' => esc_html__( 'Unit Price Base Measure', 'woo-feed' ),
'wc_germanized_gtin' => esc_html__( 'GTIN', 'woo-feed' ),
'wc_germanized_mpn' => esc_html__( 'MPN', 'woo-feed' ),
],
];
$unitPriceAttributes += $wcUnitPriceAttributes;
}
return $unitPriceAttributes;
}
/**
* Get installed SEO plugin attributes.
*
* @return array
*/
protected function getSeoPluginAttributes() {
$seoAttributes = [];
/**
* Get Yoast SEO Plugin Attributes.
* @link https://wordpress.org/plugins/wordpress-seo/
*/
if ( class_exists( 'WPSEO_Frontend' ) || class_exists( 'WPSEO_Premium' ) ) {
$seoAttributes = [
'optionGroup' => esc_html__( 'Yoast SEO', 'woo-feed' ),
'options' => [
'yoast_wpseo_title' => esc_html__( 'Title [Yoast SEO]', 'woo-feed' ),
'yoast_wpseo_metadesc' => esc_html__( 'Description [Yoast SEO]', 'woo-feed' ),
'yoast_canonical_url' => esc_html__( 'Canonical URL [Yoast SEO]', 'woo-feed' ),
],
];
/**
* Get Yoast WooCommerce SEO plugins Identifier Attributes.
* @link https://yoast.com/wordpress/plugins/yoast-woocommerce-seo/
*/
if ( class_exists( 'Yoast_WooCommerce_SEO' ) ) {
$seoAttributes['options'] += [
'yoast_gtin8' => esc_html__( 'GTIN8 [Yoast SEO]', 'woo-feed' ),
'yoast_gtin12' => esc_html__( 'GTIN12 / UPC [Yoast SEO]', 'woo-feed' ),
'yoast_gtin13' => esc_html__( 'GTIN13 / EAN [Yoast SEO]', 'woo-feed' ),
'yoast_gtin14' => esc_html__( 'GTIN14 / ITF-14 [Yoast SEO]', 'woo-feed' ),
'yoast_isbn' => esc_html__( 'ISBN [Yoast SEO]', 'woo-feed' ),
'yoast_mpn' => esc_html__( 'MPN [Yoast SEO]', 'woo-feed' ),
];
}
}
if ( class_exists( 'RankMath' ) || class_exists( 'RankMathPro' ) ) {
$seoAttributes = [
'optionGroup' => esc_html__( 'RANK MATH SEO', 'woo-feed' ),
'options' => [
'rank_math_title' => esc_html__( 'Title [RankMath SEO]', 'woo-feed' ),
'rank_math_description' => esc_html__( 'Description [RankMath SEO]', 'woo-feed' ),
'rank_math_canonical_url' => esc_html__( 'Canonical URL [RankMath SEO]', 'woo-feed' )
],
];
if ( class_exists( 'RankMathPro' ) ) {
$seoAttributes['options'] += [ 'rank_math_gtin' => esc_html__( 'GTIN [RankMath Pro SEO]', 'woo-feed' ) ];
}
}
if ( class_exists( 'AIOSEO\Plugin\AIOSEO' ) ) {
$seoAttributes = [
'optionGroup' => esc_html__( 'ALL IN ONE SEO', 'woo-feed' ),
'options' => [
'_aioseop_title' => esc_html__( 'Title [All in One SEO]', 'woo-feed' ),
'_aioseop_description' => esc_html__( 'Description [All in One SEO]', 'woo-feed' ),
'_aioseop_canonical_url' => esc_html__( 'Canonical URL [All in One SEO]', 'woo-feed' ),
],
];
}
return $seoAttributes;
}
/**
* Get Product Global Attributes.
* @retun array
*/
protected function getGlobalAttributes() {
$taxonomies = woo_feed_get_cached_data( 'getAttributeTaxonomies' );
if ( false === $taxonomies ) {
// Load the main attributes
$globalAttributes = wc_get_attribute_taxonomy_labels();
if ( count( $globalAttributes ) ) {
foreach ( $globalAttributes as $key => $value ) {
$taxonomies[ Woo_Feed_Products_v3::PRODUCT_ATTRIBUTE_PREFIX . 'pa_' . $key ] = $value;
}
}
woo_feed_set_cache_data( 'getAttributeTaxonomies', $taxonomies );
}
return [
'optionGroup' => esc_html__( 'Product Attributes', 'woo-feed' ),
'options' => $taxonomies,
];
}
/**
* Get Product Custom Attributes.
* @retun array
*/
protected function getCustomAttributes() {
$attributes = woo_feed_get_cached_data( 'woo_feed_dropdown_product_custom_attributes' );
if ( false === $attributes ) {
// Get Variation Attributes
$attributes = $this->queryVariationsAttributes();
// Get Product Custom Attributes
$attributes += $this->queryCustomAttributes();
woo_feed_set_cache_data( 'woo_feed_dropdown_product_custom_attributes', $attributes );
}
return [
'optionGroup' => esc_html__( 'Product Custom Attributes', 'woo-feed' ),
'options' => $attributes,
];
}
/**
* Get Variation Attributes
* Local attributes will be found on variation product meta only with attribute_ suffix
*/
protected function queryVariationsAttributes() {
// Get Variation Attributes
global $wpdb;
$attributes = array();
$sql = "SELECT DISTINCT( meta_key ) FROM $wpdb->postmeta
WHERE post_id IN (
SELECT ID FROM $wpdb->posts WHERE post_type = 'product_variation' -- local attributes will be found on variation product meta only with attribute_ suffix
) AND (
meta_key LIKE 'attribute_%' -- include only product attributes from meta list
AND meta_key NOT LIKE 'attribute_pa_%'
)";
// sanitization ok
$localAttributes = $wpdb->get_col( $sql ); // phpcs:ignore
foreach ( $localAttributes as $localAttribute ) {
$localAttribute = str_replace( 'attribute_', '', $localAttribute );
$attributes[ Woo_Feed_Products_v3::PRODUCT_ATTRIBUTE_PREFIX . $localAttribute ] = ucwords( str_replace( '-', ' ', $localAttribute ) );
}
return $attributes;
}
/**
* Get Product Custom Attributes
*/
protected function queryCustomAttributes() {
global $wpdb;
$attributes = array();
$sql = 'SELECT meta.meta_id, meta.meta_key as name, meta.meta_value as type FROM ' . $wpdb->postmeta . ' AS meta, ' . $wpdb->posts . " AS posts WHERE meta.post_id = posts.id AND posts.post_type LIKE '%product%' AND meta.meta_key='_product_attributes';";
$customAttributes = $wpdb->get_results( $sql ); // phpcs:ignore
if ( ! empty( $customAttributes ) ) {
foreach ( $customAttributes as $value ) {
$product_attr = maybe_unserialize( $value->type );
if ( is_array( $product_attr ) ) {
foreach ( $product_attr as $key => $arr_value ) {
if ( strpos( $key, 'pa_' ) === false ) {
$attributes[ Woo_Feed_Products_v3::PRODUCT_ATTRIBUTE_PREFIX . $key ] = ucwords( str_replace( '-', ' ', $arr_value['name'] ) );
}
}
}
}
}
return $attributes;
}
/**
* Get All Taxonomy
*
* @return array
*/
protected function getAllTaxonomy() {
$info = woo_feed_get_cached_data( 'woo_feed_dropdown_product_taxonomy' );
if ( false === $info ) {
$info = array();
global $wp_taxonomies;
$default_excludes = array(
'product_type',
'product_visibility',
'product_cat',
'product_tag',
'product_shipping_class',
'translation_priority',
);
/**
* Exclude Taxonomy from dropdown
*
* @param array $user_excludes
* @param array $default_excludes
*/
$user_excludes = apply_filters( 'woo_feed_dropdown_exclude_taxonomy', null, $default_excludes );
$default_excludes = ! empty( $user_excludes ) ? array_merge( $default_excludes, $user_excludes ) : $default_excludes;
foreach ( get_object_taxonomies( 'product' ) as $value ) {
$value = ! empty( $value ) ? trim( $value ) : $value;
if ( in_array( $value, $default_excludes, true ) || strpos( $value, 'pa_' ) !== false ) {
continue;
}
$label = isset( $wp_taxonomies[ $value ] ) ? $wp_taxonomies[ $value ]->label . " [$value]" : $value;
$info[ Woo_Feed_Products_v3::PRODUCT_TAXONOMY_PREFIX . $value ] = $label;
}
woo_feed_set_cache_data( 'woo_feed_dropdown_product_taxonomy', $info );
}
return [
'optionGroup' => esc_html__( 'Product Taxonomies', 'woo-feed' ),
'options' => $info,
];
}
/**
* Get All Options
*
* @return array
*/
protected function getAllOptions() {
$_wp_options = wp_list_pluck( get_option( 'wpfp_option', array() ), 'option_name' );
$_wp_options_val = str_replace( 'wf_option_', '', $_wp_options );
$_wp_options = array_combine( $_wp_options, $_wp_options_val );
return [
'optionGroup' => esc_html__( 'Options', 'woo-feed' ),
'options' => $_wp_options,
];
}
/**
* Get Category Mappings
* @return array
*/
protected function getCategoryMappedAttributes() {
global $wpdb;
// Load Custom Category Mapped Attributes
$info = array();
// query cached and escaped
$data = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->options WHERE option_name LIKE %s;", Woo_Feed_Products_v3::PRODUCT_CATEGORY_MAPPING_PREFIX . '%' ) ); // phpcs:ignore
if ( count( $data ) ) {
foreach ( $data as $value ) {
$opts = maybe_unserialize( $value->option_value );
$opts = maybe_unserialize( $opts );
$info[ $value->option_name ] = is_array( $opts ) && isset( $opts['mappingname'] ) ? $opts['mappingname'] : str_replace( 'wf_cmapping_',
'',
$value->option_name );
}
}
return [
'optionGroup' => esc_html__( 'Category Mapping', 'woo-feed' ),
'options' => $info,
];
}
/**
* Get Advance Custom Field (ACF) field list
*
*
* @return Array
*/
protected function getACFAttributes() {
$options = [];
if ( class_exists( 'ACF' ) ) {
$acf_fields = woo_feed_get_cached_data( 'acf_field_list' );
if ( false === $acf_fields && function_exists( 'acf_get_field_groups' ) ) {
$field_groups = acf_get_field_groups();
foreach ( $field_groups as $group ) {
// DO NOT USE here: $fields = acf_get_fields($group['key']);
// because it causes repeater field bugs and returns "trashed" fields
$fields = get_posts( array(
'posts_per_page' => - 1,
'post_type' => 'acf-field',
'orderby' => 'menu_order',
'order' => 'ASC',
'suppress_filters' => true, // DO NOT allow WPML to modify the query
'post_parent' => $group['ID'],
'post_status' => 'any',
'update_post_meta_cache' => false,
) );
foreach ( $fields as $field ) {
$options[ 'acf_fields_' . $field->post_name ] = $field->post_title;
}
}
woo_feed_set_cache_data( 'acf_field_list', $options );
}
}
return [
'optionGroup' => esc_html__( 'Advance Custom Fields (ACF)', 'woo-feed' ),
'options' => $options,
];
}
/**
* Get All Custom Attributes
*
* @return array
*/
protected function getProductMetaKeyAttributes() {
$info = woo_feed_get_cached_data( 'woo_feed_dropdown_meta_keys' );
if ( false === $info ) {
global $wpdb;
$info = [];
// Load the main attributes.
$default_exclude_keys = [
// WP internals.
'_edit_lock',
'_wp_old_slug',
'_edit_last',
'_wp_old_date',
// WC internals.
'_downloadable_files',
'_sku',
'_weight',
'_width',
'_height',
'_length',
'_file_path',
'_file_paths',
'_default_attributes',
'_product_attributes',
'_children',
'_variation_description',
// ignore variation description, engine will get child product description from WC CRUD WC_Product::get_description().
// Plugin Data.
'_wpcom_is_markdown',
// JetPack Meta.
'_yith_wcpb_bundle_data',
// Yith product bundle data.
'_et_builder_version',
// Divi builder data.
'_vc_post_settings',
// Visual Composer (WP Bakery) data.
'_enable_sidebar',
'frs_woo_product_tabs',
// WooCommerce Custom Product Tabs http://www.skyverge.com/.
];
/**
* Exclude meta keys from dropdown
*
* @param array $exclude meta keys to exclude.
* @param array $default_exclude_keys Exclude keys by default.
*/
$user_exclude = apply_filters( 'woo_feed_dropdown_exclude_meta_keys', null, $default_exclude_keys );
if ( is_array( $user_exclude ) && ! empty( $user_exclude ) ) {
$user_exclude = esc_sql( $user_exclude );
$default_exclude_keys = array_merge( $default_exclude_keys, $user_exclude );
}
$default_exclude_keys = array_map( 'esc_sql', $default_exclude_keys );
$exclude_keys = '\'' . implode( '\', \'', $default_exclude_keys ) . '\'';
$default_exclude_key_patterns = [
'%_et_pb_%', // Divi builder data
'attribute_%', // Exclude product attributes from meta list
'_yoast_wpseo_%', // Yoast SEO Data
'_acf-%', // ACF duplicate fields
'_aioseop_%', // All In One SEO Pack Data
'_oembed%', // exclude oEmbed cache meta
'_wpml_%', // wpml metas
'_oh_add_script_%', // SOGO Add Script to Individual Pages Header Footer.
];
/**
* Exclude meta key patterns from dropdown
*
* @param array $exclude meta keys to exclude.
* @param array $default_exclude_key_patterns Exclude keys by default.
*/
$user_exclude_patterns = apply_filters( 'woo_feed_dropdown_exclude_meta_keys_pattern', null, $default_exclude_key_patterns );
if ( is_array( $user_exclude_patterns ) && ! empty( $user_exclude_patterns ) ) {
$default_exclude_key_patterns = array_merge( $default_exclude_key_patterns, $user_exclude_patterns );
}
$exclude_key_patterns = '';
foreach ( $default_exclude_key_patterns as $pattern ) {
$exclude_key_patterns .= $wpdb->prepare( ' AND meta_key NOT LIKE %s', $pattern );
}
$sql = "SELECT DISTINCT( meta_key ) FROM $wpdb->postmeta WHERE 1=1 AND post_id IN ( SELECT ID FROM $wpdb->posts WHERE post_type = 'product' OR post_type = 'product_variation' ) AND ( meta_key NOT IN ( $exclude_keys ) $exclude_key_patterns )";
// sql escaped, cached
$data = $wpdb->get_results( $sql ); // phpcs:ignore
if ( count( $data ) ) {
foreach ( $data as $value ) {
//TODO Remove ACF Fields
$info[ Woo_Feed_Products_v3::POST_META_PREFIX . $value->meta_key ] = $value->meta_key;
}
}
woo_feed_set_cache_data( 'woo_feed_dropdown_meta_keys', $info );
}
return [
'optionGroup' => esc_html__( 'Custom Fields & Post Metas', 'woo-feed' ),
'options' => $info,
];
}
/**
* Get Dynamic Attribute List
*
* @return array
*/
protected function getDynamicAttributes() {
global $wpdb;
// Load Custom Category Mapped Attributes
$info = array();
// query escaped and cached
$data = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->options WHERE option_name LIKE %s;", Woo_Feed_Products_v3_Pro::PRODUCT_DYNAMIC_ATTRIBUTE_PREFIX . '%' ) ); // phpcs:ignore
if ( count( $data ) ) {
foreach ( $data as $key => $value ) {
$opts = maybe_unserialize( $value->option_value );
$opts = maybe_unserialize( $opts );
$info[ $value->option_name ] = is_array( $opts ) && isset( $opts['wfDAttributeName'] ) ? $opts['wfDAttributeName'] : str_replace(
'wf_dattribute_',
'',
$value->option_name
);
}
}
return [
'optionGroup' => esc_html__( 'Dynamic Attributes', 'woo-feed' ),
'options' => $info,
];
}
/**
* Get Attribute Mappings
*
* @return array
*/
protected function getCustomMappedAttributes() {
global $wpdb;
// Load Custom Category Mapped Attributes
$info = [];
// query cached and escaped
$data = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->options WHERE option_name LIKE %s;", Woo_Feed_Products_v3_Pro::PRODUCT_ATTRIBUTE_MAPPING_PREFIX . '%' ) ); // phpcs:ignore
if ( count( $data ) ) {
foreach ( $data as $value ) {
$opts = maybe_unserialize( $value->option_value );
$info[ $value->option_name ] = is_array( $opts ) && isset( $opts['name'] ) ? $opts['name'] : str_replace( Woo_Feed_Products_v3_Pro::PRODUCT_ATTRIBUTE_MAPPING_PREFIX, '', $value->option_name );
}
}
return [
'optionGroup' => esc_html__( 'Attribute Mappings', 'woo-feed' ),
'options' => $info,
];
}
/**
* @return array
*/
protected function getMultiLanguageAttributes() {
$attributes = [];
if ( class_exists( 'SitePress' ) ) {
$attributes = [
'optionGroup' => esc_html__( 'WPML Attributes', 'woo-feed' ),
'options' => [
'parent_id' => esc_html__( 'Parent Product ID', 'woo-feed' )
]
];
}
return $attributes;
}
/**
* @return array
*/
protected function getMultiVendorAttributes() {
$attributes = [];
if ( function_exists('woo_feed_is_multi_vendor') && woo_feed_is_multi_vendor() ) {
$attributes = [
'optionGroup' => esc_html__( 'Multi Vendor Attributes', 'woo-feed' ),
'options' => [
'vendor_store_name' => esc_html__( 'Vendor Store Name', 'woo-feed' )
]
];
}
return $attributes;
}
}