SHET30
English

شرطی کردن درگاه پرداخت ووکامرس با چند روش کاربردی

شرطی کردن درگاه پرداخت ووکامرس با چند روش کاربردی

فرض کنید یک فروشگاه اینترنتی دو زبانه، مثلاً فارسی و انگلیسی، دارید و محصولاتتون رو به دو زبان ارائه می‌کنید. حالا می‌خواید کاربران داخل ایران درگاه پرداخت ریالی مثل زرین‌پال، ملت یا سامان رو ببینن و کاربران کشورهای دیگه به درگاه بین‌المللی مثل PayPal یا Stripe دسترسی داشته باشن.

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

در این مقاله یاد می‌گیرید چطور درگاه‌های پرداخت ووکامرس رو بر اساس شرایط مختلف فیلتر کنید. این شرایط می‌تونه زبان سایت در WPML یا Polylang، مبلغ سبد خرید، نوع محصول یا وارد بودن کاربر باشه. کدهای این آموزش فقط فهرست درگاه‌های قابل‌نمایش رو تغییر می‌دن؛ پس پشتیبانی درگاه از ارز، کشور مشتری و اعتبارسنجی نهایی پرداخت همچنان باید داخل افزونه درگاه بررسی بشه. اگه با مفاهیم پایه ووکامرس آشنا نیستید، می‌تونید از بخش «آموزش ووکامرس» شروع کنید.

آنچه در این مقاله می‌خوانید

چرا باید درگاه پرداخت رو شرطی کنیم؟

ممکنه محصولات دیجیتالی مثل قالب WordPress، افزونه یا کتاب الکترونیکی بفروشید و مشتری‌هایی از چند کشور داشته باشید. در این شرایط، نمایش یک درگاه ریالی به مشتری خارجی می‌تونه اون رو سردرگم کنه و جلوی تکمیل خرید رو بگیره. از طرف دیگه، ایران در فهرست رسمی کشورهای تحت پوشش PayPal نیست؛ بنابراین ساخت و استفاده رسمی از حساب PayPal برای ساکنان ایران پشتیبانی نمی‌شه.

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

آشنایی با هوک woocommerce_available_payment_gateways

برای این کار از woocommerce_available_payment_gateways استفاده می‌کنیم. هوک فیلتر یعنی نقطه‌ای که WooCommerce داده رو در اختیار کد شما می‌ذاره تا قبل از استفاده تغییرش بدید. این فیلتر اجازه می‌ده بعضی از درگاه‌های فعال رو با توجه به شرایط سفارش از فهرست درگاه‌های قابل‌استفاده حذف کنید.

این فیلتر برای ساخت یا ثبت یک درگاه تازه نیست. اگه می‌خواید درگاه پرداخت جدیدی بسازید، باید از فیلتر woocommerce_payment_gateways و یک کلاس مبتنی بر WC_Payment_Gateway استفاده کنید. مقدارهای آرایه $available_gateways هم نمونه‌های درگاه هستن، نه فقط نام‌های متنی ساده.

افزودن کدهای شرطی به‌صورت گام‌به‌گام

گام اول: استفاده از Code Snippets یا افزونه اختصاصی

برای اضافه کردن کد، بهتره از یک افزونه مخصوص نگهداری قطعه‌کد مثل Code Snippets یا یک افزونه اختصاصی ساده استفاده کنید. این روش به قالب وابسته نیست و با تغییر یا به‌روزرسانی قالب، کد شما از بین نمی‌ره. قبل از فعال کردن هر قطعه‌کد هم از سایت نسخه پشتیبان بگیرید و اون رو اول در محیط آزمایشی بررسی کنید؛ چون یک خطای PHP ممکنه سایت رو از دسترس خارج کنه.

functions.php
functions.php

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

گام دوم: افزودن هوک پایه

فرقی نمی‌کنه از Code Snippets، افزونه اختصاصی یا functions.phpقالب فرزند استفاده می‌کنید. اول باید فیلتر اصلی رو اضافه کنید تا WooCommerce تابع سفارشی شما رو برای بررسی درگاه‌های قابل‌استفاده اجرا کنه:

add_filter( 'woocommerce_available_payment_gateways', 'mihanwp_conditional_gateway' );

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

