# ভেরিয়েশন সেট করার সমস্যা ফিক্স

## সমস্যা কি ছিল

উইশলিস্ট পেজে ভেরিয়েবল প্রোডাক্টের জন্য `.bizzwishlist-variation-selector` এ কাস্টম ড্রপডাউন ব্যবহার করা হচ্ছিল (`.bizzwishlist-variation-select` ক্লাস দিয়ে)। "Set Variation" বাটনে ক্লিক করলে `variation_id` ঠিকমতো সেট হচ্ছিল না। এছাড়া, ভেরিয়েশন সোয়াচ প্লাগিনগুলো কাজ করছিল না কারণ WooCommerce-এর স্ট্যান্ডার্ড HTML স্ট্রাকচার (`form.variations_form.cart`, `table.variations`) ব্যবহার করা হচ্ছিল না।

## কোন কোন ফাইল পরিবর্তন করা হয়েছে

### ১. `templates/wishlist-page.php`

**যা মুছে ফেলা হয়েছে:**
- কাস্টম `<select class="bizzwishlist-variation-select">` ড্রপডাউন এলিমেন্টগুলো
- ম্যানুয়ালি simplified variations data তৈরি করার PHP কোড (`$bizzwishlist_simple_variations` array)
- `<input type="hidden" class="bizzwishlist-resolved-variation" data-variations="...">` হিডেন ইনপুট (যেটায় simplified JSON variations data ছিল)

**যা যোগ করা হয়েছে:**
- `<form class="variations_form cart" data-product_id="..." data-product_variations="...">` — WooCommerce-এর স্ট্যান্ডার্ড ভেরিয়েশন ফর্ম wrapper
- `<table class="variations">` — WooCommerce-এর স্ট্যান্ডার্ড ভেরিয়েশন টেবিল স্ট্রাকচার (`<th class="label">`, `<td class="value">`)
- `wc_dropdown_variation_attribute_options()` — WooCommerce-এর বিল্ট-ইন ড্রপডাউন ফাংশন কল করা হয়েছে, যেটা স্ট্যান্ডার্ড `select` তৈরি করে `data-attribute_name` attribute সহ
- `<div class="single_variation_wrap">` — WooCommerce-এর স্ট্যান্ডার্ড wrapper
- `<input type="hidden" name="variation_id" class="variation_id bizzwishlist-resolved-variation">` — WooCommerce-এর স্ট্যান্ডার্ড hidden variation_id input
- `data-product_variations` attribute-এ full variation data পাস করা হয়েছে (আগে শুধু simplified version পাস করা হতো)
- প্রতিটা attribute select-এ ইউনিক `id` দেওয়া হয়েছে (product ID সহ) যাতে একাধিক ভেরিয়েবল প্রোডাক্ট থাকলেও কনফ্লিক্ট না হয়

### ২. `assets/js/wishlist.js`

**যা মুছে ফেলা হয়েছে:**
- `resolveVariation()` ফাংশন — এই ফাংশনে কাস্টম variation matching লজিক ছিল। `.bizzwishlist-variation-select` থেকে ভ্যালু পড়ে `.bizzwishlist-resolved-variation` থেকে `data-variations` JSON পড়ে ম্যানুয়ালি variation_id match করতো। এটা সম্পূর্ণ মুছে ফেলা হয়েছে।
- `.bizzwishlist-variation-select` এর উপর `change` event listener — এটাও মুছে ফেলা হয়েছে কারণ WooCommerce-এর নিজস্ব JS এখন variation resolution handle করবে।
- `setVariation()` ফাংশনে `.bizzwishlist-variation-select` থেকে label পড়ার কোড

