تغییر مکان فیلدهای صفحه تسویه حساب

Amir hossein Karimi

تازه وارد
سلام، دوستان من میخوام فیلدهای تسویه حساب رو جابجا کنم، مثلا اول کشور باشه بعد شهر و ... اما یه مشکلی وجود داره.
بصورت عادی با woocommerce_checkout_fields این کار انجام میشه و در سورس کد بصورت صحیح نمایش داده میشه.
اما بعد از بارگذاری صفحه وقتی کدهای جاوا اسکریپت اجرا میشن و WooSelect و ... روی فرم ها تغییرات اعمال میکنن ظاهرا اسکریپت زیر میاد و ترتیب فیلدها رو بر اساس متغییر wc_address_i18n_params عوض میکنه.
فایل مربوطه : wp-content/plugins/woocommerce/assets/js/frontend/address-i18n.min.js
متغیر مورد استفاده : wc_address_i18n_params که قبل از بارگذاری فایل، و در بالای اون تزریق میشه.

من خیلی سرچ کردم و کدها رو دستکاری کردم اما نتونستم راه حلی پیدا کنم. بارگذاری این فایل رو هم غیرفعال کردم اما مشکل به وجود میاد و بعد از تغییر استان و شهر رویداد بروز رسانی سبد خرید و روش حمل و نقل اعمال نمیشه.

کدهای من برای تغییر این بخش:
PHP:
add_filter('woocommerce_checkout_fields', 'custom_override_checkout_fields', 40);
function custom_override_checkout_fields($fields)
{
    $fields['billing']['billing_state']['priority'] = 21;
    $fields['billing']['billing_city']['priority'] = 22;
    $fields['billing']['billing_postcode']['priority'] = 61;

    $fields['billing']['billing_country']['required'] = false;
    $fields['billing']['billing_country']['class'][] = 'd-none';
    $fields['billing']['billing_phone']['label'] = 'تلفن همراه';
    $fields['billing']['billing_phone']['placeholder'] = 'خیابان';
    $fields['billing']['billing_phone']['placeholder'] = '09112345678';
    $fields['billing']['billing_email']['placeholder'] = 'example@gmail.com';
    unset($fields['billing']['billing_address_2']);
    unset($fields['shipping']);
   
    return $fields;
}

