Graded\n * Base size -> Non-Graded\n *\n * The selected Base size remains in WooCommerce's existing "sizes" variation\n * attribute so it is retained by cart sessions, checkout, and order records.\n */\nif (!defined('ABSPATH')) { return; }\n\nif (!function_exists('pssk_size_options_get_parent_product')) {\n function pssk_size_options_get_parent_product($product_or_id) {\n if ($product_or_id instanceof WC_Product_Variation) {\n $product_or_id = $product_or_id->get_parent_id();\n } elseif ($product_or_id instanceof WC_Product) {\n if ($product_or_id->is_type('variation')) {\n $product_or_id = $product_or_id->get_parent_id();\n } else {\n return $product_or_id;\n }\n }\n\n $product_id = absint($product_or_id);\n return $product_id ? wc_get_product($product_id) : false;\n }\n}\n\nif (!function_exists('pssk_size_options_is_supported_product')) {\n function pssk_size_options_is_supported_product($product_or_id) {\n if (!function_exists('wc_get_product')) { return false; }\n\n $product = pssk_size_options_get_parent_product($product_or_id);\n if (!$product || !$product->is_type('variable')) { return false; }\n\n $attributes = $product->get_attributes();\n foreach (array('sizes', 'grading', 'customize') as $key) {\n if (\n !isset($attributes[$key]) ||\n !is_object($attributes[$key]) ||\n !method_exists($attributes[$key], 'get_variation') ||\n !$attributes[$key]->get_variation()\n ) {\n return false;\n }\n }\n\n return true;\n }\n}\n\nif (!function_exists('pssk_size_options_get_mode')) {\n function pssk_size_options_get_mode($variation_attributes, $product = null) {\n $mode = '';\n if (is_array($variation_attributes)) {\n if (isset($variation_attributes['attribute_grading'])) {\n $mode = (string) $variation_attributes['attribute_grading'];\n } elseif (isset($variation_attributes['grading'])) {\n $mode = (string) $variation_attributes['grading'];\n }\n }\n\n if ($mode === 'Graded') { return 'graded'; }\n if ($mode === 'Non-Graded') { return 'base'; }\n\n $product = $product ? pssk_size_options_get_parent_product($product) : false;\n $defaults = $product ? $product->get_default_attributes() : array();\n return (($defaults['grading'] ?? 'Non-Graded') === 'Graded') ? 'graded' : 'base';\n }\n}\n\nif (!function_exists('pssk_size_options_attribute_label')) {\n function pssk_size_options_attribute_label($label, $name, $product = null) {\n if (!pssk_size_options_is_supported_product($product)) { return $label; }\n\n $key = sanitize_title((string) $name);\n $key = preg_replace('/^attribute_/', '', $key);\n\n if ($key === 'sizes') { return 'Base size'; }\n if ($key === 'grading') { return 'Size option'; }\n return $label;\n }\n add_filter('woocommerce_attribute_label', 'pssk_size_options_attribute_label', 20, 3);\n}\n\n/**\n * Replace the two legacy attribute rows in cart/checkout with the new terminology.\n * Customization and Item note rows remain untouched.\n */\nif (!function_exists('pssk_size_options_cart_item_data')) {\n function pssk_size_options_cart_item_data($item_data, $cart_item) {\n $product_id = isset($cart_item['product_id']) ? absint($cart_item['product_id']) : 0;\n if (!$product_id || !pssk_size_options_is_supported_product($product_id)) {\n return $item_data;\n }\n\n $product = wc_get_product($product_id);\n $variation_attributes = isset($cart_item['variation']) && is_array($cart_item['variation'])\n ? $cart_item['variation']\n : array();\n\n if (empty($variation_attributes) && !empty($cart_item['variation_id'])) {\n $variation = wc_get_product(absint($cart_item['variation_id']));\n if ($variation instanceof WC_Product_Variation) {\n $variation_attributes = $variation->get_variation_attributes();\n }\n }\n\n $mode = pssk_size_options_get_mode($variation_attributes, $product);\n $size = '';\n if (isset($variation_attributes['attribute_sizes'])) {\n $size = (string) $variation_attributes['attribute_sizes'];\n } elseif (isset($variation_attributes['sizes'])) {\n $size = (string) $variation_attributes['sizes'];\n }\n if ($size === '') {\n $defaults = $product ? $product->get_default_attributes() : array();\n $size = (string) ($defaults['sizes'] ?? '');\n }\n\n $filtered = array();\n foreach ((array) $item_data as $row) {\n $key = sanitize_title(wp_strip_all_tags((string) ($row['key'] ?? '')));\n if (in_array($key, array('sizes', 'grading', 'base-size', 'size-option'), true)) {\n continue;\n }\n $filtered[] = $row;\n }\n\n $filtered[] = array(\n 'key' => 'Size option',\n 'value' => ($mode === 'graded') ? 'Graded size set' : 'Base size',\n 'display' => esc_html(($mode === 'graded') ? 'Graded size set' : 'Base size'),\n );\n\n if ($mode === 'base' && $size !== '') {\n $filtered[] = array(\n 'key' => 'Base size',\n 'value' => $size,\n 'display' => esc_html($size),\n );\n }\n\n return array_values($filtered);\n }\n add_filter('woocommerce_get_item_data', 'pssk_size_options_cart_item_data', 35, 2);\n}\n\n/** Store the new selection names on order line items without exposing legacy grading metadata. */\nif (!function_exists('pssk_size_options_checkout_order_item')) {\n function pssk_size_options_checkout_order_item($item, $cart_item_key, $values, $order) {\n $product_id = isset($values['product_id']) ? absint($values['product_id']) : 0;\n if (!$product_id || !pssk_size_options_is_supported_product($product_id)) {\n return;\n }\n\n $product = wc_get_product($product_id);\n $variation_attributes = isset($values['variation']) && is_array($values['variation'])\n ? $values['variation']\n : array();\n $mode = pssk_size_options_get_mode($variation_attributes, $product);\n\n $size = '';\n if (isset($variation_attributes['attribute_sizes'])) {\n $size = (string) $variation_attributes['attribute_sizes'];\n } elseif (isset($variation_attributes['sizes'])) {\n $size = (string) $variation_attributes['sizes'];\n }\n if ($size === '') {\n $defaults = $product ? $product->get_default_attributes() : array();\n $size = (string) ($defaults['sizes'] ?? '');\n }\n\n // These are the internal variation-attribute meta keys WooCommerce creates.\n $item->delete_meta_data('sizes');\n $item->delete_meta_data('grading');\n\n $item->add_meta_data('Size option', ($mode === 'graded') ? 'Graded size set' : 'Base size', true);\n if ($mode === 'base' && $size !== '') {\n $item->add_meta_data('Base size', sanitize_text_field($size), true);\n }\n // Keep the existing "customize" variation metadata unchanged.\n }\n add_action('woocommerce_checkout_create_order_line_item', 'pssk_size_options_checkout_order_item', 30, 4);\n}\n https://patternsouk.com/wp-sitemap-posts-page-1.xmlhttps://patternsouk.com/wp-sitemap-posts-product-1.xmlhttps://patternsouk.com/wp-sitemap-taxonomies-product_cat-1.xmlhttps://patternsouk.com/wp-sitemap-users-1.xml