پرش به محتوای اصلی
علی فاتحی

توسعه افزونه اختصاصی وردپرس

وقتی هیچ افزونه آماده‌ای دقیقاً کار شما را نمی‌کند — یا می‌کند ولی با ده برابر چیزی که لازم دارید.

چه چیزی تحویل می‌گیرید

  • افزونه اختصاصی با کد تمیز و مطابق استانداردهای کدنویسی وردپرس
  • پنل تنظیمات در پیشخوان با استفاده از Settings API
  • اندپوینت REST API در صورت نیاز به مصرف از بیرون
  • مهاجرت امن داده و روال فعال‌سازی/غیرفعال‌سازی بدون آسیب به دیتابیس
  • مستندات فنی: هوک‌ها و فیلترهای در دسترس برای توسعه بعدی
  • کد منبع کامل، بدون قفل و بدون لایسنس

روند کار

  1. ۱

    تعریف دقیق دامنه کار

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

  2. ۲

    نوشتن با هوک، نه با دستکاری هسته

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

  3. ۳

    تست و مستندسازی

    افزونه روی نسخه‌های مختلف PHP و وردپرس تست می‌شود و با یک فایل README فنی تحویل داده می‌شود.

نشانه‌هایی که افزونه اختصاصی لازم دارید

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

کد چطور نوشته می‌شود

بدون دست‌زدن به هسته، بدون تغییر مستقیم افزونه‌های دیگر، و با هوک‌هایی که خودِ افزونه هم برای توسعه بعدی در اختیار می‌گذارد:

<?php
/**
 * Plugin Name: Acme Order Router
 * Requires PHP: 8.1
 */
 
declare( strict_types = 1 );
 
add_action( 'woocommerce_checkout_create_order', 'acme_assign_warehouse', 10, 2 );
 
function acme_assign_warehouse( WC_Order $order, array $data ): void {
    $province = $order->get_shipping_state();
    $warehouse = acme_pick_warehouse( $province );
 
    // فیلتر عمومی: منطق انتخاب انبار بعداً بدون تغییر این فایل قابل بازنویسی است.
    $warehouse = apply_filters( 'acme_selected_warehouse', $warehouse, $order );
 
    $order->update_meta_data( '_acme_warehouse', $warehouse );
}

دو نکته در همین قطعه کوچک: declare(strict_types=1) چون تایپ ضعیف PHP منبع باگ‌های خاموش است، و apply_filters چون افزونه‌ای که قابل توسعه نباشد، شش ماه بعد باید بازنویسی شود.

فعال‌سازی و مهاجرت داده

بیشتر خرابی‌های جدی افزونه‌ها موقع فعال‌سازی و آپدیت اتفاق می‌افتد. هر افزونه‌ای که می‌نویسم شماره نسخه اسکیما را نگه می‌دارد و مهاجرت‌ها را پله‌به‌پله و قابل بازگشت اجرا می‌کند — نه یک dbDelta که امیدوار باشیم درست کار کند.

سؤال‌های پرتکرار

چرا افزونه آماده نخریم؟

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

کد مال من است؟

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

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

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

افزونه موجودم را می‌توانید اصلاح کنید؟

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

مطمئن نیستید کدام یکی است؟

کافی است بنویسید چه مشکلی دارید. تشخیص اینکه کار در کدام دسته می‌افتد با من.

شروع یک پروژه