SHET26

تغییر نقش کاربری پیشفرض در ووکامرس هنگام خرید یا ثبت نام

تغییر نقش کاربری پیشفرض در ووکامرس هنگام خرید یا ثبت نام

درود بر شما هم‌میهنان عزیز! بعد از مدت‌ها با یه مقاله درباره ووکامرس و هوک‌هاش برگشتم.

ماجرا از اونجا شروع شد که دیروز روی یکی از سایت‌های ووکامرسی به یه مشکل عجیب برخوردم؛ کاربرهای جدید سایت داشتن با نقش کاربری «مشتری» توی بخش کاربران وردپرس ثبت می‌شدن. شاید اولش موضوع مهمی به نظر نرسه، ولی هرچی سایت بزرگ‌تر میشه، همین یه قلم بیشتر دردسر درست می‌کنه. خوشبختانه حلش کردم و حالا می‌خوام قدم به قدم همون راه‌حل رو باهاتون در میون بذارم.

تغییر نقش کاربری پیشفرض در ووکامرس

قبل از هر چیز بذارید تکلیف خود وردپرس رو روشن کنیم. وردپرس یه تنظیم خیلی ساده داره که مشخص می‌کنه هر کاربر تازه‌ای که توی سایت ثبت‌نام می‌کنه، چه نقشی بگیره.

کافیه برید به تنظیمات ← عمومی و از قسمت «نقش پیش‌فرض کاربر تازه» هر نقشی که دوست دارید رو انتخاب کنید. تموم! به همین سادگی.

تغییر ننقش کاربری پیشفرض وردپرس
تغییر ننقش کاربری پیشفرض وردپرس

پس چرا این تنظیم روی ووکامرس اثر ندارد؟

اینجا دقیقاً همون‌جاییه که کار گره می‌خوره. ووکامرس اصلاً کاری به این تنظیم وردپرس نداره و ساز خودش رو می‌زنه.

فرقی هم نمی‌کنه که ثبت‌نام خودکار موقع خرید رو فعال کرده باشید یا از کاربر بخواید قبل از خرید خودش ثبت‌نام کنه؛ توی هر دو حالت نقشی که به کاربر داده میشه «مشتری» یا همون Customer هست.

بذارید با یه مثال واقعی بگم. ما توی میهن وردپرس نقش کاربری پیشفرض همه کاربرها رو «هم‌میهن» گذاشتیم. حالا با اومدن ووکامرس، عملاً دوتا نقش کاربری موازی داریم: «هم‌میهن» و «مشتری». یعنی دو گروه از کاربر که کارشون یکیه ولی نقششون فرق داره.

این موضوع موقع توسعه سایت خودش رو نشون میده. هر بار که بخواید به یه بخشی دسترسی بدید، باید حواستون به هر دو نقش باشه. هر افزونه‌ای هم که نصب کنید، باید تنظیماتش رو برای دو نقش جدا انجام بدید. خب این یعنی دوبرابر کار و دوبرابر احتمال خطا.

خبر خوب اینه که مشکلات معمولاً راه‌حل ساده‌تر هم دارن و این یکی هم از همون دسته‌ست.

کِی به این کار نیاز پیدا می‌کنید؟

فرض کنید یه سایت ووکامرسی دارید و با میهن پنل یه پنل کاربری خوب هم براش ساختید. حالا تصمیم می‌گیرید یه افزونه پشتیبانی مثل Awesome Support نصب کنید تا کاربرها بتونن تیکت بفرستن.

برای اینکه کاربر بتونه تیکت ثبت کنه، باید نقش مخصوص پشتیبانی رو داشته باشه. ولی ووکامرس بدون اینکه از شما اجازه بگیره، به هر کسی که ثبت‌نام می‌کنه نقش Customer میده. نتیجهاین میشه که کاربر وارد پنل میشه، دنبال بخش تیکت می‌گرده و یا اصلاً نمی‌بینتش یا موقع ثبت تیکت به خطا می‌خوره. بعدش هم تماس می‌گیره و میگه سایتتون خرابه!

راه‌حل ساده‌ش اینه که همون لحظه ثبت‌نام، خودمون به ووکامرس بگیم چه نقشی به کاربر بده.

راه‌حل: آشنایی با فیلتر woocommerce_new_customer_data

