ساخت افزونه ووکامرس - ساخت Add-on برای WooCommerce

ساخت Add-on برای WooCommerce

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

Picture of هانیه مجللی
هانیه مجللی

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

راهکار حرفه‌ای، ساخت یک Add-on مستقل و سبک برای WooCommerce است؛ افزونه‌ای که فقط یک مسئله مشخص را حل کند و با ساختار استاندارد وردپرس، امنیت مناسب و قابلیت توسعه نوشته شود. در این مقاله مسیر ساخت افزونه ووکامرس را از ایده‌پردازی تا توسعه، تست، انتشار و نگهداری بررسی می‌کنیم. همچنین می‌بینید چه زمانی باید از هوک‌ها استفاده کنید، چه تفاوتی میان افزونه اختصاصی و افزونه عمومی وجود دارد و چطور می‌توان Add-on را بدون آسیب به فروشگاه در حال فعالیت توسعه داد.

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

ساخت افزونه ووکامرس؛ مسیر استاندارد از ایده تا اجرا

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

فهرست مطالب

Add-on ووکامرس چیست و چه کاربردی دارد؟

Add-on یا افزونه تکمیلی، نرم‌افزاری است که روی هسته WooCommerce نصب می‌شود و قابلیت جدیدی به آن اضافه می‌کند؛ بدون اینکه فایل‌های اصلی ووکامرس تغییر کنند. برای نمونه، یک Add-on می‌تواند سیستم قیمت‌گذاری پلکانی، اتصال به نرم‌افزار حسابداری، فیلتر محصولات بر اساس موجودی انبار یا فرم سفارشی در صفحه تسویه‌حساب ایجاد کند.

تفاوت Add-on با ویرایش مستقیم فایل‌های ووکامرس بسیار مهم است. هر تغییری که در فایل‌های اصلی انجام شود، با آپدیت بعدی از بین می‌رود و احتمال ایجاد خطا را افزایش می‌دهد. در مقابل، افزونه مستقل با استفاده از اکشن‌ها، فیلترها و APIهای رسمی توسعه داده می‌شود و مدیریت نسخه، غیرفعال‌سازی و بروزرسانی آن ساده‌تر است.

قاعده‌ای که در پروژه‌های فروشگاهی همیشه کاربرد دارد این است: «کد سفارشی را از هسته جدا نگه دارید تا فروشگاه قابل کنترل و قابل بازگشت باقی بماند.»

چه زمانی Add-on انتخاب مناسبی است؟

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

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

نیازسنجی پیش از ساخت افزونه ووکامرس

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

پرسش‌های کلیدی برای تحلیل پروژه

    • کاربر نهایی افزونه مدیر فروشگاه است یا مشتری؟
    • افزونه به کدام بخش ووکامرس دسترسی نیاز دارد؟ محصولات، سفارش‌ها، مشتریان یا پرداخت؟
    • اطلاعات جدید در کجا ذخیره می‌شود و چه مدت باید نگهداری شود؟
    • در صورت غیرفعال‌شدن افزونه، چه اتفاقی برای داده‌ها رخ می‌دهد؟
    • آیا قابلیت جدید باید با HPOS، محصولات متغیر و سفارش مهمان سازگار باشد؟
    • آیا اتصال به API خارجی نیازمند کلید دسترسی، صف پردازش یا ثبت لاگ است؟

یک تجربه عملی در این مرحله بسیار مهم است: در یکی از پروژه‌های فروشگاهی، کارفرما فقط «فیلد کد ملی» را درخواست کرده بود. در بررسی دقیق مشخص شد که کد ملی باید در صفحه مدیریت سفارش، ایمیل مدیر، فاکتور PDF و سرویس ارسال نیز قابل استفاده باشد. اگر این نیازها از ابتدا دیده نمی‌شد، افزونه چند بار بازنویسی می‌شد و هزینه توسعه بالا می‌رفت.

تفاوت افزونه اختصاصی و افزونه عمومی

ویژگیافزونه اختصاصیافزونه عمومی
مخاطبیک کسب‌وکار یا گروه مشخصتعداد زیادی از فروشگاه‌ها
تنظیماتمحدود و متناسب با فرایند داخلیگسترده و قابل پیکربندی
هزینه اولیهمعمولاً بیشترکمتر یا مبتنی بر اشتراک
کنترل روی کدبسیار بالاوابسته به سازنده افزونه
مسئولیت بروزرسانیبر عهده تیم توسعه پروژهبر عهده توسعه‌دهنده محصول

معماری و ساختار فایل‌های افزونه

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

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

my-woocommerce-addon/

