مطالعه موردی مهندسی
ریکاور MU-Plugin
دو چیز داشت درآمد را نشت میداد: سبدهایی که قبل از پرداخت رها میشدند، و سفارشهایی که به درگاه میرسیدند و متوقف میماندند. این افزونه هر دو را مدیریت میکند و در همین مسیر رفتاری از ووکامرس را اصلاح میکند که سفارشهای پرداختنشده را بینهایت در وضعیت pending نگه میداشت.
مسئله تجاری
افزونههای بازیابی موجود میخواستند مالک رکورد مشتری شوند، ردیابی خودشان را اضافه کنند و روی زمانبندیهایی بفرستند که به شیوهی واقعی کار این فروشگاه بیاعتناست. نیمهی سفارش پرداختنشده مسئلهی جدایی بود: لغو خودکار سفارشهای پرداختنشدهی خود ووکامرس اینجا قابلاتکا اجرا نمیشد، پس سفارشهای pending انباشته میشدند و هم گزارشگیری و هم وضعیت موجودی منحرف میشد.
آنچه تحویل دادم
- a2-recover-sms-mu.php، یک افزونهی MU هزارودویستونودوپنجخطی که پیامهای بازیابی را از طریق Action Scheduler در گروه اختصاصی خودش زمانبندی میکند نه روی wp-cron.
- ماشههای بازیابی در چهار نقطهی متمایز: پردازش سفارش در پرداخت، ورود سفارش به pending، ورود به on-hold، و افزودن به سبد یا مشاهدهی پرداخت برای سبدهایی که هیچوقت سفارش نشدند.
- یک مسیر اجرای pending به failed با مهلت ۳۱ دقیقه، که عمداً کمی بعد از پنجرهی خود درگاه است.
- یک جاروی پنجدقیقهای با قفل، بهعلاوهی یک دیدبان روی wp_loaded، تا انتقال روی سایتی که رویدادهای زمانبندیشدهاش قابلاتکا نیست هم اتفاق بیفتد.
- رهگیری لغو سفارش پرداختنشدهی خود ووکامرس، تا این دو سازوکار نتوانند روی یک سفارش همزمان عمل کنند.
- لینکهای کوتاه که به مقصدهای مشخص دسته یا کارت هدیه resolve میشوند، تا یک پیام بازیابی بتواند به چیزی مفیدتر از سبد اشاره کند.
- اعمال کوپن از یک کوکی در سه هوک جداگانهی سبد و پرداخت، تا مشوقی که به یک پیام بازیابی وصل است مسیر بازگشت مشتری را دوام بیاورد.
رویکرد فنی
- Action Scheduler بهجای wp-cron و در یک گروه اختصاصی، چون پیامهای بازیابی نباید وقتی یک اجرای کرون از دست میرود حذف شوند و باید وقتی مشتری میپرسد چرا این پیام را گرفتم قابل بازرسی باشند.
- مهلت ۳۱ دقیقه عمداً یک دقیقه بعد از پنجرهی درگاه است، تا افزونه هیچوقت سر یک سفارش با ارائهدهندهی پرداخت مسابقه ندهد.
- جارو قبل از اجرا قفل میگیرد، چون دو جاروی همپوشان روی یک سایت کند همانطوری است که یک مشتری یک پیام را دوبار دریافت میکند.
- دیدبان wp_loaded وجود دارد چون روی فروشگاهی پشت کش تهاجمی نمیشود به رویدادهای زمانبندیشده تکیه کرد؛ جارو مسیر اصلی است و دیدبان پشتیبان.
- نام قالب پیامک و کلید API از ثابتهایی خوانده میشوند که جای دیگری تعریف شدهاند، پس هیچ اعتبارنامهای در این فایل نیست.
نتیجه و شواهد
پیامرسانی بازیابی روی فروشگاه اجرا میشود، و سفارشهای pending حالا طبق یک زمانبندی قابلپیشبینی به failed منتقل میشوند بهجای اینکه انباشته شوند. رقم مجزای درآمد بازیابیشده ندارم، چون کوپن و پیام با هم زنده شدند و صادقانه نمیتوانم جدایشان کنم؛ نتیجهی عملیاتی که میتوانم بگویم این است که انباشت pending متوقف شد.
اهمیت برای کارفرما
هر دو نیمه در عملیات عادی خودشان را پس میدهند: سبدهای بازیابیشده از یک طرف، و وضعیت دقیق سفارش از طرف دیگر که سطح موجودی و گزارشگیری روزانه به آن وابستهاند.
خلاصه اجرایی خوانا
خلاصه_اجرایی {
پروژه: "Recover MU Plugin"
فایل: "mu-plugins/a2-recover-sms-mu.php (۱۲۹۵ خط، v0.2.0)"
صف: "Action Scheduler، گروه اختصاصی، نه wp-cron"
ماشهها: "پردازش پرداخت، سفارش pending، سفارش on-hold،
افزودن به سبد، مشاهدهی پرداخت"
قانون_pending: "pending ← failed پس از ۳۱ دقیقه
(یک دقیقه بعد از پنجرهی درگاه)"
اتکاپذیری: "جاروی قفلدار ۵دقیقهای + دیدبان wp_loaded"
تعارض: "لغو سفارش پرداختنشدهی ووکامرس رهگیری میشود"
مسیر_بازگشت: "لینک کوتاه به دسته/کارت هدیه،
کوپن از کوکی در ۳ هوک بازیابی میشود"
رازها: "کلید API و قالب از ثابتهای بیرونی خوانده میشوند"
}ارزش حرفهای این پروژه
چیزی که در بازبینی از آن دفاع میکنم انتخاب مهلت و قفل است. پیامرسانی بازیابی سیستمی است که حالت شکستش یعنی دوبار پیامدادن به یک مشتری واقعی، یا پیامدادن به کسی که قبلاً پرداخت کرده.
ساختن دیدبان بهعنوان پشتیبان جارو نه بهعنوان مسیر اصلی، از همان غریزه میآید: سازوکار اولیه باید درست باشد و پشتیبان فقط وقتی محیط بدرفتاری میکند اهمیت پیدا کند.