چند وقت پیش با چالشی رو به رو بودم. یک سایت فروشگاهی نیاز داشت که تاریخ تولد کاربر رو هنگام خرید دریافت و ذخیره کنه.
مدیر وبسایت هم اصلا اعتقادی به استفاده از افزونه نداشت و میگفت باید با کدنویسی انجام بشه.
در نتیجه دست به کار شدم تا چیزی که میخواد رو براش انجام بدم.
به نظرم اگر شما هم نیاز دارید تا اطلاعاتی مثل: تاریخ تولد، تاریخ تحویل مرسوله، کد ملی و … از کاربر هنگام خرید دریافت کنید، بهتره از افزونه های موجود استفاده کنید.
اما اگر اصرار دارید از کد استفاده کنید (به هر دلیلی)، شاید این پست بتونه کمک کننده باشه.
نکته ی مهم همین اول کار!
تمامی کدهایی که در ادامه ی این پست می بینید، در فایل functions.php قرار می گیرند.
بنابراین حواستون باشه که برای قرار دادن این کدها در functions.php، حتما قبلش از این فایل بکاپ تهیه کنید.
دقت داشته باشید که بهتره این تغییرات رو در چایلد تم (child theme) انجام بدید. چرا؟
چون اگر این تغییرات در قالب اصلی انجام بشه، با آپدیت قالب، همه ی تغییرات از بین خواهند رفت!
افزودن فیلد تاریخ تولد به ووکامرس
از طریق یکی از 2 راه زیر فایل را باز می کنیم.
• وارد هاست خود شده و به wp-content می رویم. از پوشه ی وارد پوشه ی themes شده و سپس پوشه ی مربوط به قالب خود را باز می کنیم. فایل functions.php را با ادیتور باز و ویرایش می کنیم.
• از پیشخوان وردپرس وارد بخش نمایش شده و روی ویرایشگر پرونده پوسته کلیک می کنیم. فایل functions.php را ویرایش میکنیم.
حالا آماده ایم تا کدها رو قرار بدیم. دقت کنید که شما میتونید متناسب با نیاز خودتون این تکه کد رو توسعه و یا تغییر بدید.
ابتدا با قرار دادن کد زیر، یک فیلد جدید در صفحه ی تسویه حساب ووکامرس ایجاد می کنیم.
// Add a custom field to the checkout page add_action( 'woocommerce_after_order_notes', 'add_date_of_birth_field' ); function add_date_of_birth_field( $checkout ) { echo '<div id="date_of_birth_field"><h2>' . __('Date of Birth') . '</h2>'; woocommerce_form_field( 'date_of_birth', array( 'type' => 'date', 'class' => array( 'form-row-wide' ), 'label' => __( 'Date of Birth' ), 'required' => true, ), $checkout->get_value( 'date_of_birth' ) ); echo '</div>'; }
اگر دقت کنید نوع فیلد (type) روی تاریخ (date) قرار داره که باعث میشه کاربر به راحتی تاریخ رو انتخاب کنه و مجبور نشه دستی اونو بنویسه!
همچنین می بینید که من تعریف کردم که این فیلد الزامی باشه. یعنی اگر کاربر تاریخ تولدش رو نداد، بهش خطا برگردون!
اگر نمیخواید این گزینه ضروری باشه، مقدار required رو از true به false تغییر بدید.
تا اینجای کار یک فیلد انتخاب تاریخ تولد با نام Date of Birth به صفحه تسویه حساب اضافه شده.
حالا باید این اطلاعات دریافتی از کاربر رو به عنوان دیتا ذخیره کنیم. پس در ادامه می نویسیم:
// Save the custom field value as order meta data add_action( 'woocommerce_checkout_update_order_meta', 'save_date_of_birth_field' ); function save_date_of_birth_field( $order_id ) { if ( ! empty( $_POST['date_of_birth'] ) ) { update_post_meta( $order_id, 'Date of Birth', sanitize_text_field( $_POST['date_of_birth'] ) ); } }
ترجیحا اگر در برنامه نویسی سررشته ای ندارید، این کد رو تغییری ندید. (مگر روی لوکال هاست باشید و قصدتون آموزش و کسب تجربه باشه :))
حالا با قرار دادن کد بالا ما تونستیم این اطلاعات رو ذخیره هم بکنیم.
ولی یه اشکالی وجود داره! چه عیبی توی کارمون هست؟
فیلد رو که ساختیم و در صفحه نمایش دادیم. اطلاعات هم که از کاربر گرفتیم و در دیتابیس ذخیره کردیم. خب پس مشکل کجاست؟
مشکل اینه که ما همه کار رو درست انجام دادیم ولی چطور ببینیم کاربر چه تاریخی وارد کرده؟! اصلا از کجا ببینیم؟
قاعدتا این اطلاعات باید بره در فاکتور سفارش مشتری اما متاسفانه ما تعریف نکردیم این اطلاعات رو کجا نمایش بده.
ما فقط یک فیلد ساختیم. اطلاعات رو گرفتیم. ذخیره کردیم. همین!
دیگه نگفتیم باید این اطلاعات کجا نمایش داده بشن؟
پس در ادامه ی دو تکه کد قبلی، خواهیم نوشت:
// Display the custom field value in the order invoice add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_date_of_birth_field_in_invoice', 10, 1 ); function display_date_of_birth_field_in_invoice( $order ) { echo '<p><strong>' . __( 'Date of Birth' ) . ':</strong> ' . get_post_meta( $order->get_id(), 'Date of Birth', true ) . '</p>'; }
حالا اگر یک ثبت سفارش انجام بدید می بینید که در فاکتور سفارش مشتری، تاریخی که وارد کرده نمایش داده میشه و همه چیز همونطور پیش رفت که می خواستیم 🙂
اینکه دریافت تاریخ تولد از مشتری به چه دردی میخوره کاملا بستگی به هدف سایت داره! ممکنه یک سایتی تاریخ تولد کاربرانش رو بگیره و روز تولدشون براشون کد تخفیف ارسال کنه و از این راه مشتریان بیشتری به سمت خودش جذب کنه و یا …
بهرحال امیدوارم براتون مفید بوده باشه.
تقریبا سعی میکنم برای این مدل آموزش ها ویدئو هم بزارم برای درک عمیق تر و همچنین برای کسانی که تنبل تر هستن و حوصله ی خوندن متن ندارن.
دوست داشتید ویدئو زیر رو ببینید. چکیده ای از آموزش بالاست.