├── my-woocommerce-addon.php

├── includes/

│ ├── class-admin.php

│ ├── class-checkout.php

│ └── class-order-data.php

├── assets/

│ ├── css/

│ └── js/

├── languages/

├── templates/

└── readme.txt

فایل اصلی افزونه

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

<?php

/**

* Plugin Name: My WooCommerce Add-on

* Description: قابلیت اختصاصی برای فروشگاه ووکامرسی

* Version: 1.0.0

*/

defined( 'ABSPATH' ) || exit;

if ( ! class_exists( 'WooCommerce' ) ) {

return;

}

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

نقش طراحی پلاگین در موفقیت پروژه

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

هوک‌ها و APIهای مهم ووکامرس

هوک‌ها مهم‌ترین ابزار برای اتصال Add-on به ووکامرس هستند. اکشن‌ها برای اجرای یک عملیات در نقطه مشخص استفاده می‌شوند و فیلترها امکان تغییر مقدار قبل از نمایش یا ذخیره را فراهم می‌کنند.

چند هوک پرکاربرد

    • woocommerce_before_checkout_form برای نمایش محتوای پیش از فرم پرداخت
    • woocommerce_after_checkout_billing_form برای افزودن فیلد به بخش اطلاعات صورتحساب
    • woocommerce_checkout_process برای اعتبارسنجی اطلاعات پیش از ثبت سفارش
    • woocommerce_checkout_create_order برای ذخیره داده در شیء سفارش
    • woocommerce_product_get_price برای تغییر قیمت محصول در شرایط مشخص
    • woocommerce_payment_gateways برای ثبت درگاه پرداخت سفارشی

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

استفاده از CRUD به‌جای دستکاری مستقیم دیتابیس

برای کار با سفارش، محصول و مشتری بهتر است از متدهای CRUD ووکامرس مانند get_total()، get_billing_email() و update_meta_data() استفاده شود. این روش با معماری جدید ووکامرس سازگاری بیشتری دارد و در انتقال به ساختارهایی مانند HPOS، ریسک کمتری ایجاد می‌کند.

نوشتن کوئری مستقیم روی جدول‌های سفارش، زمانی که API رسمی وجود دارد، انتخاب مناسبی نیست. چنین کدی ممکن است در نسخه‌های آینده یا در سایت‌هایی با تنظیمات متفاوت، داده نادرست برگرداند.

امنیت، اعتبارسنجی و سازگاری

هر Add-on به اطلاعات ارزشمند فروشگاه دسترسی دارد؛ از ایمیل مشتری و آدرس ارسال گرفته تا مبلغ سفارش و اطلاعات پرداخت. بنابراین امنیت نباید به مرحله پایانی موکول شود.

اصول امنیتی ضروری

    • ورودی‌های کاربر را با توابعی مانند sanitize_text_field()، sanitize_email() و absint() پاک‌سازی کنید.
    • برای فرم‌های مدیریتی از nonce استفاده کنید.
    • پیش از هر عملیات، سطح دسترسی کاربر را با current_user_can() بررسی کنید.
    • خروجی را متناسب با محل نمایش با esc_html()، esc_attr() یا esc_url() ایمن کنید.
    • کلیدهای API را در HTML یا جاوااسکریپت عمومی قرار ندهید.
    • خطاهای سرویس‌های بیرونی را در لاگ ثبت کنید، اما اطلاعات حساس را در پیام کاربر نشان ندهید.

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

سازگاری با قالب و سایر افزونه‌ها

یکی از دلایل اصلی خطا در فروشگاه‌ها، وابستگی شدید افزونه به قالب است. Add-on نباید فرض کند یک کلاس CSS، کتابخانه جاوااسکریپت یا فایل خاص در تمام قالب‌ها وجود دارد. فایل‌های خود را فقط در صفحات لازم بارگذاری کنید و نام کلاس‌های CSS را اختصاصی انتخاب کنید.

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

مثال عملی: افزودن فیلد سفارشی به پرداخت

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

نمایش فیلد در تسویه‌حساب

add_action(

'woocommerce_after_checkout_billing_form',

'my_add_customer_code_field'

);

function my_add_customer_code_field( $checkout ) {

woocommerce_form_field(

'customer_code',

array(

'type' => 'text',

'class' => array( 'form-row-wide' ),

'label' => 'شناسه مشتری',

'required' => true,

),

$checkout->get_value( 'customer_code' )

);

}

اعتبارسنجی و ذخیره داده

add_action(

'woocommerce_checkout_process',

'my_validate_customer_code'

);

