ویرایش صفحه تشکر ووکامرس: چرا فیلتر بدون شرط در قالب بلوکی کد ۵۰۰ می‌دهد؟

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

در فروشگاه آزمایشی‌ای که برای این مقاله روی ووکامرس 11.1.2 و وردپرس 7.1.2 با قالب بلوکی Twenty Twenty-Five ساختیم، فیلتر پیام صفحه تشکر (Filter، یعنی کدی که متن آماده ووکامرس را عوض می‌کند) را در ساده‌ترین شکلش نوشتیم: نام مشتری را از سفارش می‌گیرد و در پیام می‌گذارد. صفحه سفارش در انتظار بررسی درست نشان داده شد. صفحه سفارش ناموفق با کد ۵۰۰ از کار افتاد و فقط این جمله را نشان داد: «یک خطای مهم در این وب سایت رخ داده است.»

صفحه سفارش ناموفق در قالب بلوکی، در دو حالت: با فیلتر بدون شرط پیام خطای مهم وردپرس و کد ۵۰۰، با فیلتر دو شرطی پیام پیش‌فرض ووکامرس و کد ۲۰۰

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

قالب شما تعیین می‌کند کدام صفحه تشکر از خرید را دارید

ووکامرس دو صفحه تشکر دارد. در قالب کلاسیک فایل thankyou.php آن را می‌سازد؛ در قالب بلوکی، تمپلیتی (Template) به نام «تاییدیه سفارش» از چند بلوک ووکامرس ساخته شده و در ویرایشگر سایت ویرایش می‌شود. ما یک سفارش را در چهار حالت باز کردیم: قالب Twenty Twenty-Five (بلوکی) و Storefront (کلاسیک)، هر کدام یک بار با صفحه پرداخت بلوکی و یک بار با کد کوتاه

.

قالبصفحه پرداختصفحه تشکر
Twenty Twenty-Five (بلوکی)بلوکیتمپلیت بلوکی «تاییدیه سفارش»
Twenty Twenty-Five (بلوکی)کد کوتاهتمپلیت بلوکی «تاییدیه سفارش»
Storefront (کلاسیک)بلوکیthankyou.php
Storefront (کلاسیک)کد کوتاهthankyou.php

در هر چهار حالت نوع قالب تعیین‌کننده بود و نوع صفحه پرداخت اثری نداشت. برای فهمیدن نوع قالب خودتان منوی «نمایش» را باز کنید. در دو قالبی که آزمودیم، Twenty Twenty-Five گزینه «ویرایشگر» داشت و Storefront به‌جای آن «سفارشی‌سازی» و «ابزارک‌ها». Storefront گزینه «طراحی» را هم داشت که به ویرایشگر سایت می‌رفت، پس این نشانه کامل نیست. مطمئن‌ترین راه این است که یک سفارش آزمایشی بدهید و صفحه تشکرش را با تصویر زیر مقایسه کنید. افزونه ووکامرس فارسی (نسخه 10.0.5) هم در آزمایش ما فقط تاریخ سفارش را شمسی کرد.

صفحه تشکر یک سفارش در قالب کلاسیک Storefront و در قالب بلوکی Twenty Twenty-Five

با دو شرط، فیلتر پیام صفحه سفارش ناموفق را خراب نمی‌کند

پیام زیر عنوان را فیلتر woocommerce_thankyou_order_received_text عوض می‌کند و در هر دو قالب کار می‌کند. عنوان دو فیلتر جدا دارد: woocommerce_thankyou_order_received_title فقط در قالب بلوکی اثر داشت (از ووکامرس 9.6 به بعد) و woocommerce_endpoint_order-received_title فقط در قالب کلاسیک.