وردپرس برای همین جور کارها هوک‌ها و فیلترها رو در اختیارمون گذاشته. ووکامرس هم دست ما رو باز گذاشته و یه فیلتر مشخص کرده که باهاش می‌تونید تعیین کنید موقع ثبت‌نام (چه خودکار و چه دستی) چه اطلاعاتی توی پروفایل کاربر ذخیره بشه.

اسم این فیلتر woocommerce_new_customer_data هست و یکی از داده‌هایی که در اختیارمون می‌ذاره، دقیقاً همون نقش کاربره. یعنی درست همون چیزی که دنبالشیم.

از کجا مطمئنیم این فیلتر جواب میدهد؟

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

/wp-content/plugins/woocommerce/includes/wc-customer-functions.php

توی خط ۱۰۲ با همچین چیزی روبه‌رو میشید:

php

$new_customer_data = apply_filters( 'woocommerce_new_customer_data', array(
    'user_login' => $username,
    'user_pass'  => $password,
    'user_email' => $email,
    'role'       => 'customer'
) );

اینجا با یه apply_filters طرفیم. یعنی ووکامرس خودش رسماً اعلام کرده: «هر کی دوست داره می‌تونه با فیلتری به اسم woocommerce_new_customer_data روی داده‌های مشتری جدید تأثیر بذاره.»

مقدار role رو هم که می‌بینید؛ همون customer که مقصر اصلی ماجراست. پس دقیقاً می‌دونیم باید کجا رو دست‌کاری کنیم.

بخش تغییرات کدنویسی

بریم که انجامش بدیم!

قدم اول: ساختار add_filter

برای اضافه کردن یه فیلتر توی وردپرس از add_filter استفاده می‌کنیم که ساختار کلیش این شکلیه:

php

add_filter( $tag, $function_to_add, $priority, $accepted_args );

یه نکته کوچیک ولی مهم: این کد باید بعد از تگ <?php قرار بگیره.

قدم دوم: ساخت تابع mihanwp_new_customer_data

حالا به جای $tag اسم فیلتر و به جای $function_to_add اسم تابع خودمون رو می‌ذاریم:

php

add_filter( 'woocommerce_new_customer_data', 'mihanwp_new_customer_data' );

بعدش نوبت خود تابعه. کاری که می‌خوایم انجام بده ساده‌ست: آرایه اطلاعات مشتری رو بگیره، مقدار role رو عوض کنه و دوباره برش گردونه:

php

function mihanwp_new_customer_data( $new_customer_data ) {
    $new_customer_data['role'] = get_option( 'default_role' );
    return $new_customer_data;
}

بذارید یه خط توضیح بدم که چه اتفاقی افتاد. با get_option( 'default_role' ) داریم همون نقشی رو می‌خونیم که توی تنظیمات وردپرس انتخاب کردید و مستقیم می‌ریزیمش توی role. یعنی از این به بعد نقش کاربرهای ووکامرس دقیقاً همون نقش پیشفرض وردپرسه و دیگه خبری از اون دوگانگی نیست.

اگه هم دوست دارید یه نقش مشخص رو دستی تعیین کنید، کافیه به جای get_option( 'default_role' ) اسم همون نقش رو داخل کوتیشن بذارید.

قدم سوم: کد نهایی

به همین راحتی! کد کامل و آماده‌ای که باید استفاده کنید اینه:

php

add_filter( 'woocommerce_new_customer_data', 'mihanwp_new_customer_data' );

function mihanwp_new_customer_data( $new_customer_data ) {
    $new_customer_data['role'] = get_option( 'default_role' );
    return $new_customer_data;
}

نحوره قرار دادن کد در سایت

بهترین جا برای این کدها فایل توابع قالب یا همون functions.php هست. البته می‌تونید یه افزونه اختصاصی هم براش بسازید، ولی خب برای یه کد کوتاه چهار خطی واقعاً لازم نیست.

مسیر رسیدن به فایل functions.php

برید توی فایل منیجر هاستتون، بعد پوشه public_html رو باز کنید و از داخلش برید سراغ wp-content. حالا پوشه قالب سایتتون رو پیدا کنید و در نهایت فایل functions.php رو باز کنید.

فایل funtions.php در زمپ
فایل funtions.php در زمپ

یه نکته مهم درباره تگ ‎?>

