Files
sklep.elitex.pl/wp-content/plugins/woo-product-feed-pro/classes/class-attributes.php
2023-11-23 22:14:40 +01:00

669 lines
28 KiB
PHP

<?php
/**
* This class is called to: retrieve product attributes
* for populating the rules dropdowns and draggable boxes
*/
class WooSEA_Attributes {
public $attributes;
public $dropdown;
public $standard_attributes;
public function get_channel_countries(){
$channel_countries = array();
$channel_configs = get_option ('channel_statics');
foreach ($channel_configs as $key=>$val){
if (($key != "All countries") && ($key != "Custom Feed")){
array_push ($channel_countries, $key);
}
}
return $channel_countries;
}
public function get_channels($country){
$channels = array();
$channel_configs = get_option ('channel_statics');
// Lets get the generic channels
foreach ($channel_configs as $key=>$val){
if($key == "Custom Feed" || $key == "All countries"){
$channels = array_merge ($channels, $val);
}
}
// Than get the relevant country channels
foreach ($channel_configs as $key=>$val){
if(preg_match("/-$country/i", $key)){
$channels = array_merge($channels, $val);
} elseif ($country == "$key"){
$channels = array_merge($channels, $val);
}
}
return $channels;
}
private function get_dynamic_attributes(){
global $wpdb;
$list = array();
$no_taxonomies = array("portfolio_category","portfolio_skills","portfolio_tags","nav_menu","post_format","slide-page","element_category","template_category","portfolio_category","portfolio_skills","portfolio_tags","faq_category","slide-page","category","post_tag","nav_menu","link_category","post_format","product_type","product_visibility","product_cat","product_shipping_class","product_tag");
$taxonomies = get_taxonomies();
$diff_taxonomies = array_diff($taxonomies, $no_taxonomies);
# get custom taxonomy values for a product
foreach($diff_taxonomies as $tax_diff){
$taxonomy_details = get_taxonomy( $tax_diff );
foreach($taxonomy_details as $kk => $vv){
if($kk == "name"){
$pa_short = $vv;
}
if($kk == "labels"){
foreach($vv as $kw => $kv){
if($kw == "singular_name"){
$attr_name = $pa_short;
$attr_name_clean = ucfirst($kv);
}
}
}
}
$list["$attr_name"] = $attr_name_clean;
}
return $list;
}
private function get_custom_attributes() {
global $wpdb;
$list = array();
if ( ! function_exists( 'woosea_get_meta_keys_for_post_type' ) ) :
function woosea_get_meta_keys_for_post_type( $post_type, $sample_size = 'modified' ) {
$meta_keys = array();
$add_woosea_basic = get_option ('add_woosea_basic');
if($add_woosea_basic == "yes"){
$posts = get_posts( array( 'post_type' => $post_type, 'limit' => $sample_size ) );
} else {
$posts = get_posts( array( 'post_type' => $post_type, 'numberposts' => -1 ) );
}
foreach ( $posts as $post ) {
$post_meta_keys = get_post_custom_keys( $post->ID );
if(empty($post_meta_keys)){
$post_meta_keys = array();
}
$meta_keys = array_merge( $meta_keys, $post_meta_keys );
}
// Use array_unique to remove duplicate meta_keys that we received from all posts
// Use array_values to reset the index of the array
return array_values( array_unique( $meta_keys ) );
}
endif;
$post_type = "product";
$data = woosea_get_meta_keys_for_post_type($post_type);
if (count($data)) {
foreach ($data as $key => $value) {
if (!preg_match("/_product_attributes/i",$value)){
$value_display = str_replace("_", " ",$value);
$list["custom_attributes_" . $value] = ucfirst($value_display);
} else {
$data = @$wpdb->get_results(
// $wpdb->prepare("
// SELECT
// meta.meta_id,
// meta.meta_value AS type
// FROM {$wpdb->prefix}postmeta AS meta,
// {$wpdb->prefix}posts AS posts
// WHERE meta.post_id = posts.id
// AND posts.post_type LIKE '%product%'
// AND meta.meta_key='_product_attributes' AND meta.meta_value NOT LIKE \"%{}\";")
$wpdb->prepare("
SELECT
meta.meta_id,
meta.meta_value AS type
FROM {$wpdb->prefix}postmeta AS meta,
{$wpdb->prefix}posts AS posts
WHERE meta.post_id = posts.id
AND posts.post_type LIKE '%s'
AND meta.meta_key='_product_attributes' AND meta.meta_value NOT LIKE \"%{}\"", array( '%product%' ))
);
if (count($data)) {
foreach ($data as $key => $value) {
$product_attr = unserialize($value->type);
if(!empty($product_attr)){
foreach ($product_attr as $key => $arr_value) {
$value_display = str_replace("_", " ",$arr_value['name']);
$list["custom_attributes_" . $key] = ucfirst($value_display);
}
}
}
}
}
}
return $list;
}
return false;
}
public function get_mapping_attributes_dropdown() {
$sitename = get_option('blogname');
$mapping_attributes = array(
"categories" => "Category",
"title" => "Product name",
);
/**
* Create dropdown with main attributes
*/
$dropdown = "<option></option>";
$dropdown .= "<optgroup label='Main attributes'><strong>Main attributes</strong>";
foreach ($mapping_attributes as $key=>$value) {
if ($key == "categories"){
$dropdown .= "<option value='$key' selected>" . $value . "</option>";
} else {
$dropdown .= "<option value='$key'>" . $value . "</option>";
}
}
$dropdown .="</optgroup>";
$other_attributes = array(
"all_products" => "Map all products",
);
$dropdown .= "<optgroup label='Other options'><strong>Other options</strong>";
foreach ($other_attributes as $key=>$value) {
$dropdown .= "<option value='$key'>" . $value . "</option>";
}
return $dropdown;
}
public function get_special_attributes_dropdown(){
/**
* Create dropdown with product attributes
*/
$dropdown = "<option></option>";
$custom_attributes = $this->get_custom_attributes();
if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
$custom_attributes['custom_attributes__aioseop_title'] = "All in one seo pack title";
$custom_attributes['custom_attributes__aioseop_description'] = "All in one seo pack description";
}
if($custom_attributes){
$dropdown .= "<optgroup label='Custom attributes'><strong>Custom attributes</strong>";
foreach ($custom_attributes as $key => $value) {
if (strpos($value, 0, 1) !== "_") {
// Exclude total sales
if($key != "custom_attributes_total_sales"){
$value = str_replace("attribute","",$value);
$dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
}
}
}
$dropdown .="</optgroup>";
}
return $dropdown;
}
public function get_special_attributes_clean(){
$custom_attributes = $this->get_custom_attributes();
return $custom_attributes;
}
public function get_product_attributes_dropdown() {
$sitename = get_option('blogname');
$attributes = array(
"id" => "Product Id",
"sku" => "SKU",
"sku_id" => "SKU_ID (Facebook)",
"parent_sku" => "SKU parent variable product",
"sku_item_group_id" => "SKU_ITEM_GROUP_ID (Facebook)",
"wc_post_id_product_id" => "Wc_post_id_product_id (Facebook)",
"title" => "Product name",
"title_slug" => "Product name slug",
"title_hyphen" => "Product name hyphen",
"mother_title" => "Product name parent product",
"mother_title_hyphen" => "Product name parent product hyphen",
"title_lc" => "Product name lowercase",
"title_lcw" => "Product name uppercase first characters",
"description" => "Product description",
"short_description" => "Product short description",
"raw_description" => "Unfiltered product description",
"raw_short_description" => "Unfiltered product short description",
"mother_description" => "Product description parent product",
"mother_short_description" => "Product short description parent product",
"price" => "Price",
"regular_price" => "Regular price",
"sale_price" => "Sale price",
"net_price" => "Price excl. VAT",
"net_regular_price" => "Regular price excl. VAT",
"net_sale_price" => "Sale price excl. VAT",
"price_forced" => "Price incl. VAT front end",
"regular_price_forced" => "Regular price incl. VAT front end",
"sale_price_forced" => "Sale price incl. VAT front end",
"sale_price_start_date" => "Sale start date",
"sale_price_end_date" => "Sale end date",
"sale_price_effective_date" => "Sale price effective date",
"rounded_price" => "Price rounded",
"rounded_regular_price" => "Regular price rounded",
"rounded_sale_price" => "Sale price rounded",
"system_price" => "System price",
"system_net_price" => "System price excl. VAT",
"system_net_sale_price" => "System sale price excl. VAT",
"system_net_regular_price" => "System regular price excl. VAT",
"system_regular_price" => "System regular price",
"system_sale_price" => "System sale price",
"vivino_price" => "Pinterest / TikTok / Vivino price",
"vivino_sale_price" => "Pinterest / TikTok / Vivino sale price",
"vivino_regular_price" => "Pinterest / TikTok / Vivino regular price",
"vivino_net_price" => "Pinterest / TikTok / Vivino price excl. VAT",
"vivino_net_regular_price" => "Pinterest / TikTok / Vivino regular price excl. VAT",
"vivino_net_sale_price" => "Pinterest / TikTok / Vivino sale price excl. VAT",
"non_geo_wcml_price" => "Non GEO WCML price",
"mm_min_price" => "Mix & Match minimum price",
"mm_min_regular_price" => "Mix & Match minimum regular price",
"mm_max_price" => "Mix & Match maximum price",
"mm_max_regular_price" => "Mix & Match maximum regular price",
"separator_price" => "Separator price",
"separator_regular_price" => "Separator regular price",
"separator_sale_price" => "Separator sale price",
"discount_percentage" => "Discount percentage",
"link" => "Link",
"link_no_tracking" => "Link without parameters",
"variable_link" => "Product variable link",
"add_to_cart_link" => "Add to cart link",
"product_creation_date" => "Product creation date",
"days_back_created" => "Product days back created",
"currency" => "Currency",
"categories" => "Category",
"category_link" => "Category link",
"category_path" => "Category path",
"category_path_short" => "Category path short",
"category_path_skroutz" => "Category path Skroutz",
"one_category" => "Yoast / Rankmath primary category",
"nr_variations" => "Number of variations",
"nr_variations_stock" => "Number of variations on stock",
"yoast_gtin8" => "Yoast WooCommerce GTIN8",
"yoast_gtin12" => "Yoast WooCommerce GTIN12",
"yoast_gtin13" => "Yoast WooCommerce GTIN13",
"yoast_gtin14" => "Yoast WooCommerce GTIN14",
"yoast_isbn" => "Yoast WooCommerce ISBN",
"yoast_mpn" => "Yoast WooCommerce MPN",
"condition" => "Condition",
"purchase_note" => "Purchase note",
"availability" => "Availability",
"availability_date_plus1week" => "Availability date + 1 week",
"availability_date_plus2week" => "Availability date + 2 weeks",
"availability_date_plus3week" => "Availability date + 3 weeks",
"availability_date_plus4week" => "Availability date + 4 weeks",
"availability_date_plus5week" => "Availability date + 5 weeks",
"region_id" => "Region Id",
"stock_status" => "Stock Status WooCommerce",
"quantity" => "Quantity [Stock]",
"virtual" => "Virtual",
"downloadable" => "Downloadable",
"product_type" => "Product Type",
"content_type" => "Content Type",
"exclude_from_catalog" => "Excluded from catalog",
"exclude_from_search" => "Excluded from search",
"exclude_from_all" => "Excluded from all (hidden)",
"total_product_orders" => "Total product orders",
"tax_status" => "Tax status",
"tax_class" => "Tax class",
"featured" => "Featured",
"item_group_id" => "Item group ID",
"weight" => "Weight",
"width" => "Width",
"height" => "Height",
"length" => "Length",
"shipping" => "Shipping",
"shipping_price" => "Shipping cost",
"lowest_shipping_costs" => "Lowest shipping costs",
"shipping_label" => "Shipping class slug",
"shipping_label_name" => "Shipping class name",
"visibility" => "Visibility",
"rating_total" => "Total rating",
"rating_average" => "Average rating",
);
$images = array(
"image" => "Main image",
"image_all" => "Main image simple and variations",
"feature_image" => "Featured image",
"image_1" => "Additional image 1",
"image_2" => "Additional image 2",
"image_3" => "Additional image 3",
"image_4" => "Additional image 4",
"image_5" => "Additional image 5",
"image_6" => "Additional image 6",
"image_7" => "Additional image 7",
"image_8" => "Additional image 8",
"image_9" => "Additional image 9",
"image_10" => "Additional image 10",
"all_images" => "All images (comma separated)",
"all_gallery_images" => "All gallery images (comma separated)",
"all_images_kogan" => "All images Kogan (pipe separated)",
);
/**
* Create dropdown with main attributes
*/
$dropdown = "<option></option>";
$dropdown .= "<optgroup label='Main attributes'><strong>Main attributes</strong>";
foreach ($attributes as $key=>$value) {
$dropdown .= "<option value='$key'>" . $value . "</option>";
}
$dropdown .="</optgroup>";
/**
* Create dropdown with image attributes
*/
$dropdown .= "<optgroup label='Image attributes'><strong>Image attributes</strong>";
foreach ($images as $key=>$value) {
$dropdown .= "<option value='$key'>" . $value . "</option>";
}
$dropdown .="</optgroup>";
/**
* Create dropdown with dynamic attributes
*/
$dynamic_attributes = $this->get_dynamic_attributes();
if($dynamic_attributes){
$dropdown .= "<optgroup label='Dynamic attributes'><strong>Dynamic attributes</strong>";
foreach ($dynamic_attributes as $key => $value) {
// if (strpos($value, 0, 1) !== "_") {
$dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
// }
}
$dropdown .="</optgroup>";
}
$dropdown .= "<optgroup label='Google category taxonomy'><strong>Google category taxonomy</strong>";
$dropdown .= "<option value='google_category'>Google category</option>";
$dropdown .="</optgroup>";
/**
* Create dropdown with custom attributes
*/
$custom_attributes = $this->get_custom_attributes();
if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
$custom_attributes['custom_attributes__aioseop_title'] = "All in one seo pack title";
$custom_attributes['custom_attributes__aioseop_description'] = "All in one seo pack description";
}
if($custom_attributes){
$dropdown .= "<optgroup label='Custom field attributes'><strong>Custom field attributes</strong>";
foreach ($custom_attributes as $key => $value) {
if (!preg_match("/pyre|sbg|fusion/i",$value)){
$value = ltrim($value);
if (!empty($value)){
$dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
}
}
}
$dropdown .="</optgroup>";
}
/**
* Add the product tag field
*/
$dropdown .= "<optgroup label='Other fields'><strong>Other fields</strong>";
$dropdown .= "<option value='product_tag'>Product tags</option>";
$dropdown .= "<option value='product_tag_space'>Product tags space</option>";
$dropdown .= "<option value='menu_order'>Menu order</option>";
$dropdown .= "<option value='reviews'>Reviews</option>";
$dropdown .= "<option value='author'>Author</option>";
$dropdown .= "</optgroup>";
// Did the user checked extra attributes
if(get_option( 'woosea_extra_attributes' )){
$extra_attributes = get_option( 'woosea_extra_attributes' );
if($extra_attributes){
array_walk($extra_attributes, function(&$value, $key) { $value .= ' (Added Custom attribute)';});
$dropdown .= "<optgroup label='Added Custom Attributes'><strong>Added Custom Attributes</strong>";
foreach ($extra_attributes as $key => $value) {
// if (strpos($value, 0, 1) !== "_") {
$dropdown .= "<option value='$key'>" . ucfirst($value) . "</option>";
// }
}
$dropdown .="</optgroup>";
}
}
return $dropdown;
}
public function get_product_attributes() {
$sitename = get_option('blogname');
$attributes = array(
"id" => "Product Id",
"sku" => "SKU",
"sku_id" => "SKU_ID (Facebook)",
"parent_sku" => "SKU parent variable product",
"sku_item_group_id" => "SKU_ITEM_GROUP_ID (Facebook)",
"wc_post_id_product_id" => "Wc_post_id_product_id (Facebook)",
"title" => "Product name",
"title_slug" => "Product name slug",
"title_hyphen" => "Product name hyphen",
"mother_title" => "Product name parent product",
"mother_title_hyphen" => "Product name parent product hyphen",
"title_lc" => "Product name lowercase",
"title_lcw" => "Product name uppercase first characters",
"description" => "Product description",
"short_description" => "Product short description",
"raw_description" => "Unfiltered product description",
"raw_short_description" => "Unfiltered product short description",
"mother_description" => "Product description parent product",
"mother_short_description" => "Product short description parent product",
"link" => "Link",
"link_no_tracking" => "Link without parameters",
"variable_link" => "Product variable link",
"add_to_cart_link" => "Add to cart link",
"image" => "Main image",
"image_all" => "Main image simple and variations",
"feature_image" => "Feature image",
"product_type" => "Product Type",
"content_type" => "Content Type",
"exclude_from_catalog" => "Excluded from catalog",
"exclude_from_search" => "Excluded from search",
"exclude_from_all" => "Excluded from all (hidden)",
"total_product_orders" => "Total product orders",
"featured" => "Featured",
"tax_status" => "Tax status",
"tax_class" => "Tax class",
"currency" => "Currency",
"categories" => "Category",
"raw_categories" => "Category (not used for mapping)",
"google_category" => "Google category (for rules and filters only)",
"category_link" => "Category link",
"category_path" => "Category path",
"category_path_short" => "Category path short",
"category_path_skroutz" => "Category path Skroutz",
"one_category" => "Yoast / Rankmath primary category",
"nr_variations" => "Number of variations",
"nr_variations_stock" => "Number of variations on stock",
"yoast_gtin8" => "Yoast WooCommerce GTIN8",
"yoast_gtin12" => "Yoast WooCommerce GTIN12",
"yoast_gtin13" => "Yoast WooCommerce GTIN13",
"yoast_gtin14" => "Yoast WooCommerce GTIN14",
"yoast_isbn" => "Yoast WooCommerce ISBN",
"yoast_mpn" => "Yoast WooCommerce MPN",
"condition" => "Condition",
"purchase_note" => "Purchase note",
"availability" => "Availability",
"availability_date_plus1week" => "Availability date + 1 week",
"availability_date_plus2week" => "Availability date + 2 weeks",
"availability_date_plus3week" => "Availability date + 3 weeks",
"availability_date_plus4week" => "Availability date + 4 weeks",
"availability_date_plus5week" => "Availability date + 5 weeks",
"region_id" => "Region Id",
"stock_status" => "Stock Status WooCommerce",
"quantity" => "Quantity [Stock]",
"virtual" => "Virtual",
"downloadable" => "Downloadable",
"price" => "Price",
"regular_price" => "Regular price",
"sale_price" => "Sale price",
"net_price" => "Price excl. VAT",
"net_regular_price" => "Regular price excl. VAT",
"net_sale_price" => "Sale price excl. VAT",
"price_forced" => "Price incl. VAT front end",
"regular_price_forced" => "Regular price incl. VAT front end",
"sale_price_forced" => "Sale price incl. VAT front end",
"sale_price_start_date" => "Sale start date",
"sale_price_end_date" => "Sale end date",
"sale_price_effective_date" => "Sale price effective date",
"rounded_price" => "Price rounded",
"rounded_regular_price" => "Regular price rounded",
"rounded_sale_price" => "Sale price rounded",
"system_price" => "System price",
"system_net_price" => "System price excl. VAT",
"system_net_sale_price" => "System sale price excl. VAT",
"system_net_regular_price" => "System regular price excl. VAT",
"system_regular_price" => "System regular price",
"system_sale_price" => "System sale price",
"vivino_price" => "Pinterest / TikTok / Vivino price",
"vivino_sale_price" => "Pinterest / TikTok / Vivino sale price",
"vivino_regular_price" => "Pinterest / TikTok / Vivino regular price",
"vivino_net_price" => "Pinterest / TikTok / Vivino price excl. VAT",
"vivino_net_regular_price" => "Pinterest / TikTok / Vivino regular price excl. VAT",
"vivino_net_sale_price" => "Pinterest / TikTok / Vivino sale price excl. VAT",
"non_geo_wcml_price" => "Non GEO WCML price",
"mm_min_price" => "Mix & Match minimum price",
"mm_min_regular_price" => "Mix & Match minimum regular price",
"mm_max_price" => "Mix & Match maximum price",
"mm_max_regular_price" => "Mix & Match maximum regular price",
"separator_price" => "Separator price",
"separator_regular_price" => "Separator regular price",
"separator_sale_price" => "Separator sale price",
"discount_percentage" => "Discount percentage",
"item_group_id" => "Item group ID",
"weight" => "Weight",
"width" => "Width",
"height" => "Height",
"length" => "Length",
"shipping" => "Shipping",
"shipping_price" => "Shipping cost",
"lowest_shipping_costs" => "Lowest shipping costs",
"shipping_label" => "Shipping class slug",
"shipping_label_name" => "Shipping class name",
"visibility" => "Visibility",
"rating_total" => "Total rating",
"rating_average" => "Average rating",
"amount_sales" => "Amount of sales",
"product_creation_date" => "Product creation date",
"days_back_created" => "Product days back created",
);
$images = array(
"image" => "Main image",
"image_all" => "Main image simple and variations",
"feature_image" => "Featured image",
"image_1" => "Additional image 1",
"image_2" => "Additional image 2",
"image_3" => "Additional image 3",
"image_4" => "Additional image 4",
"image_5" => "Additional image 5",
"image_6" => "Additional image 6",
"image_7" => "Additional image 7",
"image_8" => "Additional image 8",
"image_9" => "Additional image 9",
"image_10" => "Additional image 10",
"all_images" => "All images (comma separated)",
"all_gallery_images" => "All gallery images (comma separated)",
"all_images_kogan" => "All images Kogan (pipe separated)",
);
$attributes = array_merge($attributes, $images);
$static = array(
"installment" => "Installment",
"static_value" => "Static value",
"calculated" => "Plugin calculation",
"product_tag" => "Product tags",
"product_tag_space" => "Product tags space",
"product_detail" => "Product detail",
"product_highlight" => "Product highlight",
"menu_order" => "Menu order",
"reviews" => "Reviews",
"author" => "Author",
);
$attributes = array_merge($attributes, $static);
if(is_array($this->get_dynamic_attributes())){
$dynamic_attributes = $this->get_dynamic_attributes();
array_walk($dynamic_attributes, function(&$value, $key) { $value .= ' (Dynamic attribute)';});
$attributes = array_merge($attributes, $dynamic_attributes);
}
$custom_attributes = $this->get_custom_attributes();
if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
$custom_attributes['custom_attributes__aioseop_title'] = "All in one seo pack title";
$custom_attributes['custom_attributes__aioseop_description'] = "All in one seo pack description";
}
array_walk($custom_attributes, function(&$value, $key) { $value .= ' (Custom attribute)';});
$attributes = array_merge($attributes, $custom_attributes);
$attributes = array_merge($attributes, $static);
// Did the user checked extra attributes
if(get_option( 'woosea_extra_attributes' )){
$extra_attributes = get_option( 'woosea_extra_attributes' );
array_walk($extra_attributes, function(&$value, $key) { $value .= ' (Added Custom attribute)';});
$attributes = array_merge($attributes, $extra_attributes);
}
return $attributes;
}
public static function get_standard_attributes($project) {
$sitename = get_option('blogname');
$standard_attributes = array(
"id" => "Product Id",
"title" => "Product name",
"categories" => "Category",
);
if ($project['taxonomy'] == 'google_shopping'){
$standard_attributes["google_product_category"] = "Google product category";
} elseif ($project['taxonomy'] != 'none'){
$standard_attributes["$project[name]_product_category"] = "$project[name] category";
}
return $standard_attributes;
}
}