ساده‌ترین شکل فیلتر پیام $order را سفارش فرض می‌کند. در قالب بلوکی برای سفارش ناموفق و برای آدرسی با کلید اشتباه، ووکامرس (طبق کد 11.1.2) به‌جای سفارش null می‌فرستد؛ در قالب کلاسیک وقتی سفارشی پیدا نشود false (توضیح خود ووکامرس در کد همین است: WC_Order|false). فراخوانی تابع get_billing_first_name روی این مقدار خطای PHP می‌دهد: «Call to a member function get_billing_first_name() on null» (برای false آخر پیام false است). در قالب بلوکی هم صفحه سفارش ناموفق و هم آدرس با کلید اشتباه کد ۵۰۰ دادند. ووکامرس همین null را به هر بازدیدکننده‌ای می‌دهد که اجازه دیدن سفارش را ندارد (طبق کد 11.1.2)، مثلاً مشتری ثبت‌نام‌شده‌ای که وارد حسابش نشده، پس خطا به سفارش ناموفق محدود نیست. در قالب کلاسیک سفارش ناموفق سالم ماند، چون آن صفحه فیلتر پیام را برای سفارش ناموفق فراخوانی نمی‌کند، ولی کلید اشتباه باز هم کد ۵۰۰ داد و صفحه نیمه‌کاره ماند.

فیلتر عنوان هم روی همه وضعیت‌ها اجرا می‌شود. وقتی عنوان را بدون شرط عوض کردیم، سفارش ناموفق هم با عنوان «خرید شما ثبت شد» بالا آمد و در قالب بلوکی متن فیلتر پیام روی سفارش لغوشده هم نشست. نسخه شرط‌دار هر دو فیلتر این است:

PHP
وردپرس نیاز
add_filter( 'woocommerce_thankyou_order_received_text', function ( $text, $order ) {
	if ( $order instanceof WC_Order && $order->has_status( array( 'on-hold', 'processing' ) ) ) {
		return 'ممنون از خرید شما، ' . esc_html( $order->get_billing_first_name() ) . '.';
	}
	return $text;
}, 10, 2 );

add_filter( 'woocommerce_thankyou_order_received_title', function ( $title, $order ) {
	if ( $order instanceof WC_Order && $order->has_status( array( 'on-hold', 'processing' ) ) ) {
		return 'خرید شما ثبت شد';
	}
	return $title;
}, 10, 2 );

شرط اول نبودن سفارش را بررسی می‌کند و شرط دوم فقط وضعیت‌هایی را عوض می‌کند که «ثبت شد» درباره‌شان راست است: در انتظار بررسی (on-hold) و در حال انجام. ما کد را روی شش حالت و در هر دو قالب اجرا کردیم. این دو وضعیت، یعنی در انتظار بررسی و در حال انجام، متن تازه گرفتند؛ در انتظار پرداخت، ناموفق، لغو شده و آدرس با کلید اشتباه همگی کد ۲۰۰ دادند و متن پیش‌فرض ماندند. در قالب کلاسیک فقط فیلتر متن اثر کرد. سفارش در انتظار پرداخت هم با عنوان «سفارش دریافت شد» و متن پیش‌فرض ووکامرس نشان داده می‌شود، پس در پیام خودتان چیزی مثل «پرداخت تأیید شد» ننویسید.

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

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

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

برای گذاشتن متن یا یک بخش دلخواه سه هوک (Hook) دارید. هوک نقطه‌ای در کد ووکامرس است که کد شما می‌تواند به آن وصل شود. این سه: woocommerce_before_thankyou بالای صفحه، woocommerce_thankyou_bacs (یا نام روش پرداخت دیگر، مثل cod) و woocommerce_thankyou پایین. ووکامرس بخش «مشخصات بانکی ما» را روی هوک woocommerce_thankyou_bacs چاپ می‌کند. محتوایش هر حسابی است که در تنظیمات پرداخت بانکی (کارت‌به‌کارت) وارد کرده‌اید؛ در آزمایش ما شماره کارت و شبا بود. ترتیب اجرا، همراه با دو هوک کنار جدول سفارش، برای شنونده‌هایی (کدی که به هوک وصل می‌شود) با اولویت پیش‌فرض (عدد ۱۰؛ عدد کمتر زودتر اجرا می‌شود) در دو قالب یکی نیست:

