افزونه وردپرس چیست؟
افزونه وردپرس مجموعهای از فایلهای برنامهنویسی است که بدون دستکاری هسته وردپرس، قابلیت تازهای به سایت اضافه میکند یا رفتار یکی از بخشهای آن را تغییر میدهد. فرم تماس، درگاه پرداخت، فروشگاه اینترنتی، عضویت کاربران و اتصال به سرویسهای خارجی نمونههایی از امکاناتی هستند که معمولاً با افزونه پیادهسازی میشوند.
تفاوت اصلی افزونه و قالب در وظیفه آنهاست. قالب بیشتر ظاهر، چیدمان و نحوه نمایش محتوا را کنترل میکند؛ اما افزونه برای منطق و امکاناتی به کار میرود که باید با تغییر قالب نیز باقی بمانند. در پروژههای طراحی سایت وردپرسی نیز قابلیتهای مستقل از ظاهر سایت معمولاً در افزونههای آماده یا اختصاصی قرار میگیرند.
در این آموزش افزونهنویسی وردپرس، یک افزونه ساده میسازیم که پیامی را در پیشخوان نمایش میدهد. سپس با هوکها، چرخه عمر افزونه، صفحه تنظیمات، بارگذاری CSS و JavaScript، امنیت و روشهای ذخیره داده آشنا میشویم.
پیشنیازهای افزونهنویسی وردپرس
برای ساخت افزونه باید با PHP آشنا باشید؛ زیرا منطق اصلی وردپرس و افزونههای آن با این زبان نوشته میشود. آشنایی با HTML برای تولید خروجی، CSS برای طراحی رابط و JavaScript برای تعاملات سمت کاربر نیز مفید است. اگر افزونه با دادههای زیادی کار میکند، شناخت پایگاه داده و MySQL هم اهمیت پیدا میکند.
برای شروع لازم نیست تمام APIهای وردپرس را حفظ باشید. شناخت ساختار فایلها، توابع PHP، هوکها و اصول امنیت کافی است تا اولین افزونه خود را بسازید. بهتر است توسعه را روی محیط آزمایشی انجام دهید و حالت اشکالزدایی وردپرس را فعال کنید تا خطاها راحتتر شناسایی شوند.
آیا برای ساخت افزونه باید OOP بلد باشیم؟
خیر. افزونههای ساده را میتوان با برنامهنویسی رویهای ساخت. با بزرگتر شدن پروژه، شیءگرایی یا OOP به جداسازی مسئولیتها، جلوگیری از تداخل نامها و نگهداری بهتر کد کمک میکند. بنابراین OOP برای اولین تمرین ضروری نیست، اما برای توسعه افزونههای حرفهای مهارت ارزشمندی است.
ساختار یک افزونه وردپرس
سادهترین افزونه میتواند فقط یک فایل PHP داشته باشد. ابتدا در مسیر wp-content/plugins پوشهای با نام یکتا، مانند mw-first-plugin بسازید و داخل آن فایل mw-first-plugin.php را قرار دهید. بهتر است پیشوند نام پوشه، فایل، تابعها و گزینهها اختصاصی باشد تا با قالب یا افزونههای دیگر تداخل ایجاد نکند.
<?php
/**
* Plugin Name: MW First Plugin
* Description: افزونهای ساده برای نمایش پیام در پیشخوان وردپرس.
* Version: 1.0.0
* Requires at least: 6.0
* Requires PHP: 7.4
* Author: MentoWeb
* License: GPL-2.0-or-later
* Text Domain: mw-first-plugin
*/
defined( 'ABSPATH' ) || exit;
وردپرس اطلاعات افزونه را از هدر ابتدای فایل اصلی میخواند. فیلد Plugin Name برای شناسایی افزونه ضروری است و سایر فیلدها اطلاعاتی مانند نسخه، نویسنده، حداقل نسخه PHP و دامنه ترجمه را مشخص میکنند. خط بررسی ABSPATH نیز از اجرای مستقیم فایل PHP جلوگیری میکند.
ساخت اولین افزونه وردپرس
کد زیر یک پیام موفقیت را در صفحات مدیریت وردپرس نمایش میدهد. آن را بعد از هدر افزونه قرار دهید، فایل را ذخیره کنید و سپس افزونه را از مسیر «افزونهها ← افزونههای نصبشده» فعال کنید.
function mw_first_plugin_admin_notice() {
echo '<div class="notice notice-success is-dismissible">';
echo '<p>' . esc_html__( 'افزونه با موفقیت فعال است.', 'mw-first-plugin' ) . '</p>';
echo '</div>';
}
add_action( 'admin_notices', 'mw_first_plugin_admin_notice' );
اگر پس از فعالسازی، پیام را در پیشخوان مشاهده کردید، اولین افزونه شما با موفقیت اجرا شده است. این مثال کوتاه، نحوه اتصال یک تابع اختصاصی به یکی از رویدادهای وردپرس را نشان میدهد.
Hook در وردپرس چیست؟
هوکها نقاطی از اجرای وردپرس هستند که افزونه میتواند بدون تغییر فایلهای هسته به آنها متصل شود. وردپرس دو نوع هوک اصلی دارد: Action و Filter. در هر دو حالت، ابتدا یک تابع Callback مینویسیم و سپس آن را به هوک موردنظر متصل میکنیم.
Action چیست؟
Action برای اجرای یک عملیات در زمان وقوع رویدادی مشخص استفاده میشود؛ برای مثال نمایش پیام مدیریتی، ثبت یک نوع نوشته یا بارگذاری فایلهای افزونه. تابع add_action() میتواند نام هوک، Callback، اولویت اجرا و تعداد آرگومانهای پذیرفتهشده را دریافت کند.
function mw_first_plugin_log_init() {
error_log( 'MW First Plugin initialized.' );
}
add_action( 'init', 'mw_first_plugin_log_init' );
Filter چیست؟
Filter یک مقدار را دریافت میکند، آن را تغییر میدهد و نتیجه را برمیگرداند. به همین دلیل Callback متصل به فیلتر باید مقدار نهایی را با return بازگرداند.
function mw_first_plugin_change_title( $title ) {
if ( is_admin() ) {
return $title;
}
return '⭐ ' . $title;
}
add_filter( 'the_title', 'mw_first_plugin_change_title' );
چرخه عمر افزونه
چرخه عمر افزونه شامل فعالسازی، غیرفعالسازی و حذف کامل است. هنگام فعالسازی میتوان تنظیمات اولیه را ساخت یا قوانین بازنویسی را بهروزرسانی کرد. غیرفعالسازی باید فقط فعالیتهای موقت افزونه را متوقف کند. اطلاعات دائمی کاربر نیز فقط هنگام حذف کامل افزونه و با تصمیم روشن توسعهدهنده پاک میشوند.
function mw_first_plugin_activate() {
add_option( 'mw_first_plugin_message', 'سلام از افزونه منتووب' );
}
register_activation_hook( __FILE__, 'mw_first_plugin_activate' );
function mw_first_plugin_deactivate() {
// توقف رویدادهای زمانبندیشده یا پاکسازی دادههای موقت.
}
register_deactivation_hook( __FILE__, 'mw_first_plugin_deactivate' );
function mw_first_plugin_uninstall() {
delete_option( 'mw_first_plugin_message' );
}
register_uninstall_hook( __FILE__, 'mw_first_plugin_uninstall' );
در افزونههای عمومی بهتر است پیش از حذف دادهها، گزینهای در اختیار مدیر سایت قرار دهید. حذف خودکار اطلاعات بدون اطلاع کاربر میتواند باعث از دست رفتن دادههای مهم شود.
ساخت صفحه تنظیمات افزونه
برای ایجاد تنظیمات استاندارد میتوان از Settings API و Options API استفاده کرد. در نمونه زیر، یک صفحه زیر منوی «تنظیمات» ساخته میشود و مدیر سایت میتواند متن پیام افزونه را تغییر دهد.
function mw_first_plugin_add_settings_page() {
add_options_page(
'تنظیمات افزونه منتووب',
'افزونه منتووب',
'manage_options',
'mw-first-plugin',
'mw_first_plugin_render_settings_page'
);
}
add_action( 'admin_menu', 'mw_first_plugin_add_settings_page' );
function mw_first_plugin_register_settings() {
register_setting(
'mw_first_plugin_group',
'mw_first_plugin_message',
array(
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
'default' => '',
)
);
}
add_action( 'admin_init', 'mw_first_plugin_register_settings' );
function mw_first_plugin_render_settings_page() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$message = get_option( 'mw_first_plugin_message', '' );
?>
<div class="wrap">
<h1><?php echo esc_html__( 'تنظیمات افزونه منتووب', 'mw-first-plugin' ); ?></h1>
<form method="post" action="options.php">
<?php settings_fields( 'mw_first_plugin_group' ); ?>
<label for="mw-first-plugin-message">
<?php echo esc_html__( 'متن پیام', 'mw-first-plugin' ); ?>
</label>
<input
id="mw-first-plugin-message"
class="regular-text"
type="text"
name="mw_first_plugin_message"
value="<?php echo esc_attr( $message ); ?>"
>
<?php submit_button(); ?>
</form>
</div>
<?php
}
بارگذاری CSS و JavaScript در افزونه
فایلهای CSS و JavaScript را نباید مستقیماً با تگهای link و script وارد کرد. توابع wp_enqueue_style() و wp_enqueue_script() وابستگیها و نسخه فایلها را مدیریت میکنند. در پیشخوان نیز بهتر است فایلها فقط در صفحه مربوط به افزونه بارگذاری شوند تا روی سرعت سایر صفحات اثر نگذارند.
function mw_first_plugin_admin_assets( $hook_suffix ) {
if ( 'settings_page_mw-first-plugin' !== $hook_suffix ) {
return;
}
wp_enqueue_style(
'mw-first-plugin-admin',
plugin_dir_url( __FILE__ ) . 'assets/admin.css',
array(),
'1.0.0'
);
wp_enqueue_script(
'mw-first-plugin-admin',
plugin_dir_url( __FILE__ ) . 'assets/admin.js',
array(),
'1.0.0',
true
);
}
add_action( 'admin_enqueue_scripts', 'mw_first_plugin_admin_assets' );
بارگذاری هدفمند فایلها در کنار کش و راهاندازی CDN در وردپرس میتواند تحویل فایلهای استاتیک را بهینهتر کند؛ با این حال، ابتدا باید از بارگذاری غیرضروری داراییهای خود افزونه جلوگیری شود.
امنیت در افزونهنویسی وردپرس
هیچ دادهای که از فرم، URL، درخواست AJAX یا سرویس خارجی دریافت میشود نباید قابل اعتماد فرض شود. چهار اصل مهم امنیت افزونه عبارتاند از بررسی سطح دسترسی، اعتبارسنجی، پاکسازی ورودی و Escape کردن خروجی. Nonce نیز برای کاهش خطر CSRF به کار میرود، اما جایگزین بررسی مجوز کاربر نیست.
- Capability: بررسی مجوز کاربر با تابعی مانند
current_user_can() - Nonce: بررسی قصد انجام عملیات و کاهش خطر درخواست جعلی
- Validation و Sanitization: بررسی و پاکسازی داده پیش از ذخیره
- Escaping: ایمنسازی داده متناسب با محل نمایش
if (
isset( $_POST['mw_message'], $_POST['mw_nonce'] ) &&
current_user_can( 'manage_options' ) &&
wp_verify_nonce(
sanitize_text_field( wp_unslash( $_POST['mw_nonce'] ) ),
'mw_save_message'
)
) {
$message = sanitize_text_field( wp_unslash( $_POST['mw_message'] ) );
update_option( 'mw_first_plugin_message', $message );
}
برای خروجی متن ساده از esc_html()، برای Attributeهای HTML از esc_attr() و برای URL از esc_url() استفاده کنید. انتخاب تابع Escape باید متناسب با محل قرارگیری داده باشد. رعایت این اصول در کنار سایر اقدامات افزایش امنیت سایت وردپرسی ضروری است.
ذخیره اطلاعات افزونه
روش ذخیره داده به نوع و حجم آن بستگی دارد. Options API برای تنظیمات عمومی افزونه مناسب است. Metadata اطلاعات وابسته به نوشته، کاربر، دیدگاه یا ترم را ذخیره میکند. جدول اختصاصی زمانی منطقی است که دادهها ساختار پیچیده، حجم زیاد یا نیازهای کوئری متفاوتی داشته باشند. پیش از ساخت جدول جدید بررسی کنید که آیا APIهای داخلی وردپرس نیاز پروژه را برطرف میکنند یا نه.
ارتباط افزونه با REST API و AJAX
AJAX برای انجام درخواستهای پسزمینه در پیشخوان یا بخش عمومی سایت کاربرد دارد. REST API نیز رابطی استاندارد برای تبادل داده از طریق HTTP فراهم میکند و در اتصال اپلیکیشن موبایل، پنل خارجی یا سرویسهای دیگر مفید است. در هر دو روش باید ورودیها پاکسازی، سطح دسترسی بررسی و پاسخ با ساختار مناسب ارسال شود. ثبت یک REST Route بدون تعریف صحیح permission_callback میتواند دسترسی ناخواسته به دادهها ایجاد کند.
آمادهسازی افزونه برای ترجمه
رشتههایی که در رابط افزونه نمایش داده میشوند باید با توابع ترجمه وردپرس نوشته شوند و Text Domain آنها با هدر افزونه هماهنگ باشد. برای متن ساده قابل بازگشت از __() و برای ترجمه همراه با Escape از توابعی مانند esc_html__() استفاده کنید.
echo esc_html__( 'سلام دنیا', 'mw-first-plugin' );
برای رشتههایی که متغیر دارند، قالب ترجمه را ثابت نگه دارید و مقدار متغیر را جداگانه با printf() یا sprintf() وارد کنید. این کار ترجمه افزونه را برای زبانهای مختلف سادهتر میکند.
اشتباهات رایج در افزونهنویسی
- تغییر مستقیم فایلهای هسته وردپرس که با بهروزرسانی از بین میرود.
- قرار دادن قابلیت مستقل و دائمی سایت در فایل
functions.phpقالب. - استفاده نکردن از پیشوند یا Namespace و ایجاد تداخل با افزونههای دیگر.
- بارگذاری CSS و JavaScript در تمام صفحات مدیریت یا سایت.
- اعتماد به ورودی کاربر و نمایش خروجی بدون پاکسازی و Escape.
- استفاده از Nonce بدون بررسی Capability کاربر.
- حذف اطلاعات دائمی هنگام غیرفعالسازی افزونه.
- اجرای کوئریهای غیرضروری یا ساخت جدول اختصاصی بدون نیاز واقعی.
- تست نکردن افزونه در حالت اشکالزدایی و نسخههای پشتیبانیشده PHP و وردپرس.
مسیر حرفهای شدن در توسعه افزونه وردپرس
پس از ساخت اولین افزونه، یادگیری را با پروژههای کوچک ادامه دهید. ساخت شورتکد، بلوک، نوع نوشته سفارشی، متاباکس، وظیفه زمانبندیشده و REST Route تمرینهای مناسبی هستند. سپس سراغ معماری شیءگرا، Composer، تست خودکار، WordPress Coding Standards و فرایند انتشار در مخزن رسمی بروید.
در پروژههای بزرگ، کد را به فایلها و کلاسهای مستقل تقسیم کنید، وابستگیها را مدیریت کنید و برای توابع عمومی مستندات بنویسید. یک افزونه حرفهای فقط قابلیت موردنظر را اجرا نمیکند؛ بلکه امن، قابلنگهداری، قابلترجمه و سازگار با محیطهای مختلف است.
چکلیست ساخت افزونه
- انتخاب نام، Slug، پیشوند یا Namespace یکتا
- ایجاد هدر استاندارد در فایل اصلی افزونه
- جلوگیری از دسترسی مستقیم به فایلهای PHP
- استفاده صحیح از Action و Filter
- تعریف رفتار فعالسازی، غیرفعالسازی و حذف
- بارگذاری CSS و JavaScript فقط در صفحات لازم
- بررسی Capability و Nonce برای عملیات حساس
- پاکسازی ورودی و Escape کردن خروجی
- انتخاب روش مناسب ذخیره اطلاعات
- آمادهسازی رشتهها برای ترجمه
- تست خطاها، امنیت و سازگاری پیش از انتشار
جمعبندی
افزونهنویسی وردپرس از یک فایل PHP و چند هوک ساده آغاز میشود، اما برای تولید افزونه قابل اعتماد باید ساختار، امنیت، ذخیره داده، ترجمه و عملکرد را نیز جدی گرفت. بهترین مسیر یادگیری این است که ابتدا یک قابلیت کوچک و واقعی بسازید، آن را آزمایش کنید و سپس مرحلهبهمرحله امکانات بیشتری به آن اضافه کنید.
اگر برای توسعه قابلیت اختصاصی، اتصال وردپرس به سرویسهای دیگر یا پیادهسازی افزونه سفارشی به راهنمایی نیاز دارید، میتوانید از خدمات طراحی سایت منتووب استفاده کنید.
سؤالات متداول
۱. برای افزونهنویسی وردپرس چه زبانهایی لازم است؟
PHP زبان اصلی توسعه افزونه است. بسته به رابط و امکانات پروژه، HTML، CSS، JavaScript و آشنایی با MySQL نیز کاربرد دارند.
۲. آیا برای ساخت افزونه باید PHP بلد باشیم؟
بله. برای ساخت افزونه واقعی و رفع خطاهای آن باید دستکم با توابع، شرطها، آرایهها، دامنه متغیرها و اصول امنیت در PHP آشنا باشید.
۳. تفاوت Action و Filter چیست؟
Action عملی را در نقطهای از اجرای وردپرس انجام میدهد؛ اما Filter مقداری را دریافت میکند، تغییر میدهد و باید مقدار نهایی را برگرداند.
۴. اطلاعات افزونه را کجا ذخیره کنیم؟
تنظیمات عمومی در Options API، اطلاعات وابسته به نوشته یا کاربر در Metadata و دادههای پیچیده و حجیم در صورت نیاز در جدول اختصاصی ذخیره میشوند.
۵. چگونه امنیت افزونه را افزایش دهیم؟
سطح دسترسی کاربر را بررسی کنید، برای عملیات حساس Nonce داشته باشید، ورودیها را اعتبارسنجی و پاکسازی کنید و خروجی را متناسب با محل نمایش Escape کنید.
۶. چگونه افزونه را روی سایت دیگری نصب کنیم؟
پوشه افزونه را به فایل ZIP تبدیل کنید و از مسیر «افزونهها ← افزودن افزونه تازه ← بارگذاری افزونه» نصب کنید. پیش از انتقال به سایت اصلی، افزونه را در محیط آزمایشی بررسی کنید.









