ویرایش صفحه تشکر ووکامرس: چرا فیلتر بدون شرط در قالب بلوکی کد ۵۰۰ میدهد؟
- سمانه جعفری
- مطالعه در 9 دقیقه
- مهر 12, 1405
- بدون دیدگاه
-
افزونه وردپرس روولوشن اسلایدر | Slider Revolution
۶۱۰,۰۰۰ تومان
-
افزونه ضد هک امنیتی وردپرس وردفنس | Wordfence Security Premium
امتیاز 4.00 از 5۵۲۰,۰۰۰ تومان -
پکیج پلاتینیوم وردپرس برای آژانسهای دیجیتال مارکتینگ| 12 محصول + 53٪ تخفیف
۴,۶۸۰,۰۰۰ تومانقیمت اصلی ۴,۶۸۰,۰۰۰ تومان بود.۲,۴۷۹,۰۰۰ تومانقیمت فعلی ۲,۴۷۹,۰۰۰ تومان است. -
افزونه المنتور پرو اورجینال | آخرین نسخه Elementor Pro
امتیاز 4.71 از 5۵۳۰,۰۰۰ تومان
در فروشگاه آزمایشیای که برای این مقاله روی ووکامرس 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) هم در آزمایش ما فقط تاریخ سفارش را شمسی کرد.

با دو شرط، فیلتر پیام صفحه سفارش ناموفق را خراب نمیکند
پیام زیر عنوان را فیلتر 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)، مثلاً مشتری ثبتنامشدهای که وارد حسابش نشده، پس خطا به سفارش ناموفق محدود نیست. در قالب کلاسیک سفارش ناموفق سالم ماند، چون آن صفحه فیلتر پیام را برای سفارش ناموفق فراخوانی نمیکند، ولی کلید اشتباه باز هم کد ۵۰۰ داد و صفحه نیمهکاره ماند.
فیلتر عنوان هم روی همه وضعیتها اجرا میشود. وقتی عنوان را بدون شرط عوض کردیم، سفارش ناموفق هم با عنوان «خرید شما ثبت شد» بالا آمد و در قالب بلوکی متن فیلتر پیام روی سفارش لغوشده هم نشست. نسخه شرطدار هر دو فیلتر این است:
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_thankyou | woocommerce_before_thankyou |
woocommerce_order_details_before_order_table | woocommerce_thankyou_bacs |
woocommerce_order_details_after_order_table | woocommerce_order_details_before_order_table |
woocommerce_thankyou_bacs | woocommerce_order_details_after_order_table |
woocommerce_thankyou | woocommerce_thankyou |
یعنی مشخصات بانکی در قالب کلاسیک بالای جدول سفارش میآید و در قالب بلوکی پایین آن. اگر فقط یک تکه متن برای پرداخت بانکی میخواهید، این کد کافی است:
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 هم در کد افزونه ثبت شدهاند، ولی آزمایششان نکردیم. قاعدهای ساختیم که سفارش پرداخت بانکی را به برگه جدا میفرستد و پرداخت در محل را روی صفحه خود ووکامرس نگه میدارد؛ هر دو درست کار کردند.

پنل افزونه و عنوان جدول سفارش در نصب ما انگلیسی بود، با اینکه بسته فایل ترجمه فارسی دارد. در سرصفحه افزونه نوشته شده که با ووکامرس تا نسخه 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 بهجای آن «سفارشیسازی» و «ابزارکها» (گزینه «طراحی» را هم داشت که به ویرایشگر سایت میرفت). مطمئنترین راه، دادن یک سفارش آزمایشی و دیدن صفحه تشکر آن است.
- سمانه جعفری
- مطالعه در 8 دقیقه
- بدون دیدگاه
- سمانه جعفری
- 8 دقیقه
- 0
- سمانه جعفری
- مطالعه در 44 دقیقه
- بدون دیدگاه
- سمانه جعفری
- 44 دقیقه
- 0
- امین زاهد
- مطالعه در 25 دقیقه
- بدون دیدگاه
- امین زاهد
- 25 دقیقه
- 0
- امین زاهد
- مطالعه در 20 دقیقه
- بدون دیدگاه
- امین زاهد
- 20 دقیقه
- 0
- امین زاهد
- مطالعه در 17 دقیقه
- بدون دیدگاه
- امین زاهد
- 17 دقیقه
- 0
- امین زاهد
- مطالعه در 21 دقیقه
- بدون دیدگاه
- امین زاهد
- 21 دقیقه
- 0
- امین زاهد
- مطالعه در 9 دقیقه
- بدون دیدگاه
- امین زاهد
- 9 دقیقه
- 0