قالب بلوکیقالب کلاسیک
woocommerce_before_thankyouwoocommerce_before_thankyou
woocommerce_order_details_before_order_tablewoocommerce_thankyou_bacs
woocommerce_order_details_after_order_tablewoocommerce_order_details_before_order_table
woocommerce_thankyou_bacswoocommerce_order_details_after_order_table
woocommerce_thankyouwoocommerce_thankyou

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

PHP
وردپرس نیاز
add_action( 'woocommerce_thankyou_bacs', function ( $order_id ) {
	$order = wc_get_order( $order_id );
	if ( $order && $order->has_status( array( 'on-hold', 'processing' ) ) ) {
		echo '<p>رسید واریز را برای ما بفرستید.</p>';
	}
} );

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

در تمپلیت پیش‌فرض قالب بلوکی هوک‌های woocommerce_thankyou_bacs و woocommerce_thankyou را فقط یک بلوک اجرا می‌کند: «اطلاعات اضافی»، آخرین بلوک تمپلیت (طبق کد ووکامرس 11.1.2). ما همین بلوک را از تمپلیت ذخیره‌شده برداشتیم. برای سفارش پرداخت بانکی هر دو هوک اجرا نشدند و بخش مشخصات بانکی از صفحه رفت.

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

ویرایشگر سایت: فهرست بلوک‌های تمپلیت تاییدیه سفارش و توضیح بلوک اطلاعات اضافی

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

اگر آموزشی می‌گوید thankyou.php را ویرایش کنید، این برای قالب کلاسیک درست است، به شرط اینکه فایل را در خود افزونه ووکامرس ویرایش نکنید: مستندات ووکامرس درباره بازنویسی فایل‌ها در قالب می‌گوید تغییر در افزونه با به‌روزرسانی از بین می‌رود و راه درست، کپی فایل در پوشه woocommerce/checkout/ قالب فرزند است. ما این را در دو قالب فرزند آزمودیم: در Storefront فایل ما بارگذاری شد و در Twenty Twenty-Five نادیده گرفته شد.

برای قالب بلوکی، مستندات سفارشی‌سازی تاییدیه سفارش راه دیگری دارد: بلوک‌های تمپلیت «تاییدیه سفارش» را پاک کنید و به‌جایشان بلوک جای‌نگهدار تمپلیت قدیمی را بگذارید. ما همین کار را در Twenty Twenty-Five کردیم. فایل thankyou.php قالب فرزند بارگذاری شد و هر سه شنونده هم اجرا شدند. هزینه‌اش این است که دیگر بلوک‌های تمپلیت را در ویرایشگر نمی‌بینید.

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

ریدایرکت ساده، یعنی بررسی صفحه تشکر با is_wc_endpoint_url روی هوک template_redirect و بعد wp_safe_redirect و exit، خریدار را به برگه شما می‌برد و در آزمایش ما هیچ هوک تشکری اجرا نشد. افزونه YITH Custom Thank You Page را فروشگاه ما می‌فروشد و راه دیگری می‌رود. طبق کد نسخه 3.30.0 از داخل خود woocommerce_thankyou و با اولویت پیش‌فرض خریدار را به برگه مقصد می‌فرستد و بعد اجرای صفحه را متوقف می‌کند. اثرش را با همان سه شنونده آزمایشی (اولویت ۵، ۱۰ و ۲۰) و یک شنونده wp_footer که با is_order_received_page فعال می‌شود دیدیم. برای اولویت ۱۰ آزمایش جدایی هم کردیم: شنونده‌ای که پیش از افزونه ثبت شده بود اجرا شد و شنونده‌ای که بعد از افزونه ثبت شد اجرا نشد. نتیجه در هر دو قالب یکی بود:

شنوندهافزونه خاموشافزونه روشن
سه شنونده روی woocommerce_thankyouخروجی هر سه به مرورگر رسیدهیچ‌کدام نرسید: اولویت ۵ پیش از ریدایرکت اجرا شد و خروجی‌اش دور ریخته شد؛ اولویت ۲۰ اجرا نشد؛ اولویت ۱۰ بسته به ترتیب ثبت اجرا شد یا نشد (آزمایش جدا، بالا)
شنونده wp_footer با is_order_received_pageرسیدرسید (افزونه این تابع را در صفحه خودش درست برمی‌گرداند)