ایجاد و فراخوانی تابع
ایجاد و فراخوانی تابع

گام سوم: ایجاد تابع شرطی و پیدا کردن شناسه درگاه

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

function mihanwp_conditional_gateway( $available_gateways ) {
    // شرط‌های ما اینجا قرار می‌گیرند
    return $available_gateways;
}

متغیر $available_gateways یک آرایه از نمونه‌های درگاه پرداخت در دسترس هست. کلید هر عضو، شناسه همون درگاهه. شناسه‌هایی مثل mellat، zarinpal، paypal، stripe و installment فقط نمونه هستن و ممکنه افزونه درگاه شما شناسه متفاوتی داشته باشه. پس قبل از استفاده از کد، شناسه واقعی رو از مستندات افزونه درگاه پیدا کنید.

برای پیدا کردن شناسه، از print_r() داخل صفحه پرداخت استفاده نکنید؛ چون خروجی مستقیم ممکنه ظاهر صفحه، درخواست‌های AJAX یا Store API رو خراب کنه. Store API همون رابطی هست که بلوک‌های جدید سبد خرید و پرداخت برای جابه‌جایی داده‌ها استفاده می‌کنن. اگه مستندات افزونه شناسه رو نگفته، در یک محیط آزمایشی و با فعال بودن گزارش خطا می‌تونید کلیدهای آرایه رو موقتاً داخل لاگ ثبت کنید:

if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
    error_log( 'Payment gateway IDs: ' . implode( ', ', array_keys( $available_gateways ) ) );
}

بعد از پیدا کردن شناسه‌ها، این کد عیب‌یابی رو حذف کنید و فایل لاگ رو عمومی نکنید.

مثال عملی: غیرفعال کردن درگاه پرداخت برای مهمان‌ها

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

if ( isset( $available_gateways['mellat'] ) && ! is_user_logged_in() ) {
    unset( $available_gateways['mellat'] );
}

کد اول با isset() بررسی می‌کنه که درگاه داخل آرایه هست یا نه. بعد is_user_logged_in() وضعیت ورود کاربر رو بررسی می‌کنه. علامت ! یعنی «نیست»؛ پس اگه کاربر وارد نشده باشه، unset() درگاه رو از فهرست قابل‌نمایش حذف می‌کنه.

شرطی کردن درگاه بر اساس زبان با WPML

اگه سایت چندزبانه شما از WPML استفاده می‌کنه، برای دریافت زبان فعلی بهتره از فیلتر wpml_current_language استفاده کنید. روش قدیمی مبتنی بر ثابت ICL_LANGUAGE_CODE برای کدهای تازه پیشنهاد نمی‌شه. نمونه زیر درگاه‌های ریالی رو در زبان انگلیسی و درگاه‌های بین‌المللی رو در زبان فارسی حذف می‌کنه:

$current_lang = apply_filters( 'wpml_current_language', null );

if ( 'en' === $current_lang ) {
    unset( $available_gateways['mellat'] );
    unset( $available_gateways['zarinpal'] );
}

if ( 'fa' === $current_lang ) {
    unset( $available_gateways['paypal'] );
    unset( $available_gateways['stripe'] );
}

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

شرطی کردن درگاه بر اساس زبان با Polylang

اگه از افزونه رایگان Polylang استفاده می‌کنید، تابع pll_current_language() کد زبان فعلی رو برمی‌گردونه. قبل از اجرای تابع، با function_exists() بررسی می‌کنیم که Polylang فعال باشه:

if ( function_exists( 'pll_current_language' ) ) {
    $current_lang = pll_current_language();

    if ( 'en' === $current_lang ) {
        unset( $available_gateways['mellat'] );
        unset( $available_gateways['zarinpal'] );
    }

    if ( 'fa' === $current_lang ) {
        unset( $available_gateways['paypal'] );
        unset( $available_gateways['stripe'] );
    }
}

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

شرطی کردن درگاه بر اساس مبلغ سبد خرید

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

if ( WC()->cart ) {
    $cart_contents_total = (float) WC()->cart->get_cart_contents_total();
    $minimum_amount      = 2000000;

    if ( $cart_contents_total < $minimum_amount ) {
        unset( $available_gateways['installment'] );
    }
}