فانکشن های اعمال شده روی woocommerce_checkout_fields رو هم بررسی کردم فقط یکیش از PWS هست که تغییر خاصی ایجاد نمیکنه و الویتش ۲۰ هست که الویت کد من ۴۰ هست و بعد از اعمال این تغییرات چیزی بهش اعمال نمیشه.
بازم میگم خروجی سورس کد مشکلی نداره مشکل اصلی کد ایجاد شده جاوا اسکریپت برای متغیر wc_address_i18n_params هست که بالاتر گفتم.
محتوای این کد به این صورت تولید میشه:
JavaScript:
var wc_address_i18n_params = {"locale":"{\"IR\":{\"state\":{\"label\":\"\\u0627\\u0633\\u062a\\u0627\\u0646\"},\"postcode\":{\"label\":\"\\u06a9\\u062f \\u067e\\u0633\\u062a\\u06cc\"}},\"default\":{\"first_name\":{\"label\":\"\\u0646\\u0627\\u0645\",\"required\":true,\"class\":[\"form-row-first\"],\"autocomplete\":\"given-name\",\"priority\":10},\"last_name\":{\"label\":\"\\u0646\\u0627\\u0645 \\u062e\\u0627\\u0646\\u0648\\u0627\\u062f\\u06af\\u06cc\",\"required\":true,\"class\":[\"form-row-last\"],\"autocomplete\":\"family-name\",\"priority\":20},\"country\":{\"type\":\"country\",\"label\":\"Country \\\/ Region\",\"required\":true,\"class\":[\"form-row-wide\",\"address-field\",\"update_totals_on_change\"],\"autocomplete\":\"country\",\"priority\":40},\"address_1\":{\"label\":\"\\u062e\\u06cc\\u0627\\u0628\\u0627\\u0646\",\"placeholder\":\"\\u067e\\u0644\\u0627\\u06a9 \\u062e\\u0627\\u0646\\u0647 \\u0648 \\u0646\\u0627\\u0645 \\u062e\\u06cc\\u0627\\u0628\\u0627\\u0646\",\"required\":true,\"class\":[\"form-row-wide\",\"address-field\"],\"autocomplete\":\"address-line1\",\"priority\":50},\"address_2\":{\"placeholder\":\"\\u0634\\u0645\\u0627\\u0631\\u0647 \\u0648\\u0627\\u062d\\u062f \\u060c \\u0628\\u0644\\u0648\\u06a9 \\u060c \\u067e\\u0644\\u0627\\u06a9 (\\u062f\\u0644\\u062e\\u0648\\u0627\\u0647)\",\"class\":[\"form-row-wide\",\"address-field\"],\"autocomplete\":\"address-line2\",\"priority\":60,\"required\":false},\"city\":{\"label\":\"\\u0634\\u0647\\u0631\",\"required\":true,\"class\":[\"form-row-wide\",\"address-field\"],\"autocomplete\":\"address-level2\",\"priority\":70},\"state\":{\"type\":\"state\",\"label\":\"\\u0627\\u0633\\u062a\\u0627\\u0646\",\"required\":true,\"class\":[\"form-row-wide\",\"address-field\"],\"validate\":[\"state\"],\"autocomplete\":\"address-level1\",\"priority\":80},\"postcode\":{\"label\":\"\\u06a9\\u062f\\u067e\\u0633\\u062a\\u06cc\",\"required\":true,\"class\":[\"form-row-wide\",\"address-field\"],\"validate\":[\"postcode\"],\"autocomplete\":\"postal-code\",\"priority\":90}}}","locale_fields":"{\"address_1\":\"#billing_address_1_field, #shipping_address_1_field\",\"address_2\":\"#billing_address_2_field, #shipping_address_2_field\",\"state\":\"#billing_state_field, #shipping_state_field, #calc_shipping_state_field\",\"postcode\":\"#billing_postcode_field, #shipping_postcode_field, #calc_shipping_postcode_field\",\"city\":\"#billing_city_field, #shipping_city_field, #calc_shipping_city_field\"}","i18n_required_text":"\u0636\u0631\u0648\u0631\u06cc","i18n_optional_text":"\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc"};
که بعد از Json Decode کردن بخش local میشه این:
JavaScript:
{
  "IR": {
    "state": {
      "label": "استان"
    },
    "postcode": {
      "label": "کد پستی"
    }
  },
  "default": {
    "first_name": {
      "label": "نام",
      "required": true,
      "class": [
        "form-row-first"
      ],
      "autocomplete": "given-name",
      "priority": 10
    },
    "last_name": {
      "label": "نام خانوادگی",
      "required": true,
      "class": [
        "form-row-last"
      ],
      "autocomplete": "family-name",
      "priority": 20
    },
    "country": {
      "type": "country",
      "label": "Country / Region",
      "required": true,
      "class": [
        "form-row-wide",
        "address-field",
        "update_totals_on_change"
      ],
      "autocomplete": "country",
      "priority": 40
    },
    "address_1": {
      "label": "خیابان",
      "placeholder": "پلاک خانه و نام خیابان",
      "required": true,
      "class": [
        "form-row-wide",
        "address-field"
      ],
      "autocomplete": "address-line1",
      "priority": 50
    },
    "address_2": {
      "placeholder": "شماره واحد ، بلوک ، پلاک (دلخواه)",
      "class": [
        "form-row-wide",
        "address-field"
      ],
      "autocomplete": "address-line2",
      "priority": 60,
      "required": false
    },
    "city": {
      "label": "شهر",
      "required": true,
      "class": [
        "form-row-wide",
        "address-field"
      ],
      "autocomplete": "address-level2",
      "priority": 70
    },
    "state": {
      "type": "state",
      "label": "استان",
      "required": true,
      "class": [
        "form-row-wide",
        "address-field"
      ],
      "validate": [
        "state"
      ],
      "autocomplete": "address-level1",
      "priority": 80
    },
    "postcode": {
      "label": "کدپستی",
      "required": true,
      "class": [
        "form-row-wide",
        "address-field"
      ],
      "validate": [
        "postcode"
      ],
      "autocomplete": "postal-code",
      "priority": 90
    }
  }
}
با دقت کردن به فیلدهای کشور (که کلاس d-none) بهش اضافه شده بود تو فیلتر بالا و همینطور Priority های فیلد استان، شهر و کدپستی متوجه میشید که کدهای PHP بالا که به فیلتر woocommerce_checkout_fields اعمال کرده بودم انگار اجراء نشده!
واقعا گیج شدم...
 
آخرین ویرایش:
بالا