From 0412d267e169a99149b1bcc40ca1025eb8e27916 Mon Sep 17 00:00:00 2001 From: Marian Shymon Date: Wed, 2 Apr 2025 05:56:05 -0700 Subject: [PATCH 01/29] Added external_variant_id to the feed file (#2998) Summary: ## Description Earlier the external_variant_id (a Woo product ID by value) was added to sync via Batch API. This is a quick follow up to add it to the feed file generation too. ### Type of change Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) ## Checklist - [ ] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added tests and all the new and existing unit tests pass locally with my changes - [ ] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. ## Changelog entry - Added external_variant_id to the feed file Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/2998 Test Plan: Tested manually by triggering feed file generation, verified both the generated feed file and there are no feed ingestion errors via Meta internal tooling. Differential Revision: D72305993 Pulled By: mshymon fbshipit-source-id: 6b941d55147e4f7e75a5ee56a4d5d5ca1323c18b --- includes/fbproductfeed.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/includes/fbproductfeed.php b/includes/fbproductfeed.php index feb326dfe..f40ea5318 100644 --- a/includes/fbproductfeed.php +++ b/includes/fbproductfeed.php @@ -384,7 +384,9 @@ public function get_product_feed_header_row() { return 'id,title,description,image_link,link,product_type,' . 'brand,price,availability,item_group_id,checkout_url,' . 'additional_image_link,sale_price_effective_date,sale_price,condition,' . - 'visibility,gender,color,size,pattern,google_product_category,default_product,variant,gtin,quantity_to_sell_on_facebook,rich_text_description,external_update_time' . PHP_EOL; + 'visibility,gender,color,size,pattern,google_product_category,default_product,'. + 'variant,gtin,quantity_to_sell_on_facebook,rich_text_description,external_update_time,'. + 'external_variant_id'. PHP_EOL; } @@ -534,7 +536,8 @@ private function prepare_product_for_feed( $woo_product, &$attribute_variants ) static::format_string_for_feed( static::get_value_from_product_data( $product_data, 'gtin' )) . ',' . static::format_string_for_feed( static::get_value_from_product_data( $product_data, 'quantity_to_sell_on_facebook' )) . ',' . static::format_string_for_feed( static::get_value_from_product_data( $product_data, 'rich_text_description' ) ) . ',' . - static::get_value_from_product_data( $product_data, 'external_update_time' ) . PHP_EOL; + static::get_value_from_product_data( $product_data, 'external_update_time' ) . ',' . + static::get_value_from_product_data( $product_data, 'external_variant_id' ) . PHP_EOL; } private static function format_additional_image_url( $product_image_urls ) { From 455d5dfc11d25498e36aab0b28549d1fac4be301 Mon Sep 17 00:00:00 2001 From: vinkmeta Date: Fri, 4 Apr 2025 08:00:35 -0700 Subject: [PATCH 02/29] Added support for syncing product type (#3013) Summary: ## Description Added support for syncing product type ### Type of change Please delete options that are not relevant. - New feature (non-breaking change which adds functionality) ## Checklist - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added tests and all the new and existing unit tests pass locally with my changes - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. ## Changelog entry Added supoprt for syncing product type Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3013 Reviewed By: francorisso Differential Revision: D72458284 Pulled By: vinkmeta fbshipit-source-id: 54621d04f97dc48fb427fd2734b269108fed1cbb --- includes/fbproduct.php | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index 5c05e6b06..95c5fc527 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -1187,6 +1187,7 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $product_data[ 'gender' ] = $this->get_fb_gender(); $product_data[ 'material' ] = Helper::str_truncate( $this->get_fb_material(), 100 ); $product_data[ 'pattern' ] = Helper::str_truncate( $this->get_fb_pattern(), 100 ); + $product_data[ 'woo_product_type' ] = $this->get_type(); if ( self::PRODUCT_PREP_TYPE_ITEMS_BATCH === $type_to_prepare_for ) { $product_data['title'] = WC_Facebookcommerce_Utils::clean_string( $this->get_title() ); From 8fe9cae5d28d61d56f88d0b103b625b772fccf39 Mon Sep 17 00:00:00 2001 From: Sayan Pandey Date: Fri, 4 Apr 2025 08:33:53 -0700 Subject: [PATCH 03/29] Relocating bulk actions (#2943) Summary: Relocating the bulk facebook sync options to edit panel Removal of bulk sync controls form the panel. ![image](https://github.com/user-attachments/assets/e995e52f-0a7a-44d2-ab1c-4d19f3fc9ab5) ![image](https://github.com/user-attachments/assets/ce1a3d25-1294-4072-be10-4d9a4946a5c1) ![image](https://github.com/user-attachments/assets/bf2e3101-f0dd-490f-9cbe-9a1c98c42607) 1. Create few products in WooCommerce 2. Go to the products tab and make some products 3. Now select multiple products and click on edit in bulk options dropdown 4. Click apply 5. Edit panel should open 6. On the right observe Facebook Sync dropdown 7. Select your choice 8. Now click Blue update button Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/2943 Reviewed By: vinkmeta Differential Revision: D71134957 Pulled By: SayanPandey fbshipit-source-id: 7adf6b86a55108b78dd23407b616908bc074ce87 --- facebook-commerce.php | 3 - includes/Admin.php | 205 ++++++++---------- includes/Products.php | 2 +- .../WCFacebookCommerceIntegrationTest.php | 17 +- 4 files changed, 104 insertions(+), 123 deletions(-) diff --git a/facebook-commerce.php b/facebook-commerce.php index 7b5290bec..b2e5610c2 100644 --- a/facebook-commerce.php +++ b/facebook-commerce.php @@ -811,9 +811,6 @@ public function on_product_save( int $wp_id ) { $this->save_product_settings( $product ); } else { // if previously enabled, add a notice on the next page load - if ( Products::is_sync_enabled_for_product( $product ) ) { - Admin::add_product_disabled_sync_notice(); - } Products::disable_sync_for_products( [ $product ] ); if ( in_array( $wp_id, $products_to_delete_from_facebook, true ) ) { $this->delete_fb_product( $product ); diff --git a/includes/Admin.php b/includes/Admin.php index 1b8367d62..a3ce4bd01 100644 --- a/includes/Admin.php +++ b/includes/Admin.php @@ -33,6 +33,12 @@ class Admin { /** @var string the "sync disabled" sync mode slug */ const SYNC_MODE_SYNC_DISABLED = 'sync_disabled'; + /** @var string the "include" sync mode for bulk edit */ + const BULK_EDIT_SYNC = 'bulk_edit_sync'; + + /** @var string the "exclude" sync mode for bulk edit */ + const BULK_EDIT_DELETE = 'bulk_edit_delete'; + /** @var Product_Categories the product category admin handler */ protected $product_categories; @@ -94,8 +100,8 @@ public function __construct() { add_filter( 'request', array( $this, 'filter_products_by_sync_enabled' ) ); // add bulk actions to manage products sync - add_filter( 'bulk_actions-edit-product', array( $this, 'add_products_sync_bulk_actions' ), 40 ); - add_action( 'handle_bulk_actions-edit-product', array( $this, 'handle_products_sync_bulk_actions' ) ); + add_action( 'woocommerce_product_bulk_edit_end', array( $this, 'add_facebook_sync_bulk_edit_dropdown_at_bottom' ) ); + add_action( 'woocommerce_product_bulk_edit_save', array( $this, 'handle_products_sync_bulk_actions' ), 10, 1 ); // add Product data tab add_filter( 'woocommerce_product_data_tabs', array( $this, 'add_product_settings_tab' ) ); @@ -438,7 +444,7 @@ public function get_product_categories_handler() { * @return array */ public function add_product_list_table_columns( $columns ) { - $columns['facebook_sync'] = __( 'Facebook sync', 'facebook-for-woocommerce' ); + $columns['facebook_sync'] = __( 'Synced to Meta catalog', 'facebook-for-woocommerce' ); return $columns; } @@ -472,13 +478,9 @@ public function add_product_list_table_columns_content( $column ) { } if ( $should_sync ) { - if ( Products::is_product_visible( $product ) ) { - esc_html_e( 'Sync and show', 'facebook-for-woocommerce' ); - } else { - esc_html_e( 'Sync and hide', 'facebook-for-woocommerce' ); - } + esc_html_e( 'Synced', 'facebook-for-woocommerce' ); } else { - esc_html_e( 'Do not sync', 'facebook-for-woocommerce' ); + esc_html_e( 'Not synced', 'facebook-for-woocommerce' ); if ( ! empty( $no_sync_reason ) ) { echo wc_help_tip( $no_sync_reason ); } @@ -511,6 +513,36 @@ public function add_products_by_sync_enabled_input_filter() { + + is_virtual() && ! Products::is_sync_enabled_for_product( $product ) ) { - $enabling_sync_virtual_products[ $product->get_id() ] = $product; - } elseif ( $product->is_type( 'variable' ) ) { - // collect the virtual variations - foreach ( $product->get_children() as $variation_id ) { - $variation = wc_get_product( $variation_id ); - if ( $variation && $variation->is_virtual() && ! Products::is_sync_enabled_for_product( $variation ) ) { - $enabling_sync_virtual_products[ $product->get_id() ] = $product; - $enabling_sync_virtual_variations[ $variation->get_id() ] = $variation; - } - } - }//end if - }//end if + public function handle_products_sync_bulk_actions( $product_edit ) { + + $sync_mode = isset( $_GET['facebook_bulk_sync_options'] ) ? (string) sanitize_text_field( wp_unslash( $_GET['facebook_bulk_sync_options'] ) ) : null; + + if ( $sync_mode ) { + /** @var \WC_Product[] $enabling_sync_virtual_products virtual products that are being included */ + $enabling_sync_virtual_products = []; + /** @var \WC_Product_Variation[] $enabling_sync_virtual_variations virtual variations that are being included */ + $enabling_sync_virtual_variations = []; + /** @var \WC_Product $product to store the product meta data */ + $product = wc_get_product( $product_edit ); + + if ( $product && $this::BULK_EDIT_SYNC === $sync_mode ) { + if ( $product->is_virtual() && ! Products::is_sync_enabled_for_product( $product ) ) { + $enabling_sync_virtual_products[ $product->get_id() ] = $product; + } elseif ( $product->is_type( 'variable' ) ) { + // collect the virtual variations + foreach ( $product->get_children() as $variation_id ) { + $variation = wc_get_product( $variation_id ); + if ( $variation && $variation->is_virtual() && ! Products::is_sync_enabled_for_product( $variation ) ) { + $enabling_sync_virtual_variations[ $variation->get_id() ] = $variation; + } + }//end foreach + if ( ! empty( $enabling_sync_virtual_variations ) ) { + $enabling_sync_virtual_products[ $product->get_id() ] = $product; }//end if - }//end foreach + }//end if + }//end if - if ( ! empty( $enabling_sync_virtual_products ) || ! empty( $enabling_sync_virtual_variations ) ) { - // display notice if enabling sync for virtual products or variations - set_transient( 'wc_' . facebook_for_woocommerce()->get_id() . '_enabling_virtual_products_sync_show_notice_' . get_current_user_id(), true, 15 * MINUTE_IN_SECONDS ); - set_transient( 'wc_' . facebook_for_woocommerce()->get_id() . '_enabling_virtual_products_sync_affected_products_' . get_current_user_id(), array_keys( $enabling_sync_virtual_products ), 15 * MINUTE_IN_SECONDS ); + if ( ! empty( $enabling_sync_virtual_products ) || ! empty( $enabling_sync_virtual_variations ) ) { + // display notice if enabling sync for virtual products or variations + set_transient( 'wc_' . facebook_for_woocommerce()->get_id() . '_enabling_virtual_products_sync_show_notice_' . get_current_user_id(), true, 15 * MINUTE_IN_SECONDS ); + set_transient( 'wc_' . facebook_for_woocommerce()->get_id() . '_enabling_virtual_products_sync_affected_products_' . get_current_user_id(), array_keys( $enabling_sync_virtual_products ), 15 * MINUTE_IN_SECONDS ); - // set visibility for virtual products - foreach ( $enabling_sync_virtual_products as $product ) { + // set visibility for virtual products + foreach ( $enabling_sync_virtual_products as $product ) { - // do not set visibility for variable products - if ( ! $product->is_type( 'variable' ) ) { - Products::set_product_visibility( $product, false ); - } + // do not set visibility for variable products + if ( ! $product->is_type( 'variable' ) ) { + Products::set_product_visibility( $product, false ); } + } - // set visibility for virtual variations - foreach ( $enabling_sync_virtual_variations as $variation ) { + // set visibility for virtual variations + foreach ( $enabling_sync_virtual_variations as $variation ) { - Products::set_product_visibility( $variation, false ); - } - }//end if + Products::set_product_visibility( $variation, false ); + } + }//end if - if ( 'facebook_include' === $action ) { + $products[] = $product; - Products::enable_sync_for_products( $products ); + if ( $this::BULK_EDIT_SYNC === $sync_mode ) { - $this->resync_products( $products ); + Products::enable_sync_for_products( $products ); - } elseif ( 'facebook_exclude' === $action ) { + $this->resync_products( $products ); - Products::disable_sync_for_products( $products ); + } elseif ( $this::BULK_EDIT_DELETE === $sync_mode ) { - self::add_product_disabled_sync_notice( count( $products ) ); - } - }//end if - }//end if + Products::disable_sync_for_products( $products ); - return $redirect; + } + } //end if } - /** * Re-syncs the given products. * @@ -990,22 +987,6 @@ private function resync_products( array $products ) { } } - - /** - * Adds a transient so an informational notice is displayed on the next page load. - * - * @since 2.0.0 - * - * @param int $count number of products - */ - public static function add_product_disabled_sync_notice( $count = 1 ) { - - if ( ! facebook_for_woocommerce()->get_admin_notice_handler()->is_notice_dismissed( 'wc-' . facebook_for_woocommerce()->get_id_dasherized() . '-product-disabled-sync' ) ) { - set_transient( 'wc_' . facebook_for_woocommerce()->get_id() . '_show_product_disabled_sync_notice_' . get_current_user_id(), $count, MINUTE_IN_SECONDS ); - } - } - - /** * Adds a message for after a product or set of products get excluded from sync. * diff --git a/includes/Products.php b/includes/Products.php index 399ef923a..30ed52085 100644 --- a/includes/Products.php +++ b/includes/Products.php @@ -91,7 +91,7 @@ private static function set_sync_for_products( array $products, $enabled ) { } // Remove excluded product from FB. - if ( "no" === $enabled && self::product_should_be_deleted( $product ) ) { + if ( "no" === $enabled ) { facebook_for_woocommerce()->get_integration()->delete_fb_product( $product ); } diff --git a/tests/Unit/WCFacebookCommerceIntegrationTest.php b/tests/Unit/WCFacebookCommerceIntegrationTest.php index aecf59db2..de4cf639e 100644 --- a/tests/Unit/WCFacebookCommerceIntegrationTest.php +++ b/tests/Unit/WCFacebookCommerceIntegrationTest.php @@ -573,11 +573,17 @@ public function test_on_product_save_existing_simple_product_sync_enabled_update */ public function test_on_product_save_existing_simple_product_sync_disabled_updates_the_product() { $product_to_update = WC_Helper_Product::create_simple_product(); - $product_to_delete = WC_Helper_Product::create_simple_product(); + + // The idea of the following mock is to overide the delete_product_item. + // The test is that the product item is being deleted as when it is marked for do not sync. + // The mock below is hit otherwise it would generate a random Mock_Response and throw error + $integration_mock = $this->createMock(WC_Facebookcommerce_Integration::class); + $integration_mock->method('delete_product_item'); + $this->integration = $integration_mock; $_POST['wc_facebook_sync_mode'] = Admin::SYNC_MODE_SYNC_DISABLED; - $_POST[ WC_Facebook_Product::FB_REMOVE_FROM_SYNC ] = $product_to_delete->get_id(); + $_POST[ WC_Facebook_Product::FB_REMOVE_FROM_SYNC ] = $product_to_update->get_id(); $product_to_update->set_stock_status( 'instock' ); @@ -586,11 +592,8 @@ public function test_on_product_save_existing_simple_product_sync_disabled_updat $this->integration->on_product_save( $product_to_update->get_id() ); - $this->assertEquals( null, get_post_meta( $product_to_delete->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) ); - $this->assertEquals( null, get_post_meta( $product_to_delete->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, true ) ); - $this->assertEquals( 'no', get_post_meta( $product_to_update->get_id(), Products::SYNC_ENABLED_META_KEY, true ) ); - $this->assertEquals( 'no', get_post_meta( $product_to_update->get_id(), Products::VISIBILITY_META_KEY, true ) ); - + $this->assertEquals( 'facebook-product-item-id', get_post_meta( $product_to_update->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) ); + $this->assertEquals( null, get_post_meta( $product_to_update->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, true ) ); } /** From 2af138ab1c5df5f40ffb3b821181c84ace552eaa Mon Sep 17 00:00:00 2001 From: Sayan Pandey Date: Fri, 4 Apr 2025 16:53:14 -0700 Subject: [PATCH 04/29] Filtration on All Products page | Synced and Not Synced (#2999) Summary: This PR includes the changes of the filtration logic at All Products page 1. We will simplify it by providing 2 options 2. `Synced` will show which facebook items are synced -> both `Sync and show` and `Sync and hide` 3. `Not Synced` will show which are the products that are previously `Do not sync`. - [x] New feature (non-breaking change which adds functionality) - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have added tests and all the new and existing unit tests pass locally with my changes - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/2999 Test Plan: Follow the steps to test: 1. Make few products 2. Mark some of them `Sync and hide` or `Sync and show` 3. Mark some as `Do not sync` 4. Go to all products page 5. Look for the filter says `Filter by synced to meta` 6. Use it :) ![image](https://github.com/user-attachments/assets/4f0dcbc0-b474-46ae-92a8-59f8f052eb0a) ![image](https://github.com/user-attachments/assets/2e859529-6569-49ae-a6dd-4c978dd7e512) Reviewed By: vinkmeta Differential Revision: D72311890 Pulled By: SayanPandey fbshipit-source-id: d9b41f5df799d3ae9b32e9f9532920660baa2da0 --- includes/Admin.php | 146 +++++++++++++-------------------------------- 1 file changed, 42 insertions(+), 104 deletions(-) diff --git a/includes/Admin.php b/includes/Admin.php index a3ce4bd01..dbf79a6ff 100644 --- a/includes/Admin.php +++ b/includes/Admin.php @@ -33,6 +33,12 @@ class Admin { /** @var string the "sync disabled" sync mode slug */ const SYNC_MODE_SYNC_DISABLED = 'sync_disabled'; + /** @var string the "fb_sync_enabled" sync mode slug */ + const INCLUDE_FACEBOOK_SYNC = 'fb_sync_enabled'; + + /** @var string the "fb_sync_disabled" sync mode slug */ + const EXCLUDE_FACEBOOK_SYNC = 'fb_sync_disabled'; + /** @var string the "include" sync mode for bulk edit */ const BULK_EDIT_SYNC = 'bulk_edit_sync'; @@ -505,10 +511,9 @@ public function add_products_by_sync_enabled_input_filter() { $choice = isset( $_GET['fb_sync_enabled'] ) ? (string) sanitize_text_field( wp_unslash( $_GET['fb_sync_enabled'] ) ) : ''; ?> as query happens on WP products, + * Reason: We need to check if a product has variation and if they are synced or not + * Future plans: When product level sync comes through this should be handled more gracefully as we will only check at product level + * */ // when checking for products with sync enabled we need to check both "yes" and meta not set, this requires adding an "OR" clause $query_vars = $this->add_query_vars_to_find_products_with_sync_enabled( $query_vars ); - // only get visible products (both "yes" and meta not set) - $query_vars = $this->add_query_vars_to_find_visible_products( $query_vars ); // since we record enabled status and visibility on child variations, we need to query variable products found for their children to exclude them from query results $exclude_products = []; $found_ids = get_posts( array_merge( $query_vars, array( 'fields' => 'ids' ) ) ); @@ -590,38 +598,7 @@ public function filter_products_by_sync_enabled( $query_vars ) { ); /** @var \WC_Product[] $found_products */ foreach ( $found_products as $product ) { - if ( ! Products::is_sync_enabled_for_product( $product ) - || ! Products::is_product_visible( $product ) ) { - $exclude_products[] = $product->get_id(); - } - } - - if ( ! empty( $exclude_products ) ) { - if ( ! empty( $query_vars['post__not_in'] ) ) { - $query_vars['post__not_in'] = array_merge( $query_vars['post__not_in'], $exclude_products ); - } else { - $query_vars['post__not_in'] = $exclude_products; - } - } - } elseif ( self::SYNC_MODE_SYNC_AND_HIDE === $filter_value ) { - // when checking for products with sync enabled we need to check both "yes" and meta not set, this requires adding an "OR" clause - $query_vars = $this->add_query_vars_to_find_products_with_sync_enabled( $query_vars ); - // only get hidden products - $query_vars = $this->add_query_vars_to_find_hidden_products( $query_vars ); - // since we record enabled status and visibility on child variations, we need to query variable products found for their children to exclude them from query results - $exclude_products = []; - $found_ids = get_posts( array_merge( $query_vars, array( 'fields' => 'ids' ) ) ); - $found_products = empty( $found_ids ) ? [] : wc_get_products( - array( - 'limit' => -1, - 'type' => 'variable', - 'include' => $found_ids, - ) - ); - /** @var \WC_Product[] $found_products */ - foreach ( $found_products as $product ) { - if ( ! Products::is_sync_enabled_for_product( $product ) - || Products::is_product_visible( $product ) ) { + if ( ! Products::is_sync_enabled_for_product( $product ) ) { $exclude_products[] = $product->get_id(); } } @@ -634,7 +611,17 @@ public function filter_products_by_sync_enabled( $query_vars ) { } } - // for the same reason, we also need to include variable products with hidden children + /** + * Now removing all `Not Synced` products from the found products + * Reason: This is required even if we have mentioned $query_vars['post__not_in'], + * the preference of $query_vars['post__in'] is higher and will be overriden + * at the end of this function. + * */ + $found_ids = array_diff( $found_ids, $exclude_products ); + + /** + * For the same reason, we also need to include variable products with hidden children + * */ $include_products = []; $hidden_variations = get_posts( array( @@ -651,13 +638,12 @@ public function filter_products_by_sync_enabled( $query_vars ) { foreach ( $hidden_variations as $variation_post ) { $variable_product = wc_get_product( $variation_post->post_parent ); // we need this check because we only want products with ALL variations hidden - if ( $variable_product instanceof \WC_Product && Products::is_sync_enabled_for_product( $variable_product ) - && ! Products::is_product_visible( $variable_product ) ) { + if ( $variable_product instanceof \WC_Product && Products::is_sync_enabled_for_product( $variable_product ) ) { $include_products[] = $variable_product->get_id(); } } } else { - // self::SYNC_MODE_SYNC_DISABLED + // self::EXCLUDE_FACEBOOK_SYNC // products to be included in the QUERY, not in the sync $include_products = []; $found_ids = []; @@ -817,71 +803,23 @@ private function maybe_add_tax_query_for_excluded_taxonomies( $query_vars, $in = return $query_vars; } - /** - * Adds query vars to limit the results to visible products. - * - * @since 2.0.0 + * Adds bulk actions in the products edit screen. * - * @param array $query_vars - * @return array - */ - private function add_query_vars_to_find_visible_products( array $query_vars ) { - $visibility_meta_query = array( - 'relation' => 'OR', - array( - 'key' => Products::VISIBILITY_META_KEY, - 'value' => 'yes', - ), - array( - 'key' => Products::VISIBILITY_META_KEY, - 'compare' => 'NOT EXISTS', - ), - ); - - if ( empty( $query_vars['meta_query'] ) ) { - $query_vars['meta_query'] = $visibility_meta_query; - } elseif ( is_array( $query_vars['meta_query'] ) ) { - $enabled_meta_query = $query_vars['meta_query']; - $query_vars['meta_query'] = array( - 'relation' => 'AND', - $enabled_meta_query, - $visibility_meta_query, - ); - } - - return $query_vars; - } - - - /** - * Adds query vars to limit the results to hidden products. + * @internal * - * @since 2.0.0 + * @since 1.10.0 * - * @param array $query_vars + * @param array $bulk_actions array of bulk action keys and labels * @return array */ - private function add_query_vars_to_find_hidden_products( array $query_vars ) { - $visibility_meta_query = array( - 'key' => Products::VISIBILITY_META_KEY, - 'value' => 'no', - ); - - if ( empty( $query_vars['meta_query'] ) ) { - $query_vars['meta_query'] = $visibility_meta_query; - } elseif ( is_array( $query_vars['meta_query'] ) ) { - $enabled_meta_query = $query_vars['meta_query']; - $query_vars['meta_query'] = array( - 'relation' => 'AND', - $enabled_meta_query, - $visibility_meta_query, - ); - } - - return $query_vars; + public function add_products_sync_bulk_actions( $bulk_actions ) { + $bulk_actions['facebook_include'] = __( 'Include in Facebook sync', 'facebook-for-woocommerce' ); + $bulk_actions['facebook_exclude'] = __( 'Exclude from Facebook sync', 'facebook-for-woocommerce' ); + return $bulk_actions; } + /** * Handles a Facebook product sync bulk action. * Called every time for a product From 3f9014df8a05308cbe77bde48ebc9cbd8cd0e060 Mon Sep 17 00:00:00 2001 From: vinkmeta Date: Mon, 7 Apr 2025 05:44:03 -0700 Subject: [PATCH 05/29] Updated PR Template (#3019) Summary: ## Description Updated PR Template ### Type of change Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added tests and all the new and existing unit tests pass locally with my changes - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. ## Changelog entry Updated PR Template Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3019 Reviewed By: gurtejrehal Differential Revision: D72530023 Pulled By: vinkmeta fbshipit-source-id: aa35b6e2b23e111f8576ce8ad9382418b991647b --- .github/PULL_REQUEST_TEMPLATE.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 0b00a875b..c7650fba7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,9 +8,10 @@ List any dependencies that are required for this change. Please delete options that are not relevant. -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- Bug fix (non-breaking change which fixes an issue) +- New feature (non-breaking change which adds functionality) +- Syntax change (non-breaking change which fixes code modularity, linting or phpcs issues) +- Breaking change (fix or feature that would cause existing functionality to not work as expected) ## Screenshots @@ -29,10 +30,12 @@ Please also list any relevant details for your test configuration. ## Checklist -- [ ] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have added tests and all the new and existing unit tests pass locally with my changes -- [ ] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. +- [] I have commented my code, particularly in hard-to-understand areas. +- [] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. +- [] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). +- [] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. +- [] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. +- [] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry From 99ba5907f8233d191db62195619472dd7efefe13 Mon Sep 17 00:00:00 2001 From: vinkmeta Date: Mon, 7 Apr 2025 05:46:32 -0700 Subject: [PATCH 06/29] Fixed Null check exceptions (#3015) Summary: Fixed Null check exceptions highlighted in the [issue](https://github.com/facebook/facebook-for-woocommerce/issues/2829) Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added tests and all the new and existing unit tests pass locally with my changes - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. Fixed Null check exceptions Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3015 Reviewed By: gurtejrehal Differential Revision: D72474455 Pulled By: vinkmeta fbshipit-source-id: 87bad39af29107639ce6cf5f501d4874d58b0724 --- .../API/FBE/Configuration/Read/Response.php | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/includes/API/FBE/Configuration/Read/Response.php b/includes/API/FBE/Configuration/Read/Response.php index 76b7a617d..40d2ea9fb 100644 --- a/includes/API/FBE/Configuration/Read/Response.php +++ b/includes/API/FBE/Configuration/Read/Response.php @@ -18,6 +18,10 @@ class Response extends API\Response { * @return boolean */ public function is_ig_shopping_enabled(): bool { + + if ( empty( $this->response_data['ig_shopping'] ) ) { + return false; + } return (bool) $this->response_data['ig_shopping']['enabled'] ?? false; } @@ -27,6 +31,23 @@ public function is_ig_shopping_enabled(): bool { * @return boolean */ public function is_ig_cta_enabled(): bool { - return (bool) $this->response_data['ig_cta']['enabled']; + + if ( empty( $this->response_data['ig_cta'] ) ) { + return false; + } + return (bool) $this->response_data['ig_cta']['enabled'] ?? false; + } + + /** + * Gets the commerce extension URI. + * + * @return string Commerce extension URI or empty string if not available. + */ + public function get_commerce_extension_uri(): string { + + if ( empty( $this->response_data['commerce_extension'] ) ) { + return ''; + } + return $this->response_data['commerce_extension']['uri'] ?? ''; } } From c1ef800b3ff3c82a625bada1e946602d8be5db1f Mon Sep 17 00:00:00 2001 From: Raymon Akladious Date: Tue, 8 Apr 2025 03:36:35 -0700 Subject: [PATCH 07/29] Relaxing sync validation (#2969) Summary: ## Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. ### Type of change Please delete options that are not relevant. - [X] New feature (non-breaking change which adds functionality) | # | Field | Validation | Change | | --- | --- | --- | ---| | 1 | Description | ALL Cap | Remove | | 2 | Description | length(5000) | Remove | | 3 | Price | If missing | Remove| | 4 | Title | length(150) | Remove | | 5 | validate_product_visibility | if hidden| Keep for now (we need to sync items as hidden in case they are not visible) | | 6 | Out of stock | if woocommerce_hide_out_of_stock_items we don't sync | Removed in another PR | | 7 | product_status | ALL Cap | Keep (part of other efforts) | | 8 | validate_product_sync_field| | Keep | | 9 | validate_product_terms| Check whether the product's categories or tags (terms) exclude it from sync.| Keep | Note: I am not super sure about (5) validate_product_visibility, I have removed it, but the item is being synced as active ## Screenshots Please provide screenshots or snapshots of the system/state both before and after implementing the changes, if appropriate ### Before In the before nothing synced showing error in the meta_box component ### After image https://www.facebook.com/commerce/catalogs/955650953442091/products As you can see, I have synced items with different validations to ensure syncing is happening ## Test instructions Create a product with a validation issue and try saving and check if it's being synced or not ## Checklist - [X] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)) - [X] I have commented my code, particularly in hard-to-understand areas - [X] I have added tests and all the new and existing unit tests pass locally with my changes - [X] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. ## Changelog entry Relaxing sync validations Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/2969 Reviewed By: vinkmeta Differential Revision: D71912613 Pulled By: raymon1 fbshipit-source-id: 8e358749664d426f809711a889a6665d257f9a4c --- includes/ProductSync/ProductValidator.php | 89 ----------------------- 1 file changed, 89 deletions(-) diff --git a/includes/ProductSync/ProductValidator.php b/includes/ProductSync/ProductValidator.php index 8ac8d9f56..06655fa9b 100644 --- a/includes/ProductSync/ProductValidator.php +++ b/includes/ProductSync/ProductValidator.php @@ -28,20 +28,6 @@ class ProductValidator { */ public const SYNC_ENABLED_META_KEY = '_wc_facebook_sync_enabled'; - /** - * Maximum length of product description. - * - * @var int - */ - public const MAX_DESCRIPTION_LENGTH = 5000; - - /** - * Maximum length of product title. - * - * @var int - */ - public const MAX_TITLE_LENGTH = 150; - /** * Maximum allowed attributes in a variation; * @@ -134,11 +120,8 @@ public function validate() { $this->validate_sync_enabled_globally(); $this->validate_product_status(); $this->validate_product_sync_field(); - $this->validate_product_price(); $this->validate_product_visibility(); $this->validate_product_terms(); - $this->validate_product_description(); - $this->validate_product_title(); } /** @@ -151,11 +134,8 @@ public function validate() { public function validate_but_skip_status_check() { $this->validate_sync_enabled_globally(); $this->validate_product_sync_field(); - $this->validate_product_price(); $this->validate_product_visibility(); $this->validate_product_terms(); - $this->validate_product_description(); - $this->validate_product_title(); } /** @@ -166,11 +146,8 @@ public function validate_but_skip_status_check() { */ public function validate_but_skip_sync_field() { $this->validate_sync_enabled_globally(); - $this->validate_product_price(); $this->validate_product_visibility(); $this->validate_product_terms(); - $this->validate_product_description(); - $this->validate_product_title(); } /** @@ -361,72 +338,6 @@ protected function validate_product_sync_field() { } } - /** - * "allow simple or variable products (and their variations) with zero or empty price - exclude other product types with zero or empty price" - * unsure why but that's what we're doing - * - * @throws ProductExcludedException If product should not be synced. - */ - protected function validate_product_price() { - $primary_product = $this->product_parent ? $this->product_parent : $this->product; - - // Variable and simple products are allowed to have no price. - if ( in_array( $primary_product->get_type(), [ 'simple', 'variable' ], true ) ) { - return; - } - - if ( ! Products::get_product_price( $this->product ) ) { - throw new ProductExcludedException( __( 'If product is not simple, variable or variation it must have a price.', 'facebook-for-woocommerce' ) ); - } - } - - /** - * Check if the description field has correct format according to: - * Product Description Specifications for Catalogs : https://www.facebook.com/business/help/2302017289821154 - * - * @throws ProductInvalidException If product description does not meet the requirements. - */ - protected function validate_product_description() { - /* - * First step is to select the description that we want to evaluate. - * Main description is the one provided for the product in the Facebook. - * If it is blank, product description will be used. - * If product description is blank, shortname will be used. - */ - $description = $this->facebook_product->get_fb_description(); - - /* - * Requirements: - * - No all caps descriptions. - * - Max length 5000. - * - Min length 30 ( tested and not required, will not enforce until this will become a hard requirement ) - */ - if ( \WC_Facebookcommerce_Utils::is_all_caps( $description ) ) { - throw new ProductInvalidException( __( 'Product description is all capital letters. Please change the description to sentence case in order to allow synchronization of your product.', 'facebook-for-woocommerce' ) ); - } - if ( strlen( $description ) > self::MAX_DESCRIPTION_LENGTH ) { - throw new ProductInvalidException( __( 'Product description is too long. Maximum allowed length is 5000 characters.', 'facebook-for-woocommerce' ) ); - } - } - - /** - * Check if the title field has correct format according to: - * Product Title Specifications for Catalogs : https://www.facebook.com/business/help/2104231189874655 - * - * @throws ProductInvalidException If product title does not meet the requirements. - */ - protected function validate_product_title() { - $title = $this->product->get_title(); - - /* - * Requirements: - * - Max length 150. - */ - if ( mb_strlen( $title, 'UTF-8' ) > self::MAX_TITLE_LENGTH ) { - throw new ProductInvalidException( __( 'Product title is too long. Maximum allowed length is 150 characters.', 'facebook-for-woocommerce' ) ); - } - } - /** * Check if variation product has proper settings. * From 3516faf2ffa6875c577327712bd25cb59bcc568d Mon Sep 17 00:00:00 2001 From: Raymon Akladious Date: Tue, 8 Apr 2025 05:58:36 -0700 Subject: [PATCH 08/29] Feature/truncate title description (#3023) Summary: ## Description in https://github.com/facebook/facebook-for-woocommerce/issues/2969 the validations were relaxed, this might cause some backend issues. In this diff, in order to sync products, we are truncating any extra characters form the title and description ### Type of change - New feature (non-breaking change which adds functionality) ## Checklist - [X] I have commented my code, particularly in hard-to-understand areas. - [X] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [X] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [X] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [X] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [X] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry Truncates extra characters from title and description Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3023 Test Plan: Create item with more than the limits of 150 character for title and more than 5000 for description Before: The title/description will be missing if both title and description are above limit, the item won't be synced After: Truncates (title/description) image synced image ## Screenshots Please provide screenshots or snapshots of the system/state both before and after implementing the changes, if appropriate ### Before ### After Reviewed By: vinkmeta, SayanPandey Differential Revision: D72567584 Pulled By: raymon1 fbshipit-source-id: 17a6b279f1a3ce5d55237b885c3d349b9b6abdfb --- includes/fbproduct.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index 95c5fc527..ce7ef6e92 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -102,6 +102,20 @@ class WC_Facebook_Product { const MAX_TIME = 'T23:59+00:00'; const MIN_TIME = 'T00:00+00:00'; + /** + * Maximum length of product description. + * + * @var int + */ + public const MAX_DESCRIPTION_LENGTH = 5000; + + /** + * Maximum length of product title. + * + * @var int + */ + public const MAX_TITLE_LENGTH = 150; + static $use_checkout_url = array( 'simple' => 1, 'variable' => 1, @@ -1169,7 +1183,7 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $categories = WC_Facebookcommerce_Utils::get_product_categories( $id ); $product_data = array(); - $product_data[ 'description' ] = $this->get_fb_description(); + $product_data[ 'description' ] = Helper::str_truncate( $this->get_fb_description(), self::MAX_DESCRIPTION_LENGTH ); $product_data[ 'rich_text_description' ] = $this->get_rich_text_description(); $product_data[ 'product_type' ] = $categories['categories']; $product_data[ 'brand' ] = Helper::str_truncate( $this->get_fb_brand(), 100 ); @@ -1190,7 +1204,7 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $product_data[ 'woo_product_type' ] = $this->get_type(); if ( self::PRODUCT_PREP_TYPE_ITEMS_BATCH === $type_to_prepare_for ) { - $product_data['title'] = WC_Facebookcommerce_Utils::clean_string( $this->get_title() ); + $product_data['title'] = Helper::str_truncate( WC_Facebookcommerce_Utils::clean_string( $this->get_title() ), self::MAX_TITLE_LENGTH ); $product_data['image_link'] = $image_urls[0]; $product_data['additional_image_link'] = $this->get_additional_image_urls( $image_urls ); $product_data['link'] = $product_url; From d256ef79dab58c413b2a98a59dd90ca1a5ba6bb3 Mon Sep 17 00:00:00 2001 From: vinkmeta Date: Sun, 13 Apr 2025 13:25:57 -0700 Subject: [PATCH 09/29] Updated PR template (#3053) Summary: ## Description Updated PR template ### Type of change Please delete options that are not relevant. - Syntax change (non-breaking change which fixes code modularity, linting or phpcs issues) ## Checklist - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [x] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [x] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry Updated PR template Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3053 Differential Revision: D72936088 Pulled By: vinkmeta fbshipit-source-id: edcd0143efdfab8f522f76db72bee49bc40314ab --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c7650fba7..c058cc1b4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -32,6 +32,7 @@ Please also list any relevant details for your test configuration. - [] I have commented my code, particularly in hard-to-understand areas. - [] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. +- [] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. From 755f2091508f41e98629fafb9c0ca572c86d0151 Mon Sep 17 00:00:00 2001 From: Vahid Kaykhaei Date: Thu, 20 Mar 2025 13:41:48 +0100 Subject: [PATCH 10/29] Updated the plugin tags, and removed the legacy contributors --- readme.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.txt b/readme.txt index 6b4ac9057..8a011d88c 100644 --- a/readme.txt +++ b/readme.txt @@ -1,6 +1,6 @@ === Facebook for WooCommerce === -Contributors: facebook, automattic, woothemes -Tags: facebook, woocommerce, marketing, product catalog feed, pixel +Contributors: facebook +Tags: meta, facebook, conversions api, catalog sync, ads Requires at least: 5.6 Tested up to: 6.7 Stable tag: 3.4.6 From 9cc7d1e7035bcc0b82bc3f348857379b604c18f6 Mon Sep 17 00:00:00 2001 From: vinkmeta Date: Mon, 14 Apr 2025 05:24:31 -0700 Subject: [PATCH 11/29] Fixed the item not found error by using filter in the product endpoint (#3054) Summary: ## Description Fixed the item not found error by using filter in the product endpoint ### Type of change Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [x] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [x] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [x] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry Fixed the item not found error by using filter in the product endpoint Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3054 Test Plan: npm run test:php Reviewed By: gurtejrehal Differential Revision: D72944229 Pulled By: vinkmeta fbshipit-source-id: fbfabe38bf0ef4e50424ab445e7e6d5a29f142af --- facebook-commerce.php | 15 ++- .../ProductCatalog/Products/Id/Request.php | 19 +++- .../ProductCatalog/Products/Id/Response.php | 2 +- tests/Unit/ApiTest.php | 92 ++++++++++++++++++- .../WCFacebookCommerceIntegrationTest.php | 45 +++++++++ 5 files changed, 161 insertions(+), 12 deletions(-) diff --git a/facebook-commerce.php b/facebook-commerce.php index b2e5610c2..80d79e2f8 100644 --- a/facebook-commerce.php +++ b/facebook-commerce.php @@ -3003,17 +3003,22 @@ public function get_product_fbid( string $fbid_type, int $wp_id, $woo_product = $fb_retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $woo_product ); try { - $facebook_ids = $this->facebook_for_woocommerce->get_api()->get_product_facebook_ids( + $response = $this->facebook_for_woocommerce->get_api()->get_product_facebook_ids( $this->get_product_catalog_id(), $fb_retailer_id ); - if ( $facebook_ids->id ) { + if ( $response->data && $response->data[0] && $response->data[0]['id'] ) { $fb_id = $fbid_type == self::FB_PRODUCT_GROUP_ID - ? $facebook_ids->get_facebook_product_group_id() - : $facebook_ids->id; + ? $response->data[0]['product_group']['id'] + : $response->data[0]['id']; + update_post_meta( $wp_id, $fbid_type, $fb_id ); + return $fb_id; + } elseif ( $response->id ) { + $fb_id = $fbid_type == self::FB_PRODUCT_GROUP_ID + ? $response->get_facebook_product_group_id() + : $response->id; update_post_meta( $wp_id, $fbid_type, $fb_id ); - return $fb_id; } } catch ( Exception $e ) { diff --git a/includes/API/ProductCatalog/Products/Id/Request.php b/includes/API/ProductCatalog/Products/Id/Request.php index 60436be05..af39f78de 100644 --- a/includes/API/ProductCatalog/Products/Id/Request.php +++ b/includes/API/ProductCatalog/Products/Id/Request.php @@ -8,9 +8,9 @@ defined( 'ABSPATH' ) || exit; /** - * Request object for Product Catalog > Product Groups > Products > Update Graph Api. + * Request object for Product Catalog > Products > Get Graph Api. * - * @link https://developers.facebook.com/docs/marketing-api/reference/product-group/products/ + * @link https://developers.facebook.com/docs/marketing-api/reference/product-catalog/products/ */ class Request extends ApiRequest { @@ -19,7 +19,18 @@ class Request extends ApiRequest { * @param string $facebook_product_retailer_id Facebook Product Retailer ID. */ public function __construct( string $facebook_product_catalog_id, string $facebook_product_retailer_id ) { - $path = "catalog:{$facebook_product_catalog_id}:" . base64_encode( $facebook_product_retailer_id ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode - parent::__construct( "/{$path}/?fields=id,product_group{id}", 'GET' ); + + /** + * We use the endpoint with filter to get the product id and group id for new products to check if the product is already synced to Facebook. + */ + $path = "/{$facebook_product_catalog_id}/products"; + parent::__construct( $path, 'GET' ); + + $this->set_params( + array( + 'filter' => '{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}', + 'fields' => 'id,product_group{id}', + ) + ); } } diff --git a/includes/API/ProductCatalog/Products/Id/Response.php b/includes/API/ProductCatalog/Products/Id/Response.php index e12c123cb..e4570b8d2 100644 --- a/includes/API/ProductCatalog/Products/Id/Response.php +++ b/includes/API/ProductCatalog/Products/Id/Response.php @@ -10,7 +10,7 @@ /** * Response object for Product Catalog > Product Groups > Update Graph Api. * - * @link https://developers.facebook.com/docs/marketing-api/reference/product-group/products/ + * @link https://developers.facebook.com/docs/marketing-api/reference/product-catalog/products/ * @property-read string id Either request was successful or not. * @property-read array product_group Product group data container containing facebook product group id * e.g. product_group => [ id => ] diff --git a/tests/Unit/ApiTest.php b/tests/Unit/ApiTest.php index e19f6a91c..d10c2f936 100644 --- a/tests/Unit/ApiTest.php +++ b/tests/Unit/ApiTest.php @@ -540,8 +540,9 @@ public function test_get_product_facebook_ids_creates_get_ids_request() { $response = function( $result, $parsed_args, $url ) use ( $facebook_product_catalog_id, $facebook_product_retailer_id ) { $this->assertEquals( 'GET', $parsed_args['method'] ); - $path = "catalog:{$facebook_product_catalog_id}:" . base64_encode( $facebook_product_retailer_id ); - $path = "/{$path}/?fields=id,product_group{id}"; + $filter = urlencode('{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}'); + $fields = urlencode('id,product_group{id}'); + $path = "/{$facebook_product_catalog_id}/products?filter={$filter}&fields={$fields}"; $this->assertEquals( "{$this->endpoint}{$this->version}{$path}", $url ); return [ @@ -560,6 +561,93 @@ public function test_get_product_facebook_ids_creates_get_ids_request() { $this->assertEquals( '8672727046074523', $response->get_facebook_product_group_id() ); } + /** + * Tests get product ids prepares a request to Facebook. + * This test is for the filter endpoint. + * + * @return void + * @throws ApiException In case of network request error. + */ + public function test_get_product_facebook_ids_creates_get_ids_request_with_filter_endpoint() { + $facebook_product_catalog_id = '726635365295186'; + $facebook_product_retailer_id = 'woo-cap_97'; + + $response = function( $result, $parsed_args, $url ) use ( $facebook_product_catalog_id, $facebook_product_retailer_id ) { + $this->assertEquals( 'GET', $parsed_args['method'] ); + + $filter = urlencode('{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}'); + $fields = urlencode('id,product_group{id}'); + $path = "/{$facebook_product_catalog_id}/products?filter={$filter}&fields={$fields}"; + + $this->assertEquals( "{$this->endpoint}{$this->version}{$path}", $url ); + return [ + 'body' => '{"data":[{"id":"8672727132741181","product_group":{"id":"8672727046074523"}}]}', + 'response' => [ + 'code' => 200, + 'message' => 'OK', + ], + ]; + }; + add_filter( 'pre_http_request', $response, 10, 3 ); + + $is_call_before_sync = true; + $product = WC_Helper_Product::create_simple_product(); + $woo_product = new WC_Facebook_Product( $product ); + $response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id, $woo_product, $is_call_before_sync ); + + $this->assertEquals( + [ + [ + 'id' => '8672727132741181', + 'product_group' => [ + 'id' => '8672727046074523', + ], + ], + ], + $response->data + ); + } + + /** + * Tests get product ids prepares a request to Facebook. + * This test is for the filter endpoint with a product retailer id that doesn't exist. + * + * @return void + * @throws ApiException In case of network request error. + */ + public function test_get_product_facebook_ids_creates_get_ids_request_with_filter_endpoint_nonexisting_product() { + $facebook_product_catalog_id = '726635365295186'; + $facebook_product_retailer_id = 'nonexisting_product_retailer_id'; + + $response = function( $result, $parsed_args, $url ) use ( $facebook_product_catalog_id, $facebook_product_retailer_id ) { + $this->assertEquals( 'GET', $parsed_args['method'] ); + + $filter = urlencode('{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}'); + $fields = urlencode('id,product_group{id}'); + $path = "/{$facebook_product_catalog_id}/products?filter={$filter}&fields={$fields}"; + + $this->assertEquals( "{$this->endpoint}{$this->version}{$path}", $url ); + return [ + 'body' => '{"data":[]}', + 'response' => [ + 'code' => 200, + 'message' => 'OK', + ], + ]; + }; + add_filter( 'pre_http_request', $response, 10, 3 ); + + $is_call_before_sync = true; + $product = WC_Helper_Product::create_simple_product(); + $woo_product = new \WC_Facebook_Product( $product ); + $response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id, $woo_product, $is_call_before_sync ); + + $this->assertEquals( + [], + $response->data + ); + } + /** * Tests delete product prepares a request to Facebook. * diff --git a/tests/Unit/WCFacebookCommerceIntegrationTest.php b/tests/Unit/WCFacebookCommerceIntegrationTest.php index de4cf639e..987ae429d 100644 --- a/tests/Unit/WCFacebookCommerceIntegrationTest.php +++ b/tests/Unit/WCFacebookCommerceIntegrationTest.php @@ -3291,4 +3291,49 @@ public function test_get_product_fbid_calls_facebook_and_sets_post_meta_value_fo $this->assertEquals( 'product-id', $facebook_product_id ); $this->assertEquals( 'product-id', get_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) ); } + + /** + * Tests get product facebook id calls facebook graph api with the endpoint with filter to get id and updates + * post meta item id value. + * + * @return void + */ + public function test_get_product_fbid_calls_facebook_and_sets_post_meta_value_for_item_id_with_filter_endpoint() { + add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '1122334455' ); + + $product = WC_Helper_Product::create_simple_product(); + $fb_retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( new WC_Facebook_Product( $product->get_id() ) ); + + $this->api->expects( $this->once() ) + ->method( 'get_product_facebook_ids' ) + ->with( '1122334455', $fb_retailer_id ) + ->willReturn( new API\ProductCatalog\Products\Id\Response( '{"data":[{"id":"product-id","product_group":{"id":"product-group-id"}}]}' ) ); + + $facebook_product_id = $this->integration->get_product_fbid( WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, $product->get_id() ); + + $this->assertEquals( 'product-id', $facebook_product_id ); + $this->assertEquals( 'product-id', get_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) ); + } + + /** + * Tests get product facebook id calls facebook graph api with the endpoint with filter to find that the item doesn't exist. + * + * @return void + */ + public function test_get_product_fbid_calls_facebook_and_sets_post_meta_value_for_item_id_with_filter_endpoint_empty_data() { + add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '1122334455' ); + + $product = WC_Helper_Product::create_simple_product(); + $fb_retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( new WC_Facebook_Product( $product->get_id() ) ); + + $this->api->expects( $this->once() ) + ->method( 'get_product_facebook_ids' ) + ->with( '1122334455', $fb_retailer_id ) + ->willReturn( new API\ProductCatalog\Products\Id\Response( '{"data":[]}' ) ); + + $facebook_product_id = $this->integration->get_product_fbid( WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, $product->get_id() ); + + $this->assertEquals( null, $facebook_product_id ); + $this->assertEquals( null, get_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) ); + } } From 27ceac68d8ac8f15515b4a99626c74613a069b0b Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Wed, 9 Apr 2025 09:21:48 -0700 Subject: [PATCH 12/29] fix: Update descriptive tooltip for MPN text input (#3034) Summary: ## Description Fixed bug where MPN input box had no tooltip #Before Screenshot 2025-04-09 at 16 48 51 #After Screenshot 2025-04-09 at 16 49 06 Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3034 Reviewed By: SayanPandey Differential Revision: D72721454 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: 5b6d48fbd3c14f0dd12760973f979263fecef43f --- includes/Admin.php | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/Admin.php b/includes/Admin.php index dbf79a6ff..92a2f286c 100644 --- a/includes/Admin.php +++ b/includes/Admin.php @@ -1302,6 +1302,7 @@ public function add_product_settings_tab_content() { 'value' => $fb_mpn, 'class' => 'enable-if-sync-enabled', 'desc_tip' => true, + 'description' => __( 'Manufacturer Part Number (MPN) of the item', 'facebook-for-woocommerce' ), ) ); From b02ac71db4aa4f1de3d80ba45a139c9c857480f6 Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Wed, 9 Apr 2025 09:41:02 -0700 Subject: [PATCH 13/29] docs: Document get_unmapped_attributes from Woo to Meta (#3033) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: This investigation documents how the `get_unmapped_attributes()` function handles the synchronization of WooCommerce product attributes that aren't explicitly mapped to standard Facebook catalog fields. The `get_unmapped_attributes()` method in `WC_Facebook_Product` class: ```php public function get_unmapped_attributes() { $unmapped_attributes = array(); $attributes = $this->woo_product->get_attributes(); foreach ($attributes as $attribute_name => $_) { $value = $this->woo_product->get_attribute($attribute_name); if (!empty($value)) { $mapped_field = $this->check_attribute_mapping($attribute_name); if ($mapped_field === false) { $unmapped_attributes[] = array( 'name' => $attribute_name, 'value' => $value ); } } } return $unmapped_attributes; } ``` 1. **Collection**: Retrieves all WooCommerce product attributes 2. **Filtering**: - Checks each attribute for non-empty values - Verifies if attribute is mapped to a Facebook field 3. **Storage**: - Stores unmapped attributes in array format - Preserves both name and value pairs Comprehensive test cases verify: - Empty attribute handling - Mapped vs unmapped attribute differentiation - Mixed attribute scenarios - Value validation - ✅ Only processes attributes with non-empty values - ✅ Excludes attributes mapped to standard Facebook fields - ✅ Maintains original attribute names and values - ✅ Works with both simple and variable products ```php $facebook_product = new WC_Facebook_Product($product); $unmapped_attributes = $facebook_product->get_unmapped_attributes(); // Returns: [ ['name' => 'weight', 'value' => '2kg'], ['name' => 'style', 'value' => 'Modern'] ] ``` - `check_attribute_mapping()`: Validates attribute mapping status - Facebook catalog field mappings - WooCommerce attribute management - Product meta storage Test cases confirm proper handling of: - Products with no attributes - Products with only mapped attributes - Products with only unmapped attributes - Products with mixed attribute types - Empty attribute values This investigation provides foundation for: - Improving attribute sync documentation - Enhancing mapping configurations - Optimizing attribute processing - Extending test coverage Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3033 Reviewed By: vinkmeta Differential Revision: D72707817 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: 0e66df271750005c8f2da74efde4e74db0759ceb --- includes/fbproduct.php | 67 +++++++++++++- tests/Unit/fbproductTest.php | 173 ++++++++++++++++++++++++++++++++++- 2 files changed, 232 insertions(+), 8 deletions(-) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index ce7ef6e92..b135339e0 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -167,6 +167,64 @@ class WC_Facebook_Product { */ public $rich_text_description; + /** @var array Standard Facebook fields that WooCommerce attributes can map to */ + private static $standard_facebook_fields = array( + 'size' => array('size'), + 'color' => array('color', 'colour'), + 'pattern' => array('pattern'), + 'material' => array('material'), + 'gender' => array('gender'), + 'age_group' => array('age_group') + ); + + + /** + * Check if a WooCommerce attribute maps to a standard Facebook field + * + * @param string $attribute_name The WooCommerce attribute name + * @return bool|string False if not mapped, or the Facebook field name if mapped + */ + public function check_attribute_mapping($attribute_name) { + $sanitized_name = \WC_Facebookcommerce_Utils::sanitize_variant_name($attribute_name, false); + + foreach (self::$standard_facebook_fields as $fb_field => $possible_matches) { + foreach ($possible_matches as $match) { + if (stripos($sanitized_name, $match) !== false) { + return $fb_field; + } + } + } + + return false; + } + + /** + * Get all attributes that are not mapped to standard Facebook fields + * + * @return array Array of unmapped attributes with 'name' and 'value' keys + */ + public function get_unmapped_attributes() { + $unmapped_attributes = array(); + $attributes = $this->woo_product->get_attributes(); + + foreach ($attributes as $attribute_name => $_) { + $value = $this->woo_product->get_attribute($attribute_name); + + if (!empty($value)) { + $mapped_field = $this->check_attribute_mapping($attribute_name); + + if ($mapped_field === false) { + $unmapped_attributes[] = array( + 'name' => $attribute_name, + 'value' => $value + ); + } + } + } + + return $unmapped_attributes; + } + public function __construct( $wpid, $parent_product = null ) { if ( $wpid instanceof WC_Product ) { @@ -1163,11 +1221,11 @@ private function build_checkout_url( $product_url ) { public function prepare_product( $retailer_id = null, $type_to_prepare_for = self::PRODUCT_PREP_TYPE_NORMAL ) { if ( ! $retailer_id ) { - $retailer_id = - WC_Facebookcommerce_Utils::get_fb_retailer_id( $this ); + $retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $this ); } - $image_urls = $this->get_all_image_urls(); + $image_urls = $this->get_all_image_urls(); + // Replace WordPress sanitization's ampersand with a real ampersand. $product_url = str_replace( '&%3B', @@ -1195,13 +1253,12 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $product_data[ 'condition' ] = $this->get_fb_condition(); $product_data[ 'size' ] = $this->get_fb_size(); $product_data[ 'color' ] = $this->get_fb_color(); - $product_data[ 'mpn' ] = $this->get_fb_mpn(); $product_data[ 'pattern' ] = Helper::str_truncate( $this->get_fb_pattern(), 100 ); $product_data[ 'age_group' ] = $this->get_fb_age_group(); $product_data[ 'gender' ] = $this->get_fb_gender(); $product_data[ 'material' ] = Helper::str_truncate( $this->get_fb_material(), 100 ); - $product_data[ 'pattern' ] = Helper::str_truncate( $this->get_fb_pattern(), 100 ); $product_data[ 'woo_product_type' ] = $this->get_type(); + $product_data[ 'unmapped_attributes' ] = $this->get_unmapped_attributes(); if ( self::PRODUCT_PREP_TYPE_ITEMS_BATCH === $type_to_prepare_for ) { $product_data['title'] = Helper::str_truncate( WC_Facebookcommerce_Utils::clean_string( $this->get_title() ), self::MAX_TITLE_LENGTH ); diff --git a/tests/Unit/fbproductTest.php b/tests/Unit/fbproductTest.php index 7be356234..09747b566 100644 --- a/tests/Unit/fbproductTest.php +++ b/tests/Unit/fbproductTest.php @@ -904,14 +904,13 @@ private function create_product_attribute($name, $value, $is_taxonomy) { $term_ids[] = $term['term_id']; } } - $attribute->set_options($term_ids); - $attribute->set_taxonomy(true); + $attribute->is_taxonomy(true); } else { // For custom attributes $values = is_array($value) ? $value : [$value]; $attribute->set_options($values); - $attribute->set_taxonomy(false); + $attribute->is_taxonomy(false); } $attribute->set_position(0); @@ -1056,4 +1055,172 @@ public function test_external_update_time_unset() { $this->assertEquals(isset($data['external_update_time']), false); } + + + + /** + * Tests for get_fb_short_description() method + */ + public function test_get_fb_short_description() { + // Test 1: Variation products should inherit parent's short description + $variable_product = WC_Helper_Product::create_variation_product(); + $variation = wc_get_product($variable_product->get_children()[0]); + + // Set the parent product's short description + $variable_product->set_short_description('parent short description'); + $variable_product->save(); + + // Even if we try to set a short description on the variation (which we dont have functionality for in WooCommerce UI) + $variation->set_short_description('variation short description - should be ignored'); + $variation->save(); + + $parent_fb_product = new \WC_Facebook_Product($variable_product); + $facebook_product = new \WC_Facebook_Product($variation, $parent_fb_product); + $description = $facebook_product->get_fb_short_description(); + + // Variations should inherit the parent product's short description + $this->assertEquals('parent short description', $description, 'Variations should inherit parent short description'); + + // Test 2: Gets short description from post excerpt for simple products + $product = WC_Helper_Product::create_simple_product(); + $product->set_short_description('product short description'); + $product->save(); + + $facebook_product = new \WC_Facebook_Product($product); + $description = $facebook_product->get_fb_short_description(); + $this->assertEquals('product short description', $description); + + // Test 3: Returns empty string when no short description exists + $product = WC_Helper_Product::create_simple_product(); + $product->set_short_description(''); + $product->save(); + + $facebook_product = new \WC_Facebook_Product($product); + $description = $facebook_product->get_fb_short_description(); + $this->assertEquals('', $description); + + // Test 4: Applies filters + $filter = $this->add_filter_with_safe_teardown('facebook_for_woocommerce_fb_product_short_description', function($description, $id) { + return 'filtered short description for product ' . $id; + }, 10, 2); + + $description = $facebook_product->get_fb_short_description(); + $this->assertEquals('filtered short description for product ' . $product->get_id(), $description); + + // Remove the filter early + $filter->teardown_safely_immediately(); + } + + /** + * Test get_unmapped_attributes with no attributes + */ + public function test_get_unmapped_attributes_no_attributes() { + $product = WC_Helper_Product::create_simple_product(); + $facebook_product = new \WC_Facebook_Product($product); + + $unmapped_attributes = $facebook_product->get_unmapped_attributes(); + $this->assertIsArray($unmapped_attributes); + $this->assertEmpty($unmapped_attributes); + } + + /** + * Test get_unmapped_attributes with only mapped attributes + */ + public function test_get_unmapped_attributes_only_mapped() { + $product = WC_Helper_Product::create_simple_product(); + + // Add mapped attributes (size, color) + $attributes = array(); + $attributes[] = $this->create_product_attribute('size', 'Large', false); + $attributes[] = $this->create_product_attribute('color', 'Blue', false); + $product->set_attributes($attributes); + $product->save(); + + $facebook_product = new \WC_Facebook_Product($product); + $unmapped_attributes = $facebook_product->get_unmapped_attributes(); + + $this->assertIsArray($unmapped_attributes); + $this->assertEmpty($unmapped_attributes); + } + + /** + * Test get_unmapped_attributes with only unmapped attributes + */ + public function test_get_unmapped_attributes_only_unmapped() { + $product = WC_Helper_Product::create_simple_product(); + + // Add unmapped attributes + $attributes = array(); + $attributes[] = $this->create_product_attribute('weight', '2kg', false); + $attributes[] = $this->create_product_attribute('style', 'Modern', false); + $product->set_attributes($attributes); + $product->save(); + + $facebook_product = new \WC_Facebook_Product($product); + $unmapped_attributes = $facebook_product->get_unmapped_attributes(); + + $this->assertIsArray($unmapped_attributes); + $this->assertCount(2, $unmapped_attributes); + + // Verify first unmapped attribute + $this->assertEquals('weight', $unmapped_attributes[0]['name']); + $this->assertEquals('2kg', $unmapped_attributes[0]['value']); + + // Verify second unmapped attribute + $this->assertEquals('style', $unmapped_attributes[1]['name']); + $this->assertEquals('Modern', $unmapped_attributes[1]['value']); + } + + /** + * Test get_unmapped_attributes with both mapped and unmapped attributes + */ + public function test_get_unmapped_attributes_mixed() { + $product = WC_Helper_Product::create_simple_product(); + + // Add both mapped and unmapped attributes + $attributes = array(); + $attributes[] = $this->create_product_attribute('size', 'Medium', false); // mapped + $attributes[] = $this->create_product_attribute('weight', '3kg', false); // unmapped + $attributes[] = $this->create_product_attribute('color', 'Red', false); // mapped + $attributes[] = $this->create_product_attribute('style', 'Classic', false); // unmapped + $product->set_attributes($attributes); + $product->save(); + + $facebook_product = new \WC_Facebook_Product($product); + $unmapped_attributes = $facebook_product->get_unmapped_attributes(); + + $this->assertIsArray($unmapped_attributes); + $this->assertCount(2, $unmapped_attributes); + + // Verify only unmapped attributes are returned + $this->assertEquals('weight', $unmapped_attributes[0]['name']); + $this->assertEquals('3kg', $unmapped_attributes[0]['value']); + $this->assertEquals('style', $unmapped_attributes[1]['name']); + $this->assertEquals('Classic', $unmapped_attributes[1]['value']); + } + + /** + * Test get_unmapped_attributes with empty attribute values + */ + public function test_get_unmapped_attributes_empty_values() { + $product = WC_Helper_Product::create_simple_product(); + + // Add attributes with empty values + $attributes = array(); + $attributes[] = $this->create_product_attribute('weight', '', false); // empty unmapped + $attributes[] = $this->create_product_attribute('size', '', false); // empty mapped + $attributes[] = $this->create_product_attribute('style', 'Modern', false); // non-empty unmapped + $product->set_attributes($attributes); + $product->save(); + + $facebook_product = new \WC_Facebook_Product($product); + $unmapped_attributes = $facebook_product->get_unmapped_attributes(); + + $this->assertIsArray($unmapped_attributes); + $this->assertCount(1, $unmapped_attributes); + + // Verify only non-empty unmapped attribute is returned + $this->assertEquals('style', $unmapped_attributes[0]['name']); + $this->assertEquals('Modern', $unmapped_attributes[0]['value']); + } } From 2989c43cbd3e141f3b62f74ed0840a977c587d2b Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Thu, 10 Apr 2025 02:12:12 -0700 Subject: [PATCH 14/29] fix: Add parent product material inheritance for variations (#3035) Summary: ## Description This PR fixes an inconsistency in how product material attributes are handled for variable products in the Facebook for WooCommerce sync process. Previously, variations would not inherit their parent product's material attribute, unlike other attributes such as color and size. ### What Changed - Added parent fallback logic to `get_fb_material()` method - Variations now check parent product's material value if no variation-specific material is set - Maintains existing string sanitization and length limits ### Before ```php // Only checked variation attributes and direct meta $fb_material = get_post_meta($this->id, self::FB_MATERIAL, true); ``` ### After ```php // Now includes parent fallback like other attributes if (empty($fb_material) && $this->is_type('variation')) { $parent_id = $this->get_parent_id(); if ($parent_id) { $fb_material = get_post_meta($parent_id, self::FB_MATERIAL, true); } } ``` ### Testing 1. Create a variable product with a material set at the parent level 2. Create variations without specific material values 3. Verify variations inherit the parent's material when syncing to Facebook 4. Verify variations with their own material values still use their specific value ### Related Issues - Fixes inconsistent material attribute syncing for variable products - Aligns material handling with other product attributes Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3035 Reviewed By: vinkmeta Differential Revision: D72733411 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: 28483bffcdc0563d1af8e98748e8d3a35e9da9b9 --- includes/fbproduct.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index b135339e0..9c70685f0 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -1054,6 +1054,14 @@ public function get_fb_material() { true ); + // If empty and this is a variation, get the parent material + if ( empty( $fb_material ) && $this->is_type( 'variation' ) ) { + $parent_id = $this->get_parent_id(); + if ( $parent_id ) { + $fb_material = get_post_meta( $parent_id, self::FB_MATERIAL, true ); + } + } + return mb_substr(WC_Facebookcommerce_Utils::clean_string($fb_material), 0, 200); } From aabef285831b892fbe768ddf8d100716192ef9eb Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Thu, 10 Apr 2025 11:49:47 -0700 Subject: [PATCH 15/29] =?UTF-8?q?fix:=20mismatch=20between=20tooltip=20mes?= =?UTF-8?q?sages=20for=20Skirt=20Length=20and=20Sleeve=20Le=E2=80=A6=20(#3?= =?UTF-8?q?039)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: allow-large-files # Fix Tooltip Messages for Skirt Length and Sleeve Length ## Issue The tooltip messages for Skirt Length and Sleeve Length were incorrectly swapped, causing confusion for users. ## Changes - Corrected tooltip text for Skirt Length to properly describe skirt measurements - Corrected tooltip text for Sleeve Length to properly describe sleeve measurements ## Testing - Verified tooltips display correct information when hovering over each field Screenshot 2025-04-10 at 16 00 09 Screenshot 2025-04-10 at 16 00 00 Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3039 Reviewed By: SayanPandey, gurtejrehal Differential Revision: D72794796 Pulled By: devbodaghe fbshipit-source-id: f4acad7cdd227bacdbd6b9facda4612da9f2c705 --- ..._google_category_to_attribute_mapping.json | 597 +++++++----------- ..._category_to_attribute_mapping_fields.json | 2 +- 2 files changed, 240 insertions(+), 359 deletions(-) diff --git a/bin/fb_google_category_to_attribute_mapping.json b/bin/fb_google_category_to_attribute_mapping.json index 6cdbc2c00..5047d104a 100644 --- a/bin/fb_google_category_to_attribute_mapping.json +++ b/bin/fb_google_category_to_attribute_mapping.json @@ -104118,7 +104118,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -104135,8 +104135,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -104651,7 +104650,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -104668,8 +104667,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -105184,7 +105182,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -105201,8 +105199,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -105717,7 +105714,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -105734,8 +105731,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -106250,7 +106246,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -106267,8 +106263,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -106783,7 +106778,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -106800,8 +106795,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -107316,7 +107310,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -107333,8 +107327,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -107849,7 +107842,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -107866,8 +107859,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -108382,7 +108374,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -108399,8 +108391,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -108915,7 +108906,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -108932,8 +108923,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -109448,7 +109438,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -109465,8 +109455,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -109981,7 +109970,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -109998,8 +109987,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -110514,7 +110502,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -110531,8 +110519,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -111047,7 +111034,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -111064,8 +111051,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -111580,7 +111566,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -111597,8 +111583,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -112113,7 +112098,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -112130,8 +112115,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -112646,7 +112630,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -112663,8 +112647,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -113179,7 +113162,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -113196,8 +113179,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -113712,7 +113694,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -113729,8 +113711,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -114245,7 +114226,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -114262,8 +114243,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -114778,7 +114758,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -114795,8 +114775,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -115311,7 +115290,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -115328,8 +115307,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -115844,7 +115822,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -115861,8 +115839,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -116377,7 +116354,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -116394,8 +116371,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -116910,7 +116886,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -116927,8 +116903,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -117443,7 +117418,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -117460,8 +117435,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -117976,7 +117950,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -117993,8 +117967,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -118509,7 +118482,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -118526,8 +118499,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -119042,7 +119014,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -119059,8 +119031,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -119575,7 +119546,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -119592,8 +119563,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -120108,7 +120078,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -120125,8 +120095,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -120641,7 +120610,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -120658,8 +120627,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -121174,7 +121142,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -121191,8 +121159,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -121707,7 +121674,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -121724,8 +121691,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -122240,7 +122206,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -122257,8 +122223,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -122773,7 +122738,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -122790,8 +122755,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -123306,7 +123270,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -123323,8 +123287,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -123839,7 +123802,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -123856,8 +123819,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -124372,7 +124334,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -124389,8 +124351,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -124905,7 +124866,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -124922,8 +124883,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -125438,7 +125398,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -125455,8 +125415,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -125971,7 +125930,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -125988,8 +125947,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -126504,7 +126462,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -126521,8 +126479,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -127037,7 +126994,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -127054,8 +127011,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -127570,7 +127526,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -127587,8 +127543,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -128103,7 +128058,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -128120,8 +128075,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -128636,7 +128590,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -128653,8 +128607,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -129169,7 +129122,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -129186,8 +129139,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -129702,7 +129654,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -129719,8 +129671,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -130235,7 +130186,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -130252,8 +130203,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -130768,7 +130718,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -130785,8 +130735,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -131301,7 +131250,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -131318,8 +131267,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -131834,7 +131782,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -131851,8 +131799,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -132367,7 +132314,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -132384,8 +132331,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -132900,7 +132846,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -132917,8 +132863,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -133433,7 +133378,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -133450,8 +133395,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -133966,7 +133910,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -133983,8 +133927,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -134499,7 +134442,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -134516,8 +134459,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -135032,7 +134974,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -135049,8 +134991,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -135565,7 +135506,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -135582,8 +135523,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -136098,7 +136038,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -136115,8 +136055,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -136631,7 +136570,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -136648,8 +136587,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -137164,7 +137102,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -137181,8 +137119,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -137697,7 +137634,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -137714,8 +137651,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -138230,7 +138166,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -138247,8 +138183,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -138763,7 +138698,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -138780,8 +138715,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -139296,7 +139230,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -139313,8 +139247,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -139829,7 +139762,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -139846,8 +139779,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -140362,7 +140294,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -140379,8 +140311,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -140895,7 +140826,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -140912,8 +140843,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -141428,7 +141358,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -141445,8 +141375,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -141961,7 +141890,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -141978,8 +141907,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -142494,7 +142422,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -142511,8 +142439,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -143027,7 +142954,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -143044,8 +142971,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -143560,7 +143486,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -143577,8 +143503,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -144093,7 +144018,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -144110,8 +144035,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -144626,7 +144550,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -144643,8 +144567,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -145159,7 +145082,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -145176,8 +145099,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -145692,7 +145614,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -145709,8 +145631,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -146225,7 +146146,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -146242,8 +146163,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -146758,7 +146678,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -146775,8 +146695,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -147291,7 +147210,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -147308,8 +147227,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -147824,7 +147742,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -147841,8 +147759,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -148357,7 +148274,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -148374,8 +148291,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -148890,7 +148806,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -148907,8 +148823,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -149423,7 +149338,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -149440,8 +149355,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -149956,7 +149870,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -149973,8 +149887,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -150489,7 +150402,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -150506,8 +150419,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -151022,7 +150934,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -151039,8 +150951,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -151555,7 +151466,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -151572,8 +151483,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -152088,7 +151998,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -152105,8 +152015,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -152621,7 +152530,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -152638,8 +152547,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -153154,7 +153062,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -153171,8 +153079,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -153687,7 +153594,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -153704,8 +153611,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -154220,7 +154126,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -154237,8 +154143,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -154753,7 +154658,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -154770,8 +154675,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -155286,7 +155190,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -155303,8 +155207,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -155819,7 +155722,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -155836,8 +155739,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -156352,7 +156254,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -156369,8 +156271,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -156885,7 +156786,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -156902,8 +156803,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -157418,7 +157318,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -157435,8 +157335,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -157951,7 +157850,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -157968,8 +157867,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -158484,7 +158382,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -158501,8 +158399,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -159017,7 +158914,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -159034,8 +158931,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -159550,7 +159446,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -159567,8 +159463,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -160083,7 +159978,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -160100,8 +159995,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -160616,7 +160510,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -160633,8 +160527,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -161149,7 +161042,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -161166,8 +161059,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -161682,7 +161574,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -161699,8 +161591,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -162215,7 +162106,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -162232,8 +162123,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -162748,7 +162638,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -162765,8 +162655,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -163281,7 +163170,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -163298,8 +163187,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -163814,7 +163702,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -163831,8 +163719,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -164347,7 +164234,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -164364,8 +164251,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -164880,7 +164766,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -164897,8 +164783,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -165413,7 +165298,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -165430,8 +165315,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -165946,7 +165830,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -165963,8 +165847,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -166479,7 +166362,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -166496,8 +166379,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -183953,7 +183835,7 @@ "fieldname": "SkirtLength", "key": "skirt_length", "recommended": false, - "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." + "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." }, { "type": "measurement", @@ -183970,8 +183852,7 @@ "fieldname": "SleeveLength", "key": "sleeve_length", "recommended": false, - "description": "The numeric length value of skirts from waist to bottom. Does not include style values like Maxi." - }, + "description": "The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve." }, { "type": "enum", "example": "3\/4 Sleeve", @@ -938052,4 +937933,4 @@ } ] } -} +} \ No newline at end of file diff --git a/data/google_category_to_attribute_mapping_fields.json b/data/google_category_to_attribute_mapping_fields.json index 32e8481b4..b21e47454 100644 --- a/data/google_category_to_attribute_mapping_fields.json +++ b/data/google_category_to_attribute_mapping_fields.json @@ -1 +1 @@ -{"5773e3cf8b57a590831b2fa4966071b7":{"key":"gender","fieldname":"Gender","recommended":false,"type":"enum","description":"Gender the product item is targeted towards","enum_values":["female","male","unisex"],"can_have_unknown_value":false},"48f499603e045536424c8db9e2b51338":{"key":"brand","fieldname":"Brand","recommended":false,"type":"string","description":"Brand name, unique manufacturer part number (MPN), or Global Trade Item Number (GTIN) of the item."},"e44fa2f9d73d8394fc19e11bda594270":{"key":"color","fieldname":"Color","recommended":false,"type":"string","description":"Color of the product item"},"3c93dcbe5e2427633884455f8fdf3d0a":{"key":"size","fieldname":"size","recommended":false,"type":"string","description":"Size of the product item"},"14360682ab38bda0c27cd410da1ddb93":{"key":"pattern","fieldname":"Pattern","recommended":false,"type":"string","description":"Pattern of the product item"},"57a5027e44183e4bee60fd79e0f72215":{"key":"material","fieldname":"Material","recommended":false,"type":"string","description":"Material of the product item"},"536559919dfbf7c806f82836c7b6ace0":{"key":"age_group","fieldname":"AgeGroup","recommended":false,"type":"enum","description":"Age group the product item is targeted towards","enum_values":["adult","all ages","infant","kids","newborn","teen","toddler"],"can_have_unknown_value":false},"fdbb66325f7179c53e0d013f85a8f1bb":{"key":"material","fieldname":"Material","recommended":true,"type":"string","description":"Material of the product item"},"56beea7a921d2d0a4b65bcb91de4619f":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MinimumWeight","key":"minimum_weight","recommended":true,"description":"The lower weight limit or capability of an item,often used in conjunction with \"Maximum Weight\".The meaning varies with context of product.For example, when used with \"Maximum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"b4e2ba079a90aafe22d7b40a27a8a86b":{"type":"string","example":"1-3 Years","can_have_multiple_values":false,"fieldname":"AgeRange","key":"age_range","recommended":true,"description":"Minimum and Maximum Ages for a product. Note: the unit of measure in\n Months, or Years."},"d86e410dc0b595fa52c8071297df164e":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWidth","key":"product_width","recommended":true,"description":"The width of the fully assembled product."},"fb29eb2f1bed6b57202be5766b13a012":{"key":"color","fieldname":"Color","recommended":true,"type":"string","description":"Color of the product item"},"6f6763dc75294a1700c3325ed0e01501":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductLength","key":"product_length","recommended":true,"description":"The length of the fully assembled product."},"a125082f8b596fd6a3fc4ef69aac4ce9":{"key":"gender","fieldname":"Gender","recommended":true,"type":"enum","description":"Gender the product item is targeted towards","enum_values":["female","male","unisex"],"can_have_unknown_value":false},"b77f4835261839838cf7da93a4397624":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductHeight","key":"product_height","recommended":true,"description":"The height of the fully assembled product"},"fab78b5f78ea9c6822f0efd4b76812c7":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumWeight","key":"maximum_weight","recommended":true,"description":"The upper weight limit or capability of an item,often used in conjunction with \"Minimum Weight\".The meaning varies with context of product.For example, when used with \"Minimum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"c33d8f504a0d16cc768948032b96bb86":{"type":"string","example":["Waterproof"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"75d33e09027a3e497cd7f4871c44d0ad":{"type":"string","example":"Shape Identification","can_have_multiple_values":false,"fieldname":"EducationalFocus","key":"educational_focus","recommended":false,"description":"Describes the educational skills that the product is intended to improve"},"a61b31aad2b1cff7a5e059435aa0c079":{"type":"string","example":"Chewbacca","can_have_multiple_values":false,"fieldname":"Character","key":"character","recommended":false,"description":"The particular character, person or entity that your item represents or is associated with."},"186773615b385aea09f78bf7846c2da2":{"type":"string","example":"Space","can_have_multiple_values":false,"fieldname":"Theme","key":"theme","recommended":false,"description":"The particular subject, theme or idea that your item represents or is associated with."},"f0cc9df58632d42a9f64e187e36822ac":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsAssemblyRequired","key":"is_assembly_required","recommended":true,"description":"Indicates if the product arrives unassembledand must be put together before use."},"18213b9375e78464379a596bc5a12105":{"type":"string","example":"jogging","can_have_multiple_values":false,"fieldname":"StrollerType","key":"stroller_type","recommended":false,"description":"Prominent stroller styles."},"e294d165c14bf93d4ff9d565c45b86f0":{"type":"enum","example":["Foldable"],"can_have_multiple_values":true,"enum_values":["Foldable"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"09e6b8670b86e122237dee1d1948f5e3":{"type":"string","example":"3-point harness","can_have_multiple_values":false,"fieldname":"SafetyHarnessStyle","key":"safety_harness_style","recommended":false,"description":"The style of the occupant restraint harness included with the car\n seat, stroller, carrier, etc."},"5a781cf5acf5b20a3457889ab0719688":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberOfSeats","key":"number_of_seats","recommended":false,"description":"The number of people that can be accommodated by the\n available seats of an item."},"acb1aef05b9c5b358e8d767422053a0c":{"type":"string","example":"Convertible Car Seats","can_have_multiple_values":false,"fieldname":"ChildCarSeatStyle","key":"child_car_seat_style","recommended":false,"description":"Prominent car seat styles."},"84520363ef89687443e2b75aac0ca2a4":{"type":"string","example":"3 ft","can_have_multiple_values":false,"fieldname":"CarSeatMaxChildHeight","key":"car_seat_max_child_height","recommended":false,"description":"The maximum height of the child occupant as given by the\n manufacturer, measured in inches or centimeters."},"9d014a512c1e3019550901b0c0494ff4":{"type":"string","example":"Forward-Facing","can_have_multiple_values":false,"fieldname":"CarSeatFacingDirection","key":"car_seat_facing_direction","recommended":false,"description":"Which direction the car seat faces."},"c139a1077e40bc1ed55105d8250cfbd7":{"type":"string","example":"sling","can_have_multiple_values":false,"fieldname":"BabyCarrierStyle","key":"baby_carrier_style","recommended":false,"description":"Prominent wearable baby carrier styles."},"de2ea24937f3cfb9d23a6184b6bb1717":{"type":"string","example":"front carry-facing in","can_have_multiple_values":false,"fieldname":"BabyCarrierPosition","key":"baby_carrier_position","recommended":false,"description":"Applies to wearable baby carriers. Describes the part of the body\n against which the child is placed along with the direction the child\n faces (where applicable) while in the wearable baby carrier."},"3e6c4c356607b43e111bc414a797367c":{"type":"integer","example":12,"can_have_multiple_values":false,"fieldname":"PackageQuantity","key":"package_quantity","recommended":true,"description":"The total number of items included in the package or box."},"b2e91b6002cde2bfa85933056e1fbab1":{"key":"size","fieldname":"size","recommended":true,"type":"string","description":"Size of the product item"},"e84c396def9cf6dfa460ad427e4086f1":{"type":"string","example":["Stop using if you experience swelling, rash, or fever"],"can_have_multiple_values":true,"fieldname":"StopUseIndications","key":"stop_use_indications","recommended":false,"description":"Information that describes symptoms or reactions that\n indicate when to stop using the product."},"f9f15a8a99459328f839fb1423283f15":{"type":"string","example":["Vanilla"],"can_have_multiple_values":true,"fieldname":"Scent","key":"scent","recommended":false,"description":"The scent or fragrance of your item; including items\n labelled as \"unscented\""},"ad4e681a4cf1c32d992b0119533bb4f3":{"type":"string","example":"Oil","can_have_multiple_values":false,"fieldname":"ProductForm","key":"product_form","recommended":false,"description":"The consistency, texture or formulation of the item and the way\n it will be consumed or dispensed."},"4ddda60fca4317fa3a260bc6a716eacb":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumWeight","key":"maximum_weight","recommended":false,"description":"The upper weight limit or capability of an item,often used in conjunction with \"Minimum Weight\".The meaning varies with context of product.For example, when used with \"Minimum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"9bf1fceb6bbc26681a6531a069d97089":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MinimumWeight","key":"minimum_weight","recommended":false,"description":"The lower weight limit or capability of an item,often used in conjunction with \"Maximum Weight\".The meaning varies with context of product.For example, when used with \"Maximum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"1b2a0250577aa3367755a9d309396596":{"type":"string","example":["Apply to wet hair","Massage into scalp","Rinse thoroughly"],"can_have_multiple_values":true,"fieldname":"Instructions","key":"instructions","recommended":false,"description":"Detailed information telling how the product should be operated,\n assembled, or consumed."},"cb857165d244dc15e39ea8f1e8752ee8":{"type":"string","example":["some_string","other"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":false,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"06824c1d350fd02b20f1ccb63dc70aa2":{"type":"string","example":"Cloth","can_have_multiple_values":false,"fieldname":"DiaperType","key":"diaper_type","recommended":false,"description":"Describes the type of diaper"},"fdb673fe23dcfd4e913ea68db30f1886":{"type":"enum","example":"Infant","can_have_multiple_values":false,"enum_values":["Newborn","Infant","Toddler"],"can_have_unknown_value":false,"fieldname":"BabyLifeStage","key":"baby_life_stage","recommended":false,"description":"Describes the life stage of the child"},"4a1709fc558601d050f61caacf1886f7":{"type":"string","example":"Stage 1","can_have_multiple_values":false,"fieldname":"BabyFoodStage","key":"baby_food_stage","recommended":true,"description":"Attribute designed to capture the generalized age grouping (commonly referred to as \"stage\") of a given baby food, as specified by manufacturer. Example descriptions: Stage 1 - Foods have a single ingredient and are pureed and generally contain about 2.5 oz of fruits, veggies or meats. Stage 2 - Foods are strained instead of pureed and have a combination of fruits or veggies instead of single ingredients, contain larger portions. Stage 3 - Foods are mashed and have more texture than the pureed foods and may have bits and chunks of meats or veggies."},"b5ab18b31d909d41c1dc88e00bac6e44":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWidth","key":"product_width","recommended":false,"description":"The width of the fully assembled product."},"812cdd6be6bd77d8fae155eee4b5ca8e":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductLength","key":"product_length","recommended":false,"description":"The length of the fully assembled product."},"045b717bb79c0b39f9d17afd53120c44":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductHeight","key":"product_height","recommended":false,"description":"The height of the fully assembled product"},"666634cdd39d094fdf806ea000651fd9":{"type":"integer","example":12,"can_have_multiple_values":false,"fieldname":"PackageQuantity","key":"package_quantity","recommended":false,"description":"The total number of items included in the package or box."},"1f60a7e1c843194aef22644bdc923372":{"type":"string","example":["Yams"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":false,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"0412c658ae5558750f3d8dcf73b35e2f":{"type":"string","example":["Cinnamon","Peppermint"],"can_have_multiple_values":true,"fieldname":"Flavor","key":"flavor","recommended":false,"description":"Describes the taste or flavor of the item, as described by the\n manufacturer. May be an important attribute for shoppers for items\n like dental products, medicine or baby foods."},"003aaedcb75e3bdf52a4a7c043bc83bf":{"type":"string","example":"Contains Peanuts","can_have_multiple_values":false,"fieldname":"Allergens","key":"allergens","recommended":false,"description":"Statement regarding any ingredients that may be food allergens, often written as \"Contains X\" or \"Manufactured in a facility which processes Y.\""},"f29ece641eb9d606c99f8ff1375cdafd":{"type":"string","example":16,"can_have_multiple_values":false,"fieldname":"Megapixels","key":"megapixels","recommended":true,"description":"Describes the resolution at which this item records images."},"198abe5c383734cf1f5c25725ad05626":{"type":"string","example":6,"can_have_multiple_values":false,"fieldname":"DigitalZoom","key":"digital_zoom","recommended":true,"description":"Describes the magnification power provided by a feature that electronically enlarges the image area"},"3c84275e3f255e24439d4d2acca1738c":{"type":"string","example":10,"can_have_multiple_values":false,"fieldname":"OpticalZoom","key":"optical_zoom","recommended":true,"description":"Describes the magnification power of a physical optical zoom lens."},"5546fa0a68017a13c3d54f434b16e543":{"type":"string","example":"Lenovo Thinkpad","can_have_multiple_values":false,"fieldname":"Model","key":"model","recommended":true,"description":"The common name of the model of the product. Does not include model numbers."},"c4140fbb308019e33a32ebef93a21145":{"key":"brand","fieldname":"Brand","recommended":true,"type":"string","description":"Brand name, unique manufacturer part number (MPN), or Global Trade Item Number (GTIN) of the item."},"c73360481bac2974a2647239ba9ac090":{"type":"string","example":"USB 2.0","can_have_multiple_values":false,"fieldname":"USBTechnology","key":"u_s_b_technology","recommended":false,"description":"Describes the version of USB technology on the product."},"fb5d85a3717fff61798f843282121fc6":{"type":"enum","example":["Flash"],"can_have_multiple_values":true,"enum_values":["35mm Jack","Downloadable Content","Online Multiplayer","Touchscreen","Bluetooth","GPS","SIM","USB Connectivity","WLAN","Portable","Unlocked","Auto Document Feeder","Auto Two-Sided Printing","Energy Star Certified","Integrated Speakers","3D","Smart","Flash","Microphone","Red Eye Reduction"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"e52c7222866dfa79fb54fb46377f2dba":{"type":"string","example":"USB-C","can_have_multiple_values":false,"fieldname":"USBType","key":"u_s_b_type","recommended":false,"description":"Describes the type of USB connector on the product."},"a557ee533a27f6ba2ab2896f50128d2b":{"type":"string","example":["Portrait"],"can_have_multiple_values":true,"fieldname":"ShootingModes","key":"shooting_modes","recommended":false,"description":"Describes the available settings designed to accommodate different photographic situations."},"cb76a2503550b23c7e96374acff9974c":{"type":"string","example":250,"can_have_multiple_values":false,"fieldname":"MinimumShutterSpeed","key":"minimum_shutter_speed","recommended":false,"description":"Describes the minimum shutter speed of the item. Measured in seconds."},"dfa8888400db20a0c59123675195f680":{"type":"string","example":2,"can_have_multiple_values":false,"fieldname":"SelfTimerDelay","key":"self_timer_delay","recommended":false,"description":"Length of time in seconds the self-timer will allow before it\n takes a photo"},"80a2c75641a182aabe897e4d0c5c8ea2":{"type":"measurement","example":"42 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ScreenSize","key":"screen_size","recommended":false,"description":"Describes the measurement of the device's screen, typically measured diagonally in inches."},"4b71478ae3751b69220f8f35f0f65ab9":{"type":"string","example":"1\/2.3 in","can_have_multiple_values":false,"fieldname":"SensorResolution","key":"sensor_resolution","recommended":false,"description":"One specification describing the smallest detectable incremental change of input parameter that can be detected in the output signal. For digital cameras, image sensor resolution is an important factor for image quality."},"82aef4349fbc23a369243c604b574e3a":{"type":"string","example":"f\/16","can_have_multiple_values":false,"fieldname":"MinimumAperture","key":"minimum_aperture","recommended":false,"description":"The smallest aperture this item accommodates; typically expressed in f-numbers."},"73d65ceca095eeba210477fa2c3566ca":{"type":"string","example":"f\/5","can_have_multiple_values":false,"fieldname":"FocalRatio","key":"focal_ratio","recommended":false,"description":"Ratio of the lens's focal length, to the diameter of the entrance pupil. Also known as the f-number or f-stop, this number indicates lens speed."},"7518e31e367a461a82c93d537dc2c7da":{"type":"string","example":["iPad"],"can_have_multiple_values":true,"fieldname":"CompatibleDevices","key":"compatible_devices","recommended":false,"description":"Devices compatible with the item."},"ba6bb30e5d011b3182c2d01d3ec52356":{"type":"string","example":"HDMI","can_have_multiple_values":false,"fieldname":"ConnectorType","key":"connector_type","recommended":false,"description":"Describes the types of connections supported on the item."},"aaa86538e1892f9637b83693ea86da06":{"type":"string","example":"LCD","can_have_multiple_values":false,"fieldname":"DisplayTechnology","key":"display_technology","recommended":false,"description":"Describes the type of technology that powers the display, like LED or LCD."},"3f3305be9612e01d2d0b854c2e23dd0f":{"type":"string","example":"Built-in Camera","can_have_multiple_values":false,"fieldname":"FlashType","key":"flash_type","recommended":false,"description":"The type of flash the camera has or can accommodate."},"27ac044687275eca92c8ffc695dfcfac":{"type":"string","example":18,"can_have_multiple_values":false,"fieldname":"FocalLength","key":"focal_length","recommended":false,"description":"On a camera or lens, the distance between the image sensor and the lens when the subject is in focus,stated as a range in millimeters."},"b5dd74005f37c4313d88aaf9ec09a6ce":{"type":"measurement","example":"10 h","enum_values":["s","m","h","d"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"BatteryLife","key":"battery_life","recommended":false,"description":"Describes the total battery life (or maximum run time) of the item, typically measured in hours."},"25dd344c790ce67c74887cef8bf51bf9":{"type":"string","example":["Scratch-Resistant"],"can_have_multiple_values":true,"fieldname":"LensCoating","key":"lens_coating","recommended":false,"description":"Type of thin layer of material applied to the surface of lenses or other optical elements that provide specific effects."},"37ced536fc643daf19b3e78c6109d462":{"type":"string","example":49,"can_have_multiple_values":false,"fieldname":"LensDiameter","key":"lens_diameter","recommended":false,"description":"Measurement of the diameter of the front portion of the lens, measured in mm."},"fa1806a7580ccac912c41dc13a38f9f2":{"type":"string","example":"Cooling","can_have_multiple_values":false,"fieldname":"LensFilter","key":"lens_filter","recommended":false,"description":"Describes the kind of filter attached to a lens."},"ee8a6aaa75b14a3f55320e0ff3bf4e19":{"type":"string","example":"f\/1.4","can_have_multiple_values":false,"fieldname":"MaximumAperture","key":"maximum_aperture","recommended":false,"description":"Size of the largest aperture this item accommodates; typically expressed in f-numbers."},"2693162e8e03185c2f7147c2ed198794":{"type":"string","example":0.00025,"can_have_multiple_values":false,"fieldname":"MaximumShutterSpeed","key":"maximum_shutter_speed","recommended":false,"description":"Describes the maximum shutter speed of the item. Measured in seconds."},"2af16c00b68ea710c43881873f0c0eab":{"type":"string","example":["WiFi"],"can_have_multiple_values":true,"fieldname":"WirelessTechnologies","key":"wireless_technologies","recommended":false,"description":"Describes the types of wireless technologies that can be used by the product."},"1d70a2d3ce76a127d1ffb1b2f4209ac9":{"key":"age_group","fieldname":"AgeGroup","recommended":true,"type":"enum","description":"Age group the product item is targeted towards","enum_values":["adult","all ages","infant","kids","newborn","teen","toddler"],"can_have_unknown_value":false},"6d21b5b1295293a171d1c7d989e9db81":{"type":"string","example":["Bodycon"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"df971d2b5138c017068b1b1ca5fe7ff0":{"key":"pattern","fieldname":"Pattern","recommended":true,"type":"string","description":"Pattern of the product item"},"7992ac8898667c0ac4a874e914c71ec0":{"type":"string","example":["Designer","Embroidered"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"03321e77f42ca941c319d9d3a696e822":{"type":"string","example":"Flutter","can_have_multiple_values":false,"fieldname":"SleeveStyle","key":"sleeve_style","recommended":false,"description":"The style of sleeves. Does not include sleeve length styles."},"ef7cf809c0d3f3dde722b692949e8a82":{"type":"enum","example":"US","can_have_multiple_values":false,"enum_values":["US","UK","EU","DE","FR","JP","CN","IT","BR","MEX","AU"],"can_have_unknown_value":true,"fieldname":"SizeSystem","key":"size_system","recommended":false,"description":"The size system used by your item, usually corresponds to Country."},"891fd9d63794da9979642269ffdf2bdb":{"type":"measurement","example":"32 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SkirtLength","key":"skirt_length","recommended":false,"description":"The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve."},"d0074b6e5f6d004d8b24dee11da5c838":{"type":"measurement","example":"32 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SleeveLength","key":"sleeve_length","recommended":false,"description":"The numeric length value of skirts from waist to bottom. Does not include style values like Maxi."},"c49d53b2f6e3b840d1b3b36cf763b823":{"type":"enum","example":"3\/4 Sleeve","can_have_multiple_values":false,"enum_values":["3\/4 Sleeve","Long Sleeve","Short Sleeve","Sleeveless"],"can_have_unknown_value":true,"fieldname":"SleeveLengthStyle","key":"sleeve_length_style","recommended":false,"description":"The style of sleeve length. Does not include sleeve styles."},"ebc88b022a77d94e80822b572e926b7a":{"type":"string","example":["Tennis"],"can_have_multiple_values":true,"fieldname":"Sport","key":"sport","recommended":false,"description":"The particular sport or activity for which your item is intended."},"5db117ce3ae7225ccccb737276630902":{"type":"enum","example":"Ankle","can_have_multiple_values":false,"enum_values":["Ankle","Crew","Knee High","Mid Calf","No Show","Over the Knee","Thigh High"],"can_have_unknown_value":true,"fieldname":"SockRise","key":"sock_rise","recommended":false,"description":"The height style of socks."},"bde7f38a6a5fa76697d288227050040e":{"type":"string","example":["Golden State Warriors"],"can_have_multiple_values":true,"fieldname":"SportsLeague","key":"sports_league","recommended":false,"description":"The particular sports league that your item represents or is associated with."},"f87289e65273a3a8c33c2fd3dc5b6d4b":{"type":"string","example":["NFL"],"can_have_multiple_values":true,"fieldname":"SportsTeam","key":"sports_team","recommended":false,"description":"The particular sports team that your item represents or is associated with."},"a9dc83480290657ae724a1d0fe346563":{"type":"enum","example":["Water Resistant"],"can_have_multiple_values":true,"enum_values":["Waterproof","Water Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"790ed72ed6a00633b47d5959d9869e00":{"type":"string","example":"Racerback","can_have_multiple_values":false,"fieldname":"UpperBodyStrapConfiguration","key":"upper_body_strap_configuration","recommended":false,"description":"The strap style for items like tops, bras, and swimsuits."},"8b9b340f74a391da8163b1edfbaeeef9":{"type":"string","example":"Ultra High","can_have_multiple_values":false,"fieldname":"WaistRise","key":"waist_rise","recommended":false,"description":"The height where the waistline of the item lies on the body."},"ed9805103a40909dbd170d6a15d59e57":{"type":"measurement","example":"30 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WaistSize","key":"waist_size","recommended":false,"description":"The numeric size of the waist for lower body garments. Does not include generic sizes like Small."},"59d583067536c9a9f0092ad4349b4107":{"type":"string","example":"Opaque","can_have_multiple_values":false,"fieldname":"Sheerness","key":"sheerness","recommended":false,"description":"The amount of sheerness or opacity of an item. Usually used for hosiery items."},"5917325df899badf730967031c51828e":{"type":"string","example":"Relaxed","can_have_multiple_values":false,"fieldname":"PantFit","key":"pant_fit","recommended":false,"description":"The general fit style of pants. Also applies to jeans."},"5d2faf8e7cd918c37585a3582ce67d41":{"type":"string","example":"Ankle","can_have_multiple_values":false,"fieldname":"PantLengthStyle","key":"pant_length_style","recommended":false,"description":"The length style of pants. Also applies to jeans & leggings."},"79d33c7a4244cde541284dffebd8af57":{"type":"string","example":["Distressed","Faded"],"can_have_multiple_values":true,"fieldname":"DenimFeatures","key":"denim_features","recommended":false,"description":"Features, embellishments & finishes that are specific to jeans."},"088788414687d075b58111bf0a9e6b28":{"type":"integer","example":32,"can_have_multiple_values":false,"fieldname":"BraBandSize","key":"bra_band_size","recommended":false,"description":"The band size of the bra."},"f8cd81278f0a424f4552e69119f8ce3e":{"type":"string","example":"A","can_have_multiple_values":false,"fieldname":"BraCupSize","key":"bra_cup_size","recommended":false,"description":"The cup size of the bra."},"3eb05a953435b526264c76134a8b02df":{"type":"measurement","example":"34 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ChestSize","key":"chest_size","recommended":false,"description":"The numeric size of the chest measurement for the item. Does not include generic sizes like Small."},"7951a620026294a95a0ac44f9ba71eee":{"type":"string","example":"Zipper","can_have_multiple_values":false,"fieldname":"Closure","key":"closure","recommended":false,"description":"The type of fastener used to close your item."},"114da48906462d334d5d7f59893d434d":{"type":"enum","example":"Big & Tall","can_have_multiple_values":false,"enum_values":["Big & Tall","Regular","Big Boys","Big Girls","Full Size","Little Boys","Little Girls","Petite","Plus","Maternity","Baby Boy","Baby Girls","Toddler Boys","Toddler Girls"],"can_have_unknown_value":true,"fieldname":"ClothingSizeType","key":"clothing_size_type","recommended":false,"description":"The general grouping of different sizes based on age & gender."},"e1cc3ced186fc459db4f1778dabbc6c0":{"type":"string","example":"Banded","can_have_multiple_values":false,"fieldname":"CollarStyle","key":"collar_style","recommended":false,"description":"The style of collar on your item."},"07a68126da1326bbb99e0ffd81455258":{"type":"string","example":["Do Not Iron","Dry Clean Only"],"can_have_multiple_values":true,"fieldname":"FabricCareInstructions","key":"fabric_care_instructions","recommended":false,"description":"The specific care instructions for how the fabric of your item should be cleaned. This can be found on the label of the item."},"c4398a3afbb4b58166ab7090026a1c5f":{"type":"string","example":"Boot Cut","can_have_multiple_values":false,"fieldname":"PantLegStyle","key":"pant_leg_style","recommended":false,"description":"The style or cut of pant legs. Also applies to jeans."},"8908691dbe1fc7cf9b8ec543a30ccf74":{"type":"measurement","example":"30 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Inseam","key":"inseam","recommended":false,"description":"The numeric size of the inseam for items like pants, jeans and leggings. Does not include generic sizes like Small."},"0c682655422cf862d012da48c74e9045":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsAdultProduct","key":"is_adult_product","recommended":false,"description":"Indicates if your product is sexually suggestive and intended only for adults."},"e32d81cb2795fb799d41e9beb75914a1":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsCostume","key":"is_costume","recommended":false,"description":"Indicates if the item is intended to be worn as a costume."},"044e1e8f4a2fb735e0f63e44c3217379":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsOutfitSet","key":"is_outfit_set","recommended":false,"description":"Indicates if the product has 2 or more different items that come as part of a matching or oufit set, like matching shirt & pants or bra & underwear set"},"11c967a5fc1a473d71ba4e8ac43d35c4":{"type":"string","example":"Acid Wash","can_have_multiple_values":false,"fieldname":"JeanWash","key":"jean_wash","recommended":false,"description":"The post-process wash treatment that may alter color or texture of denim products."},"f26b323c65bc8413143b53c424cb106c":{"type":"string","example":"Crew Neck","can_have_multiple_values":false,"fieldname":"Neckline","key":"neckline","recommended":false,"description":"The neckline or neck style of the item."},"efe63cfc2af39e9b3904b04f339137a8":{"type":"string","example":["Bridesmaid"],"can_have_multiple_values":true,"fieldname":"Occasion","key":"occasion","recommended":false,"description":"The type of special occassion(s) for which your item is intended or specialized."},"00efcecb28226b61fa715ceed2408546":{"type":"string","example":"Banded","can_have_multiple_values":false,"fieldname":"WaistStyle","key":"waist_style","recommended":false,"description":"The style of the waist on the item. Can apply to pants or dresses."},"f8b8550acb981fe24299736073b56104":{"type":"string","example":["Bow Tie"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"a53318a479999a52de362427c1af31da":{"type":"string","example":"Narrow","can_have_multiple_values":false,"fieldname":"SunglassesWidth","key":"sunglasses_width","recommended":false,"description":"The width of the sunglasses frame."},"422e14c47d8c95351a13574b5ffe3076":{"type":"string","example":"Anti-Reflective","can_have_multiple_values":false,"fieldname":"SunglassesLensTechnology","key":"sunglasses_lens_technology","recommended":false,"description":"The technology or treatment of sunglasses lenses."},"36415ae546c8d7681c9ede23fdc1ddc3":{"type":"enum","example":"Beige","can_have_multiple_values":false,"enum_values":["Beige","Black","Blue","Bronze","Brown","Gold","Gray","Green","Multi-Color","Orange","Pink","Purple","Red","Silver","White","Yellow"],"can_have_unknown_value":true,"fieldname":"SunglassesLensColor","key":"sunglasses_lens_color","recommended":false,"description":"The color of sunglasses lenses."},"70c39caa59cfd987167f972dd9aba990":{"type":"string","example":"Classic","can_have_multiple_values":false,"fieldname":"TieWidth","key":"tie_width","recommended":false,"description":"The width of tie."},"8125fc680ed8690436264f94a52dd4e9":{"type":"string","example":["Chukka"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"cd9f78020f15de834fcc58d3d563ebac":{"type":"string","example":"A","can_have_multiple_values":false,"fieldname":"ShoeWidth","key":"shoe_width","recommended":true,"description":"The width of the shoes."},"b0bd5a2777af18be80307b03175a050a":{"type":"enum","example":["Water Resistant"],"can_have_multiple_values":true,"enum_values":["Orthopedic","Waterproof","Water Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"30bc46e76de465db006632f51b9dc9bc":{"type":"enum","example":"Flats","can_have_multiple_values":false,"enum_values":["Flats","Boots","Heels","Sandals","Slippers","Athletic Shoes","Fashion Sneakers"],"can_have_unknown_value":true,"fieldname":"ShoeType","key":"shoe_type","recommended":false,"description":"The type of shoes."},"eb7731477ae172c98b8653d26038d351":{"type":"string","example":"Wedge","can_have_multiple_values":false,"fieldname":"HeelStyle","key":"heel_style","recommended":false,"description":"The style of heel on the shoes."},"9847453e3dfb3f97dd262911e96927fc":{"type":"measurement","example":"0.5 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"HeelHeight","key":"heel_height","recommended":false,"description":"The numeric height of the heel on the shoes."},"24cdfc97c883070990bfe53a9ab4fcc1":{"type":"string","example":["Hoops"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"ae3548dbfd62e601abeefe809b9804fe":{"type":"string","example":["Ruby","Emerald"],"can_have_multiple_values":true,"fieldname":"Gemstone","key":"gemstone","recommended":true,"description":"The type of gemstone(s) in your item."},"c2b8ee902fdca1b35815f183af905f6a":{"type":"string","example":["Vintage","Engraved"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"f0933d6a49ace1948a6f904be052d459":{"type":"enum","example":["Resizable"],"can_have_multiple_values":true,"enum_values":["Resizable","Water Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"0a55223a8807dfafc4e957899053f571":{"type":"string","example":"Silver","can_have_multiple_values":false,"fieldname":"PlatingMaterial","key":"plating_material","recommended":false,"description":"The type of metal or material which your item is plated or covered with."},"deb41e4835824a3ada806d318df5ffe0":{"type":"string","example":"14k","can_have_multiple_values":false,"fieldname":"MetalStampOrPurity","key":"metal_stamp_or_purity","recommended":false,"description":"The metal purity of your item. Sometimes this is indicated or stamped directly onto jewelry items."},"6e7562a9f0a1c4675f7ca5d15cf53e6a":{"type":"string","example":"2 prong","can_have_multiple_values":false,"fieldname":"JewelrySettingStyle","key":"jewelry_setting_style","recommended":false,"description":"The style in which stones are set within or attached to a piece of jewelry"},"f0f118d833eecf0a3d4deb47ce1e8a2a":{"type":"string","example":["Best Friends Forever"],"can_have_multiple_values":true,"fieldname":"Inscription","key":"inscription","recommended":false,"description":"The text of what is engraved on the item. (Multiple Values Accepted)"},"3ed35b95494c9b3f2985fdb9dff7730d":{"type":"string","example":1.29,"can_have_multiple_values":false,"fieldname":"GemstoneWeight","key":"gemstone_weight","recommended":false,"description":"The total weight or mass (in carats) of the individual gemstone."},"58ba4a0325e3756373a8383a2bc5377d":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"GemstoneWidth","key":"gemstone_width","recommended":false,"description":"The width measurement of the gemstone in milimeters."},"8e0135de1890e1bc54c6f4524d2bb6a1":{"type":"string","example":["Dyed","Heat Treated"],"can_have_multiple_values":true,"fieldname":"GemstoneTreatment","key":"gemstone_treatment","recommended":false,"description":"Indicates any treatments or processing of the stone to change its color, clarity or durability."},"af11df6c0242d4276dc13b175379b723":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"GemstoneLength","key":"gemstone_length","recommended":false,"description":"The length measurement of the gemstone in milimeters."},"8f70200f0fd2e1a7987947575021f910":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"GemstoneHeight","key":"gemstone_height","recommended":false,"description":"The height measurement of the gemstone in milimeters."},"6ad2f369b3c9e5177d46ce54aaa855e3":{"type":"string","example":"Asscher","can_have_multiple_values":false,"fieldname":"GemstoneCut","key":"gemstone_cut","recommended":false,"description":"The style in which the gemstone(s) of your item have been cut and their general shape."},"be0f716b198ea39563b1ae49c03feaa7":{"type":"string","example":"Natural","can_have_multiple_values":false,"fieldname":"GemstoneCreationMethod","key":"gemstone_creation_method","recommended":false,"description":"The method by which the stone was created. Indicates if the stone is natural or manmade."},"087b63be2ec0b2c73fdeb21260a8429e":{"type":"string","example":"Colorless","can_have_multiple_values":false,"fieldname":"GemstoneColor","key":"gemstone_color","recommended":false,"description":"The color of the gemstone(s) in your item that accounts for hue, tone and saturation."},"40496e7589d7a3e945471afaa9b5eb77":{"type":"string","example":"FL","can_have_multiple_values":false,"fieldname":"GemstoneClarity","key":"gemstone_clarity","recommended":false,"description":"The quality and clarity of the visual aspect of the gemstone, particularly important for Diamonds. Indicates visual and and internal characteristics and surface defects of blemishes."},"3b714bc4f27197b27df4ed555063b227":{"type":"string","example":"Clip-On","can_have_multiple_values":false,"fieldname":"EarringBackFinding","key":"earring_back_finding","recommended":false,"description":"The type of fastening method for the backs of earrings."},"2a4450be3608cf3a38cad25f7d49b813":{"type":"string","example":"Lobster Clasp","can_have_multiple_values":false,"fieldname":"ClaspType","key":"clasp_type","recommended":false,"description":"The type of clasp or closure method of your item."},"b8b24c8698213706e91fb53948de8a69":{"type":"measurement","example":"12 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ChainLength","key":"chain_length","recommended":false,"description":"The length of the jewelry chain. Usually in inches."},"2ad129e62056d93bd1201aef398651bb":{"type":"string","example":1.29,"can_have_multiple_values":false,"fieldname":"TotalGemstoneWeight","key":"total_gemstone_weight","recommended":false,"description":"The total combined weight or mass (in carats) of all stones in the piece of jewelry."},"d9e0fd21a2211dee29551f555ae1036d":{"type":"string","example":["Bangle"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"cf48a2e1304c7e8e3df5e6a9eb67e991":{"type":"enum","example":"Electric","can_have_multiple_values":false,"enum_values":["Electric","Batteries"],"can_have_unknown_value":true,"fieldname":"PowerType","key":"power_type","recommended":false,"description":"Provides information on the exact type of power used by the item."},"abfc9636c9dd70941b01e4e077588073":{"type":"enum","example":["Calendar"],"can_have_multiple_values":true,"enum_values":["Calendar","Resizable","Water Resistant","Waterproof"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"0f94d987d41ce3cc234ca9051c468234":{"type":"measurement","example":"240 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchBandLength","key":"watch_band_length","recommended":false,"description":"The length of the watch band"},"8ea77ea069e2c0b4b74c167d9e394faf":{"type":"string","example":["Leather","Stainless Steel"],"can_have_multiple_values":true,"fieldname":"WatchBandMaterial","key":"watch_band_material","recommended":false,"description":"The primary material(s) from which the band of the watch is made."},"d3ac14e44af9ea925fd801578da42a63":{"type":"measurement","example":"22 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchBandWidth","key":"watch_band_width","recommended":false,"description":"The width of the watch band"},"028cde57179c9c4356a63649d170c6c4":{"type":"measurement","example":"42 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchCaseDiameter","key":"watch_case_diameter","recommended":false,"description":"The diameter of the watch case or dial"},"f4b65f0456fd44dd79accf30fa6002f6":{"type":"string","example":"Round","can_have_multiple_values":false,"fieldname":"WatchCaseShape","key":"watch_case_shape","recommended":false,"description":"The shape of the watch case or enclosure which contains the face & inner workings of the watch."},"37da4cf70f57a2eaf2671145d216b16e":{"type":"measurement","example":"12 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchCaseThickness","key":"watch_case_thickness","recommended":false,"description":"The thickness of the watch case or dial"},"eba94cf3d4446cdb773987c97f384918":{"type":"string","example":["Yoga","Sailing"],"can_have_multiple_values":true,"fieldname":"Activity","key":"activity","recommended":false,"description":"The particular sport or activity for which your item is intended."},"44084d5972f3b03d6abe5887c6dfd4b0":{"type":"string","example":["Ruby","Emerald"],"can_have_multiple_values":true,"fieldname":"Gemstone","key":"gemstone","recommended":false,"description":"The type of gemstone(s) in your item."},"9a6f633320e996ae1d5bad38d51e085c":{"type":"string","example":"Quartz","can_have_multiple_values":false,"fieldname":"WatchMovementType","key":"watch_movement_type","recommended":false,"description":"The type of movement within the watch"},"fe4c9e79e3986fe439f5ba1c21828f2e":{"type":"measurement","example":"1 TB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"StorageCapacity","key":"storage_capacity","recommended":true,"description":"Describes the amount of storage space on the item's hard drive, typically measured in megabytes, gigabytes or terabytes."},"2390176fad8a47f031329e771da0e400":{"type":"string","example":"Android","can_have_multiple_values":false,"fieldname":"OperatingSystem","key":"operating_system","recommended":true,"description":"Describes the type of preloaded operating system software installed on the device."},"49b1cf42befb0ba138e430326fbc6ea6":{"type":"measurement","example":"42 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ScreenSize","key":"screen_size","recommended":true,"description":"Describes the measurement of the device's screen, typically measured diagonally in inches."},"567aba0d72ce14b0928d5e6aa61c7f35":{"type":"string","example":24,"can_have_multiple_values":false,"fieldname":"RearFacingCameraResolution","key":"rear_facing_camera_resolution","recommended":false,"description":"Describes the maximum resolution of the item's rear facing camera, in megapixels."},"a5dc22c3e935ab432331f4cab30c0787":{"type":"measurement","example":"3 GHz","enum_values":["Hz","KHz","MHz","GHz"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProcessorSpeed","key":"processor_speed","recommended":false,"description":"Describes the operational frequency of the computer's CPU"},"361b07f5140feaec4be03122ed0d6287":{"type":"string","example":"Intel Core i7","can_have_multiple_values":false,"fieldname":"ProcessorType","key":"processor_type","recommended":false,"description":"Describes commonly used name of the computer's CPU"},"fe18897b738f817319015eb3048928e5":{"type":"measurement","example":"16 GB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"RamMemory","key":"ram_memory","recommended":false,"description":"Desribes the amount of RAM memory that is preinstalled on the product."},"083cb9b61b45283ca9ee93f906516300":{"type":"integer","example":1080,"can_have_multiple_values":false,"fieldname":"Resolution","key":"resolution","recommended":false,"description":"Describes the resolution of the product screen"},"a59afd07b13fe423f4ea99faec8453d8":{"type":"string","example":24,"can_have_multiple_values":false,"fieldname":"VideoResolution","key":"video_resolution","recommended":false,"description":"Describes the resolution of the video recordings of the product in\n megapixels"},"3b621ecd047fb5f084be32fc1afb6389":{"type":"string","example":"ATX","can_have_multiple_values":false,"fieldname":"MotherboardFormFactor","key":"motherboard_form_factor","recommended":false,"description":"Describes one of the standard physical sizes to which the computer motherboard conforms"},"bfe5d2ed096364fe145cc59a87f41760":{"type":"string","example":["CD ROM"],"can_have_multiple_values":true,"fieldname":"OpticalDrive","key":"optical_drive","recommended":false,"description":"Describes the type of optical drives included with the product"},"ec6456439bf772caeb9e8304cb32ec3e":{"type":"measurement","example":"16 GB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumSupportedRam","key":"maximum_supported_ram","recommended":false,"description":"Describes the maximum amount of RAM memory that can be supported by the product."},"70d088a2087eeddc317dedc4846e71e1":{"type":"enum","example":"Internal","can_have_multiple_values":false,"enum_values":["Internal","External"],"can_have_unknown_value":true,"fieldname":"HardDriveType","key":"hard_drive_type","recommended":false,"description":"Describes whether the hard drives of the product are internal or external"},"4a2d5d0019d9f4e3e553461d450eb409":{"type":"string","example":"Nvidia GeForce RTX 2080","can_have_multiple_values":false,"fieldname":"GraphicsCardModel","key":"graphics_card_model","recommended":false,"description":"Describes the model name of the graphics card included with the product"},"ea1ec0d2e16be590eee6a2ede6da6435":{"type":"string","example":24,"can_have_multiple_values":false,"fieldname":"FrontFacingCameraResolution","key":"front_facing_camera_resolution","recommended":false,"description":"Describes the maximum resolution of the item's front facing camera, in megapixels."},"b6049f7a7d322c6402d8e55ff0041d93":{"type":"string","example":"AM3","can_have_multiple_values":false,"fieldname":"CpuSocketType","key":"cpu_socket_type","recommended":false,"description":"The interface of, or required by, the central processing unit."},"54919ad5f3d7792c8e13c4bde36632bf":{"type":"string","example":"Full Tower","can_have_multiple_values":false,"fieldname":"ComputerCaseFormFactor","key":"computer_case_form_factor","recommended":false,"description":"Describes one of the standard physical sizes to which the computer case conforms"},"b31777d6275a27c26f1e9928c503ef19":{"type":"string","example":"Bluetooth 4.0","can_have_multiple_values":false,"fieldname":"BluetoothTechnology","key":"bluetooth_technology","recommended":false,"description":"Describes the type of version of the compatible bluetooth."},"dacac94d354a921cff590fa3d34d6078":{"type":"string","example":12,"can_have_multiple_values":false,"fieldname":"StandbyTime","key":"standby_time","recommended":false,"description":"Describes the total stand-by time in hours of the phone."},"ed57863b87213a9ffe54d40f978635b8":{"type":"string","example":12,"can_have_multiple_values":false,"fieldname":"TalkTime","key":"talk_time","recommended":false,"description":"Describes the total talk time in hours of the phone."},"643ec7fd851671f9f0fe60199b37bf0c":{"type":"string","example":["Leather"],"can_have_multiple_values":true,"fieldname":"WatchBandMaterial","key":"watch_band_material","recommended":false,"description":"The materials from which the band of the watch is made."},"d0aae07685ed17d8f4d00a2658fbb437":{"type":"string","example":["Standard SIM"],"can_have_multiple_values":true,"fieldname":"SimTypes","key":"sim_types","recommended":false,"description":"Describes the type of SIM compatible with the product, like Mini-SIM, Dual SIM."},"f2d22b905571ec1b0c9722ed6c227125":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberofSIMCardSlots","key":"numberof_s_i_m_card_slots","recommended":false,"description":"Describes the number of SIM card slots on the product."},"7c8efd858532f7cdf437cc9fb39a0bec":{"type":"string","example":"3G","can_have_multiple_values":false,"fieldname":"CellularGeneration","key":"cellular_generation","recommended":false,"description":" Describes the communications network generation of the cell phone"},"65fe00497801a23a1285c1bdfba66014":{"type":"string","example":"CDMA","can_have_multiple_values":false,"fieldname":"CellularBand","key":"cellular_band","recommended":false,"description":"Describes the cellular band or network technology used by the device."},"fe1280e0d1b522e738d01296e5efb34f":{"type":"string","example":"Verizon","can_have_multiple_values":false,"fieldname":"CellPhoneServiceProvider","key":"cell_phone_service_provider","recommended":false,"description":"Describes the company that provides the phone's cellular service (if not unlocked)"},"bbc7f8045d5073625f856ac52313df47":{"type":"string","example":"Wristwatch","can_have_multiple_values":false,"fieldname":"WatchStyle","key":"watch_style","recommended":false,"description":"The style of watch."},"707d4ddb458001de9dd489dc081a917a":{"type":"string","example":["iPad"],"can_have_multiple_values":true,"fieldname":"CompatibleDevices","key":"compatible_devices","recommended":true,"description":"Devices compatible with the item."},"30c69d289f07754985fa521022655ba0":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWeight","key":"product_weight","recommended":false,"description":"The weight of the fully assembled product."},"10a6af510a4d49ca6eeaebfbead6c6fa":{"type":"measurement","example":"40 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MinimumScreenSize","key":"minimum_screen_size","recommended":false,"description":" Describes the minimum size of the TV\/Monitor that the mount can\n accommodate"},"b1bac032a961eb0cff6df86fce2da4c4":{"type":"string","example":"Fixed Mount","can_have_multiple_values":false,"fieldname":"MountType","key":"mount_type","recommended":false,"description":"Describes how the TV or monitor is attached and degree of\n adjustment of position is allowed once the mount is installed"},"bdcaca96c46e181c0d4bf347097c228e":{"type":"measurement","example":"55 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumScreenSize","key":"maximum_screen_size","recommended":false,"description":"Describes the maximum size of the TV\/Monitor that the mount can\n accommodate"},"ec7db52e6443df6d84672fa3397e4144":{"type":"measurement","example":"45 lb","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaxLoadWeight","key":"max_load_weight","recommended":false,"description":"Describes the amount of weight that the TV\/Monitor mount\n can support as certified by the manufacturer"},"91f569f41bdde8d40c421f04d9f0ec23":{"type":"string","example":["In-Ear"],"can_have_multiple_values":true,"fieldname":"HeadphoneFeatures","key":"headphone_features","recommended":false,"description":"List features specific to headphones"},"158bcad2efdd1b1f944e632d8603c189":{"type":"measurement","example":"2 ft","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"CableLength","key":"cable_length","recommended":false,"description":"Total length of electronics cable"},"8904e34635ccfa9f1776f6bf8964d571":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductDepth","key":"product_depth","recommended":true,"description":"The depth of the fully assembled product."},"1e86882555078459f4919858583e9fce":{"type":"integer","example":1080,"can_have_multiple_values":false,"fieldname":"Resolution","key":"resolution","recommended":true,"description":"Describes the resolution of the product screen"},"75bf93f645a2702cd3dc1aeac96fcc79":{"type":"integer","example":50,"can_have_multiple_values":false,"fieldname":"MonochromePagesPerMinute","key":"monochrome_pages_per_minute","recommended":false,"description":"The number of monochrome pages that the imaging device is able to produce per minute."},"bf9c9a51c205f8c02070a7aa2e11d65b":{"type":"enum","example":"Monochrome","can_have_multiple_values":false,"enum_values":["Monochrome","Color"],"can_have_unknown_value":true,"fieldname":"MonochromeOrColor","key":"monochrome_or_color","recommended":false,"description":"Is the imaging device capable of color processing or monochrome only?"},"eefa8dd52fadfc95322a8c584a87e1c5":{"type":"integer","example":12,"can_have_multiple_values":false,"fieldname":"ColorPagesPerMinute","key":"color_pages_per_minute","recommended":false,"description":"The number of color pages that the imaging device is able to produce per minute."},"be84c1ccb42a2826aa12efb3ad494d6e":{"type":"string","example":"LCD","can_have_multiple_values":false,"fieldname":"DisplayTechnology","key":"display_technology","recommended":true,"description":"Describes the type of technology that powers the display, like LED or LCD."},"fece1f8c30e55cec967050c8d46d2179":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"ResponseTime","key":"response_time","recommended":false,"description":"Describes the amount of time it takes for the pixels in a display to change, measured in miliseconds."},"d2b0fda41f2dc69846c9a72ee97b6304":{"type":"string","example":60,"can_have_multiple_values":false,"fieldname":"RefreshRate","key":"refresh_rate","recommended":false,"description":"Describes the refresh rate of the display. This measures the number of times the picture is updated per second, measured in Hz."},"0307a27632bdff957e247336e336c958":{"type":"string","example":"200 x 200","can_have_multiple_values":false,"fieldname":"VesaMountingStandard","key":"vesa_mounting_standard","recommended":false,"description":"The VESA Standard defines the distance in millimeters between the\n four mounting holes on the back of a TV (distance horizontally x\n distance vertically)."},"0ea98808c27886d1dae8ceaa3aaa2260":{"type":"string","example":"4:3","can_have_multiple_values":false,"fieldname":"AspectRatio","key":"aspect_ratio","recommended":false,"description":"Describes the relationship between the product's width and its height."},"0abb978f2c8edd1d059e564a4e41e744":{"type":"integer","example":3,"can_have_multiple_values":false,"fieldname":"NumberOfHdmiports","key":"number_of_hdmiports","recommended":false,"description":"The number of HDMI ports on the television or monitor"},"82229416d35b701d3f141174aa5f054b":{"type":"string","example":"20,000:1","can_have_multiple_values":false,"fieldname":"MaximumContrastRatio","key":"maximum_contrast_ratio","recommended":false,"description":"The ratio between the luminance of the brightest color to that of\n the darkest color capable of being displayed."},"2da53aa14b92ca922b59fdea5a6a69d6":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsAssemblyRequired","key":"is_assembly_required","recommended":false,"description":"Indicates if the product arrives unassembledand must be put together before use."},"6fa83aef4f8623080b9b36b3373d650f":{"type":"string","example":"CCFL","can_have_multiple_values":false,"fieldname":"BacklightTechnology","key":"backlight_technology","recommended":false,"description":"Describes the technology used to backlight the screen or television. Commonly Cathold Fluorescent Tubes (CCFL) or Light Emitting Diodes (LED)"},"459473687330b5617bdaf470bcf83a7e":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"AudioPowerOutput","key":"audio_power_output","recommended":false,"description":"Describes the power of the audio output of the device's speakers, measured in watts."},"81c8727757c4fd1d1d12f5d261744c57":{"type":"string","example":["Noise Cancelling"],"can_have_multiple_values":true,"fieldname":"AudioFeatures","key":"audio_features","recommended":false,"description":"Describes whether the product has certain special audio features."},"1e2de3306f34ebe0755bb8f5297f9cb0":{"type":"string","example":1.8,"can_have_multiple_values":false,"fieldname":"ThrowRatio","key":"throw_ratio","recommended":false,"description":"The relation between the throw distance and the image width; tells\n us what image size we can project from a certain distance away."},"755632f8c8070139f1d7b1d8817eeac3":{"type":"string","example":6500,"can_have_multiple_values":false,"fieldname":"LampLife","key":"lamp_life","recommended":false,"description":"The expected life of the projection lamp in hours."},"697539305c05f8a9a0fe6e97e2eab4d0":{"type":"string","example":2000,"can_have_multiple_values":false,"fieldname":"Brightness","key":"brightness","recommended":false,"description":"Brightness per bulb measured in lumens."},"fba4b5b5f790c6348fabe6c10d0f8bf6":{"type":"string","example":"Xbox 360","can_have_multiple_values":false,"fieldname":"VideoGamePlatform","key":"video_game_platform","recommended":true,"description":"Describes the type of platform on which video game software is capable of running."},"01691d8e5b9ed5a58a109dc90b74f439":{"type":"string","example":"Fallout","can_have_multiple_values":false,"fieldname":"VideoGameSeries","key":"video_game_series","recommended":false,"description":"The name of the video game series this game belongs to."},"ecb8b647ae87edddac43b94a3093e72c":{"type":"string","example":"E - Everyone","can_have_multiple_values":false,"fieldname":"VideoGameRating","key":"video_game_rating","recommended":false,"description":"Describes the standard rating of the content of the video game. Can be important for violent games or games intended only for mature audiences."},"532c713f0d2a4408702814f32c02020f":{"type":"string","example":"Shooter","can_have_multiple_values":false,"fieldname":"VideoGameGenre","key":"video_game_genre","recommended":false,"description":"Describes the genre, style or type of video game being sold."},"e65585ff17b284d24ee18e28851f6ac8":{"type":"measurement","example":"1 TB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"StorageCapacity","key":"storage_capacity","recommended":false,"description":"Describes the amount of storage space on the item's hard drive, typically measured in megabytes, gigabytes or terabytes."},"9a9c97dfb6df9491e73d4ba7d39e2460":{"type":"string","example":["Kinect"],"can_have_multiple_values":true,"fieldname":"RequiredPeripherals","key":"required_peripherals","recommended":false,"description":"Indicates any type of required accessory or peripheral necessary to operate the item (or play the video game)."},"a36f46f58ba3a8907408d6c24e50bfad":{"type":"string","example":"09-19-2019","can_have_multiple_values":false,"fieldname":"ReleaseDate","key":"release_date","recommended":false,"description":"Describes the specific date which marks when the product was made available for public distribution, provided in the format MM-DD-YYYY"},"48504b28464be452dc971f271b0eef35":{"type":"string","example":"CD","can_have_multiple_values":false,"fieldname":"PhysicalMediaFormat","key":"physical_media_format","recommended":false,"description":"Describes the standard media format in which the product exists."},"95f1c14e6ac4218a6af57710a935fb6f":{"type":"string","example":"Android","can_have_multiple_values":false,"fieldname":"OperatingSystem","key":"operating_system","recommended":false,"description":"Describes the type of preloaded operating system software installed on the device."},"87ee129e6abae679ef3dc1881c29ac4c":{"type":"string","example":"Natural\/Unfinished","can_have_multiple_values":false,"fieldname":"Finish","key":"finish","recommended":true,"description":"The external treatment to the productthat usually includes a change inappearance or texture to the item.Commonly used for furniture includewood, metal and fabric."},"73c8639362fab24e43a3fa21a122d3f6":{"type":"string","example":"Bohemian","can_have_multiple_values":false,"fieldname":"DecorStyle","key":"decor_style","recommended":true,"description":"The decorative style in which the product was made."},"9c05349004f01b710d863a5bcc135754":{"type":"string","example":["Designer"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"447e1ca997ac7372d84321a5da8b9577":{"type":"string","example":["Family Room"],"can_have_multiple_values":true,"fieldname":"RecommendedRooms","key":"recommended_rooms","recommended":false,"description":"The rooms where the item is likely or recommended to be used."},"cb8a3c1875a379537c185708e6662ba6":{"type":"measurement","example":"20 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SeatBackHeight","key":"seat_back_height","recommended":false,"description":"Indicates the seat back height from the base of the seat to the top of the back. This may be separate from the \"Assembled Product Height\" and \"Seat Height\" attributes."},"ed80e4f1f84fcb9b076e9089aa9b73da":{"type":"measurement","example":"36 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SeatHeight","key":"seat_height","recommended":false,"description":"Indicates height from the floor to the top of the seat. This may be separate from the \"Assembled Product Height\" and \"Seat Back Height\" attributes."},"eaf4eb99a4c71f786c74f207839181ab":{"type":"string","example":"Leather","can_have_multiple_values":false,"fieldname":"SeatMaterial","key":"seat_material","recommended":false,"description":"The material of the item's seat cushion. This may be separate from the item's main material composition, which falls under the \"Material\" attribute."},"f2d839922ab1a15c3720eb42f01393ff":{"type":"string","example":"Square","can_have_multiple_values":false,"fieldname":"Shape","key":"shape","recommended":false,"description":"The general shape of the product. Often used to describe\n furniture and home furnishings."},"00d4ef3a1bb967e59e960f07a8a36010":{"type":"enum","example":["Antique"],"can_have_multiple_values":true,"enum_values":["Foldable","Inflatable","Pump Included","Wheeled","Antique"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"2733dc5d8c97d75657a86568037a0609":{"type":"integer","example":4,"can_have_multiple_values":false,"fieldname":"NumberOfDrawers","key":"number_of_drawers","recommended":false,"description":"The number of drawers included in the product."},"9e1903c5cd2876e1c9889eb5cea8045a":{"type":"integer","example":4,"can_have_multiple_values":false,"fieldname":"NumberOfShelves","key":"number_of_shelves","recommended":false,"description":"The number of shelves included in the product."},"8cafc76619e3f64c83abec41a95b9915":{"type":"string","example":"Wall Mount","can_have_multiple_values":false,"fieldname":"MountType","key":"mount_type","recommended":false,"description":"The method by which the item is attached or anchored. Used for products such as shelving and other fixtures."},"97bdb9242e7b2962284619b2ce7c06a4":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MattressThickness","key":"mattress_thickness","recommended":false,"description":"The measure from the bottom of the mattress to the crown"},"a700f8e116174455d5d9f3782aa0bf4e":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsPowered","key":"is_powered","recommended":false,"description":"Indicates if the item uses electricity and requires a power cord or batteries to operate."},"7f54c0815b0e8d9cb192bdc4819bd7f5":{"type":"enum","example":"Indoor Only","can_have_multiple_values":false,"enum_values":["Indoor Only","Outdoor Only","Indoor\/Outdoor"],"can_have_unknown_value":true,"fieldname":"IndoororOutdoor","key":"indooror_outdoor","recommended":false,"description":"Indicates if the item is indoor only, outdoor only, or intended for both."},"39a086121f568673a43aedb5478c26d4":{"type":"string","example":"Foam","can_have_multiple_values":false,"fieldname":"FillMaterial","key":"fill_material","recommended":false,"description":"The material used to stuff the item usually in cushions, pillows,\n mattresses, and bean bags."},"d17ad1a388d5c83e6d89a16d3ac964fb":{"type":"string","example":"Extra Firm","can_have_multiple_values":false,"fieldname":"ComfortLevel","key":"comfort_level","recommended":false,"description":"The firmness or softness of a mattress."},"9d73d1c85fae03275869c6806d30fd93":{"type":"string","example":"Canopy Bed","can_have_multiple_values":false,"fieldname":"BedFrameType","key":"bed_frame_type","recommended":false,"description":"The type or style of the bed. Does not include Futons, Day Beds, or Sleepers."},"7d8fefe9bf9918c271f908a0e83f5f16":{"type":"enum","example":["Wheeled"],"can_have_multiple_values":true,"enum_values":["Foldable","Wheeled","Antique"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"e009f02a406e7aab29c5ab8230d08848":{"type":"string","example":"Natural\/Unfinished","can_have_multiple_values":false,"fieldname":"Finish","key":"finish","recommended":false,"description":"The external treatment to the productthat usually includes a change inappearance or texture to the item.Commonly used for furniture includewood, metal and fabric."},"13828083302ba311fdebc396a1610bf6":{"type":"string","example":["Fever"],"can_have_multiple_values":true,"fieldname":"HealthConcern","key":"health_concern","recommended":true,"description":"Indicates if the item is meant to alleviate particular health issues, illnesses or life stages. For concerns specific to skin care, please use the Skin Care Concern attribute."},"11f3261c7ccebb79e06751f778d5d4ab":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":true,"description":"Indicates the capacity or volume of your item. This is important for buyers to know the amount of product they are receiving and is important for skin care, beauty & hair care products."},"2d80b0c58142a82357f2d2fdfafd9068":{"type":"string","example":["Beeswax"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":true,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"365ecf662d48185b92a5aa253d935173":{"type":"string","example":"3 to 5 hours","can_have_multiple_values":false,"fieldname":"ResultTime","key":"result_time","recommended":false,"description":"Duration of time necessary to see the outcome from using a product. Typically used for medical and personal care test kits and monitors."},"7699774215529bc8717eb00ce738c58a":{"type":"string","example":"Heavy","can_have_multiple_values":false,"fieldname":"Absorbency","key":"absorbency","recommended":false,"description":"Term describing the ability of a product to absorb moisture. Used in personal care products such as pads and liners."},"2639fc784370fb97d9a426b33e6eff0e":{"type":"measurement","example":"0.4 ml","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ServingSize","key":"serving_size","recommended":false,"description":"Measurement value specifying the amount of the item typically used as a reference on the label of that item to list per serving information (nutrients, calories, total fat). Applicable for a wide variety of products including food, beverages, and nutritional supplements."},"336df2b3fca4bc8318f7589b8c888d03":{"type":"string","example":["Dry Skin"],"can_have_multiple_values":true,"fieldname":"SkinCareConcern","key":"skin_care_concern","recommended":false,"description":"Indicates if the item is meant to alleviate particular skin care issues. For general health concerns like obesity, or blood pressure please use the Health Concerns attribute. Values may be similar to the Skin Type attribute - \"dry cracked skin\" may be a cocnern but \"dry\" is a skin type."},"eba9b3d21340c3ed25d6778417988888":{"type":"enum","example":"Oily","can_have_multiple_values":false,"enum_values":["Oily","Dry","Combination","Sensitive"],"can_have_unknown_value":true,"fieldname":"SkinType","key":"skin_type","recommended":false,"description":"Indicates the general skin type that the product is intended for on the oily\/dry spectrum."},"cffbfe91501fcda43b326b2797a39ee0":{"type":"integer","example":15,"can_have_multiple_values":false,"fieldname":"SpfValue","key":"spf_value","recommended":false,"description":"Indicates the strength of SPF (Sun Protection Factor) in an item. This describes how well the product can block out harmful rays from the run. Commonly found in suncreen and makeup products."},"4f2642a8dcd42338499b2aa75ffca1fe":{"type":"enum","example":["Reusable"],"can_have_multiple_values":true,"enum_values":["Adaptive Lenses","Automatic Shut Off","Cordless","Foldable","Industrial","Latex-Free","Non-Comedogenic","Portable","Polarized","Reusable","Self-Tanning","Tinted","Travel Size","Waterproof","Wheeled","Scratch-Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"78aba0a00b3412827370aede724962dc":{"type":"string","example":["Plastic"],"can_have_multiple_values":true,"fieldname":"LensMaterial","key":"lens_material","recommended":false,"description":"The substances an optical lens is made out of."},"e6041e1b82f9e3ac106d984107d13504":{"type":"string","example":"Single Vision","can_have_multiple_values":false,"fieldname":"LensType","key":"lens_type","recommended":false,"description":"Whether the lens is single, multifocal, or tinted"},"937f3f40d16b2b5a23052e2d7311c6ff":{"type":"string","example":"Blue","can_have_multiple_values":false,"fieldname":"LensTint","key":"lens_tint","recommended":false,"description":"Color of lens tint."},"8b4897149a7b0cf1c4b79f6ca7c03881":{"type":"string","example":["Solid"],"can_have_multiple_values":true,"fieldname":"Keywords","key":"keywords","recommended":false,"description":"Keywords that might be used to search for this term, including synonyms and related terms."},"830b557ebbb8f05aa8d8e89c8073c9d8":{"type":"string","example":[{"name":"Pyrithione zinc","amount":2.5},{"name":"Salicylic Acid","amount":2}],"can_have_multiple_values":false,"fieldname":"IngredientsComposition","key":"ingredients_composition","recommended":false,"description":"The ingredients with the corresponding composition value"},"45f47b75dfc8dcab7bcc1b6895c572a0":{"type":"string","example":["Iron Oxide"],"can_have_multiple_values":true,"fieldname":"InactiveIngredients","key":"inactive_ingredients","recommended":false,"description":"Describes the list of inactive ingredients as shown on the item label."},"a416c6be2906ac2830fbd812fba3e591":{"type":"enum","example":"Full-Rim","can_have_multiple_values":false,"enum_values":["Full-Rim","Rimless","Semi-Rimless","Half-Rim"],"can_have_unknown_value":true,"fieldname":"EyewearRim","key":"eyewear_rim","recommended":false,"description":"Whether eyewear has rims, partial rims, or no rim at all."},"f4b8e7636597b2b532f6c75c8bd2a7a9":{"type":"string","example":["1 teaspoon every 6 hours"],"can_have_multiple_values":true,"fieldname":"Dosage","key":"dosage","recommended":false,"description":"The amount of a medication, drug, or supplement that is directed to be taken, or applied at one time or regularly during a period of time, as specified by the manufacturer."},"91455c53f237eb64c3de88f2c35b9556":{"type":"string","example":["Eyes","Face"],"can_have_multiple_values":true,"fieldname":"BodyPart","key":"body_part","recommended":false,"description":"Describes the particular body part(s) for which the item is intended."},"007e22a1352c2d2a1a443ba90e14b127":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"BatteriesRequired","key":"batteries_required","recommended":false,"description":"Indicates if batteries are required to use the product."},"052d7ff877183c9dcce5362a73e73428":{"type":"integer","example":400,"can_have_multiple_values":false,"fieldname":"UVRating","key":"u_v_rating","recommended":false,"description":"Ultraviolet rating for eyewear."},"3308f187f85aeefe4d6ed8fc5cd8e8e6":{"type":"enum","example":"Fair","can_have_multiple_values":false,"enum_values":["Fair","Light","Medium","Neutral","Olive","Dark"],"can_have_unknown_value":true,"fieldname":"SkinTone","key":"skin_tone","recommended":false,"description":"Describes the color or shade of skin that a product is targeted for. This is separate from Color Name of the product. \"Olive\" may be a color name from the manufacturer as well as the type of skin tone the product is targeting."},"9a04dccec14d02d689cf02fb757d1a10":{"type":"string","example":["Beeswax"],"can_have_multiple_values":true,"fieldname":"InactiveIngredients","key":"inactive_ingredients","recommended":false,"description":"Describes the list of inactive ingredients as shown on the item label."},"896fe12fa920abf8d338cef50e162628":{"type":"string","example":["Fever"],"can_have_multiple_values":true,"fieldname":"HealthConcern","key":"health_concern","recommended":false,"description":"Indicates if the item is meant to alleviate particular health issues, illnesses or life stages. For concerns specific to skin care, please use the Skin Care Concern attribute."},"3456eaf701f7278c2be139c78bcabd3f":{"type":"enum","example":["Coarse"],"can_have_multiple_values":true,"enum_values":["Coarse","Color Treated","Curly","Damaged","Dry","Fine","Oily"],"can_have_unknown_value":false,"fieldname":"HairType","key":"hair_type","recommended":false,"description":"Indicates the general hair types that the product is intended for relating to texture, coarseness, oiliness, thickness, and curliness."},"ce6ffae63aa69791f8881e7fb7c2bea8":{"type":"string","example":["Wash with warm water & soap"],"can_have_multiple_values":true,"fieldname":"CareInstructions","key":"care_instructions","recommended":false,"description":"Describes how the item should be cleaned, cared for or maintained."},"f7cdf1aaddb5d5cf96bdc35a3f9ba7c7":{"type":"string","example":"100% Hand-Tied","can_have_multiple_values":false,"fieldname":"WigCapType","key":"wig_cap_type","recommended":false,"description":"The construction style of the wig cap (also called the \"wig base\"), affecting the wig's appearance, durability, and styling options."},"16f4737bd60328d18f404968ba09f5de":{"type":"enum","example":["Automatic Shut Off"],"can_have_multiple_values":true,"enum_values":["Automatic Shut Off","Energy Star-Certified"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"ecb45e77061f56ea0bf5ab6280fd7b6d":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberofLights","key":"numberof_lights","recommended":false,"description":"The number of lights or bulbs contained within a light or light fixture."},"884e05ecb296a36e8e63b1b2bd060fb9":{"type":"string","example":"Fluorescent","can_have_multiple_values":false,"fieldname":"LightBulbType","key":"light_bulb_type","recommended":false,"description":"The type of light bulb."},"0e8054ce0f52ba0d4105f9da4cbfcbfe":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":false,"description":"Indicates the maximum amount that the item can hold like pounds, liters or volume. Does not include Storage Capacity which is used for digital items."},"64b3fe664fa4c3666faae8b77a734631":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":true,"description":"Indicates the maximum amount that the item can hold like pounds, liters or volume. Does not include Storage Capacity which is used for digital items."},"7c421b8f435ae90ca36f71389bd6b9ca":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWeight","key":"product_weight","recommended":true,"description":"The weight of the fully assembled product."},"3eb15df7a5722992f9aa3dbf1a8c3923":{"type":"string","example":["Low Noise"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"049be88f7223ae9a349f4d47ec511389":{"type":"measurement","example":"220 V","enum_values":["V","KV"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Volts","key":"volts","recommended":false,"description":"The number of volts the product produces or requires. Also known as Voltage;"},"3aa26481e6a2737040dacf5844ff32f2":{"type":"enum","example":["Automatic Shut Off"],"can_have_multiple_values":true,"enum_values":["Automatic Shut Off","Energy Star-Certified","Bluetooth Compatible","Industrial","Remote Control Included","Wi-Fi Compatible"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"1b4aabae8670a6b5f8ad83a12c664b37":{"type":"string","example":44,"can_have_multiple_values":false,"fieldname":"SoundRating","key":"sound_rating","recommended":false,"description":"The sound decibel rating for the noise level of the appliance."},"43e44c783f17bdfc8772466174badee1":{"type":"string","example":["Amazon Alexa"],"can_have_multiple_values":true,"fieldname":"SmartHomeCompatibility","key":"smart_home_compatibility","recommended":false,"description":"The type of Smart Home devices that the product is compatible with."},"140a15b94c6d50aa103b176dc71951ff":{"type":"integer","example":2,"can_have_multiple_values":false,"fieldname":"NumberofDoors","key":"numberof_doors","recommended":false,"description":"The number of doors on the item."},"454fe2a0cbc9e12c03b9db3ccfe98a21":{"type":"integer","example":4,"can_have_multiple_values":false,"fieldname":"NumberofBurners","key":"numberof_burners","recommended":false,"description":"The number of cooking burners or elements."},"b771092e645e5a68eb3c34f590d4a028":{"type":"string","example":"Top Load","can_have_multiple_values":false,"fieldname":"LoadPosition","key":"load_position","recommended":false,"description":"The type of load position for washers & dryers."},"da1ff3922c1b46224c541ecf62c91f69":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsSet","key":"is_set","recommended":false,"description":"Indicates if the product is being sold as a set, like washer & dryer set."},"424a3c305eb21ffbd1257294397cc022":{"type":"string","example":"Electric","can_have_multiple_values":false,"fieldname":"FuelType","key":"fuel_type","recommended":false,"description":"The type of fuel used to power certain appliances."},"96481ec4bdef8e6fe8e5093ef39a68d0":{"type":"integer","example":10200,"can_have_multiple_values":false,"fieldname":"BTU","key":"b_t_u","recommended":false,"description":"The number of British Thermal Units for heating and cooling appliances."},"608d8c80b0c29120dd74b33b92b656f3":{"type":"measurement","example":"400 W","enum_values":["W","KW","MW","GW"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Watts","key":"watts","recommended":false,"description":"The number of watts the product procues or requires. Also known as Wattage."},"8f4a7d7221541f65cac8a79c08758bfb":{"type":"string","example":"Oil","can_have_multiple_values":false,"fieldname":"ProductForm","key":"product_form","recommended":true,"description":"The consistency, texture or formulation of the item and the way\n it will be consumed or dispensed."},"803d2a584a08f5944b306958fdb95a21":{"type":"string","example":["Vanilla"],"can_have_multiple_values":true,"fieldname":"Scent","key":"scent","recommended":true,"description":"The scent or fragrance of your item; including items\n labelled as \"unscented\""},"4e7d7d90f4137c48ce55a4b9a823eff2":{"type":"string","example":["some_string","other"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":true,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"c8d76e2396b1577c1c9da0d9ec4cf770":{"type":"string","example":["Carpet"],"can_have_multiple_values":true,"fieldname":"RecommendedUse","key":"recommended_use","recommended":true,"description":"The recommended use\/surface of cleaning product."},"ec65783a5d3d73c90f83a5d59797ac73":{"type":"string","example":["Unscented"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"febfed4ca6efd5a645a1862390468384":{"type":"string","example":"Canister","can_have_multiple_values":false,"fieldname":"VacuumType","key":"vacuum_type","recommended":false,"description":"The type of vacuum cleaner."},"da6b491d82e229483b578dec94e4ff95":{"type":"enum","example":["Biodegradable"],"can_have_multiple_values":true,"enum_values":["Biodegradable","Recyclable"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"6cc94d5bc1810a51cf9b3139b629fd37":{"type":"integer","example":15,"can_have_multiple_values":false,"fieldname":"ShelfLife","key":"shelf_life","recommended":false,"description":"The length of time that the product can be stored without spoiling or losing quality, measured in days."},"23a063f0e0a0a294b129169b749639fa":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":false,"description":"Indicates the maximum amount that the item can hold like pounds, liters or volume."},"b9bee7f2bace5f8065911d6998b34bad":{"type":"string","example":"Bag","can_have_multiple_values":false,"fieldname":"BagType","key":"bag_type","recommended":false,"description":"Indicates whether the vacuum cleaner is bag or bagless."},"07360c7815892f05de28ec9f92926612":{"type":"enum","example":["Chemical"],"can_have_multiple_values":true,"enum_values":["Chemical","Combustible","Flammable"],"can_have_unknown_value":false,"fieldname":"Warnings","key":"warnings","recommended":false,"description":"Warnings associated with the product."},"e6c000a4a5c024e4385c9e89ef1232c3":{"type":"integer","example":400,"can_have_multiple_values":false,"fieldname":"ThreadCount","key":"thread_count","recommended":true,"description":"The number of threads per square inch of fabric."},"2410d57d61f0e552896d9aca00f7b67b":{"type":"enum","example":["Water Resistant"],"can_have_multiple_values":true,"enum_values":["Reversible","Hypoallergenic","Stain Resistant","Water Resistant","Organic","Sustainably Sourced"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"c1a740062d17b6704080705c2474435c":{"type":"integer","example":3,"can_have_multiple_values":false,"fieldname":"PiecesInSet","key":"pieces_in_set","recommended":false,"description":"The number of items included in the set. If the item contains matching fitted sheets, flat sheets, and 2 pillowcases - the number is 4."},"0f4c1a53965b293c894d4b0e607b9770":{"type":"string","example":["Designer","Anti-Streak"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"4a6f34f51dbacff4a7033c14e600ce06":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsSet","key":"is_set","recommended":false,"description":"Indicates if the product contains 2 of more different items that are sold as part of a set."},"e8e50abdc6b50b497e7c90af199feeec":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberOfLicenses","key":"number_of_licenses","recommended":true,"description":"The maximum number of users or installations allowed under the terms of the software licensing agreement."},"9c3c05234da77307c8b4fc50977ca324":{"type":"string","example":["Windows 7 or later"],"can_have_multiple_values":true,"fieldname":"SoftwareSystemRequirements","key":"software_system_requirements","recommended":true,"description":"The basic requirements necessary of any system in order to satisfactorily run the software."},"46c833eff8474794a70b21f9d2389e04":{"type":"string","example":"Antivirus & Security","can_have_multiple_values":false,"fieldname":"SoftwareCategory","key":"software_category","recommended":false,"description":"The general category of software to which the item is most closely associated with"},"1c4ef2904cadfca2cf53773ad85ce53d":{"type":"string","example":"7.2","can_have_multiple_values":false,"fieldname":"SoftwareVersion","key":"software_version","recommended":false,"description":"The version number assigned to this specific release of the software."}} \ No newline at end of file +{"5773e3cf8b57a590831b2fa4966071b7":{"key":"gender","fieldname":"Gender","recommended":false,"type":"enum","description":"Gender the product item is targeted towards","enum_values":["female","male","unisex"],"can_have_unknown_value":false},"48f499603e045536424c8db9e2b51338":{"key":"brand","fieldname":"Brand","recommended":false,"type":"string","description":"Brand name, unique manufacturer part number (MPN), or Global Trade Item Number (GTIN) of the item."},"e44fa2f9d73d8394fc19e11bda594270":{"key":"color","fieldname":"Color","recommended":false,"type":"string","description":"Color of the product item"},"3c93dcbe5e2427633884455f8fdf3d0a":{"key":"size","fieldname":"size","recommended":false,"type":"string","description":"Size of the product item"},"14360682ab38bda0c27cd410da1ddb93":{"key":"pattern","fieldname":"Pattern","recommended":false,"type":"string","description":"Pattern of the product item"},"57a5027e44183e4bee60fd79e0f72215":{"key":"material","fieldname":"Material","recommended":false,"type":"string","description":"Material of the product item"},"536559919dfbf7c806f82836c7b6ace0":{"key":"age_group","fieldname":"AgeGroup","recommended":false,"type":"enum","description":"Age group the product item is targeted towards","enum_values":["adult","all ages","infant","kids","newborn","teen","toddler"],"can_have_unknown_value":false},"fdbb66325f7179c53e0d013f85a8f1bb":{"key":"material","fieldname":"Material","recommended":true,"type":"string","description":"Material of the product item"},"56beea7a921d2d0a4b65bcb91de4619f":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MinimumWeight","key":"minimum_weight","recommended":true,"description":"The lower weight limit or capability of an item,often used in conjunction with \"Maximum Weight\".The meaning varies with context of product.For example, when used with \"Maximum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"b4e2ba079a90aafe22d7b40a27a8a86b":{"type":"string","example":"1-3 Years","can_have_multiple_values":false,"fieldname":"AgeRange","key":"age_range","recommended":true,"description":"Minimum and Maximum Ages for a product. Note: the unit of measure in\n Months, or Years."},"d86e410dc0b595fa52c8071297df164e":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWidth","key":"product_width","recommended":true,"description":"The width of the fully assembled product."},"fb29eb2f1bed6b57202be5766b13a012":{"key":"color","fieldname":"Color","recommended":true,"type":"string","description":"Color of the product item"},"6f6763dc75294a1700c3325ed0e01501":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductLength","key":"product_length","recommended":true,"description":"The length of the fully assembled product."},"a125082f8b596fd6a3fc4ef69aac4ce9":{"key":"gender","fieldname":"Gender","recommended":true,"type":"enum","description":"Gender the product item is targeted towards","enum_values":["female","male","unisex"],"can_have_unknown_value":false},"b77f4835261839838cf7da93a4397624":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductHeight","key":"product_height","recommended":true,"description":"The height of the fully assembled product"},"fab78b5f78ea9c6822f0efd4b76812c7":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumWeight","key":"maximum_weight","recommended":true,"description":"The upper weight limit or capability of an item,often used in conjunction with \"Minimum Weight\".The meaning varies with context of product.For example, when used with \"Minimum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"c33d8f504a0d16cc768948032b96bb86":{"type":"string","example":["Waterproof"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"75d33e09027a3e497cd7f4871c44d0ad":{"type":"string","example":"Shape Identification","can_have_multiple_values":false,"fieldname":"EducationalFocus","key":"educational_focus","recommended":false,"description":"Describes the educational skills that the product is intended to improve"},"a61b31aad2b1cff7a5e059435aa0c079":{"type":"string","example":"Chewbacca","can_have_multiple_values":false,"fieldname":"Character","key":"character","recommended":false,"description":"The particular character, person or entity that your item represents or is associated with."},"186773615b385aea09f78bf7846c2da2":{"type":"string","example":"Space","can_have_multiple_values":false,"fieldname":"Theme","key":"theme","recommended":false,"description":"The particular subject, theme or idea that your item represents or is associated with."},"f0cc9df58632d42a9f64e187e36822ac":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsAssemblyRequired","key":"is_assembly_required","recommended":true,"description":"Indicates if the product arrives unassembledand must be put together before use."},"18213b9375e78464379a596bc5a12105":{"type":"string","example":"jogging","can_have_multiple_values":false,"fieldname":"StrollerType","key":"stroller_type","recommended":false,"description":"Prominent stroller styles."},"e294d165c14bf93d4ff9d565c45b86f0":{"type":"enum","example":["Foldable"],"can_have_multiple_values":true,"enum_values":["Foldable"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"09e6b8670b86e122237dee1d1948f5e3":{"type":"string","example":"3-point harness","can_have_multiple_values":false,"fieldname":"SafetyHarnessStyle","key":"safety_harness_style","recommended":false,"description":"The style of the occupant restraint harness included with the car\n seat, stroller, carrier, etc."},"5a781cf5acf5b20a3457889ab0719688":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberOfSeats","key":"number_of_seats","recommended":false,"description":"The number of people that can be accommodated by the\n available seats of an item."},"acb1aef05b9c5b358e8d767422053a0c":{"type":"string","example":"Convertible Car Seats","can_have_multiple_values":false,"fieldname":"ChildCarSeatStyle","key":"child_car_seat_style","recommended":false,"description":"Prominent car seat styles."},"84520363ef89687443e2b75aac0ca2a4":{"type":"string","example":"3 ft","can_have_multiple_values":false,"fieldname":"CarSeatMaxChildHeight","key":"car_seat_max_child_height","recommended":false,"description":"The maximum height of the child occupant as given by the\n manufacturer, measured in inches or centimeters."},"9d014a512c1e3019550901b0c0494ff4":{"type":"string","example":"Forward-Facing","can_have_multiple_values":false,"fieldname":"CarSeatFacingDirection","key":"car_seat_facing_direction","recommended":false,"description":"Which direction the car seat faces."},"c139a1077e40bc1ed55105d8250cfbd7":{"type":"string","example":"sling","can_have_multiple_values":false,"fieldname":"BabyCarrierStyle","key":"baby_carrier_style","recommended":false,"description":"Prominent wearable baby carrier styles."},"de2ea24937f3cfb9d23a6184b6bb1717":{"type":"string","example":"front carry-facing in","can_have_multiple_values":false,"fieldname":"BabyCarrierPosition","key":"baby_carrier_position","recommended":false,"description":"Applies to wearable baby carriers. Describes the part of the body\n against which the child is placed along with the direction the child\n faces (where applicable) while in the wearable baby carrier."},"3e6c4c356607b43e111bc414a797367c":{"type":"integer","example":12,"can_have_multiple_values":false,"fieldname":"PackageQuantity","key":"package_quantity","recommended":true,"description":"The total number of items included in the package or box."},"b2e91b6002cde2bfa85933056e1fbab1":{"key":"size","fieldname":"size","recommended":true,"type":"string","description":"Size of the product item"},"e84c396def9cf6dfa460ad427e4086f1":{"type":"string","example":["Stop using if you experience swelling, rash, or fever"],"can_have_multiple_values":true,"fieldname":"StopUseIndications","key":"stop_use_indications","recommended":false,"description":"Information that describes symptoms or reactions that\n indicate when to stop using the product."},"f9f15a8a99459328f839fb1423283f15":{"type":"string","example":["Vanilla"],"can_have_multiple_values":true,"fieldname":"Scent","key":"scent","recommended":false,"description":"The scent or fragrance of your item; including items\n labelled as \"unscented\""},"ad4e681a4cf1c32d992b0119533bb4f3":{"type":"string","example":"Oil","can_have_multiple_values":false,"fieldname":"ProductForm","key":"product_form","recommended":false,"description":"The consistency, texture or formulation of the item and the way\n it will be consumed or dispensed."},"4ddda60fca4317fa3a260bc6a716eacb":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumWeight","key":"maximum_weight","recommended":false,"description":"The upper weight limit or capability of an item,often used in conjunction with \"Minimum Weight\".The meaning varies with context of product.For example, when used with \"Minimum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"9bf1fceb6bbc26681a6531a069d97089":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MinimumWeight","key":"minimum_weight","recommended":false,"description":"The lower weight limit or capability of an item,often used in conjunction with \"Maximum Weight\".The meaning varies with context of product.For example, when used with \"Maximum Weight\",this attribute provides weight ranges for a range of productsincluding pet medicine, baby carriers and outdoor play structures."},"1b2a0250577aa3367755a9d309396596":{"type":"string","example":["Apply to wet hair","Massage into scalp","Rinse thoroughly"],"can_have_multiple_values":true,"fieldname":"Instructions","key":"instructions","recommended":false,"description":"Detailed information telling how the product should be operated,\n assembled, or consumed."},"cb857165d244dc15e39ea8f1e8752ee8":{"type":"string","example":["some_string","other"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":false,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"06824c1d350fd02b20f1ccb63dc70aa2":{"type":"string","example":"Cloth","can_have_multiple_values":false,"fieldname":"DiaperType","key":"diaper_type","recommended":false,"description":"Describes the type of diaper"},"fdb673fe23dcfd4e913ea68db30f1886":{"type":"enum","example":"Infant","can_have_multiple_values":false,"enum_values":["Newborn","Infant","Toddler"],"can_have_unknown_value":false,"fieldname":"BabyLifeStage","key":"baby_life_stage","recommended":false,"description":"Describes the life stage of the child"},"4a1709fc558601d050f61caacf1886f7":{"type":"string","example":"Stage 1","can_have_multiple_values":false,"fieldname":"BabyFoodStage","key":"baby_food_stage","recommended":true,"description":"Attribute designed to capture the generalized age grouping (commonly referred to as \"stage\") of a given baby food, as specified by manufacturer. Example descriptions: Stage 1 - Foods have a single ingredient and are pureed and generally contain about 2.5 oz of fruits, veggies or meats. Stage 2 - Foods are strained instead of pureed and have a combination of fruits or veggies instead of single ingredients, contain larger portions. Stage 3 - Foods are mashed and have more texture than the pureed foods and may have bits and chunks of meats or veggies."},"b5ab18b31d909d41c1dc88e00bac6e44":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWidth","key":"product_width","recommended":false,"description":"The width of the fully assembled product."},"812cdd6be6bd77d8fae155eee4b5ca8e":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductLength","key":"product_length","recommended":false,"description":"The length of the fully assembled product."},"045b717bb79c0b39f9d17afd53120c44":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductHeight","key":"product_height","recommended":false,"description":"The height of the fully assembled product"},"666634cdd39d094fdf806ea000651fd9":{"type":"integer","example":12,"can_have_multiple_values":false,"fieldname":"PackageQuantity","key":"package_quantity","recommended":false,"description":"The total number of items included in the package or box."},"1f60a7e1c843194aef22644bdc923372":{"type":"string","example":["Yams"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":false,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"0412c658ae5558750f3d8dcf73b35e2f":{"type":"string","example":["Cinnamon","Peppermint"],"can_have_multiple_values":true,"fieldname":"Flavor","key":"flavor","recommended":false,"description":"Describes the taste or flavor of the item, as described by the\n manufacturer. May be an important attribute for shoppers for items\n like dental products, medicine or baby foods."},"003aaedcb75e3bdf52a4a7c043bc83bf":{"type":"string","example":"Contains Peanuts","can_have_multiple_values":false,"fieldname":"Allergens","key":"allergens","recommended":false,"description":"Statement regarding any ingredients that may be food allergens, often written as \"Contains X\" or \"Manufactured in a facility which processes Y.\""},"f29ece641eb9d606c99f8ff1375cdafd":{"type":"string","example":16,"can_have_multiple_values":false,"fieldname":"Megapixels","key":"megapixels","recommended":true,"description":"Describes the resolution at which this item records images."},"198abe5c383734cf1f5c25725ad05626":{"type":"string","example":6,"can_have_multiple_values":false,"fieldname":"DigitalZoom","key":"digital_zoom","recommended":true,"description":"Describes the magnification power provided by a feature that electronically enlarges the image area"},"3c84275e3f255e24439d4d2acca1738c":{"type":"string","example":10,"can_have_multiple_values":false,"fieldname":"OpticalZoom","key":"optical_zoom","recommended":true,"description":"Describes the magnification power of a physical optical zoom lens."},"5546fa0a68017a13c3d54f434b16e543":{"type":"string","example":"Lenovo Thinkpad","can_have_multiple_values":false,"fieldname":"Model","key":"model","recommended":true,"description":"The common name of the model of the product. Does not include model numbers."},"c4140fbb308019e33a32ebef93a21145":{"key":"brand","fieldname":"Brand","recommended":true,"type":"string","description":"Brand name, unique manufacturer part number (MPN), or Global Trade Item Number (GTIN) of the item."},"c73360481bac2974a2647239ba9ac090":{"type":"string","example":"USB 2.0","can_have_multiple_values":false,"fieldname":"USBTechnology","key":"u_s_b_technology","recommended":false,"description":"Describes the version of USB technology on the product."},"fb5d85a3717fff61798f843282121fc6":{"type":"enum","example":["Flash"],"can_have_multiple_values":true,"enum_values":["35mm Jack","Downloadable Content","Online Multiplayer","Touchscreen","Bluetooth","GPS","SIM","USB Connectivity","WLAN","Portable","Unlocked","Auto Document Feeder","Auto Two-Sided Printing","Energy Star Certified","Integrated Speakers","3D","Smart","Flash","Microphone","Red Eye Reduction"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"e52c7222866dfa79fb54fb46377f2dba":{"type":"string","example":"USB-C","can_have_multiple_values":false,"fieldname":"USBType","key":"u_s_b_type","recommended":false,"description":"Describes the type of USB connector on the product."},"a557ee533a27f6ba2ab2896f50128d2b":{"type":"string","example":["Portrait"],"can_have_multiple_values":true,"fieldname":"ShootingModes","key":"shooting_modes","recommended":false,"description":"Describes the available settings designed to accommodate different photographic situations."},"cb76a2503550b23c7e96374acff9974c":{"type":"string","example":250,"can_have_multiple_values":false,"fieldname":"MinimumShutterSpeed","key":"minimum_shutter_speed","recommended":false,"description":"Describes the minimum shutter speed of the item. Measured in seconds."},"dfa8888400db20a0c59123675195f680":{"type":"string","example":2,"can_have_multiple_values":false,"fieldname":"SelfTimerDelay","key":"self_timer_delay","recommended":false,"description":"Length of time in seconds the self-timer will allow before it\n takes a photo"},"80a2c75641a182aabe897e4d0c5c8ea2":{"type":"measurement","example":"42 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ScreenSize","key":"screen_size","recommended":false,"description":"Describes the measurement of the device's screen, typically measured diagonally in inches."},"4b71478ae3751b69220f8f35f0f65ab9":{"type":"string","example":"1\/2.3 in","can_have_multiple_values":false,"fieldname":"SensorResolution","key":"sensor_resolution","recommended":false,"description":"One specification describing the smallest detectable incremental change of input parameter that can be detected in the output signal. For digital cameras, image sensor resolution is an important factor for image quality."},"82aef4349fbc23a369243c604b574e3a":{"type":"string","example":"f\/16","can_have_multiple_values":false,"fieldname":"MinimumAperture","key":"minimum_aperture","recommended":false,"description":"The smallest aperture this item accommodates; typically expressed in f-numbers."},"73d65ceca095eeba210477fa2c3566ca":{"type":"string","example":"f\/5","can_have_multiple_values":false,"fieldname":"FocalRatio","key":"focal_ratio","recommended":false,"description":"Ratio of the lens's focal length, to the diameter of the entrance pupil. Also known as the f-number or f-stop, this number indicates lens speed."},"7518e31e367a461a82c93d537dc2c7da":{"type":"string","example":["iPad"],"can_have_multiple_values":true,"fieldname":"CompatibleDevices","key":"compatible_devices","recommended":false,"description":"Devices compatible with the item."},"ba6bb30e5d011b3182c2d01d3ec52356":{"type":"string","example":"HDMI","can_have_multiple_values":false,"fieldname":"ConnectorType","key":"connector_type","recommended":false,"description":"Describes the types of connections supported on the item."},"aaa86538e1892f9637b83693ea86da06":{"type":"string","example":"LCD","can_have_multiple_values":false,"fieldname":"DisplayTechnology","key":"display_technology","recommended":false,"description":"Describes the type of technology that powers the display, like LED or LCD."},"3f3305be9612e01d2d0b854c2e23dd0f":{"type":"string","example":"Built-in Camera","can_have_multiple_values":false,"fieldname":"FlashType","key":"flash_type","recommended":false,"description":"The type of flash the camera has or can accommodate."},"27ac044687275eca92c8ffc695dfcfac":{"type":"string","example":18,"can_have_multiple_values":false,"fieldname":"FocalLength","key":"focal_length","recommended":false,"description":"On a camera or lens, the distance between the image sensor and the lens when the subject is in focus,stated as a range in millimeters."},"b5dd74005f37c4313d88aaf9ec09a6ce":{"type":"measurement","example":"10 h","enum_values":["s","m","h","d"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"BatteryLife","key":"battery_life","recommended":false,"description":"Describes the total battery life (or maximum run time) of the item, typically measured in hours."},"25dd344c790ce67c74887cef8bf51bf9":{"type":"string","example":["Scratch-Resistant"],"can_have_multiple_values":true,"fieldname":"LensCoating","key":"lens_coating","recommended":false,"description":"Type of thin layer of material applied to the surface of lenses or other optical elements that provide specific effects."},"37ced536fc643daf19b3e78c6109d462":{"type":"string","example":49,"can_have_multiple_values":false,"fieldname":"LensDiameter","key":"lens_diameter","recommended":false,"description":"Measurement of the diameter of the front portion of the lens, measured in mm."},"fa1806a7580ccac912c41dc13a38f9f2":{"type":"string","example":"Cooling","can_have_multiple_values":false,"fieldname":"LensFilter","key":"lens_filter","recommended":false,"description":"Describes the kind of filter attached to a lens."},"ee8a6aaa75b14a3f55320e0ff3bf4e19":{"type":"string","example":"f\/1.4","can_have_multiple_values":false,"fieldname":"MaximumAperture","key":"maximum_aperture","recommended":false,"description":"Size of the largest aperture this item accommodates; typically expressed in f-numbers."},"2693162e8e03185c2f7147c2ed198794":{"type":"string","example":0.00025,"can_have_multiple_values":false,"fieldname":"MaximumShutterSpeed","key":"maximum_shutter_speed","recommended":false,"description":"Describes the maximum shutter speed of the item. Measured in seconds."},"2af16c00b68ea710c43881873f0c0eab":{"type":"string","example":["WiFi"],"can_have_multiple_values":true,"fieldname":"WirelessTechnologies","key":"wireless_technologies","recommended":false,"description":"Describes the types of wireless technologies that can be used by the product."},"1d70a2d3ce76a127d1ffb1b2f4209ac9":{"key":"age_group","fieldname":"AgeGroup","recommended":true,"type":"enum","description":"Age group the product item is targeted towards","enum_values":["adult","all ages","infant","kids","newborn","teen","toddler"],"can_have_unknown_value":false},"6d21b5b1295293a171d1c7d989e9db81":{"type":"string","example":["Bodycon"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"df971d2b5138c017068b1b1ca5fe7ff0":{"key":"pattern","fieldname":"Pattern","recommended":true,"type":"string","description":"Pattern of the product item"},"7992ac8898667c0ac4a874e914c71ec0":{"type":"string","example":["Designer","Embroidered"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"03321e77f42ca941c319d9d3a696e822":{"type":"string","example":"Flutter","can_have_multiple_values":false,"fieldname":"SleeveStyle","key":"sleeve_style","recommended":false,"description":"The style of sleeves. Does not include sleeve length styles."},"ef7cf809c0d3f3dde722b692949e8a82":{"type":"enum","example":"US","can_have_multiple_values":false,"enum_values":["US","UK","EU","DE","FR","JP","CN","IT","BR","MEX","AU"],"can_have_unknown_value":true,"fieldname":"SizeSystem","key":"size_system","recommended":false,"description":"The size system used by your item, usually corresponds to Country."},"891fd9d63794da9979642269ffdf2bdb":{"type":"measurement","example":"32 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SkirtLength","key":"skirt_length","recommended":false,"description":"The numeric length value of skirts from waist to bottom. Does not include style values like Maxi."},"d0074b6e5f6d004d8b24dee11da5c838":{"type":"measurement","example":"32 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SleeveLength","key":"sleeve_length","recommended":false,"description":"The numeric length value of shirt sleeves. Does not include styles of shirt sleeves like 3\/4 Sleeve."},"c49d53b2f6e3b840d1b3b36cf763b823":{"type":"enum","example":"3\/4 Sleeve","can_have_multiple_values":false,"enum_values":["3\/4 Sleeve","Long Sleeve","Short Sleeve","Sleeveless"],"can_have_unknown_value":true,"fieldname":"SleeveLengthStyle","key":"sleeve_length_style","recommended":false,"description":"The style of sleeve length. Does not include sleeve styles."},"ebc88b022a77d94e80822b572e926b7a":{"type":"string","example":["Tennis"],"can_have_multiple_values":true,"fieldname":"Sport","key":"sport","recommended":false,"description":"The particular sport or activity for which your item is intended."},"5db117ce3ae7225ccccb737276630902":{"type":"enum","example":"Ankle","can_have_multiple_values":false,"enum_values":["Ankle","Crew","Knee High","Mid Calf","No Show","Over the Knee","Thigh High"],"can_have_unknown_value":true,"fieldname":"SockRise","key":"sock_rise","recommended":false,"description":"The height style of socks."},"bde7f38a6a5fa76697d288227050040e":{"type":"string","example":["Golden State Warriors"],"can_have_multiple_values":true,"fieldname":"SportsLeague","key":"sports_league","recommended":false,"description":"The particular sports league that your item represents or is associated with."},"f87289e65273a3a8c33c2fd3dc5b6d4b":{"type":"string","example":["NFL"],"can_have_multiple_values":true,"fieldname":"SportsTeam","key":"sports_team","recommended":false,"description":"The particular sports team that your item represents or is associated with."},"a9dc83480290657ae724a1d0fe346563":{"type":"enum","example":["Water Resistant"],"can_have_multiple_values":true,"enum_values":["Waterproof","Water Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"790ed72ed6a00633b47d5959d9869e00":{"type":"string","example":"Racerback","can_have_multiple_values":false,"fieldname":"UpperBodyStrapConfiguration","key":"upper_body_strap_configuration","recommended":false,"description":"The strap style for items like tops, bras, and swimsuits."},"8b9b340f74a391da8163b1edfbaeeef9":{"type":"string","example":"Ultra High","can_have_multiple_values":false,"fieldname":"WaistRise","key":"waist_rise","recommended":false,"description":"The height where the waistline of the item lies on the body."},"ed9805103a40909dbd170d6a15d59e57":{"type":"measurement","example":"30 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WaistSize","key":"waist_size","recommended":false,"description":"The numeric size of the waist for lower body garments. Does not include generic sizes like Small."},"59d583067536c9a9f0092ad4349b4107":{"type":"string","example":"Opaque","can_have_multiple_values":false,"fieldname":"Sheerness","key":"sheerness","recommended":false,"description":"The amount of sheerness or opacity of an item. Usually used for hosiery items."},"5917325df899badf730967031c51828e":{"type":"string","example":"Relaxed","can_have_multiple_values":false,"fieldname":"PantFit","key":"pant_fit","recommended":false,"description":"The general fit style of pants. Also applies to jeans."},"5d2faf8e7cd918c37585a3582ce67d41":{"type":"string","example":"Ankle","can_have_multiple_values":false,"fieldname":"PantLengthStyle","key":"pant_length_style","recommended":false,"description":"The length style of pants. Also applies to jeans & leggings."},"79d33c7a4244cde541284dffebd8af57":{"type":"string","example":["Distressed","Faded"],"can_have_multiple_values":true,"fieldname":"DenimFeatures","key":"denim_features","recommended":false,"description":"Features, embellishments & finishes that are specific to jeans."},"088788414687d075b58111bf0a9e6b28":{"type":"integer","example":32,"can_have_multiple_values":false,"fieldname":"BraBandSize","key":"bra_band_size","recommended":false,"description":"The band size of the bra."},"f8cd81278f0a424f4552e69119f8ce3e":{"type":"string","example":"A","can_have_multiple_values":false,"fieldname":"BraCupSize","key":"bra_cup_size","recommended":false,"description":"The cup size of the bra."},"3eb05a953435b526264c76134a8b02df":{"type":"measurement","example":"34 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ChestSize","key":"chest_size","recommended":false,"description":"The numeric size of the chest measurement for the item. Does not include generic sizes like Small."},"7951a620026294a95a0ac44f9ba71eee":{"type":"string","example":"Zipper","can_have_multiple_values":false,"fieldname":"Closure","key":"closure","recommended":false,"description":"The type of fastener used to close your item."},"114da48906462d334d5d7f59893d434d":{"type":"enum","example":"Big & Tall","can_have_multiple_values":false,"enum_values":["Big & Tall","Regular","Big Boys","Big Girls","Full Size","Little Boys","Little Girls","Petite","Plus","Maternity","Baby Boy","Baby Girls","Toddler Boys","Toddler Girls"],"can_have_unknown_value":true,"fieldname":"ClothingSizeType","key":"clothing_size_type","recommended":false,"description":"The general grouping of different sizes based on age & gender."},"e1cc3ced186fc459db4f1778dabbc6c0":{"type":"string","example":"Banded","can_have_multiple_values":false,"fieldname":"CollarStyle","key":"collar_style","recommended":false,"description":"The style of collar on your item."},"07a68126da1326bbb99e0ffd81455258":{"type":"string","example":["Do Not Iron","Dry Clean Only"],"can_have_multiple_values":true,"fieldname":"FabricCareInstructions","key":"fabric_care_instructions","recommended":false,"description":"The specific care instructions for how the fabric of your item should be cleaned. This can be found on the label of the item."},"c4398a3afbb4b58166ab7090026a1c5f":{"type":"string","example":"Boot Cut","can_have_multiple_values":false,"fieldname":"PantLegStyle","key":"pant_leg_style","recommended":false,"description":"The style or cut of pant legs. Also applies to jeans."},"8908691dbe1fc7cf9b8ec543a30ccf74":{"type":"measurement","example":"30 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Inseam","key":"inseam","recommended":false,"description":"The numeric size of the inseam for items like pants, jeans and leggings. Does not include generic sizes like Small."},"0c682655422cf862d012da48c74e9045":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsAdultProduct","key":"is_adult_product","recommended":false,"description":"Indicates if your product is sexually suggestive and intended only for adults."},"e32d81cb2795fb799d41e9beb75914a1":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsCostume","key":"is_costume","recommended":false,"description":"Indicates if the item is intended to be worn as a costume."},"044e1e8f4a2fb735e0f63e44c3217379":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsOutfitSet","key":"is_outfit_set","recommended":false,"description":"Indicates if the product has 2 or more different items that come as part of a matching or oufit set, like matching shirt & pants or bra & underwear set"},"11c967a5fc1a473d71ba4e8ac43d35c4":{"type":"string","example":"Acid Wash","can_have_multiple_values":false,"fieldname":"JeanWash","key":"jean_wash","recommended":false,"description":"The post-process wash treatment that may alter color or texture of denim products."},"f26b323c65bc8413143b53c424cb106c":{"type":"string","example":"Crew Neck","can_have_multiple_values":false,"fieldname":"Neckline","key":"neckline","recommended":false,"description":"The neckline or neck style of the item."},"efe63cfc2af39e9b3904b04f339137a8":{"type":"string","example":["Bridesmaid"],"can_have_multiple_values":true,"fieldname":"Occasion","key":"occasion","recommended":false,"description":"The type of special occassion(s) for which your item is intended or specialized."},"00efcecb28226b61fa715ceed2408546":{"type":"string","example":"Banded","can_have_multiple_values":false,"fieldname":"WaistStyle","key":"waist_style","recommended":false,"description":"The style of the waist on the item. Can apply to pants or dresses."},"f8b8550acb981fe24299736073b56104":{"type":"string","example":["Bow Tie"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"a53318a479999a52de362427c1af31da":{"type":"string","example":"Narrow","can_have_multiple_values":false,"fieldname":"SunglassesWidth","key":"sunglasses_width","recommended":false,"description":"The width of the sunglasses frame."},"422e14c47d8c95351a13574b5ffe3076":{"type":"string","example":"Anti-Reflective","can_have_multiple_values":false,"fieldname":"SunglassesLensTechnology","key":"sunglasses_lens_technology","recommended":false,"description":"The technology or treatment of sunglasses lenses."},"36415ae546c8d7681c9ede23fdc1ddc3":{"type":"enum","example":"Beige","can_have_multiple_values":false,"enum_values":["Beige","Black","Blue","Bronze","Brown","Gold","Gray","Green","Multi-Color","Orange","Pink","Purple","Red","Silver","White","Yellow"],"can_have_unknown_value":true,"fieldname":"SunglassesLensColor","key":"sunglasses_lens_color","recommended":false,"description":"The color of sunglasses lenses."},"70c39caa59cfd987167f972dd9aba990":{"type":"string","example":"Classic","can_have_multiple_values":false,"fieldname":"TieWidth","key":"tie_width","recommended":false,"description":"The width of tie."},"8125fc680ed8690436264f94a52dd4e9":{"type":"string","example":["Chukka"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"cd9f78020f15de834fcc58d3d563ebac":{"type":"string","example":"A","can_have_multiple_values":false,"fieldname":"ShoeWidth","key":"shoe_width","recommended":true,"description":"The width of the shoes."},"b0bd5a2777af18be80307b03175a050a":{"type":"enum","example":["Water Resistant"],"can_have_multiple_values":true,"enum_values":["Orthopedic","Waterproof","Water Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"30bc46e76de465db006632f51b9dc9bc":{"type":"enum","example":"Flats","can_have_multiple_values":false,"enum_values":["Flats","Boots","Heels","Sandals","Slippers","Athletic Shoes","Fashion Sneakers"],"can_have_unknown_value":true,"fieldname":"ShoeType","key":"shoe_type","recommended":false,"description":"The type of shoes."},"eb7731477ae172c98b8653d26038d351":{"type":"string","example":"Wedge","can_have_multiple_values":false,"fieldname":"HeelStyle","key":"heel_style","recommended":false,"description":"The style of heel on the shoes."},"9847453e3dfb3f97dd262911e96927fc":{"type":"measurement","example":"0.5 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"HeelHeight","key":"heel_height","recommended":false,"description":"The numeric height of the heel on the shoes."},"24cdfc97c883070990bfe53a9ab4fcc1":{"type":"string","example":["Hoops"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"ae3548dbfd62e601abeefe809b9804fe":{"type":"string","example":["Ruby","Emerald"],"can_have_multiple_values":true,"fieldname":"Gemstone","key":"gemstone","recommended":true,"description":"The type of gemstone(s) in your item."},"c2b8ee902fdca1b35815f183af905f6a":{"type":"string","example":["Vintage","Engraved"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"f0933d6a49ace1948a6f904be052d459":{"type":"enum","example":["Resizable"],"can_have_multiple_values":true,"enum_values":["Resizable","Water Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"0a55223a8807dfafc4e957899053f571":{"type":"string","example":"Silver","can_have_multiple_values":false,"fieldname":"PlatingMaterial","key":"plating_material","recommended":false,"description":"The type of metal or material which your item is plated or covered with."},"deb41e4835824a3ada806d318df5ffe0":{"type":"string","example":"14k","can_have_multiple_values":false,"fieldname":"MetalStampOrPurity","key":"metal_stamp_or_purity","recommended":false,"description":"The metal purity of your item. Sometimes this is indicated or stamped directly onto jewelry items."},"6e7562a9f0a1c4675f7ca5d15cf53e6a":{"type":"string","example":"2 prong","can_have_multiple_values":false,"fieldname":"JewelrySettingStyle","key":"jewelry_setting_style","recommended":false,"description":"The style in which stones are set within or attached to a piece of jewelry"},"f0f118d833eecf0a3d4deb47ce1e8a2a":{"type":"string","example":["Best Friends Forever"],"can_have_multiple_values":true,"fieldname":"Inscription","key":"inscription","recommended":false,"description":"The text of what is engraved on the item. (Multiple Values Accepted)"},"3ed35b95494c9b3f2985fdb9dff7730d":{"type":"string","example":1.29,"can_have_multiple_values":false,"fieldname":"GemstoneWeight","key":"gemstone_weight","recommended":false,"description":"The total weight or mass (in carats) of the individual gemstone."},"58ba4a0325e3756373a8383a2bc5377d":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"GemstoneWidth","key":"gemstone_width","recommended":false,"description":"The width measurement of the gemstone in milimeters."},"8e0135de1890e1bc54c6f4524d2bb6a1":{"type":"string","example":["Dyed","Heat Treated"],"can_have_multiple_values":true,"fieldname":"GemstoneTreatment","key":"gemstone_treatment","recommended":false,"description":"Indicates any treatments or processing of the stone to change its color, clarity or durability."},"af11df6c0242d4276dc13b175379b723":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"GemstoneLength","key":"gemstone_length","recommended":false,"description":"The length measurement of the gemstone in milimeters."},"8f70200f0fd2e1a7987947575021f910":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"GemstoneHeight","key":"gemstone_height","recommended":false,"description":"The height measurement of the gemstone in milimeters."},"6ad2f369b3c9e5177d46ce54aaa855e3":{"type":"string","example":"Asscher","can_have_multiple_values":false,"fieldname":"GemstoneCut","key":"gemstone_cut","recommended":false,"description":"The style in which the gemstone(s) of your item have been cut and their general shape."},"be0f716b198ea39563b1ae49c03feaa7":{"type":"string","example":"Natural","can_have_multiple_values":false,"fieldname":"GemstoneCreationMethod","key":"gemstone_creation_method","recommended":false,"description":"The method by which the stone was created. Indicates if the stone is natural or manmade."},"087b63be2ec0b2c73fdeb21260a8429e":{"type":"string","example":"Colorless","can_have_multiple_values":false,"fieldname":"GemstoneColor","key":"gemstone_color","recommended":false,"description":"The color of the gemstone(s) in your item that accounts for hue, tone and saturation."},"40496e7589d7a3e945471afaa9b5eb77":{"type":"string","example":"FL","can_have_multiple_values":false,"fieldname":"GemstoneClarity","key":"gemstone_clarity","recommended":false,"description":"The quality and clarity of the visual aspect of the gemstone, particularly important for Diamonds. Indicates visual and and internal characteristics and surface defects of blemishes."},"3b714bc4f27197b27df4ed555063b227":{"type":"string","example":"Clip-On","can_have_multiple_values":false,"fieldname":"EarringBackFinding","key":"earring_back_finding","recommended":false,"description":"The type of fastening method for the backs of earrings."},"2a4450be3608cf3a38cad25f7d49b813":{"type":"string","example":"Lobster Clasp","can_have_multiple_values":false,"fieldname":"ClaspType","key":"clasp_type","recommended":false,"description":"The type of clasp or closure method of your item."},"b8b24c8698213706e91fb53948de8a69":{"type":"measurement","example":"12 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ChainLength","key":"chain_length","recommended":false,"description":"The length of the jewelry chain. Usually in inches."},"2ad129e62056d93bd1201aef398651bb":{"type":"string","example":1.29,"can_have_multiple_values":false,"fieldname":"TotalGemstoneWeight","key":"total_gemstone_weight","recommended":false,"description":"The total combined weight or mass (in carats) of all stones in the piece of jewelry."},"d9e0fd21a2211dee29551f555ae1036d":{"type":"string","example":["Bangle"],"can_have_multiple_values":true,"fieldname":"Style","key":"style","recommended":true,"description":"The style(s) associated with the item."},"cf48a2e1304c7e8e3df5e6a9eb67e991":{"type":"enum","example":"Electric","can_have_multiple_values":false,"enum_values":["Electric","Batteries"],"can_have_unknown_value":true,"fieldname":"PowerType","key":"power_type","recommended":false,"description":"Provides information on the exact type of power used by the item."},"abfc9636c9dd70941b01e4e077588073":{"type":"enum","example":["Calendar"],"can_have_multiple_values":true,"enum_values":["Calendar","Resizable","Water Resistant","Waterproof"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"0f94d987d41ce3cc234ca9051c468234":{"type":"measurement","example":"240 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchBandLength","key":"watch_band_length","recommended":false,"description":"The length of the watch band"},"8ea77ea069e2c0b4b74c167d9e394faf":{"type":"string","example":["Leather","Stainless Steel"],"can_have_multiple_values":true,"fieldname":"WatchBandMaterial","key":"watch_band_material","recommended":false,"description":"The primary material(s) from which the band of the watch is made."},"d3ac14e44af9ea925fd801578da42a63":{"type":"measurement","example":"22 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchBandWidth","key":"watch_band_width","recommended":false,"description":"The width of the watch band"},"028cde57179c9c4356a63649d170c6c4":{"type":"measurement","example":"42 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchCaseDiameter","key":"watch_case_diameter","recommended":false,"description":"The diameter of the watch case or dial"},"f4b65f0456fd44dd79accf30fa6002f6":{"type":"string","example":"Round","can_have_multiple_values":false,"fieldname":"WatchCaseShape","key":"watch_case_shape","recommended":false,"description":"The shape of the watch case or enclosure which contains the face & inner workings of the watch."},"37da4cf70f57a2eaf2671145d216b16e":{"type":"measurement","example":"12 mm","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"WatchCaseThickness","key":"watch_case_thickness","recommended":false,"description":"The thickness of the watch case or dial"},"eba94cf3d4446cdb773987c97f384918":{"type":"string","example":["Yoga","Sailing"],"can_have_multiple_values":true,"fieldname":"Activity","key":"activity","recommended":false,"description":"The particular sport or activity for which your item is intended."},"44084d5972f3b03d6abe5887c6dfd4b0":{"type":"string","example":["Ruby","Emerald"],"can_have_multiple_values":true,"fieldname":"Gemstone","key":"gemstone","recommended":false,"description":"The type of gemstone(s) in your item."},"9a6f633320e996ae1d5bad38d51e085c":{"type":"string","example":"Quartz","can_have_multiple_values":false,"fieldname":"WatchMovementType","key":"watch_movement_type","recommended":false,"description":"The type of movement within the watch"},"fe4c9e79e3986fe439f5ba1c21828f2e":{"type":"measurement","example":"1 TB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"StorageCapacity","key":"storage_capacity","recommended":true,"description":"Describes the amount of storage space on the item's hard drive, typically measured in megabytes, gigabytes or terabytes."},"2390176fad8a47f031329e771da0e400":{"type":"string","example":"Android","can_have_multiple_values":false,"fieldname":"OperatingSystem","key":"operating_system","recommended":true,"description":"Describes the type of preloaded operating system software installed on the device."},"49b1cf42befb0ba138e430326fbc6ea6":{"type":"measurement","example":"42 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ScreenSize","key":"screen_size","recommended":true,"description":"Describes the measurement of the device's screen, typically measured diagonally in inches."},"567aba0d72ce14b0928d5e6aa61c7f35":{"type":"string","example":24,"can_have_multiple_values":false,"fieldname":"RearFacingCameraResolution","key":"rear_facing_camera_resolution","recommended":false,"description":"Describes the maximum resolution of the item's rear facing camera, in megapixels."},"a5dc22c3e935ab432331f4cab30c0787":{"type":"measurement","example":"3 GHz","enum_values":["Hz","KHz","MHz","GHz"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProcessorSpeed","key":"processor_speed","recommended":false,"description":"Describes the operational frequency of the computer's CPU"},"361b07f5140feaec4be03122ed0d6287":{"type":"string","example":"Intel Core i7","can_have_multiple_values":false,"fieldname":"ProcessorType","key":"processor_type","recommended":false,"description":"Describes commonly used name of the computer's CPU"},"fe18897b738f817319015eb3048928e5":{"type":"measurement","example":"16 GB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"RamMemory","key":"ram_memory","recommended":false,"description":"Desribes the amount of RAM memory that is preinstalled on the product."},"083cb9b61b45283ca9ee93f906516300":{"type":"integer","example":1080,"can_have_multiple_values":false,"fieldname":"Resolution","key":"resolution","recommended":false,"description":"Describes the resolution of the product screen"},"a59afd07b13fe423f4ea99faec8453d8":{"type":"string","example":24,"can_have_multiple_values":false,"fieldname":"VideoResolution","key":"video_resolution","recommended":false,"description":"Describes the resolution of the video recordings of the product in\n megapixels"},"3b621ecd047fb5f084be32fc1afb6389":{"type":"string","example":"ATX","can_have_multiple_values":false,"fieldname":"MotherboardFormFactor","key":"motherboard_form_factor","recommended":false,"description":"Describes one of the standard physical sizes to which the computer motherboard conforms"},"bfe5d2ed096364fe145cc59a87f41760":{"type":"string","example":["CD ROM"],"can_have_multiple_values":true,"fieldname":"OpticalDrive","key":"optical_drive","recommended":false,"description":"Describes the type of optical drives included with the product"},"ec6456439bf772caeb9e8304cb32ec3e":{"type":"measurement","example":"16 GB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumSupportedRam","key":"maximum_supported_ram","recommended":false,"description":"Describes the maximum amount of RAM memory that can be supported by the product."},"70d088a2087eeddc317dedc4846e71e1":{"type":"enum","example":"Internal","can_have_multiple_values":false,"enum_values":["Internal","External"],"can_have_unknown_value":true,"fieldname":"HardDriveType","key":"hard_drive_type","recommended":false,"description":"Describes whether the hard drives of the product are internal or external"},"4a2d5d0019d9f4e3e553461d450eb409":{"type":"string","example":"Nvidia GeForce RTX 2080","can_have_multiple_values":false,"fieldname":"GraphicsCardModel","key":"graphics_card_model","recommended":false,"description":"Describes the model name of the graphics card included with the product"},"ea1ec0d2e16be590eee6a2ede6da6435":{"type":"string","example":24,"can_have_multiple_values":false,"fieldname":"FrontFacingCameraResolution","key":"front_facing_camera_resolution","recommended":false,"description":"Describes the maximum resolution of the item's front facing camera, in megapixels."},"b6049f7a7d322c6402d8e55ff0041d93":{"type":"string","example":"AM3","can_have_multiple_values":false,"fieldname":"CpuSocketType","key":"cpu_socket_type","recommended":false,"description":"The interface of, or required by, the central processing unit."},"54919ad5f3d7792c8e13c4bde36632bf":{"type":"string","example":"Full Tower","can_have_multiple_values":false,"fieldname":"ComputerCaseFormFactor","key":"computer_case_form_factor","recommended":false,"description":"Describes one of the standard physical sizes to which the computer case conforms"},"b31777d6275a27c26f1e9928c503ef19":{"type":"string","example":"Bluetooth 4.0","can_have_multiple_values":false,"fieldname":"BluetoothTechnology","key":"bluetooth_technology","recommended":false,"description":"Describes the type of version of the compatible bluetooth."},"dacac94d354a921cff590fa3d34d6078":{"type":"string","example":12,"can_have_multiple_values":false,"fieldname":"StandbyTime","key":"standby_time","recommended":false,"description":"Describes the total stand-by time in hours of the phone."},"ed57863b87213a9ffe54d40f978635b8":{"type":"string","example":12,"can_have_multiple_values":false,"fieldname":"TalkTime","key":"talk_time","recommended":false,"description":"Describes the total talk time in hours of the phone."},"643ec7fd851671f9f0fe60199b37bf0c":{"type":"string","example":["Leather"],"can_have_multiple_values":true,"fieldname":"WatchBandMaterial","key":"watch_band_material","recommended":false,"description":"The materials from which the band of the watch is made."},"d0aae07685ed17d8f4d00a2658fbb437":{"type":"string","example":["Standard SIM"],"can_have_multiple_values":true,"fieldname":"SimTypes","key":"sim_types","recommended":false,"description":"Describes the type of SIM compatible with the product, like Mini-SIM, Dual SIM."},"f2d22b905571ec1b0c9722ed6c227125":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberofSIMCardSlots","key":"numberof_s_i_m_card_slots","recommended":false,"description":"Describes the number of SIM card slots on the product."},"7c8efd858532f7cdf437cc9fb39a0bec":{"type":"string","example":"3G","can_have_multiple_values":false,"fieldname":"CellularGeneration","key":"cellular_generation","recommended":false,"description":" Describes the communications network generation of the cell phone"},"65fe00497801a23a1285c1bdfba66014":{"type":"string","example":"CDMA","can_have_multiple_values":false,"fieldname":"CellularBand","key":"cellular_band","recommended":false,"description":"Describes the cellular band or network technology used by the device."},"fe1280e0d1b522e738d01296e5efb34f":{"type":"string","example":"Verizon","can_have_multiple_values":false,"fieldname":"CellPhoneServiceProvider","key":"cell_phone_service_provider","recommended":false,"description":"Describes the company that provides the phone's cellular service (if not unlocked)"},"bbc7f8045d5073625f856ac52313df47":{"type":"string","example":"Wristwatch","can_have_multiple_values":false,"fieldname":"WatchStyle","key":"watch_style","recommended":false,"description":"The style of watch."},"707d4ddb458001de9dd489dc081a917a":{"type":"string","example":["iPad"],"can_have_multiple_values":true,"fieldname":"CompatibleDevices","key":"compatible_devices","recommended":true,"description":"Devices compatible with the item."},"30c69d289f07754985fa521022655ba0":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWeight","key":"product_weight","recommended":false,"description":"The weight of the fully assembled product."},"10a6af510a4d49ca6eeaebfbead6c6fa":{"type":"measurement","example":"40 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MinimumScreenSize","key":"minimum_screen_size","recommended":false,"description":" Describes the minimum size of the TV\/Monitor that the mount can\n accommodate"},"b1bac032a961eb0cff6df86fce2da4c4":{"type":"string","example":"Fixed Mount","can_have_multiple_values":false,"fieldname":"MountType","key":"mount_type","recommended":false,"description":"Describes how the TV or monitor is attached and degree of\n adjustment of position is allowed once the mount is installed"},"bdcaca96c46e181c0d4bf347097c228e":{"type":"measurement","example":"55 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaximumScreenSize","key":"maximum_screen_size","recommended":false,"description":"Describes the maximum size of the TV\/Monitor that the mount can\n accommodate"},"ec7db52e6443df6d84672fa3397e4144":{"type":"measurement","example":"45 lb","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MaxLoadWeight","key":"max_load_weight","recommended":false,"description":"Describes the amount of weight that the TV\/Monitor mount\n can support as certified by the manufacturer"},"91f569f41bdde8d40c421f04d9f0ec23":{"type":"string","example":["In-Ear"],"can_have_multiple_values":true,"fieldname":"HeadphoneFeatures","key":"headphone_features","recommended":false,"description":"List features specific to headphones"},"158bcad2efdd1b1f944e632d8603c189":{"type":"measurement","example":"2 ft","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"CableLength","key":"cable_length","recommended":false,"description":"Total length of electronics cable"},"8904e34635ccfa9f1776f6bf8964d571":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductDepth","key":"product_depth","recommended":true,"description":"The depth of the fully assembled product."},"1e86882555078459f4919858583e9fce":{"type":"integer","example":1080,"can_have_multiple_values":false,"fieldname":"Resolution","key":"resolution","recommended":true,"description":"Describes the resolution of the product screen"},"75bf93f645a2702cd3dc1aeac96fcc79":{"type":"integer","example":50,"can_have_multiple_values":false,"fieldname":"MonochromePagesPerMinute","key":"monochrome_pages_per_minute","recommended":false,"description":"The number of monochrome pages that the imaging device is able to produce per minute."},"bf9c9a51c205f8c02070a7aa2e11d65b":{"type":"enum","example":"Monochrome","can_have_multiple_values":false,"enum_values":["Monochrome","Color"],"can_have_unknown_value":true,"fieldname":"MonochromeOrColor","key":"monochrome_or_color","recommended":false,"description":"Is the imaging device capable of color processing or monochrome only?"},"eefa8dd52fadfc95322a8c584a87e1c5":{"type":"integer","example":12,"can_have_multiple_values":false,"fieldname":"ColorPagesPerMinute","key":"color_pages_per_minute","recommended":false,"description":"The number of color pages that the imaging device is able to produce per minute."},"be84c1ccb42a2826aa12efb3ad494d6e":{"type":"string","example":"LCD","can_have_multiple_values":false,"fieldname":"DisplayTechnology","key":"display_technology","recommended":true,"description":"Describes the type of technology that powers the display, like LED or LCD."},"fece1f8c30e55cec967050c8d46d2179":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"ResponseTime","key":"response_time","recommended":false,"description":"Describes the amount of time it takes for the pixels in a display to change, measured in miliseconds."},"d2b0fda41f2dc69846c9a72ee97b6304":{"type":"string","example":60,"can_have_multiple_values":false,"fieldname":"RefreshRate","key":"refresh_rate","recommended":false,"description":"Describes the refresh rate of the display. This measures the number of times the picture is updated per second, measured in Hz."},"0307a27632bdff957e247336e336c958":{"type":"string","example":"200 x 200","can_have_multiple_values":false,"fieldname":"VesaMountingStandard","key":"vesa_mounting_standard","recommended":false,"description":"The VESA Standard defines the distance in millimeters between the\n four mounting holes on the back of a TV (distance horizontally x\n distance vertically)."},"0ea98808c27886d1dae8ceaa3aaa2260":{"type":"string","example":"4:3","can_have_multiple_values":false,"fieldname":"AspectRatio","key":"aspect_ratio","recommended":false,"description":"Describes the relationship between the product's width and its height."},"0abb978f2c8edd1d059e564a4e41e744":{"type":"integer","example":3,"can_have_multiple_values":false,"fieldname":"NumberOfHdmiports","key":"number_of_hdmiports","recommended":false,"description":"The number of HDMI ports on the television or monitor"},"82229416d35b701d3f141174aa5f054b":{"type":"string","example":"20,000:1","can_have_multiple_values":false,"fieldname":"MaximumContrastRatio","key":"maximum_contrast_ratio","recommended":false,"description":"The ratio between the luminance of the brightest color to that of\n the darkest color capable of being displayed."},"2da53aa14b92ca922b59fdea5a6a69d6":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsAssemblyRequired","key":"is_assembly_required","recommended":false,"description":"Indicates if the product arrives unassembledand must be put together before use."},"6fa83aef4f8623080b9b36b3373d650f":{"type":"string","example":"CCFL","can_have_multiple_values":false,"fieldname":"BacklightTechnology","key":"backlight_technology","recommended":false,"description":"Describes the technology used to backlight the screen or television. Commonly Cathold Fluorescent Tubes (CCFL) or Light Emitting Diodes (LED)"},"459473687330b5617bdaf470bcf83a7e":{"type":"string","example":5,"can_have_multiple_values":false,"fieldname":"AudioPowerOutput","key":"audio_power_output","recommended":false,"description":"Describes the power of the audio output of the device's speakers, measured in watts."},"81c8727757c4fd1d1d12f5d261744c57":{"type":"string","example":["Noise Cancelling"],"can_have_multiple_values":true,"fieldname":"AudioFeatures","key":"audio_features","recommended":false,"description":"Describes whether the product has certain special audio features."},"1e2de3306f34ebe0755bb8f5297f9cb0":{"type":"string","example":1.8,"can_have_multiple_values":false,"fieldname":"ThrowRatio","key":"throw_ratio","recommended":false,"description":"The relation between the throw distance and the image width; tells\n us what image size we can project from a certain distance away."},"755632f8c8070139f1d7b1d8817eeac3":{"type":"string","example":6500,"can_have_multiple_values":false,"fieldname":"LampLife","key":"lamp_life","recommended":false,"description":"The expected life of the projection lamp in hours."},"697539305c05f8a9a0fe6e97e2eab4d0":{"type":"string","example":2000,"can_have_multiple_values":false,"fieldname":"Brightness","key":"brightness","recommended":false,"description":"Brightness per bulb measured in lumens."},"fba4b5b5f790c6348fabe6c10d0f8bf6":{"type":"string","example":"Xbox 360","can_have_multiple_values":false,"fieldname":"VideoGamePlatform","key":"video_game_platform","recommended":true,"description":"Describes the type of platform on which video game software is capable of running."},"01691d8e5b9ed5a58a109dc90b74f439":{"type":"string","example":"Fallout","can_have_multiple_values":false,"fieldname":"VideoGameSeries","key":"video_game_series","recommended":false,"description":"The name of the video game series this game belongs to."},"ecb8b647ae87edddac43b94a3093e72c":{"type":"string","example":"E - Everyone","can_have_multiple_values":false,"fieldname":"VideoGameRating","key":"video_game_rating","recommended":false,"description":"Describes the standard rating of the content of the video game. Can be important for violent games or games intended only for mature audiences."},"532c713f0d2a4408702814f32c02020f":{"type":"string","example":"Shooter","can_have_multiple_values":false,"fieldname":"VideoGameGenre","key":"video_game_genre","recommended":false,"description":"Describes the genre, style or type of video game being sold."},"e65585ff17b284d24ee18e28851f6ac8":{"type":"measurement","example":"1 TB","enum_values":["KB","MB","GB","TB"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"StorageCapacity","key":"storage_capacity","recommended":false,"description":"Describes the amount of storage space on the item's hard drive, typically measured in megabytes, gigabytes or terabytes."},"9a9c97dfb6df9491e73d4ba7d39e2460":{"type":"string","example":["Kinect"],"can_have_multiple_values":true,"fieldname":"RequiredPeripherals","key":"required_peripherals","recommended":false,"description":"Indicates any type of required accessory or peripheral necessary to operate the item (or play the video game)."},"a36f46f58ba3a8907408d6c24e50bfad":{"type":"string","example":"09-19-2019","can_have_multiple_values":false,"fieldname":"ReleaseDate","key":"release_date","recommended":false,"description":"Describes the specific date which marks when the product was made available for public distribution, provided in the format MM-DD-YYYY"},"48504b28464be452dc971f271b0eef35":{"type":"string","example":"CD","can_have_multiple_values":false,"fieldname":"PhysicalMediaFormat","key":"physical_media_format","recommended":false,"description":"Describes the standard media format in which the product exists."},"95f1c14e6ac4218a6af57710a935fb6f":{"type":"string","example":"Android","can_have_multiple_values":false,"fieldname":"OperatingSystem","key":"operating_system","recommended":false,"description":"Describes the type of preloaded operating system software installed on the device."},"87ee129e6abae679ef3dc1881c29ac4c":{"type":"string","example":"Natural\/Unfinished","can_have_multiple_values":false,"fieldname":"Finish","key":"finish","recommended":true,"description":"The external treatment to the productthat usually includes a change inappearance or texture to the item.Commonly used for furniture includewood, metal and fabric."},"73c8639362fab24e43a3fa21a122d3f6":{"type":"string","example":"Bohemian","can_have_multiple_values":false,"fieldname":"DecorStyle","key":"decor_style","recommended":true,"description":"The decorative style in which the product was made."},"9c05349004f01b710d863a5bcc135754":{"type":"string","example":["Designer"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"447e1ca997ac7372d84321a5da8b9577":{"type":"string","example":["Family Room"],"can_have_multiple_values":true,"fieldname":"RecommendedRooms","key":"recommended_rooms","recommended":false,"description":"The rooms where the item is likely or recommended to be used."},"cb8a3c1875a379537c185708e6662ba6":{"type":"measurement","example":"20 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SeatBackHeight","key":"seat_back_height","recommended":false,"description":"Indicates the seat back height from the base of the seat to the top of the back. This may be separate from the \"Assembled Product Height\" and \"Seat Height\" attributes."},"ed80e4f1f84fcb9b076e9089aa9b73da":{"type":"measurement","example":"36 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"SeatHeight","key":"seat_height","recommended":false,"description":"Indicates height from the floor to the top of the seat. This may be separate from the \"Assembled Product Height\" and \"Seat Back Height\" attributes."},"eaf4eb99a4c71f786c74f207839181ab":{"type":"string","example":"Leather","can_have_multiple_values":false,"fieldname":"SeatMaterial","key":"seat_material","recommended":false,"description":"The material of the item's seat cushion. This may be separate from the item's main material composition, which falls under the \"Material\" attribute."},"f2d839922ab1a15c3720eb42f01393ff":{"type":"string","example":"Square","can_have_multiple_values":false,"fieldname":"Shape","key":"shape","recommended":false,"description":"The general shape of the product. Often used to describe\n furniture and home furnishings."},"00d4ef3a1bb967e59e960f07a8a36010":{"type":"enum","example":["Antique"],"can_have_multiple_values":true,"enum_values":["Foldable","Inflatable","Pump Included","Wheeled","Antique"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"2733dc5d8c97d75657a86568037a0609":{"type":"integer","example":4,"can_have_multiple_values":false,"fieldname":"NumberOfDrawers","key":"number_of_drawers","recommended":false,"description":"The number of drawers included in the product."},"9e1903c5cd2876e1c9889eb5cea8045a":{"type":"integer","example":4,"can_have_multiple_values":false,"fieldname":"NumberOfShelves","key":"number_of_shelves","recommended":false,"description":"The number of shelves included in the product."},"8cafc76619e3f64c83abec41a95b9915":{"type":"string","example":"Wall Mount","can_have_multiple_values":false,"fieldname":"MountType","key":"mount_type","recommended":false,"description":"The method by which the item is attached or anchored. Used for products such as shelving and other fixtures."},"97bdb9242e7b2962284619b2ce7c06a4":{"type":"measurement","example":"10 in","enum_values":["mm","cm","m","in","ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"MattressThickness","key":"mattress_thickness","recommended":false,"description":"The measure from the bottom of the mattress to the crown"},"a700f8e116174455d5d9f3782aa0bf4e":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsPowered","key":"is_powered","recommended":false,"description":"Indicates if the item uses electricity and requires a power cord or batteries to operate."},"7f54c0815b0e8d9cb192bdc4819bd7f5":{"type":"enum","example":"Indoor Only","can_have_multiple_values":false,"enum_values":["Indoor Only","Outdoor Only","Indoor\/Outdoor"],"can_have_unknown_value":true,"fieldname":"IndoororOutdoor","key":"indooror_outdoor","recommended":false,"description":"Indicates if the item is indoor only, outdoor only, or intended for both."},"39a086121f568673a43aedb5478c26d4":{"type":"string","example":"Foam","can_have_multiple_values":false,"fieldname":"FillMaterial","key":"fill_material","recommended":false,"description":"The material used to stuff the item usually in cushions, pillows,\n mattresses, and bean bags."},"d17ad1a388d5c83e6d89a16d3ac964fb":{"type":"string","example":"Extra Firm","can_have_multiple_values":false,"fieldname":"ComfortLevel","key":"comfort_level","recommended":false,"description":"The firmness or softness of a mattress."},"9d73d1c85fae03275869c6806d30fd93":{"type":"string","example":"Canopy Bed","can_have_multiple_values":false,"fieldname":"BedFrameType","key":"bed_frame_type","recommended":false,"description":"The type or style of the bed. Does not include Futons, Day Beds, or Sleepers."},"7d8fefe9bf9918c271f908a0e83f5f16":{"type":"enum","example":["Wheeled"],"can_have_multiple_values":true,"enum_values":["Foldable","Wheeled","Antique"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"e009f02a406e7aab29c5ab8230d08848":{"type":"string","example":"Natural\/Unfinished","can_have_multiple_values":false,"fieldname":"Finish","key":"finish","recommended":false,"description":"The external treatment to the productthat usually includes a change inappearance or texture to the item.Commonly used for furniture includewood, metal and fabric."},"13828083302ba311fdebc396a1610bf6":{"type":"string","example":["Fever"],"can_have_multiple_values":true,"fieldname":"HealthConcern","key":"health_concern","recommended":true,"description":"Indicates if the item is meant to alleviate particular health issues, illnesses or life stages. For concerns specific to skin care, please use the Skin Care Concern attribute."},"11f3261c7ccebb79e06751f778d5d4ab":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":true,"description":"Indicates the capacity or volume of your item. This is important for buyers to know the amount of product they are receiving and is important for skin care, beauty & hair care products."},"2d80b0c58142a82357f2d2fdfafd9068":{"type":"string","example":["Beeswax"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":true,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"365ecf662d48185b92a5aa253d935173":{"type":"string","example":"3 to 5 hours","can_have_multiple_values":false,"fieldname":"ResultTime","key":"result_time","recommended":false,"description":"Duration of time necessary to see the outcome from using a product. Typically used for medical and personal care test kits and monitors."},"7699774215529bc8717eb00ce738c58a":{"type":"string","example":"Heavy","can_have_multiple_values":false,"fieldname":"Absorbency","key":"absorbency","recommended":false,"description":"Term describing the ability of a product to absorb moisture. Used in personal care products such as pads and liners."},"2639fc784370fb97d9a426b33e6eff0e":{"type":"measurement","example":"0.4 ml","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ServingSize","key":"serving_size","recommended":false,"description":"Measurement value specifying the amount of the item typically used as a reference on the label of that item to list per serving information (nutrients, calories, total fat). Applicable for a wide variety of products including food, beverages, and nutritional supplements."},"336df2b3fca4bc8318f7589b8c888d03":{"type":"string","example":["Dry Skin"],"can_have_multiple_values":true,"fieldname":"SkinCareConcern","key":"skin_care_concern","recommended":false,"description":"Indicates if the item is meant to alleviate particular skin care issues. For general health concerns like obesity, or blood pressure please use the Health Concerns attribute. Values may be similar to the Skin Type attribute - \"dry cracked skin\" may be a cocnern but \"dry\" is a skin type."},"eba9b3d21340c3ed25d6778417988888":{"type":"enum","example":"Oily","can_have_multiple_values":false,"enum_values":["Oily","Dry","Combination","Sensitive"],"can_have_unknown_value":true,"fieldname":"SkinType","key":"skin_type","recommended":false,"description":"Indicates the general skin type that the product is intended for on the oily\/dry spectrum."},"cffbfe91501fcda43b326b2797a39ee0":{"type":"integer","example":15,"can_have_multiple_values":false,"fieldname":"SpfValue","key":"spf_value","recommended":false,"description":"Indicates the strength of SPF (Sun Protection Factor) in an item. This describes how well the product can block out harmful rays from the run. Commonly found in suncreen and makeup products."},"4f2642a8dcd42338499b2aa75ffca1fe":{"type":"enum","example":["Reusable"],"can_have_multiple_values":true,"enum_values":["Adaptive Lenses","Automatic Shut Off","Cordless","Foldable","Industrial","Latex-Free","Non-Comedogenic","Portable","Polarized","Reusable","Self-Tanning","Tinted","Travel Size","Waterproof","Wheeled","Scratch-Resistant"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"78aba0a00b3412827370aede724962dc":{"type":"string","example":["Plastic"],"can_have_multiple_values":true,"fieldname":"LensMaterial","key":"lens_material","recommended":false,"description":"The substances an optical lens is made out of."},"e6041e1b82f9e3ac106d984107d13504":{"type":"string","example":"Single Vision","can_have_multiple_values":false,"fieldname":"LensType","key":"lens_type","recommended":false,"description":"Whether the lens is single, multifocal, or tinted"},"937f3f40d16b2b5a23052e2d7311c6ff":{"type":"string","example":"Blue","can_have_multiple_values":false,"fieldname":"LensTint","key":"lens_tint","recommended":false,"description":"Color of lens tint."},"8b4897149a7b0cf1c4b79f6ca7c03881":{"type":"string","example":["Solid"],"can_have_multiple_values":true,"fieldname":"Keywords","key":"keywords","recommended":false,"description":"Keywords that might be used to search for this term, including synonyms and related terms."},"830b557ebbb8f05aa8d8e89c8073c9d8":{"type":"string","example":[{"name":"Pyrithione zinc","amount":2.5},{"name":"Salicylic Acid","amount":2}],"can_have_multiple_values":false,"fieldname":"IngredientsComposition","key":"ingredients_composition","recommended":false,"description":"The ingredients with the corresponding composition value"},"45f47b75dfc8dcab7bcc1b6895c572a0":{"type":"string","example":["Iron Oxide"],"can_have_multiple_values":true,"fieldname":"InactiveIngredients","key":"inactive_ingredients","recommended":false,"description":"Describes the list of inactive ingredients as shown on the item label."},"a416c6be2906ac2830fbd812fba3e591":{"type":"enum","example":"Full-Rim","can_have_multiple_values":false,"enum_values":["Full-Rim","Rimless","Semi-Rimless","Half-Rim"],"can_have_unknown_value":true,"fieldname":"EyewearRim","key":"eyewear_rim","recommended":false,"description":"Whether eyewear has rims, partial rims, or no rim at all."},"f4b8e7636597b2b532f6c75c8bd2a7a9":{"type":"string","example":["1 teaspoon every 6 hours"],"can_have_multiple_values":true,"fieldname":"Dosage","key":"dosage","recommended":false,"description":"The amount of a medication, drug, or supplement that is directed to be taken, or applied at one time or regularly during a period of time, as specified by the manufacturer."},"91455c53f237eb64c3de88f2c35b9556":{"type":"string","example":["Eyes","Face"],"can_have_multiple_values":true,"fieldname":"BodyPart","key":"body_part","recommended":false,"description":"Describes the particular body part(s) for which the item is intended."},"007e22a1352c2d2a1a443ba90e14b127":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"BatteriesRequired","key":"batteries_required","recommended":false,"description":"Indicates if batteries are required to use the product."},"052d7ff877183c9dcce5362a73e73428":{"type":"integer","example":400,"can_have_multiple_values":false,"fieldname":"UVRating","key":"u_v_rating","recommended":false,"description":"Ultraviolet rating for eyewear."},"3308f187f85aeefe4d6ed8fc5cd8e8e6":{"type":"enum","example":"Fair","can_have_multiple_values":false,"enum_values":["Fair","Light","Medium","Neutral","Olive","Dark"],"can_have_unknown_value":true,"fieldname":"SkinTone","key":"skin_tone","recommended":false,"description":"Describes the color or shade of skin that a product is targeted for. This is separate from Color Name of the product. \"Olive\" may be a color name from the manufacturer as well as the type of skin tone the product is targeting."},"9a04dccec14d02d689cf02fb757d1a10":{"type":"string","example":["Beeswax"],"can_have_multiple_values":true,"fieldname":"InactiveIngredients","key":"inactive_ingredients","recommended":false,"description":"Describes the list of inactive ingredients as shown on the item label."},"896fe12fa920abf8d338cef50e162628":{"type":"string","example":["Fever"],"can_have_multiple_values":true,"fieldname":"HealthConcern","key":"health_concern","recommended":false,"description":"Indicates if the item is meant to alleviate particular health issues, illnesses or life stages. For concerns specific to skin care, please use the Skin Care Concern attribute."},"3456eaf701f7278c2be139c78bcabd3f":{"type":"enum","example":["Coarse"],"can_have_multiple_values":true,"enum_values":["Coarse","Color Treated","Curly","Damaged","Dry","Fine","Oily"],"can_have_unknown_value":false,"fieldname":"HairType","key":"hair_type","recommended":false,"description":"Indicates the general hair types that the product is intended for relating to texture, coarseness, oiliness, thickness, and curliness."},"ce6ffae63aa69791f8881e7fb7c2bea8":{"type":"string","example":["Wash with warm water & soap"],"can_have_multiple_values":true,"fieldname":"CareInstructions","key":"care_instructions","recommended":false,"description":"Describes how the item should be cleaned, cared for or maintained."},"f7cdf1aaddb5d5cf96bdc35a3f9ba7c7":{"type":"string","example":"100% Hand-Tied","can_have_multiple_values":false,"fieldname":"WigCapType","key":"wig_cap_type","recommended":false,"description":"The construction style of the wig cap (also called the \"wig base\"), affecting the wig's appearance, durability, and styling options."},"16f4737bd60328d18f404968ba09f5de":{"type":"enum","example":["Automatic Shut Off"],"can_have_multiple_values":true,"enum_values":["Automatic Shut Off","Energy Star-Certified"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"ecb45e77061f56ea0bf5ab6280fd7b6d":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberofLights","key":"numberof_lights","recommended":false,"description":"The number of lights or bulbs contained within a light or light fixture."},"884e05ecb296a36e8e63b1b2bd060fb9":{"type":"string","example":"Fluorescent","can_have_multiple_values":false,"fieldname":"LightBulbType","key":"light_bulb_type","recommended":false,"description":"The type of light bulb."},"0e8054ce0f52ba0d4105f9da4cbfcbfe":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":false,"description":"Indicates the maximum amount that the item can hold like pounds, liters or volume. Does not include Storage Capacity which is used for digital items."},"64b3fe664fa4c3666faae8b77a734631":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":true,"description":"Indicates the maximum amount that the item can hold like pounds, liters or volume. Does not include Storage Capacity which is used for digital items."},"7c421b8f435ae90ca36f71389bd6b9ca":{"type":"measurement","example":"10 g","enum_values":["mg","g","kg","oz","lb"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"ProductWeight","key":"product_weight","recommended":true,"description":"The weight of the fully assembled product."},"3eb15df7a5722992f9aa3dbf1a8c3923":{"type":"string","example":["Low Noise"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"049be88f7223ae9a349f4d47ec511389":{"type":"measurement","example":"220 V","enum_values":["V","KV"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Volts","key":"volts","recommended":false,"description":"The number of volts the product produces or requires. Also known as Voltage;"},"3aa26481e6a2737040dacf5844ff32f2":{"type":"enum","example":["Automatic Shut Off"],"can_have_multiple_values":true,"enum_values":["Automatic Shut Off","Energy Star-Certified","Bluetooth Compatible","Industrial","Remote Control Included","Wi-Fi Compatible"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"1b4aabae8670a6b5f8ad83a12c664b37":{"type":"string","example":44,"can_have_multiple_values":false,"fieldname":"SoundRating","key":"sound_rating","recommended":false,"description":"The sound decibel rating for the noise level of the appliance."},"43e44c783f17bdfc8772466174badee1":{"type":"string","example":["Amazon Alexa"],"can_have_multiple_values":true,"fieldname":"SmartHomeCompatibility","key":"smart_home_compatibility","recommended":false,"description":"The type of Smart Home devices that the product is compatible with."},"140a15b94c6d50aa103b176dc71951ff":{"type":"integer","example":2,"can_have_multiple_values":false,"fieldname":"NumberofDoors","key":"numberof_doors","recommended":false,"description":"The number of doors on the item."},"454fe2a0cbc9e12c03b9db3ccfe98a21":{"type":"integer","example":4,"can_have_multiple_values":false,"fieldname":"NumberofBurners","key":"numberof_burners","recommended":false,"description":"The number of cooking burners or elements."},"b771092e645e5a68eb3c34f590d4a028":{"type":"string","example":"Top Load","can_have_multiple_values":false,"fieldname":"LoadPosition","key":"load_position","recommended":false,"description":"The type of load position for washers & dryers."},"da1ff3922c1b46224c541ecf62c91f69":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsSet","key":"is_set","recommended":false,"description":"Indicates if the product is being sold as a set, like washer & dryer set."},"424a3c305eb21ffbd1257294397cc022":{"type":"string","example":"Electric","can_have_multiple_values":false,"fieldname":"FuelType","key":"fuel_type","recommended":false,"description":"The type of fuel used to power certain appliances."},"96481ec4bdef8e6fe8e5093ef39a68d0":{"type":"integer","example":10200,"can_have_multiple_values":false,"fieldname":"BTU","key":"b_t_u","recommended":false,"description":"The number of British Thermal Units for heating and cooling appliances."},"608d8c80b0c29120dd74b33b92b656f3":{"type":"measurement","example":"400 W","enum_values":["W","KW","MW","GW"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Watts","key":"watts","recommended":false,"description":"The number of watts the product procues or requires. Also known as Wattage."},"8f4a7d7221541f65cac8a79c08758bfb":{"type":"string","example":"Oil","can_have_multiple_values":false,"fieldname":"ProductForm","key":"product_form","recommended":true,"description":"The consistency, texture or formulation of the item and the way\n it will be consumed or dispensed."},"803d2a584a08f5944b306958fdb95a21":{"type":"string","example":["Vanilla"],"can_have_multiple_values":true,"fieldname":"Scent","key":"scent","recommended":true,"description":"The scent or fragrance of your item; including items\n labelled as \"unscented\""},"4e7d7d90f4137c48ce55a4b9a823eff2":{"type":"string","example":["some_string","other"],"can_have_multiple_values":true,"fieldname":"Ingredients","key":"ingredients","recommended":true,"description":"The list of all ingredients contained in an item, as found on the product label mandated by FDA guidelines."},"c8d76e2396b1577c1c9da0d9ec4cf770":{"type":"string","example":["Carpet"],"can_have_multiple_values":true,"fieldname":"RecommendedUse","key":"recommended_use","recommended":true,"description":"The recommended use\/surface of cleaning product."},"ec65783a5d3d73c90f83a5d59797ac73":{"type":"string","example":["Unscented"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"febfed4ca6efd5a645a1862390468384":{"type":"string","example":"Canister","can_have_multiple_values":false,"fieldname":"VacuumType","key":"vacuum_type","recommended":false,"description":"The type of vacuum cleaner."},"da6b491d82e229483b578dec94e4ff95":{"type":"enum","example":["Biodegradable"],"can_have_multiple_values":true,"enum_values":["Biodegradable","Recyclable"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"6cc94d5bc1810a51cf9b3139b629fd37":{"type":"integer","example":15,"can_have_multiple_values":false,"fieldname":"ShelfLife","key":"shelf_life","recommended":false,"description":"The length of time that the product can be stored without spoiling or losing quality, measured in days."},"23a063f0e0a0a294b129169b749639fa":{"type":"measurement","example":"12 oz","enum_values":["ml","l","oz","cu_ft"],"can_have_multiple_values":false,"can_have_unknown_value":false,"fieldname":"Capacity","key":"capacity","recommended":false,"description":"Indicates the maximum amount that the item can hold like pounds, liters or volume."},"b9bee7f2bace5f8065911d6998b34bad":{"type":"string","example":"Bag","can_have_multiple_values":false,"fieldname":"BagType","key":"bag_type","recommended":false,"description":"Indicates whether the vacuum cleaner is bag or bagless."},"07360c7815892f05de28ec9f92926612":{"type":"enum","example":["Chemical"],"can_have_multiple_values":true,"enum_values":["Chemical","Combustible","Flammable"],"can_have_unknown_value":false,"fieldname":"Warnings","key":"warnings","recommended":false,"description":"Warnings associated with the product."},"e6c000a4a5c024e4385c9e89ef1232c3":{"type":"integer","example":400,"can_have_multiple_values":false,"fieldname":"ThreadCount","key":"thread_count","recommended":true,"description":"The number of threads per square inch of fabric."},"2410d57d61f0e552896d9aca00f7b67b":{"type":"enum","example":["Water Resistant"],"can_have_multiple_values":true,"enum_values":["Reversible","Hypoallergenic","Stain Resistant","Water Resistant","Organic","Sustainably Sourced"],"can_have_unknown_value":false,"fieldname":"StandardFeatures","key":"standard_features","recommended":false,"description":"Standard features related to your item that might be important for buyers."},"c1a740062d17b6704080705c2474435c":{"type":"integer","example":3,"can_have_multiple_values":false,"fieldname":"PiecesInSet","key":"pieces_in_set","recommended":false,"description":"The number of items included in the set. If the item contains matching fitted sheets, flat sheets, and 2 pillowcases - the number is 4."},"0f4c1a53965b293c894d4b0e607b9770":{"type":"string","example":["Designer","Anti-Streak"],"can_have_multiple_values":true,"fieldname":"AdditionalFeatures","key":"additional_features","recommended":false,"description":"Additional features related to your item that might be important for buyers."},"4a6f34f51dbacff4a7033c14e600ce06":{"type":"boolean","example":"yes","can_have_multiple_values":false,"can_have_unknown_value":false,"enum_values":["yes","no"],"fieldname":"IsSet","key":"is_set","recommended":false,"description":"Indicates if the product contains 2 of more different items that are sold as part of a set."},"e8e50abdc6b50b497e7c90af199feeec":{"type":"integer","example":1,"can_have_multiple_values":false,"fieldname":"NumberOfLicenses","key":"number_of_licenses","recommended":true,"description":"The maximum number of users or installations allowed under the terms of the software licensing agreement."},"9c3c05234da77307c8b4fc50977ca324":{"type":"string","example":["Windows 7 or later"],"can_have_multiple_values":true,"fieldname":"SoftwareSystemRequirements","key":"software_system_requirements","recommended":true,"description":"The basic requirements necessary of any system in order to satisfactorily run the software."},"46c833eff8474794a70b21f9d2389e04":{"type":"string","example":"Antivirus & Security","can_have_multiple_values":false,"fieldname":"SoftwareCategory","key":"software_category","recommended":false,"description":"The general category of software to which the item is most closely associated with"},"1c4ef2904cadfca2cf53773ad85ce53d":{"type":"string","example":"7.2","can_have_multiple_values":false,"fieldname":"SoftwareVersion","key":"software_version","recommended":false,"description":"The version number assigned to this specific release of the software."}} \ No newline at end of file From eaaea898c7f3a7cf5e21c830c4b598d344598b1f Mon Sep 17 00:00:00 2001 From: Tzah Granot Date: Thu, 17 Apr 2025 12:52:18 +0100 Subject: [PATCH 16/29] Updating version to 3.4.7 --- changelog.txt | 17 +++++++++++++++++ facebook-for-woocommerce.php | 4 ++-- package.json | 2 +- readme.txt | 28 +++++++++++++++++----------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/changelog.txt b/changelog.txt index 97c59c7e4..ede91da7a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,22 @@ *** Facebook for WooCommerce Changelog *** += 3.4.7 - 2025-04-17 = +* Tweak - Added external_variant_id to the feed file by @mshymon in #2998 +* Tweak - Added support for syncing product type by @vinkmeta in #3013 +* Tweak - Relocating bulk actions by @SayanPandey in #2943 +* Tweak - Filtration on All Products page | Synced and Not Synced by @SayanPandey in #2999 +* Tweak - Updated PR Template by @vinkmeta in #3019 +* Fix - Null check exceptions by @vinkmeta in #3015 +* Tweak - Relaxing sync validations by @raymon1 in #2969 +* Tweak - Truncates extra characters from title and description by @raymon1 in #3023 +* Tweak - Updated PR template by @vinkmeta in #3053 +* Fix - The item not found error by using filter in the product endpoint @vinkmeta in #3054 +* Fix - Bug where MPN input box had no tooltip by @devbodaghe in #3034 +* Tweak - Investigation: WooCommerce to Facebook Product Attribute Syncing by @devbodaghe in #3033 +* Fix - Add parent product material inheritance for variations by @devbodaghe in #3035 +* Fix - Tooltip Messages for Skirt Length and Sleeve Length by @devbodaghe in #3039 +* Fix - Typo in Admin.php by @SayanPandey in #3063 + = 3.4.6 - 2025-04-04 = * Fix - Product availability syncing by @vinkmeta in #3010 * Fix - Product attribute sort error which prevented product edits in certain scenarios by @iodic in #3012 diff --git a/facebook-for-woocommerce.php b/facebook-for-woocommerce.php index d5b212536..e6a38ca23 100644 --- a/facebook-for-woocommerce.php +++ b/facebook-for-woocommerce.php @@ -10,7 +10,7 @@ * Description: Grow your business on Facebook! Use this official plugin to help sell more of your products using Facebook. After completing the setup, you'll be ready to create ads that promote your products and you can also create a shop section on your Page where customers can browse your products on Facebook. * Author: Facebook * Author URI: https://www.facebook.com/ - * Version: 3.4.6 + * Version: 3.4.7 * Requires at least: 5.6 * Requires PHP: 7.4 * Text Domain: facebook-for-woocommerce @@ -48,7 +48,7 @@ class WC_Facebook_Loader { /** * @var string the plugin version. This must be in the main plugin file to be automatically bumped by Woorelease. */ - const PLUGIN_VERSION = '3.4.6'; // WRCS: DEFINED_VERSION. + const PLUGIN_VERSION = '3.4.7'; // WRCS: DEFINED_VERSION. // Minimum PHP version required by this plugin. const MINIMUM_PHP_VERSION = '7.4.0'; diff --git a/package.json b/package.json index eb4db21f8..4c04e8658 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "facebook-for-woocommerce", - "version": "3.4.6", + "version": "3.4.7", "author": "Facebook", "homepage": "https://woocommerce.com/products/facebook/", "license": "GPL-2.0", diff --git a/readme.txt b/readme.txt index 8a011d88c..966bb4d44 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Contributors: facebook Tags: meta, facebook, conversions api, catalog sync, ads Requires at least: 5.6 Tested up to: 6.7 -Stable tag: 3.4.6 +Stable tag: 3.4.7 Requires PHP: 7.4 MySQL: 5.6 or greater License: GPLv2 or later @@ -40,15 +40,21 @@ When opening a bug on GitHub, please give us as many details as possible. == Changelog == -= 3.4.6 - 2025-04-04 = -* Fix - Product availability syncing by @vinkmeta in #3010 -* Fix - Product attribute sort error which prevented product edits in certain scenarios by @iodic in #3012 - -= 3.4.5 - 2025-04-01 = -* Tweak - Add new product field external_update_time to measure product update latency by @mshymon in #2973 -* Fix - for 'PHP Warning: Undefined variable $fb_product_parent' by @mshymon in #2976 -* Fix - Updated logic to choose/create the feed for product sync by @mshymon in #2989 -* Add - Facebook Product Data Tab Enhancement by @devbodaghe in #2938 -* Fix - PHP Warning for empty attributes by @vinkmeta in #3001 += 3.4.7 - 2025-04-17 = +* Tweak - Added external_variant_id to the feed file by @mshymon in #2998 +* Tweak - Added support for syncing product type by @vinkmeta in #3013 +* Tweak - Relocating bulk actions by @SayanPandey in #2943 +* Tweak - Filtration on All Products page | Synced and Not Synced by @SayanPandey in #2999 +* Tweak - Updated PR Template by @vinkmeta in #3019 +* Fix - Null check exceptions by @vinkmeta in #3015 +* Tweak - Relaxing sync validations by @raymon1 in #2969 +* Tweak - Truncates extra characters from title and description by @raymon1 in #3023 +* Tweak - Updated PR template by @vinkmeta in #3053 +* Fix - The item not found error by using filter in the product endpoint @vinkmeta in #3054 +* Fix - Bug where MPN input box had no tooltip by @devbodaghe in #3034 +* Tweak - Investigation: WooCommerce to Facebook Product Attribute Syncing by @devbodaghe in #3033 +* Fix - Add parent product material inheritance for variations by @devbodaghe in #3035 +* Fix - Tooltip Messages for Skirt Length and Sleeve Length by @devbodaghe in #3039 +* Fix - Typo in Admin.php by @SayanPandey in #3063 [See changelog for all versions](https://raw.githubusercontent.com/facebook/facebook-for-woocommerce/refs/heads/main/changelog.txt). From eb8b1205de5f14491f77a42e64b4cf8d660811f9 Mon Sep 17 00:00:00 2001 From: Sayan Pandey Date: Thu, 17 Apr 2025 03:40:42 -0700 Subject: [PATCH 17/29] Fixing meta to Meta (#3063) Summary: ## Description Just changin meta to Meta ### Type of change String fix Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3063 Reviewed By: vinkmeta Differential Revision: D73177989 Pulled By: SayanPandey fbshipit-source-id: 003cfa41d40482964c5c400963e28dc62e0e924b --- includes/Admin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/Admin.php b/includes/Admin.php index 92a2f286c..1e55b022c 100644 --- a/includes/Admin.php +++ b/includes/Admin.php @@ -511,7 +511,7 @@ public function add_products_by_sync_enabled_input_filter() { $choice = isset( $_GET['fb_sync_enabled'] ) ? (string) sanitize_text_field( wp_unslash( $_GET['fb_sync_enabled'] ) ) : ''; ?> From 9e244a98880472fe155f58ebdd22e5437ee74357 Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Wed, 9 Apr 2025 08:44:44 -0700 Subject: [PATCH 18/29] feat(product-sync): Add separate short_description field to Facebook product data (#3029) Summary: This PR modifies how product descriptions are synced to Facebook by sending the short description as a separate field rather than using it as a fallback for the main description. This change allows both description types to be utilized independently in the Facebook catalog. - Added `short_description` field to product data sent to Facebook - Modified `get_fb_short_description()` method to handle variation products consistently with main description - Added fallback logic for variation products to use parent product's short description when needed - Maintained separation between main description and short description fields Previously, short descriptions were only used as a fallback when the main description was empty or when specifically configured to use short descriptions instead of main descriptions. Now both descriptions are sent to Facebook as separate fields: - `description`: Contains the main product description - `short_description`: Contains the product's short description - Both fields maintain their own content and fallback logic - [ ] Verify that both main and short descriptions are sent to Facebook - [ ] Test with variation products to ensure proper fallback behavior - [ ] Confirm that existing product syncs continue to work as expected - [ ] Verify that products with only one description type still sync correctly This change provides more flexibility in how product descriptions are displayed on Facebook, allowing merchants to utilize both description types for different purposes in their product catalog. This PR adds comprehensive test cases for the Facebook product short description functionality (`get_fb_short_description()` method). The tests ensure the method behaves correctly across various product types and scenarios. - **Variation inheritance**: Verifies that product variations correctly inherit short descriptions from parent products (even when variations attempt to set their own descriptions) - **Simple product descriptions**: Confirms short descriptions are properly retrieved from product excerpts - **Empty description handling**: Tests that empty short descriptions return empty strings - **Filter application**: Validates the `facebook_for_woocommerce_fb_product_short_description` filter hook works correctly These tests help ensure reliable product information display when syncing to Facebook catalog and maintain consistency with WooCommerce's product description behavior. Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3029 Differential Revision: D72671275 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: 177fd103bf4768af2a88a67cb20e9bc7c42ac369 --- includes/fbproduct.php | 54 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index 9c70685f0..8a108544b 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -78,6 +78,7 @@ class WC_Facebook_Product { // Should match facebook-commerce.php while we migrate that code over // to this object. const FB_PRODUCT_DESCRIPTION = 'fb_product_description'; + const FB_SHORT_DESCRIPTION = 'fb_product_short_description'; const FB_PRODUCT_PRICE = 'fb_product_price'; const FB_SIZE = 'fb_size'; const FB_COLOR = 'fb_color'; @@ -728,6 +729,56 @@ public function get_fb_description() { return apply_filters( 'facebook_for_woocommerce_fb_product_description', $description, $this->id ); } + /** + * Get the short description for a product. + * + * This function retrieves the short product description, but unlike the main description + * it should only use values specifically set for short description. + * + * @return string The short description for the product. + */ + public function get_fb_short_description() { + $short_description = ''; + + // For variations, first try to get the short description from the parent product + if (WC_Facebookcommerce_Utils::is_variation_type($this->woo_product->get_type())) { + // Get the parent product + $parent_id = $this->woo_product->get_parent_id(); + if ($parent_id) { + $parent_post = get_post($parent_id); + if ($parent_post && !empty($parent_post->post_excerpt)) { + $short_description = WC_Facebookcommerce_Utils::clean_string($parent_post->post_excerpt); + } + } + + // If no parent description found, try getting the variation's own excerpt + if (empty($short_description)) { + $post = $this->get_post_data(); + if ($post && !empty($post->post_excerpt)) { + $short_description = WC_Facebookcommerce_Utils::clean_string($post->post_excerpt); + } + } + + return apply_filters('facebook_for_woocommerce_fb_product_short_description', $short_description, $this->id); + } + + // Use the product's short description (excerpt) from WooCommerce + $post = $this->get_post_data(); + $post_excerpt = WC_Facebookcommerce_Utils::clean_string($post->post_excerpt); + + if (!empty($post_excerpt)) { + $short_description = $post_excerpt; + } + + /** + * Filters the FB product short description. + * + * @param string $short_description Facebook product short description. + * @param int $id WooCommerce Product ID. + */ + return apply_filters('facebook_for_woocommerce_fb_product_short_description', $short_description, $this->id); + } + /** * Get the rich text description for a product. * @@ -1250,6 +1301,7 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $product_data = array(); $product_data[ 'description' ] = Helper::str_truncate( $this->get_fb_description(), self::MAX_DESCRIPTION_LENGTH ); + $product_data[ 'short_description' ] = $this->get_fb_short_description(); $product_data[ 'rich_text_description' ] = $this->get_rich_text_description(); $product_data[ 'product_type' ] = $categories['categories']; $product_data[ 'brand' ] = Helper::str_truncate( $this->get_fb_brand(), 100 ); @@ -1306,7 +1358,7 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $google_product_category = Products::get_google_product_category_id( $this->woo_product ); if ( $google_product_category ) { - $product_data['google_product_category'] = $google_product_category; + $product_data['google_product_category'] = (int) $google_product_category; } // Currently only items batch and feed support enhanced catalog fields From e6443a1bb76e8b26530654865c509247c067361b Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Wed, 9 Apr 2025 09:59:43 -0700 Subject: [PATCH 19/29] Feature/sync short description remove dropdown (#3031) Summary: This PR modifies how product descriptions are synced to Facebook by sending the short description as a separate field rather than using it as a fallback for the main description. This change allows both description types to be utilized independently in the Facebook catalog. - Added `short_description` field to product data sent to Facebook - Modified `get_fb_short_description()` method to handle variation products consistently with main description - Added fallback logic for variation products to use parent product's short description when needed - Maintained separation between main description and short description fields Previously, short descriptions were only used as a fallback when the main description was empty or when specifically configured to use short descriptions instead of main descriptions. Now both descriptions are sent to Facebook as separate fields: - `description`: Contains the main product description - `short_description`: Contains the product's short description - Both fields maintain their own content and fallback logic - [ ] Verify that both main and short descriptions are sent to Facebook - [ ] Test with variation products to ensure proper fallback behavior - [ ] Confirm that existing product syncs continue to work as expected - [ ] Verify that products with only one description type still sync correctly This change provides more flexibility in how product descriptions are displayed on Facebook, allowing merchants to utilize both description types for different purposes in their product catalog. Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3031 Reviewed By: vinkmeta Differential Revision: D72671491 Pulled By: devbodaghe fbshipit-source-id: 4a56db94bb699689ed41b768048014bba2aa7340 --- facebook-commerce.php | 36 --------- .../Admin/Settings_Screens/Product_Sync.php | 12 --- includes/Lifecycle.php | 5 -- includes/fbproduct.php | 12 +-- .../WCFacebookCommerceIntegrationTest.php | 76 ------------------- tests/Unit/fbproductTest.php | 15 ---- 6 files changed, 3 insertions(+), 153 deletions(-) diff --git a/facebook-commerce.php b/facebook-commerce.php index 80d79e2f8..be88640c3 100644 --- a/facebook-commerce.php +++ b/facebook-commerce.php @@ -95,12 +95,6 @@ class WC_Facebookcommerce_Integration extends WC_Integration { /** @var string request headers in the debug log */ const SETTING_REQUEST_HEADERS_IN_DEBUG_MODE = 'wc_facebook_request_headers_in_debug_log'; - /** @var string the standard product description mode name */ - const PRODUCT_DESCRIPTION_MODE_STANDARD = 'standard'; - - /** @var string the short product description mode name */ - const PRODUCT_DESCRIPTION_MODE_SHORT = 'short'; - /** @var string custom taxonomy Facebook Product Set ID */ const FB_PRODUCT_SET_ID = 'fb_product_set_id'; @@ -2501,36 +2495,6 @@ public function get_excluded_product_tag_ids() { return (array) apply_filters( 'wc_facebook_excluded_product_tag_ids', get_option( self::SETTING_EXCLUDED_PRODUCT_TAG_IDS, [] ), $this ); } - /** - * Gets the configured product description mode. - * - * @since 1.10.0 - * - * @return string - */ - public function get_product_description_mode() { - /** - * Filters the configured product description mode. - * - * @since 1.10.0 - * - * @param string $mode the configured product description mode - * @param \WC_Facebookcommerce_Integration $integration the integration instance - */ - $mode = (string) apply_filters( 'wc_facebook_product_description_mode', get_option( self::SETTING_PRODUCT_DESCRIPTION_MODE, self::PRODUCT_DESCRIPTION_MODE_STANDARD ), $this ); - - $valid_modes = [ - self::PRODUCT_DESCRIPTION_MODE_STANDARD, - self::PRODUCT_DESCRIPTION_MODE_SHORT, - ]; - - if ( ! in_array( $mode, $valid_modes, true ) ) { - $mode = self::PRODUCT_DESCRIPTION_MODE_STANDARD; - } - - return $mode; - } - /** Setter methods ************************************************************************************************/ diff --git a/includes/Admin/Settings_Screens/Product_Sync.php b/includes/Admin/Settings_Screens/Product_Sync.php index 8dc50e3fb..9efcc65ef 100644 --- a/includes/Admin/Settings_Screens/Product_Sync.php +++ b/includes/Admin/Settings_Screens/Product_Sync.php @@ -304,18 +304,6 @@ public function get_settings() { ), ), - array( - 'id' => \WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, - 'title' => __( 'Product description sync', 'facebook-for-woocommerce' ), - 'type' => 'select', - 'class' => 'product-sync-field', - 'desc_tip' => __( 'Choose which product description to display in the Facebook catalog.', 'facebook-for-woocommerce' ), - 'default' => \WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD, - 'options' => array( - \WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD => __( 'Standard description', 'facebook-for-woocommerce' ), - \WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT => __( 'Short description', 'facebook-for-woocommerce' ), - ), - ), array( 'id' => Commerce::OPTION_GOOGLE_PRODUCT_CATEGORY_ID, 'type' => 'product_sync_google_product_categories', diff --git a/includes/Lifecycle.php b/includes/Lifecycle.php index 297774cdc..ed490e14d 100644 --- a/includes/Lifecycle.php +++ b/includes/Lifecycle.php @@ -149,10 +149,6 @@ private function migrate_1_9_settings() { $new_settings[ \WC_Facebookcommerce_Integration::SETTING_ENABLE_PRODUCT_SYNC ] = $product_sync_enabled ? 'yes' : 'no'; } - if ( ! isset( $new_settings[ \WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE ] ) ) { - $new_settings[ \WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE ] = ! empty( get_option( 'fb_sync_short_description', 0 ) ) ? \WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT : \WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD; - } - if ( ! isset( $new_settings[ \WC_Facebookcommerce_Integration::SETTING_SCHEDULED_RESYNC_OFFSET ] ) ) { $autosync_time = get_option( 'woocommerce_fb_autosync_time' ); $parsed_time = ! empty( $autosync_time ) ? strtotime( $autosync_time ) : false; @@ -219,7 +215,6 @@ protected function upgrade_to_2_0_0() { 'enable_product_sync' => \WC_Facebookcommerce_Integration::SETTING_ENABLE_PRODUCT_SYNC, 'excluded_product_category_ids' => \WC_Facebookcommerce_Integration::SETTING_EXCLUDED_PRODUCT_CATEGORY_IDS, 'excluded_product_tag_ids' => \WC_Facebookcommerce_Integration::SETTING_EXCLUDED_PRODUCT_TAG_IDS, - 'product_description_mode' => \WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, 'enable_messenger' => self::SETTING_ENABLE_MESSENGER, 'messenger_locale' => self::SETTING_MESSENGER_LOCALE, 'messenger_greeting' => self::SETTING_MESSENGER_GREETING, diff --git a/includes/fbproduct.php b/includes/fbproduct.php index 8a108544b..d67369f4b 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -153,11 +153,6 @@ class WC_Facebook_Product { */ private $main_description; - /** - * @var bool Sync short description. - */ - private $sync_short_description; - /** * @var bool Product visibility on Facebook. */ @@ -240,7 +235,6 @@ public function __construct( $wpid, $parent_product = null ) { $this->gallery_urls = null; $this->fb_use_parent_image = null; $this->main_description = ''; - $this->sync_short_description = \WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT === facebook_for_woocommerce()->get_integration()->get_product_description_mode(); $this->rich_text_description = ''; if ( $meta = get_post_meta( $this->id, self::FB_VISIBILITY, true ) ) { @@ -269,7 +263,7 @@ public function __construct( $wpid, $parent_product = null ) { */ public function __get( $key ) { // Add warning for private properties. - if ( in_array( $key, array( 'fb_description', 'gallery_urls', 'fb_use_parent_image', 'main_description', 'sync_short_description' ), true ) ) { + if ( in_array( $key, array( 'fb_description', 'gallery_urls', 'fb_use_parent_image', 'main_description' ), true ) ) { /* translators: %s property name. */ _doing_it_wrong( __FUNCTION__, sprintf( esc_html__( 'The %s property is private and should not be accessed outside its class.', 'facebook-for-woocommerce' ), esc_html( $key ) ), '3.0.32' ); return $this->$key; @@ -710,7 +704,7 @@ public function get_fb_description() { $description = $post_content; } - if ( $this->sync_short_description || ( empty( $description ) && ! empty( $post_excerpt ) ) ) { + if ( empty( $description ) && ! empty( $post_excerpt ) ) { $description = $post_excerpt; } @@ -830,7 +824,7 @@ public function get_rich_text_description() { $rich_text_description = $post_content; } - if ( $this->sync_short_description || ( empty( $rich_text_description ) && ! empty( $post_excerpt ) ) ) { + if ( empty( $rich_text_description ) && ! empty( $post_excerpt ) ) { $rich_text_description = $post_excerpt; } } diff --git a/tests/Unit/WCFacebookCommerceIntegrationTest.php b/tests/Unit/WCFacebookCommerceIntegrationTest.php index 987ae429d..2757b33b6 100644 --- a/tests/Unit/WCFacebookCommerceIntegrationTest.php +++ b/tests/Unit/WCFacebookCommerceIntegrationTest.php @@ -2378,82 +2378,6 @@ function ( $ids ) { $this->assertEquals( [ 111, 222, 333 ], $tags ); } - /** - * Tests get product description mode with no filter no options. - * - * @return void - */ - public function test_get_product_description_mode_no_filter_no_options() { - remove_all_filters( 'wc_facebook_product_description_mode' ); - delete_option( WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE ); - - $mode = $this->integration->get_product_description_mode(); - - $this->assertEquals( WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD, $mode ); - } - - /** - * Tests get product description mode with no filter. - * - * @return void - */ - public function test_get_product_description_mode_no_filter() { - remove_all_filters( 'wc_facebook_product_description_mode' ); - add_option( - WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, - WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT - ); - - $mode = $this->integration->get_product_description_mode(); - - $this->assertEquals( WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT, $mode ); - } - - /** - * Tests get product description mode with filter. - * - * @return void - */ - public function test_get_product_description_mode_with_filter() { - add_filter( - 'wc_facebook_product_description_mode', - function ( $mode ) { - return WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD; - } - ); - - add_option( - WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, - WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT - ); - - $mode = $this->integration->get_product_description_mode(); - - $this->assertEquals( WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD, $mode ); - } - - /** - * Tests get product description mode falls back into default mode if mode is not recognised as valid mode. - * - * @return void - */ - public function test_get_product_description_mode_falls_back_to_default_when_unknown_mode() { - add_filter( - 'wc_facebook_product_description_mode', - function ( $mode ) { - return 'super-duper-description-mode-123'; - } - ); - - add_option( - WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, - WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT - ); - - $mode = $this->integration->get_product_description_mode(); - - $this->assertEquals( WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_STANDARD, $mode ); - } /** * Tests product catalog id option update with valid catalog id value. diff --git a/tests/Unit/fbproductTest.php b/tests/Unit/fbproductTest.php index 09747b566..0823ecda8 100644 --- a/tests/Unit/fbproductTest.php +++ b/tests/Unit/fbproductTest.php @@ -93,15 +93,6 @@ public function test_get_fb_description_from_post_content() { $description = $facebook_product->get_fb_description(); $this->assertEquals( $description, get_post( $product->get_id() )->post_content ); - // Gets description from excerpt ignoring content when short mode is set - add_option( - WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, - WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT - ); - - $facebook_product = new \WC_Facebook_Product( $product ); - $description = $facebook_product->get_fb_description(); - $this->assertEquals( $description, get_post( $product->get_id() )->post_excerpt ); } /** @@ -653,12 +644,6 @@ public function test_get_rich_text_description() { $description = $facebook_product->get_rich_text_description(); $this->assertEquals('

product content description

', $description); - // Test 6: Falls back to post excerpt if content is empty and sync_short_description is true - add_option( - WC_Facebookcommerce_Integration::SETTING_PRODUCT_DESCRIPTION_MODE, - WC_Facebookcommerce_Integration::PRODUCT_DESCRIPTION_MODE_SHORT - ); - $product->set_description(''); $product->set_short_description('

short description test

'); $product->save(); From 1c7e71bbf8b74afcbf11d096a3d07691ed900fce Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Mon, 14 Apr 2025 08:35:45 -0700 Subject: [PATCH 20/29] Feature: Short Description Fallback (#3048) Summary: ## Feature: Short Description Fallback This pull request introduces a new feature to the `WC_Facebook_Product` class, specifically enhancing the `get_fb_short_description` method. The method now includes logic to use the main product description as the short description when the main description is less than 50 characters. ### Changes - **Modified `get_fb_short_description` Method:** - For variation products, if no short description is found, the method now checks if the main description is less than 50 characters and uses it as the short description. - For regular products, if no short description (excerpt) is found, the method checks if the main description is less than 50 characters and uses it as the short description. ### Benefits - Ensures that products with very short main descriptions can still have a meaningful short description. - Improves the consistency and completeness of product data sent to Facebook. ### Testing - Verified that the short description is correctly populated from the main description when it is less than 50 characters. - Ensured that existing functionality remains unaffected for products with longer descriptions. ### Notes - This change does not affect any other parts of the plugin and maintains backward compatibility. Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3048 Reviewed By: vinkmeta Differential Revision: D72866715 Pulled By: devbodaghe fbshipit-source-id: 87fe2e362dcc025b2633894f930afa9cbd9a174d --- includes/fbproduct.php | 16 +++++ tests/Unit/fbproductTest.php | 124 +++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index d67369f4b..5c4908c73 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -753,6 +753,14 @@ public function get_fb_short_description() { } } + // If still no short description, check if main description is short enough + if (empty($short_description)) { + $main_description = WC_Facebookcommerce_Utils::clean_string($this->woo_product->get_description()); + if (!empty($main_description) && strlen($main_description) <= 1000) { + $short_description = $main_description; + } + } + return apply_filters('facebook_for_woocommerce_fb_product_short_description', $short_description, $this->id); } @@ -763,6 +771,14 @@ public function get_fb_short_description() { if (!empty($post_excerpt)) { $short_description = $post_excerpt; } + + // If no short description (excerpt) found, check if main description is short enough + if (empty($short_description)) { + $post_content = WC_Facebookcommerce_Utils::clean_string($post->post_content); + if (!empty($post_content) && strlen($post_content) <= 1000) { + $short_description = $post_content; + } + } /** * Filters the FB product short description. diff --git a/tests/Unit/fbproductTest.php b/tests/Unit/fbproductTest.php index 0823ecda8..70e136507 100644 --- a/tests/Unit/fbproductTest.php +++ b/tests/Unit/fbproductTest.php @@ -1096,6 +1096,130 @@ public function test_get_fb_short_description() { $filter->teardown_safely_immediately(); } + /** + * Test fallback to main description when it's less than 1000 characters. + */ + public function test_get_fb_short_description_fallback_to_short_main_description() { + // Arrange + $product = WC_Helper_Product::create_simple_product(); + $short_description = 'Short main description'; + + // Set up the test conditions + $product->set_description($short_description); + $product->set_short_description(''); // Ensure short description is empty + $product->save(); + + // Act + $facebook_product = new \WC_Facebook_Product($product); + $result_description = $facebook_product->get_fb_short_description(); + + // Assert + $this->assertEquals( + $short_description, + $result_description, + 'Short main description should be used when excerpt is empty' + ); + } + + /** + * Test fallback to main description when it's exactly 1000 characters. + */ + public function test_get_fb_short_description_fallback_to_exact_length_main_description() { + // Arrange + $product = WC_Helper_Product::create_simple_product(); + $exact_length_description = str_repeat('a', 1000); + + // Set up the test conditions + $product->set_description($exact_length_description); + $product->set_short_description(''); // Ensure short description is empty + $product->save(); + + // Act + $facebook_product = new \WC_Facebook_Product($product); + $result_description = $facebook_product->get_fb_short_description(); + + // Assert + $this->assertEquals( + $exact_length_description, + $result_description, + 'Main description of exactly 1000 characters should be used when excerpt is empty' + ); + $this->assertEquals( + 1000, + strlen($result_description), + 'Result description should be exactly 1000 characters long' + ); + } + + /** + * Test that main description is not used when it exceeds 1000 characters. + */ + public function test_get_fb_short_description_no_fallback_to_long_main_description() { + // Arrange + $product = WC_Helper_Product::create_simple_product(); + $too_long_description = str_repeat('a', 1001); + + // Set up the test conditions + $product->set_description($too_long_description); + $product->set_short_description(''); // Ensure short description is empty + $product->save(); + + // Act + $facebook_product = new \WC_Facebook_Product($product); + $result_description = $facebook_product->get_fb_short_description(); + + // Assert + $this->assertEquals( + '', + $result_description, + 'Should not fallback to main description if it exceeds 1000 characters' + ); + $this->assertNotEquals( + $too_long_description, + $result_description, + 'Long description should not be used even if no other description is available' + ); + $this->assertLessThan( + strlen($too_long_description), + strlen($result_description), + 'Result description should be shorter than the too-long main description' + ); + } + + /** + * Test that short description is always preferred over main description, even when both are present + * and main description is short enough to be used. + */ + public function test_get_fb_short_description_prefers_short_over_main() { + // Arrange + $product = WC_Helper_Product::create_simple_product(); + $short_description = 'Short product description'; + $main_description = 'Main product description that is also short'; + + // Set up both descriptions + $product->set_description($main_description); + $product->set_short_description($short_description); + $product->save(); + + // Act + $facebook_product = new \WC_Facebook_Product($product); + $result_description = $facebook_product->get_fb_short_description(); + + // Assert + $this->assertEquals( + $short_description, + $result_description, + 'Short description should be used when available, regardless of main description length' + ); + + // Verify we're not using the main description + $this->assertNotEquals( + $main_description, + $result_description, + 'Main description should not be used when short description is available' + ); + } + /** * Test get_unmapped_attributes with no attributes */ From 652ce11f212415719f21641f076ab29a0ad41432 Mon Sep 17 00:00:00 2001 From: Sayan Pandey Date: Thu, 17 Apr 2025 03:40:42 -0700 Subject: [PATCH 21/29] Fixing meta to Meta (#3063) Summary: Just changin meta to Meta String fix Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3063 Reviewed By: vinkmeta Differential Revision: D73177989 Pulled By: SayanPandey fbshipit-source-id: 003cfa41d40482964c5c400963e28dc62e0e924b From f9b89c477d4f7c3bbc37b71c3e4ff8d024a22c95 Mon Sep 17 00:00:00 2001 From: Vahid Kaykhaei Date: Wed, 23 Apr 2025 08:22:16 -0700 Subject: [PATCH 22/29] Fix for the gap in Purchase events through CAPI (#3060) Summary: Added a hook to woocommerce_new_order event to ensure we track Purchase events through different flows. Also added a flag to the order metadata to track whether a Purchase event has been sent for this order or not. Added more hooks to track if an event's status changed from on-hold or pending to processing or completed through the WP dashboard. Also fixed a phpcs warning in AAMSettings.php file ## Description This PR is addressing the gap in Purchase events being sent by this plugin compared to GTM & Stape. The details are explained in this doc: https://fburl.com/gdoc/ihoi9jna ### Type of change Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [x] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [x] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [x] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry Fixed a problem where Purchase event was not firing if thankyou page was not shown, Custom payment provider or order management plugin used, or Purchase state updated through Woo dashboard Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3060 Test Plan: On a woo website, use any of the following payment options and check the Purchase event being registered: - Klarna - Card Payment - Direct Bank transfer - Cash on delivery - Paypal Reviewed By: tzahgr Differential Revision: D73507420 Pulled By: vahidkay-meta fbshipit-source-id: e879f24103ca0b4505fa981b99d820de9181ee77 --- facebook-commerce-events-tracker.php | 90 ++++++++++------------------ includes/Events/AAMSettings.php | 2 +- 2 files changed, 33 insertions(+), 59 deletions(-) diff --git a/facebook-commerce-events-tracker.php b/facebook-commerce-events-tracker.php index 2af4c6fac..afc1d55b9 100644 --- a/facebook-commerce-events-tracker.php +++ b/facebook-commerce-events-tracker.php @@ -105,8 +105,10 @@ private function add_hooks() { add_action( 'woocommerce_after_single_product', array( $this, 'inject_view_content_event' ) ); add_action( 'woocommerce_after_single_product', array( $this, 'maybe_inject_search_event' ) ); + // ViewCategory events add_action( 'woocommerce_after_shop_loop', array( $this, 'inject_view_category_event' ) ); + // Search events add_action( 'pre_get_posts', array( $this, 'inject_search_event' ) ); add_filter( 'woocommerce_redirect_single_search_result', array( $this, 'maybe_add_product_search_event_to_session' ) ); @@ -122,23 +124,23 @@ private function add_hooks() { // InitiateCheckout events add_action( 'woocommerce_after_checkout_form', array( $this, 'inject_initiate_checkout_event' ) ); + // InitiateCheckout events for checkout block. add_action( 'woocommerce_blocks_checkout_enqueue_data', array( $this, 'inject_initiate_checkout_event' ) ); + // Purchase and Subscribe events - add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'inject_purchase_event' ) ); + add_action( 'woocommerce_new_order', array( $this, 'inject_purchase_event' ) ); + add_action( 'woocommerce_payment_complete', array( $this, 'inject_purchase_event' ), 10 ); + add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'inject_purchase_event' ), 20 ); add_action( 'woocommerce_thankyou', array( $this, 'inject_purchase_event' ), 40 ); + add_action( 'woocommerce_order_status_processing', array( $this, 'inject_purchase_event' ), 50 ); + add_action( 'woocommerce_order_status_completed', array( $this, 'inject_purchase_event' ), 50 ); + add_action( 'woocommerce_process_shop_order_meta', array( $this, 'inject_purchase_event' ), 60 ); - // Checkout update order meta from the Checkout Block. - if ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '7.2.0', '>=' ) ) { - add_action( 'woocommerce_store_api_checkout_update_order_meta', array( $this, 'inject_order_meta_event_for_checkout_block_flow' ), 10, 1 ); - } elseif ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '6.3.0', '>=' ) ) { - add_action( 'woocommerce_blocks_checkout_update_order_meta', array( $this, 'inject_order_meta_event_for_checkout_block_flow' ), 10, 1 ); - } else { - add_action( '__experimental_woocommerce_blocks_checkout_update_order_meta', array( $this, 'inject_order_meta_event_for_checkout_block_flow' ), 10, 1 ); - } - - // TODO move this in some 3rd party plugin integrations handler at some point {FN 2020-03-20} + // Lead events through Contact Form 7 add_action( 'wpcf7_contact_form', array( $this, 'inject_lead_event_hook' ), 11 ); + + // Flush pending events on shutdown add_action( 'shutdown', array( $this, 'send_pending_events' ) ); } @@ -795,6 +797,8 @@ public function inject_initiate_checkout_event() { * * This may happen either when: * - WooCommerce signals a payment transaction complete (most gateways) + * - The order status is changed through the Woo dashboard to Processing or Completed + * - The Payment Completed event is fired, which happens in case of some external payment gateways. * - Customer reaches Thank You page skipping payment (for gateways that do not require payment, e.g. Cheque, BACS, Cash on delivery...) * * The method checks if the event was not triggered already avoiding a duplicate. @@ -808,7 +812,9 @@ public function inject_purchase_event( $order_id ) { $event_name = 'Purchase'; - if ( ! $this->is_pixel_enabled() || $this->pixel->is_last_event( $event_name ) ) { + $valid_purchase_order_states = array( 'processing', 'completed' ); + + if ( ! $this->is_pixel_enabled() ) { return; } @@ -817,23 +823,26 @@ public function inject_purchase_event( $order_id ) { if ( ! $order ) { return; } + + // Get the status of the order to ensure we track the actual purchases and not the ones that have a failed payment. + $order_state = $order->get_status(); - // use a session flag to ensure an order is tracked with any payment method, also when the order is placed through AJAX - $order_placed_flag = '_wc_' . facebook_for_woocommerce()->get_id() . '_order_placed_' . $order_id; - - // use a session flag to ensure a Purchase event is not tracked multiple times + // use a session flag to ensure this Purchase event is not tracked multiple times $purchase_tracked_flag = '_wc_' . facebook_for_woocommerce()->get_id() . '_purchase_tracked_' . $order_id; - // when saving the order meta data: add a flag to mark the order tracked - if ( 'woocommerce_checkout_update_order_meta' === current_action() ) { - set_transient( $order_placed_flag, 'yes', 15 * MINUTE_IN_SECONDS ); + // Return if this Purchase event has already been tracked + if ( 'yes' === get_transient( $purchase_tracked_flag ) || $order->meta_exists( '_meta_purchase_tracked' ) || ! in_array( $order_state, $valid_purchase_order_states ) ) { return; } - // bail if by the time we are on the thank you page the meta has not been set or we already tracked a Purchase event - if ( 'yes' !== get_transient( $order_placed_flag ) || 'yes' === get_transient( $purchase_tracked_flag ) ) { - return; - } + // Mark the order as tracked for the session + set_transient( $purchase_tracked_flag, 'yes', 15 * MINUTE_IN_SECONDS ); + + // Set a flag to ensure this Purchase event is not going to be sent across different sessions + $order->add_meta_data( '_meta_purchase_tracked', true, true ); + + // Save the metadata + $order->save(); $content_type = 'product'; $contents = array(); @@ -885,41 +894,6 @@ public function inject_purchase_event( $order_id ) { $this->inject_subscribe_event( $order_id ); - // mark the order as tracked - set_transient( $purchase_tracked_flag, 'yes', 15 * MINUTE_IN_SECONDS ); - - } - - /** - * Inject order meta gor WooCommerce Checkout Blocks flow. - * The blocks flow does not trigger the woocommerce_checkout_update_order_meta so we can't rely on it. - * The Checkout Block has its own hook that allows us to inject the meta at - * the appropriate moment: woocommerce_store_api_checkout_update_order_meta. - * - * Note: __experimental_woocommerce_blocks_checkout_update_order_meta has been deprecated - * as of WooCommerce Blocks 6.3.0 - * - * @since 2.6.6 - * - * @param WC_Order|int $the_order Order object or id. - */ - public function inject_order_meta_event_for_checkout_block_flow( $the_order ) { - - $event_name = 'Purchase'; - - if ( ! $this->is_pixel_enabled() || $this->pixel->is_last_event( $event_name ) ) { - return; - } - - $order = wc_get_order($the_order); - - if ( ! $order ) { - return; - } - - $order_placed_flag = '_wc_' . facebook_for_woocommerce()->get_id() . '_order_placed_' . $order->get_id(); - set_transient( $order_placed_flag, 'yes', 15 * MINUTE_IN_SECONDS ); - } diff --git a/includes/Events/AAMSettings.php b/includes/Events/AAMSettings.php index 58cee4346..817624e4d 100644 --- a/includes/Events/AAMSettings.php +++ b/includes/Events/AAMSettings.php @@ -160,7 +160,7 @@ public function set_pixel_id( $pixel_id ) { * @return string */ public function __toString() { - return json_encode( + return wp_json_encode( array( 'enableAutomaticMatching' => $this->enable_automatic_matching, 'enabledAutomaticMatchingFields' => $this->enabled_automatic_matching_fields, From 988b293180c65569872a0a501adc553da10b4bb8 Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Wed, 23 Apr 2025 07:07:04 -0700 Subject: [PATCH 23/29] Remove type cast for GPC (#3078) Summary: ## Description Remove type casting for gpc to int ### Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [] I have commented my code, particularly in hard-to-understand areas. - [] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry Remove type casting for gpc to int Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3078 Reviewed By: vinkmeta Differential Revision: D73508817 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: 27d7842646a79f2560424df784a8a889792ada7c --- includes/fbproduct.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index 5c4908c73..751569dd0 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -1368,7 +1368,7 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $google_product_category = Products::get_google_product_category_id( $this->woo_product ); if ( $google_product_category ) { - $product_data['google_product_category'] = (int) $google_product_category; + $product_data['google_product_category'] = $google_product_category; } // Currently only items batch and feed support enhanced catalog fields From c0ad22fbbc22aaaade5046e97ee0e02e3fc24b3d Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Wed, 23 Apr 2025 10:49:27 -0700 Subject: [PATCH 24/29] Disable unmatched fields to batch api (#3079) Summary: ## Description Disable unmapped fields to batch api ### Type of change - New feature (non-breaking change which adds functionality) ## Checklist - [] I have commented my code, particularly in hard-to-understand areas. - [] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). ## Changelog entry Disable unmapped fields to batch api Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3079 Reviewed By: vinkmeta Differential Revision: D73518066 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: b94721cf267fbb78449a90cecf6f90a15764019d --- includes/fbproduct.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/fbproduct.php b/includes/fbproduct.php index 751569dd0..7b729f835 100644 --- a/includes/fbproduct.php +++ b/includes/fbproduct.php @@ -1327,8 +1327,8 @@ public function prepare_product( $retailer_id = null, $type_to_prepare_for = sel $product_data[ 'age_group' ] = $this->get_fb_age_group(); $product_data[ 'gender' ] = $this->get_fb_gender(); $product_data[ 'material' ] = Helper::str_truncate( $this->get_fb_material(), 100 ); - $product_data[ 'woo_product_type' ] = $this->get_type(); - $product_data[ 'unmapped_attributes' ] = $this->get_unmapped_attributes(); + // $product_data[ 'woo_product_type' ] = $this->get_type(); + // $product_data[ 'unmapped_attributes' ] = $this->get_unmapped_attributes(); if ( self::PRODUCT_PREP_TYPE_ITEMS_BATCH === $type_to_prepare_for ) { $product_data['title'] = Helper::str_truncate( WC_Facebookcommerce_Utils::clean_string( $this->get_title() ), self::MAX_TITLE_LENGTH ); From e6894e927afcebfb23e1a17f2be8e72086a6f74e Mon Sep 17 00:00:00 2001 From: Tzah Granot Date: Thu, 24 Apr 2025 17:00:17 +0100 Subject: [PATCH 25/29] Updating changelog.txt and readme.txt for v3.4.7 --- changelog.txt | 6 ++++++ readme.txt | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/changelog.txt b/changelog.txt index ede91da7a..5644470d8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -16,6 +16,12 @@ * Fix - Add parent product material inheritance for variations by @devbodaghe in #3035 * Fix - Tooltip Messages for Skirt Length and Sleeve Length by @devbodaghe in #3039 * Fix - Typo in Admin.php by @SayanPandey in #3063 +* Add - Add separate short_description field to Facebook product data by @devbodaghe in #3029 +* Tweak - Sync short description remove dropdown by @devbodaghe in #3031 +* Tweak - Short Description Fallback by @devbodaghe in #3048 +* Fix - A problem where Purchase event was not firing if thankyou page was not shown or Purchase state updated through Woo dashboard by @vahidkay-meta in #3060 +* Tweak - Remove type casting for gpc to int by @devbodaghe in 3078 +* Tweak - Disable unmapped fields to batch api by @devbodaghe in #3079 = 3.4.6 - 2025-04-04 = * Fix - Product availability syncing by @vinkmeta in #3010 diff --git a/readme.txt b/readme.txt index 966bb4d44..bc6249a47 100644 --- a/readme.txt +++ b/readme.txt @@ -56,5 +56,11 @@ When opening a bug on GitHub, please give us as many details as possible. * Fix - Add parent product material inheritance for variations by @devbodaghe in #3035 * Fix - Tooltip Messages for Skirt Length and Sleeve Length by @devbodaghe in #3039 * Fix - Typo in Admin.php by @SayanPandey in #3063 +* Add - Add separate short_description field to Facebook product data by @devbodaghe in #3029 +* Tweak - Sync short description remove dropdown by @devbodaghe in #3031 +* Tweak - Short Description Fallback by @devbodaghe in #3048 +* Fix - A problem where Purchase event was not firing if thankyou page was not shown or Purchase state updated through Woo dashboard by @vahidkay-meta in #3060 +* Tweak - Remove type casting for gpc to int by @devbodaghe in 3078 +* Tweak - Disable unmapped fields to batch api by @devbodaghe in #3079 [See changelog for all versions](https://raw.githubusercontent.com/facebook/facebook-for-woocommerce/refs/heads/main/changelog.txt). From 43f4a3e31fc8f1be52aaedddbc1b97a6bf80caad Mon Sep 17 00:00:00 2001 From: David Evbodaghe Date: Thu, 24 Apr 2025 13:20:42 -0700 Subject: [PATCH 26/29] Fix product variation fields not saving correctly (#3090) Summary: # Fix Product Variation Fields Not Saving Correctly ## Description This PR fixes an issue where product variation custom fields for Facebook for WooCommerce were not being properly saved and displayed. Specifically, the MPN (Manufacturer Part Number) and custom image URL values weren't being preserved when saving product variations. The issue was caused by two main problems: 1. The MPN field was being incorrectly formatted as a decimal number with `wc_format_decimal()` when rendered, which is inappropriate for an alphanumeric identifier 2. The custom image URL was potentially being overwritten due to variable reuse in the save logic These bugs prevented merchants from properly configuring their product variations for Facebook Catalog sync. ### Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [x] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki](https://fburl.com/wiki/2cgfduwc). - [x] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [x] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki](https://fburl.com/wiki/nhx73tgs). ## Changelog entry Fix issue where product variation MPN and custom image URL fields weren't being properly saved and displayed. Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3090 Test Plan: 1. Create a variable product with at least one variation 2. Enable Facebook sync for the variation 3. Set a custom MPN value (e.g., "ABC12345") and a custom image URL 4. Save the product 5. Reload the product edit page 6. Verify that the MPN and custom image URL values have been preserved ## Screenshots ### Before https://pxl.cl/74Rzv When saving product variations, the MPN field and custom image URL would not persist after saving. ### After https://pxl.cl/74Rzk The MPN field and custom image URL now correctly display and save the values entered by users. Reviewed By: carterbuce Differential Revision: D73611087 Privacy Context Container: L1313315 Pulled By: devbodaghe fbshipit-source-id: 5308dfb808e63055d033b3da847fde32d0b62885 --- includes/Admin.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/includes/Admin.php b/includes/Admin.php index 1e55b022c..92ef597ff 100644 --- a/includes/Admin.php +++ b/includes/Admin.php @@ -1573,7 +1573,7 @@ public function add_product_variation_edit_fields( $index, $variation_data, $pos 'label' => __( 'Manufacturer Parts Number (MPN)', 'facebook-for-woocommerce' ), 'desc_tip' => true, 'description' => __( 'Manufacturer Parts Number', 'facebook-for-woocommerce' ), - 'value' => wc_format_decimal( $fb_mpn ), + 'value' => $fb_mpn, 'class' => 'enable-if-sync-enabled', 'wrapper_class' => 'form-row form-full', ) @@ -1662,7 +1662,7 @@ public function save_product_variation_edit_fields( $variation_id, $index ) { $posted_param = 'variable_' . \WC_Facebook_Product::FB_PRODUCT_IMAGE; $image_url = isset( $_POST[ $posted_param ][ $index ] ) ? esc_url_raw( wp_unslash( $_POST[ $posted_param ][ $index ] ) ) : null; $posted_param = 'variable_' . \WC_Facebook_Product::FB_PRODUCT_CONDITION; - $image_url = isset( $_POST[ $posted_param ][ $index ] ) ? esc_url_raw( wp_unslash( $_POST[ $posted_param ][ $index ] ) ) : null; + $condition = isset( $_POST[ $posted_param ][ $index ] ) ? esc_url_raw( wp_unslash( $_POST[ $posted_param ][ $index ] ) ) : null; $posted_param = 'variable_' . \WC_Facebook_Product::FB_PRODUCT_VIDEO; $video_urls = isset( $_POST[ $posted_param ][ $index ] ) ? esc_url_raw( wp_unslash( $_POST[ $posted_param ][ $index ] ) ) : []; $posted_param = 'variable_' . \WC_Facebook_Product::FB_PRODUCT_PRICE; @@ -1672,6 +1672,7 @@ public function save_product_variation_edit_fields( $variation_id, $index ) { $variation->update_meta_data( Products::PRODUCT_IMAGE_SOURCE_META_KEY, $image_source ); $variation->update_meta_data( \WC_Facebook_Product::FB_MPN, $fb_mpn ); $variation->update_meta_data( \WC_Facebook_Product::FB_PRODUCT_IMAGE, $image_url ); + $variation->update_meta_data( \WC_Facebook_Product::FB_PRODUCT_CONDITION, $condition ); $variation->update_meta_data( \WC_Facebook_Product::FB_PRODUCT_VIDEO, $video_urls ); $variation->update_meta_data( \WC_Facebook_Product::FB_PRODUCT_PRICE, $price ); $variation->save_meta_data(); From bec1ad3623d343dcde9f9c6b0186ef7c5c2f8f43 Mon Sep 17 00:00:00 2001 From: Tzah Granot Date: Mon, 28 Apr 2025 14:09:26 +0100 Subject: [PATCH 27/29] Update changelog.txt and readme.txt for v3.4.7 --- changelog.txt | 1 + readme.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/changelog.txt b/changelog.txt index 5644470d8..14ad52dc7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -22,6 +22,7 @@ * Fix - A problem where Purchase event was not firing if thankyou page was not shown or Purchase state updated through Woo dashboard by @vahidkay-meta in #3060 * Tweak - Remove type casting for gpc to int by @devbodaghe in 3078 * Tweak - Disable unmapped fields to batch api by @devbodaghe in #3079 +* Fix - Product variation fields not saving correctly by @devbodaghe in #3090 = 3.4.6 - 2025-04-04 = * Fix - Product availability syncing by @vinkmeta in #3010 diff --git a/readme.txt b/readme.txt index bc6249a47..f7d9a044f 100644 --- a/readme.txt +++ b/readme.txt @@ -62,5 +62,6 @@ When opening a bug on GitHub, please give us as many details as possible. * Fix - A problem where Purchase event was not firing if thankyou page was not shown or Purchase state updated through Woo dashboard by @vahidkay-meta in #3060 * Tweak - Remove type casting for gpc to int by @devbodaghe in 3078 * Tweak - Disable unmapped fields to batch api by @devbodaghe in #3079 +* Fix - Product variation fields not saving correctly by @devbodaghe in #3090 [See changelog for all versions](https://raw.githubusercontent.com/facebook/facebook-for-woocommerce/refs/heads/main/changelog.txt). From a97de9e91d994d8452e2842f48b84ad2b9967aee Mon Sep 17 00:00:00 2001 From: Vinod Kumar Date: Mon, 28 Apr 2025 07:42:00 -0700 Subject: [PATCH 28/29] Removed failing test due to merge conflicts (#3103) Summary: Removed failing test due to merge conflicts related to SAOff changes which are not pushed yet - Bug fix (non-breaking change which fixes an issue) - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have confirmed that my changes do not introduce any new PHPCS warnings or errors. - [x] I have checked plugin debug logs that my changes do not introduce any new PHP warnings or FATAL errors. - [x] I followed general Pull Request best practices. Meta employees to follow this [wiki]([url](https://fburl.com/wiki/2cgfduwc)). - [x] I have added tests (if necessary) and all the new and existing unit tests pass locally with my changes. - [x] I have completed dogfooding and QA testing, or I have conducted thorough due diligence to ensure that it does not break existing functionality. - [x] I have updated or requested update to plugin documentations (if necessary). Meta employees to follow this [wiki]([url](https://fburl.com/wiki/nhx73tgs)). Removed failing test due to merge conflicts Pull Request resolved: https://github.com/facebook/facebook-for-woocommerce/pull/3103 Test Plan: npm run test:php Reviewed By: SayanPandey Differential Revision: D73779212 Pulled By: vinkmeta fbshipit-source-id: b81923bf833834ceb11cf84298dd925b13a2f11b --- tests/Unit/fbproductTest.php | 55 ------------------------------------ 1 file changed, 55 deletions(-) diff --git a/tests/Unit/fbproductTest.php b/tests/Unit/fbproductTest.php index 70e136507..56816aab9 100644 --- a/tests/Unit/fbproductTest.php +++ b/tests/Unit/fbproductTest.php @@ -1041,61 +1041,6 @@ public function test_external_update_time_unset() { $this->assertEquals(isset($data['external_update_time']), false); } - - - /** - * Tests for get_fb_short_description() method - */ - public function test_get_fb_short_description() { - // Test 1: Variation products should inherit parent's short description - $variable_product = WC_Helper_Product::create_variation_product(); - $variation = wc_get_product($variable_product->get_children()[0]); - - // Set the parent product's short description - $variable_product->set_short_description('parent short description'); - $variable_product->save(); - - // Even if we try to set a short description on the variation (which we dont have functionality for in WooCommerce UI) - $variation->set_short_description('variation short description - should be ignored'); - $variation->save(); - - $parent_fb_product = new \WC_Facebook_Product($variable_product); - $facebook_product = new \WC_Facebook_Product($variation, $parent_fb_product); - $description = $facebook_product->get_fb_short_description(); - - // Variations should inherit the parent product's short description - $this->assertEquals('parent short description', $description, 'Variations should inherit parent short description'); - - // Test 2: Gets short description from post excerpt for simple products - $product = WC_Helper_Product::create_simple_product(); - $product->set_short_description('product short description'); - $product->save(); - - $facebook_product = new \WC_Facebook_Product($product); - $description = $facebook_product->get_fb_short_description(); - $this->assertEquals('product short description', $description); - - // Test 3: Returns empty string when no short description exists - $product = WC_Helper_Product::create_simple_product(); - $product->set_short_description(''); - $product->save(); - - $facebook_product = new \WC_Facebook_Product($product); - $description = $facebook_product->get_fb_short_description(); - $this->assertEquals('', $description); - - // Test 4: Applies filters - $filter = $this->add_filter_with_safe_teardown('facebook_for_woocommerce_fb_product_short_description', function($description, $id) { - return 'filtered short description for product ' . $id; - }, 10, 2); - - $description = $facebook_product->get_fb_short_description(); - $this->assertEquals('filtered short description for product ' . $product->get_id(), $description); - - // Remove the filter early - $filter->teardown_safely_immediately(); - } - /** * Test fallback to main description when it's less than 1000 characters. */ From 2722a1581d2defd12943a9f73a23a1ba7251dfac Mon Sep 17 00:00:00 2001 From: Tzah Granot Date: Mon, 28 Apr 2025 16:05:11 +0100 Subject: [PATCH 29/29] More updates to changelog.txt and readme.txt for v3.4.7 --- changelog.txt | 1 + readme.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/changelog.txt b/changelog.txt index 14ad52dc7..33c9ec8ac 100644 --- a/changelog.txt +++ b/changelog.txt @@ -23,6 +23,7 @@ * Tweak - Remove type casting for gpc to int by @devbodaghe in 3078 * Tweak - Disable unmapped fields to batch api by @devbodaghe in #3079 * Fix - Product variation fields not saving correctly by @devbodaghe in #3090 +* Fix - Removed failing test due to merge conflicts @vinkmeta in #3103 = 3.4.6 - 2025-04-04 = * Fix - Product availability syncing by @vinkmeta in #3010 diff --git a/readme.txt b/readme.txt index f7d9a044f..2e40c7533 100644 --- a/readme.txt +++ b/readme.txt @@ -63,5 +63,6 @@ When opening a bug on GitHub, please give us as many details as possible. * Tweak - Remove type casting for gpc to int by @devbodaghe in 3078 * Tweak - Disable unmapped fields to batch api by @devbodaghe in #3079 * Fix - Product variation fields not saving correctly by @devbodaghe in #3090 +* Fix - Removed failing test due to merge conflicts @vinkmeta in #3103 [See changelog for all versions](https://raw.githubusercontent.com/facebook/facebook-for-woocommerce/refs/heads/main/changelog.txt).