اگه آخر فایل functions.php عبارت ?> وجود داره، کد رو یه خط قبلش بذارید. اگه این عبارت رو نداشت، خیلی راحت کد رو توی آخرین خط فایل اضافه کنید و فایل رو ذخیره کنید.

یه نکته‌ای که خیلی‌ها یادشون می‌ره: اگه از قالب آماده استفاده می‌کنید، حتماً کد رو توی قالب فرزند بذارید. وگرنه با اولین آپدیت قالب، همه زحمتتون پاک میشه و باید از اول شروع کنید.

انتخاب نقش کاربری دلخواه از تنظیمات وردپرس

حالا که کد سر جاش نشسته، فقط کافیه به وردپرس بگید چه نقشی مدنظرتونه.

برید به تنظیمات ← عمومی.

تنظیمات عمومی وردپرس
تنظیمات عمومی وردپرس

بعد از بخش «نقش پیش‌فرض کاربر تازه» نقش دلخواهتون رو انتخاب کنید و تغییرات رو ذخیره کنید.

تغییر نقش کاربری پیشفرض در ووکامرس
تغییر نقش کاربری پیشفرض در ووکامرس

تموم شد! از این به بعد هر کاربری که توی سایت ووکامرسیتون ثبت‌نام کنه، همون نقشی رو می‌گیره که خودتون انتخاب کردید. پیشنهاد می‌کنم یه بار هم با یه ایمیل آزمایشی ثبت‌نام کنید و توی بخش کاربران چک کنید تا خیالتون کاملاً راحت بشه.

جمع‌بندی

خلاصه کاری که کردیم این بود: فهمیدیم ووکامرس نقش کاربری خودش رو به کاربرهای جدید تحمیل می‌کنه، رفتیم سراغ کد خود ووکامرس و فیلتر woocommerce_new_customer_data رو پیدا کردیم، یه تابع کوتاه نوشتیم تا نقش پیشفرض وردپرس جاش رو بگیره و آخرش گذاشتیمش توی functions.php. همین چند خط کد، شما رو از کلی دردسر مدیریت دو نقش موازی نجات میده.

اگه جایی از کار گیر کردید یا سوالی براتون پیش اومد، توی بخش دیدگاه‌ها بنویسید تا کمکتون کنم. موفق و پیروز باشید. 🙂

نظر شما در این مورد چیه؟

  1. U360608۲۷ آبان ۱۴۰۳

    سلام وقت بخیر
    من میخوام وقتی مشتری دیدگاه میفرسته جای مالک تایید شده بنویسه “خریدار محصول” باید چیکار کنم؟

  2. U21429۲۸ آذر ۱۴۰۲

    سلام وقت بخیر
    افزونه رزرو نوبت بوکتینک رو نصب کردم و وقتی کاربر نوبت رزرو میکنه، نقشش به مشتری بوکتینک تغییر پیدا میکنه و هیچ تنظیماتی هم نداره که نقش رو تغییر نده. برای این مورد چه راهکاری پیشنهاد میکنید؟
    باتشکر

    • رضا راد۲۸ آذر ۱۴۰۲

      سلام بستگی به تنظیمات و کدهای این افزونه داره

  3. U315817۷ مرداد ۱۴۰۱

    سلام وقت بخیر من این کد رو داخل function.php قرار دادم .
    یبار همینجوری قرار دادم
    یبار داخل
    و از قسمت تنظیمات نقش کاربری رو روی مشترک قرار دادم ولی وقتی کاربر ثبت نام میکنه همین مشتری نمایش داده میشه .
    از افزونه ایتم سکیوریتی هم استفاده میکنم ممکنه از تنظیمات اون باسشه ؟
    لطفا راهنمایی کنید .
    پیشاپیش تشکر

    • رضا راد۸ مرداد ۱۴۰۱

      سلام وقت بخیر نه از اون نمیتونه باشه شاید از پلاگین دیگری هست.

پشتیبانپشتیبانپشتیبانپشتیبانپشتیبان
تیم میهن وردپرس
پشتیبانپشتیبانپشتیبانپشتیبانپشتیبان
تیم میهن وردپرسآنلاین و پاسخگوی شما هستیم.آنلاین

در حال بارگذاری...

هر سوالی دارید بپرسید.پاسخگوی شما هستیم.