**যা যোগ করা হয়েছে:**
- `initWishlistVariationForms()` ফাংশন — উইশলিস্ট পেজের প্রতিটা `.bizzwishlist-variation-selector .variations_form` এ WooCommerce-এর `wc_variation_form()` কল করে ইনিশিয়ালাইজ করে। এটা `init()` ফাংশন থেকে কল হয়।
- `found_variation` event listener — `.bizzwishlist-variation-selector .variations_form` এ WooCommerce যখন variation match করে, তখন `found_variation` event fire করে। এই event listener সেই variation_id ক্যাপচার করে hidden input-এ সেট করে, row-এর `data-variation-id` attribute আপডেট করে, এবং "Set Variation" বাটন enable করে।
- `reset_data` event listener — যখন ইউজার ড্রপডাউন ক্লিয়ার করে, WooCommerce `reset_data` event fire করে। এই listener variation_id রিসেট করে `0`-তে এবং বাটনগুলো disable করে।
- `setVariation()` ফাংশনে `select[data-attribute_name]` (WooCommerce স্ট্যান্ডার্ড) থেকে label পড়ার কোড এবং `.variations_form` থেকে `.variation_id` ভ্যালু পড়ার কোড

### ৩. `includes/Frontend/Assets.php`

**যা পরিবর্তন করা হয়েছে:**
- `bizzwishlist` script-এর dependency-তে `'wc-add-to-cart-variation'` যোগ করা হয়েছে। আগে শুধু `array( 'jquery' )` ছিল, এখন `array( 'jquery', 'wc-add-to-cart-variation' )` হয়েছে। এটা দরকার কারণ WooCommerce-এর variation form JS (`wc_variation_form()` ফাংশন) এই script-এ define করা আছে।

## কেন এই পদ্ধতি ব্যবহার করা হয়েছে

১. **WooCommerce স্ট্যান্ডার্ড ফলো করা হয়েছে:** `form.variations_form.cart` এবং `table.variations` ক্লাস ব্যবহার করা হয়েছে যাতে ভেরিয়েশন সোয়াচ প্লাগিনগুলো (যেমন Variation Swatches for WooCommerce) সঠিকভাবে কাজ করে।

২. **WooCommerce-এর নিজস্ব variation matching ব্যবহার করা হয়েছে:** কাস্টম `resolveVariation()` ফাংশনের বদলে WooCommerce-এর `wc-add-to-cart-variation` script-এর মাধ্যমে variation resolution করা হচ্ছে। এটা অনেক বেশি reliable এবং edge case handle করতে পারে।

৩. **`wc_dropdown_variation_attribute_options()` ব্যবহার করা হয়েছে:** কাস্টম `<select>` এর বদলে WooCommerce-এর built-in ফাংশন কল করা হয়েছে, যেটা proper `data-attribute_name` attribute সহ select তৈরি করে।

৪. **`found_variation` event ব্যবহার করা হয়েছে:** WooCommerce variation form যখন সব attribute select করার পর matching variation খুঁজে পায়, তখন `found_variation` event fire করে variation object সহ। এই event থেকে `variation_id` নিয়ে hidden input-এ সেট করা হচ্ছে। তাই "Set Variation" বাটনে ক্লিক করলে সঠিক `variation_id` পাওয়া যাচ্ছে।

## কোথায় কোথায় চেক করা হয়েছে

- `templates/wishlist-page.php` — ভেরিয়েশন সিলেক্টরের HTML স্ট্রাকচার
- `assets/js/wishlist.js` — ভেরিয়েশন সংক্রান্ত সব JavaScript ফাংশন ও event handler
- `includes/Frontend/Assets.php` — Script dependency
- `includes/Ajax/WishlistAjax.php` — AJAX handler যেটা `variation_id` receive করে (এটায় কোন পরিবর্তন দরকার ছিল না)
- `includes/Frontend/WishlistButton.php` — সিঙ্গেল প্রোডাক্ট পেজের বাটন (এটায় কোন পরিবর্তন দরকার ছিল না)
- `includes/Frontend/WishlistPage.php` — শর্টকোড রেন্ডারিং (এটায় কোন পরিবর্তন দরকার ছিল না)