function my_validate_customer_code() {

if ( empty( $_POST['customer_code'] ) ) {

wc_add_notice(

'لطفاً شناسه مشتری را وارد کنید.',

'error'

);

}

}

add_action(

'woocommerce_checkout_create_order',

'my_save_customer_code',

10,

2

);

function my_save_customer_code( $order, $data ) {

if ( isset( $_POST['customer_code'] ) ) {

$code = sanitize_text_field(

wp_unslash( $_POST['customer_code'] )

);

$order->update_meta_data( 'customer_code', $code );

}

}

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

تست، بهینه‌سازی و انتشار

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

چک‌لیست تست قبل از انتشار

    • فعال‌سازی و غیرفعال‌سازی افزونه بدون خطای PHP
    • عملکرد صحیح برای کاربر واردشده و مهمان
    • تست محصول ساده، متغیر و محصول دارای تخفیف
    • بررسی سفارش موفق، ناموفق و لغوشده
    • تست در موبایل و مرورگرهای اصلی
    • بررسی پیام‌های خطا و موفقیت
    • آزمایش با HPOS در صورت فعال‌بودن آن
    • بررسی تداخل با افزونه‌های کش، امنیتی و پرداخت
    • بررسی ترجمه‌پذیری رشته‌ها و زبان فارسی

نسخه‌بندی و نگهداری

برای هر تغییر، شماره نسخه مشخصی در نظر بگیرید و تغییرات را در فایل changelog ثبت کنید. نسخه‌های آزمایشی را ابتدا برای گروه محدودی از کاربران اجرا کنید. در صورت اتصال به سرویس خارجی، timeout و مدیریت خطا را جدی بگیرید؛ یک API کند نباید صفحه پرداخت را برای همیشه معطل کند.

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

مزایا و محدودیت‌های ساخت افزونه اختصاصی

مزایا

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

محدودیت‌ها

    • نیاز به تحلیل و توسعه اولیه بیشتر از نصب افزونه آماده
    • مسئولیت بروزرسانی و سازگاری با نسخه‌های آینده
    • ضرورت داشتن مستندات و پشتیبان فنی
    • احتمال افزایش هزینه در صورت تغییر مداوم نیازمندی‌ها

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

هزینه و زمان لازم برای ساخت Add-on ووکامرس

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

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

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

جمع‌بندی ساخت افزونه ووکامرس

یک Add-on موفق فقط مجموعه‌ای از کدهای PHP نیست؛ محصولی است که باید با معماری ووکامرس، تجربه کاربری، امنیت، عملکرد و نیاز واقعی فروشگاه هماهنگ باشد. شروع درست با تحلیل مسئله، استفاده از هوک‌ها و APIهای رسمی، جداسازی کد از هسته، رعایت استانداردهای امنیتی و تست در محیط staging، ریسک پروژه را به شکل محسوسی کاهش می‌دهد.

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

سؤالات متداول درباره ساخت Add-on برای WooCommerce

آیا برای ساخت Add-on باید PHP را به‌صورت حرفه‌ای بلد باشیم؟

بله، تسلط به PHP، ساختار وردپرس، هوک‌ها، شی‌گرایی و کار با دیتابیس ضروری است. علاوه بر آن، آشنایی با HTML، CSS، JavaScript و APIهای ووکامرس نیز برای توسعه قابلیت‌های کامل‌تر لازم می‌شود.

آیا می‌توان فایل‌های اصلی WooCommerce را ویرایش کرد؟

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

آیا Add-on با همه قالب‌های وردپرس سازگار است؟

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

آیا استفاده از هوک‌ها برای همه قابلیت‌ها کافی است؟

برای بسیاری از تغییرات بله، اما نه همیشه. بعضی قابلیت‌ها به APIهای اختصاصی، بلوک‌های ووکامرس، جاوااسکریپت سمت کاربر یا ارتباط مستقیم با سرویس خارجی نیاز دارند. انتخاب ابزار باید بر اساس نوع نیاز و نسخه ووکامرس انجام شود.

چگونه امنیت افزونه ووکامرس را بررسی کنیم؟

ورودی‌ها را پاک‌سازی و خروجی‌ها را Escape کنید، nonce و سطح دسترسی را بررسی کنید، کلیدهای API را مخفی نگه دارید و خطاها را بدون نمایش اطلاعات حساس ثبت کنید. بررسی کد توسط توسعه‌دهنده مستقل و تست روی محیط جدا نیز برای پروژه‌های حساس توصیه می‌شود.

آیا بعد از انتشار، افزونه نیاز به پشتیبانی دارد؟

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

امتیاز دادن

نظرات با ارزش کاربران

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

فهرست مطالب