شنونده‌ها را خودمان نوشتیم و افزونه ردیابی واقعی نصب نکردیم. بعد از روشن کردن هر افزونه تشکر یک سفارش آزمایشی بدهید و ببینید رویداد خرید در ابزار ردیابی‌تان ثبت می‌شود.

در صفحه‌ای که برای سفارش‌های پرداخت بانکی ساختیم شماره کارت و شبا نبود. وقتی فقط کد کوتاه [yith_orderreview_header] افزونه را روی برگه گذاشتیم، مشخصات بانکی برگشت.

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

فهرست قاعده‌های افزونه Yith Custom Thank You Page: سفارش پرداخت بانکی (کارت‌به‌کارت) به یک برگه و پرداخت در محل به صفحه خود ووکامرس

پنل افزونه و عنوان جدول سفارش در نصب ما انگلیسی بود، با اینکه بسته فایل ترجمه فارسی دارد. در سرصفحه افزونه نوشته شده که با ووکامرس تا نسخه 10.8 آزمایش شده است، و ما آن را روی 11.1.2 اجرا کردیم.

پرسش‌های متداول

صفحه تشکر ووکامرس را بدون افزونه چطور ویرایش کنم؟

بسته به قالب. در قالب بلوکی تمپلیت «تاییدیه سفارش» را در ویرایشگر سایت ویرایش کنید و برای متن از فیلتر woocommerce_thankyou_order_received_text استفاده کنید. در قالب کلاسیک فایل thankyou.php را در پوشه woocommerce/checkout/ قالب فرزند بگذارید. فیلتر پیام و فیلتر عنوان قالب بلوکی را با بررسی اینکه $order یک WC_Order است بنویسید.

چرا بعد از افزودن کد پیام تشکر، صفحه سفارش ناموفق خطای مهم نشان می‌دهد؟

در قالب بلوکی ووکامرس برای سفارش ناموفق به فیلتر پیام به‌جای سفارش مقدار null می‌دهد و کدی که از سفارش نام مشتری می‌خواهد خطای PHP می‌دهد. شرط $order instanceof WC_Order قبل از استفاده از سفارش مشکل را برطرف می‌کند.

چرا شماره کارت و شبا از صفحه تشکر ناپدید شد؟

در تمپلیت پیش‌فرض قالب بلوکی هوک‌های woocommerce_thankyou_bacs و woocommerce_thankyou را فقط بلوک «اطلاعات اضافی» اجرا می‌کند. اگر آن را از تمپلیت «تاییدیه سفارش» پاک کرده باشید، مشخصات بانکی هم روی صفحه نمی‌آید.

با ریدایرکت به صفحه دلخواه، کد ردیابی خرید اجرا می‌شود؟

بستگی دارد کد به چه چیزی وصل است. در آزمایش ما با ریدایرکت ساده روی template_redirect هیچ هوک تشکری اجرا نشد. بعد از ریدایرکت افزونه YITH Custom Thank You Page هم خروجی شنونده‌های آزمایشی روی هوک woocommerce_thankyou به صفحه خریدار نرسید، ولی شنونده‌ای که در wp_footer با is_order_received_page فعال می‌شد رسید. افزونه ردیابی واقعی را آزمایش نکردیم.

از کجا بفهمم قالبم بلوکی است یا کلاسیک؟

در دو قالبی که آزمودیم، Twenty Twenty-Five زیر «نمایش» گزینه «ویرایشگر» داشت و Storefront به‌جای آن «سفارشی‌سازی» و «ابزارک‌ها» (گزینه «طراحی» را هم داشت که به ویرایشگر سایت می‌رفت). مطمئن‌ترین راه، دادن یک سفارش آزمایشی و دیدن صفحه تشکر آن است.

تصویر سمانه جعفری
سمانه جعفری
پیشنهاد میکنیم این مقالات را هم بخوانید

دیدگاه یا پرسش خود را بنویسید