عدد 2000000 بر اساس واحد پول تنظیم‌شده در WooCommerce تفسیر می‌شه. این عدد به‌خودی‌خود به معنی دو میلیون تومان نیست؛ ممکنه واحد فروشگاه شما ریال، تومان، دلار یا ارز دیگه‌ای باشه. شناسه installment هم فقط مثاله و باید شناسه واقعی درگاه اقساطی رو جایگزینش کنید.

بررسی کد در پرداخت کلاسیک و پرداخت بلوکی

WooCommerce دو نوع صفحه پرداخت رایج داره: پرداخت کلاسیک که با شورت‌کد ساخته می‌شه و Checkout بلوکی که از بلوک‌های جدید سبد خرید و پرداخت استفاده می‌کنه. فیلتر woocommerce_available_payment_gateways در Store API هم برای تعیین درگاه‌های قابل‌استفاده در نظر گرفته می‌شه، ولی این موضوع به‌تنهایی سازگاری کامل افزونه درگاه با Checkout بلوکی رو تضمین نمی‌کنه.

قبل از انتشار تغییرات، خرید آزمایشی رو در همون نوع صفحه پرداختی انجام بدید که فروشگاه شما استفاده می‌کنه. اگه هر دو نوع Checkout روی سایت دارید، هر دو رو جداگانه آزمایش کنید. همین‌طور مطمئن بشید افزونه درگاه شما رسماً از Checkout بلوکی پشتیبانی می‌کنه.

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

آیا برای شرطی کردن درگاه پرداخت ووکامرس به افزونه نیاز داریم؟

نه، می‌تونید این کار رو با فیلتر woocommerce_available_payment_gateways و یک قطعه‌کد انجام بدید. برای نگهداری امن‌تر کد بهتره از Code Snippets، یک افزونه اختصاصی ساده یا فایل functions.php قالب فرزند استفاده کنید.

شناسه واقعی درگاه پرداخت رو از کجا پیدا کنیم؟

اول مستندات افزونه درگاه رو بررسی کنید. اگه شناسه اونجا نوشته نشده، می‌تونید در محیط آزمایشی کلیدهای آرایه $available_gateways رو موقتاً داخل لاگ ثبت کنید. شناسه‌هایی مثل mellat و zarinpal در این آموزش فقط مثال هستن.

آیا زبان سایت برای انتخاب درگاه پرداخت کافی هست؟

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

می‌شه درگاه پرداخت رو بر اساس مبلغ سبد خرید نمایش داد؟

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

این روش در پرداخت بلوکی WooCommerce هم کار می‌کنه؟

فیلتر درگاه‌های قابل‌استفاده در Store API هم در نظر گرفته می‌شه، ولی این موضوع سازگاری کامل افزونه درگاه با Checkout بلوکی رو تضمین نمی‌کنه. بهتره کد و افزونه درگاه رو در پرداخت کلاسیک و بلوکی جداگانه آزمایش کنید.

مخفی کردن درگاه برای جلوگیری از پرداخت اشتباه کافی هست؟

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

جمع‌بندی و کد نهایی

می‌تونید چند شرط رو با هم ترکیب کنید. نمونه زیر درگاه ملت رو برای مهمان‌ها و نسخه انگلیسی سایت مخفی می‌کنه و درگاه PayPal رو در نسخه فارسی نمایش نمی‌ده. شناسه‌های این نمونه رو حتماً با شناسه واقعی درگاه‌های سایت خودتون جایگزین کنید:

add_filter( 'woocommerce_available_payment_gateways', 'mihanwp_conditional_gateway' );

function mihanwp_conditional_gateway( $available_gateways ) {
    $current_lang = apply_filters( 'wpml_current_language', null );

    if ( isset( $available_gateways['mellat'] ) ) {
        if ( ! is_user_logged_in() ) {
            unset( $available_gateways['mellat'] );
        }

        if ( 'en' === $current_lang ) {
            unset( $available_gateways['mellat'] );
        }
    }

    if (
        isset( $available_gateways['paypal'] ) &&
        'fa' === $current_lang
    ) {
        unset( $available_gateways['paypal'] );
    }

    return $available_gateways;
}

