سال 97 با یک چالش مواجه شدم، باید فروشگاه وردپرسی راه میانداختم که بتوان همزمان در آن محصولات کیلویی و عددی را برای فروش قرارداد. به عنوان مثال دسته بندی آجیل باید به صورت کیلویی و دسته بندی کنسرو به صورت عددی محاسبه و فروخته میشد.
تجربه کاربری برای جلوگیری از سردرگمی کاربر و نارضایتی خیلی مهم بود. مثلا فرض کنید مشتری به خیال خودش 1 محصول را به سبد خرید اضافه میکرد، اما در واقع 1 کیلوگرم از آن محصول را به سبد خرید اضافه کرده بود و چون این مطلب را نمیدانست، قیمت محصول به نظرش بسیار گران بود!
با ذکر چند نکته راه حل خودم را برای این سناریو شرح میدهم:
لازم است که در کنار قیمت، مشخص کنیم که واحد قیمت دهی محصول چیست؟
کد زیر در فایل functions.php پوسته چایلد قرار میگیرد. ابتدا قالب قیمت پیشفرض را حذف و سپس قالب جدید را مشروط به دسته بندی یا برچسب محصول اعمال میکنیم.
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10); add_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 12); add_filter('woocommerce_single_product_summary', 'price_lable', 10); add_filter('woocommerce_after_shop_loop_item_title', 'price_lable', 8); function price_lable($price){ if (has_term('آجیل', 'product_cat') || has_term('خشکبار', 'product_tag')) { $text = __('هر کیلو:'); } else { $text = __(' هر عدد:');} echo '<span class="price">' . $text . '</span> ' . $price;}
در کنار قسمت ورودی تعداد جهت سفارش، لازم است کاربر بداند که عددی که انتخاب میکند چه واحدی دارد؟ برای اینکار، قبل از این ورودی، یک span جدید ایجاد میکنیم که مشروط به دسته بندی یا برچسب محصول متغییر است.
add_action('woocommerce_before_add_to_cart_quantity', 'quantity_lable'); function quantity_lable(){ if (has_term('آجیل', 'product_cat') || has_term('خشکبار', 'product_tag')) { ?> <span class="howmuch"> <?php echo "چند کیلو؟" ?></span> <?php } else { ?><span class="howmuch"> <?php echo "چند عدد؟" ?></span> <?php } }
add_filter( 'woocommerce_get_availability', 'stock_lable', 10, 2 ); function stock_lable( $availability, $_product ) { $stock_quantity = $_product->get_stock_quantity(); if (has_term('جعبه فست فود', 'product_cat') || has_term('سینی رستورانی', 'product_tag')) { $text = __('کیلو موجود در انبار '); $availability['availability'] = sprintf( ' %s کیلو موجود در انبار', $stock_quantity ); } else { $text = __('عدد موجود در انبار '); $availability['availability'] = sprintf( ' %s عدد موجود در انبار', $stock_quantity ); } return $availability; }
اگر هزینه حمل و نقل محصولات را بر اساس وزن محاسبه میکنید، در قسمت حمل و نقل هر محصول، وزن محصولات کیلویی را باید 1 کیلوگرم و وزن محصولات عددی را معادل وزن واقعی هر عدد از آن قرار دهید.