این کد فقط نمایش درگاه‌ها رو فیلتر می‌کنه و جای تنظیمات امنیتی یا محدودیت‌های خود افزونه درگاه رو نمی‌گیره. بعد از هر تغییر، سناریوهای مهم مثل کاربر مهمان، کاربر واردشده، زبان‌های مختلف، مبلغ‌های کمتر و بیشتر از حد تعیین‌شده و هر دو نوع Checkout رو در محیط آزمایشی بررسی کنید. اگه مشکلی دیدید، کد رو غیرفعال کنید و گزارش خطای WooCommerce یا WordPress رو بررسی کنید.

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

  1. U339946۵ خرداد ۱۴۰۵

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

  2. U337903۲۷ خرداد ۱۴۰۳

    سلام چجوری میتونیم از این کد ها برای شرطی کردن روی دسته خاصی از محصولات یک درگاه رو غیر فعال کنیم مثلا روی سایت دسته بندی A و B داریم میخوایم یک درگاه روی دسته های B نشون داده نشه یا روی دسته های A نشون داده بشه….

  3. U338991۲۹ بهمن ۱۴۰۲

    سلام … سوالی داشتم
    من به یه مشکل عجیب برای درگاه پرداخت برخوردم … درگاه پرداخت سایتمون سداده … الان مشكلي كه پيش آمده اينه كه بعد از پرداخت در درگاه بانكي در مرورگر سافاري، موقع بازگشت به سايت سريعا صفحه رو نميشناسه و ارور نشون ميده ( safari can’t open this page ) وفقط هم تو مرورگر سافاری ( در ورژنهای مختلفش) این مشکل وجود داره و الان نمیدونم واقعا باید چیکارش کنم؟ … حتی به پشتیبانی سرور و سداد هم پیام دادم ولی مشکل حل نشد … شما راه حلی سراغ دارید؟

  4. U328388۸ شهریور ۱۴۰۲

    با سلام و احترام .ابتداعا بهت بگم قالب اهوارایی که ساختی عالیه برادرم. دوما مشکل من اینه که نوشته ها را هر چی میخونم بازم نمیفهمم فقط ویدیوها برای من خوبن. چرا این مبحث آموزشت فایل ویدیویی نذاشتی ؟ کاش میزاشتی و من راحت بودم!!!!!! این صحبت کد ک میکنی من گیج میشم حتما باید از رو ویدیو ببینم و انجام بدم.

    • رضا راد۱۱ شهریور ۱۴۰۲

      درود بر شما سپاس. مقالاتی که بازدید بالا دارن براشون ویدیو میسازیم. این مدل مقالات رو فقط متن مینویسیم.

  5. U320048۱۲ اردیبهشت ۱۴۰۲

    درود بر شما تیم حرفه ایی
    یک سوال داشتم ممنون میشم کمک کنید
    من افزونه WooCommerce Autocomplete Orders برای تایید خودکار سفارشات ووکامرس
    اما قسمت تنظیمات فقط یک گزینه روشنه و بقیه فیلد ها خاموشن
    اون گزینه رو تغییر هم میدم باز بفیه فیلد ها خاموشن
    باید چیکار کنم
    لینک اسکرین شات فرستادم

    • رضا راد۱۲ اردیبهشت ۱۴۰۲

      سلام ظاهرا یا لایسنس افزونه فعال نیست یا باید فیلد اول رو تغییر بدید به حالتی که بقیه فیلدها روشن بشه

  6. U320048۲۰ فروردین ۱۴۰۲

    سلام خسته نباشید
    کاربر من وقتی تا مرحله پرداخت محصول میره(قسمت درگاه پرداخت که شماره کارت رو باید وارد کنه)
    برای من ایمیل میاد که سفارش دریافت شده
    قسمت روش پرداخت هم میزنه پرداخت با زرین پال
    این طبیعیه؟؟!!

    • رضا راد۲۰ فروردین ۱۴۰۲

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

      • U320048۲۲ فروردین ۱۴۰۲

        سلام مجدد
        ممنون میشم بگید از کدوم بخش تنظیمات

        • رضا راد۲۲ فروردین ۱۴۰۲

          توی بخش تنظیمات ووکامرس > ایمیل های ارسالی

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

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

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