# ساخت افزونه‌ی ساده‌ی وردپرس با کمک هوش مصنوعی

- آدرس: https://di9.ir/blog/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-%D8%A8%D8%A7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C
- نویسنده: danidiba
- انتشار: 2026-08-26T12:16:00+03:30
- به‌روزرسانی: 2026-08-26T12:16:00+03:30
- دسته: هوش مصنوعی در وردپرس
- برچسب‌ها: افزونه وردپرس، امنیت وردپرس، کدنویسی، هوش مصنوعی

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

هوش مصنوعی کد یک افزونه‌ی کوچک وردپرس را در چند ثانیه می‌نویسد. مشکل سرعت نیست؛ مشکل این است که کد تولیدشده معمولاً *کار می‌کند* و همین آدم را گول می‌زند. فرم ذخیره می‌شود، جعبه نمایش داده می‌شود، و کسی نمی‌بیند که nonce بررسی نشده یا خروجی بدون escape چاپ می‌شود.

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

![چرخه‌ی ساخت افزونه با هوش مصنوعی در پنج قدم: تعریف کار، پرامپت با قیدها، بازبینی، آزمایش روی کپی سایت و نصب روی سایت اصلی](https://di9.ir/blog/wp-content/uploads/2026/09/fig-a13-1.svg)

## کار را چطور برای هوش مصنوعی تعریف کنیم؟

کار را در یک جمله‌ی دقیق بنویسید: چه کاری، برای چه کسی، کجا و در چه محیطی. هر ابهامی که بگذارید، مدل با حدس پر می‌کند.

«یک افزونه برای مدیریت یادداشت‌ها بنویس» ده تصمیم را به مدل واگذار می‌کند. به‌جایش این چهار مورد را روشن کنید:

- **کار دقیق:** یک جعبه‌ی متنی در ستون کناری ویرایش نوشته که محتوایش در متای همان نوشته ذخیره شود.
- **چه کسی:** فقط کاربرانی که اجازه‌ی ویرایش همان نوشته را دارند.
- **کجا نه:** هیچ‌جای سایت عمومی نمایش داده نشود.
- **محیط:** نسخه‌ی وردپرس و PHP سایت، که در «ابزارها ← سلامت سایت» پیدا می‌شود.

اگر کار بیش از یک جمله توضیح لازم دارد، آن را به چند مرحله بشکنید.

## چه پرامپتی کد امن‌تر می‌دهد؟

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

اصول کلی این نوع درخواست در [پرامپت‌نویسی برای کار فنی](https://di9.ir/blog/%D9%BE%D8%B1%D8%A7%D9%85%D9%BE%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1-%D9%81%D9%86%DB%8C) آمده؛ این نمونه‌ی مخصوص وردپرس است:

```prompt
یک افزونه‌ی تک‌فایلی وردپرس بنویس، برای PHP نسخه‌ی ۸ به بالا.
کار: یک متاباکس «یادداشت داخلی» در ستون کناری ویرایش نوشته‌ها
که متن را در متای _dg_internal_note ذخیره کند.
قیدها:
- فقط از توابع و قلاب‌های خود وردپرس استفاده کن.
- فرم nonce داشته باشد و هنگام ذخیره بررسی شود.
- پیش از ذخیره، دسترسی edit_post برای همان نوشته بررسی شود.
- ورودی با wp_unslash و تابع sanitize مناسب پاک شود.
- هر خروجی با تابع escape مناسب چاپ شود.
- همه‌ی نام‌ها با پیشوند dg_ شروع شوند.
بعد از کد، در چند خط بگو هر بخش چه می‌کند.
```

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

## کد خروجی را چطور بخوانیم؟

کد را پیش از اجرا بخوانید و چهار نقطه‌ی امنیتی را در آن پیدا کنید: nonce، بررسی دسترسی، پاک‌سازی ورودی و escape خروجی. اگر یکی نبود، کد آماده نیست.

دو تعریف کوتاه: **nonce در وردپرس توکن موقتی است که ثابت می‌کند درخواست از فرم خود سایت و از طرف همان کاربر آمده است.** **escape یعنی خنثی‌کردن نویسه‌های خطرناک پیش از چاپ، تا متن به‌جای کد اجرا نشود.**

خروجی خوب برای پرامپت بالا چیزی شبیه این است:

```php
<?php
/**
 * Plugin Name: DG Internal Note
 * Requires PHP: 8.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_action( 'add_meta_boxes', 'dg_internal_note_add_box' );

function dg_internal_note_add_box(): void {
    add_meta_box( 'dg_internal_note', 'یادداشت داخلی', 'dg_internal_note_render', 'post', 'side' );
}

function dg_internal_note_render( WP_Post $post ): void {
    wp_nonce_field( 'dg_internal_note_save', 'dg_internal_note_nonce' );
    $note = get_post_meta( $post->ID, '_dg_internal_note', true );
    echo '<textarea name="dg_internal_note" rows="4" class="widefat">';
    echo esc_textarea( (string) $note );
    echo '</textarea>';
}

add_action( 'save_post_post', 'dg_internal_note_save' );

function dg_internal_note_save( int $post_id ): void {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    if ( ! isset( $_POST['dg_internal_note_nonce'] ) ) {
        return;
    }
    $nonce = sanitize_text_field( wp_unslash( $_POST['dg_internal_note_nonce'] ) );
    if ( ! wp_verify_nonce( $nonce, 'dg_internal_note_save' ) ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
    $note = isset( $_POST['dg_internal_note'] )
        ? sanitize_textarea_field( wp_unslash( $_POST['dg_internal_note'] ) )
        : '';
    update_post_meta( $post_id, '_dg_internal_note', $note );
}
```

چیزهایی که باید در همین کد ببینید:

- `wp_nonce_field` در فرم و `wp_verify_nonce` هنگام ذخیره، با نام action یکسان.
- `current_user_can( 'edit_post', $post_id )` یعنی اجازه برای **همین نوشته**، نه یک نقش کلی.
- `wp_unslash` پیش از پاک‌سازی، چون وردپرس داده‌ی `$_POST` را اسلش‌دار می‌کند.
- `esc_textarea` برای داخل textarea؛ برای ویژگی HTML باید `esc_attr` باشد و برای متن معمولی `esc_html`.
- کلید متا با خط زیر شروع شده تا در جعبه‌ی «زمینه‌های دلخواه» دیده نشود.

اگر افزونه نباید بعد از حذف چیزی در دیتابیس جا بگذارد، یک فایل `uninstall.php` کنارش بگذارید:

```php
<?php
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    exit;
}
delete_post_meta_by_key( '_dg_internal_note' );
```

ساختار کامل افزونه و قلاب‌ها را در [ساخت افزونه‌ی وردپرس از صفر](https://di9.ir/blog/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-%D8%A7%D8%B2-%D8%B5%D9%81%D8%B1) آورده‌ایم.

### چک‌لیست هشت‌موردی بازبینی

این هشت مورد را خط‌به‌خط در کد پیدا کنید؛ نبودن هر کدام از ردیف دوم به بعد یعنی کد آماده‌ی نصب نیست.

| مورد | دنبال چه بگردید |
| --- | --- |
| جلوگیری از اجرای مستقیم | بررسی `ABSPATH` در ابتدای فایل |
| nonce | ساخت در فرم، بررسی هنگام ذخیره |
| بررسی دسترسی | `current_user_can` با قابلیت درست |
| پاک‌سازی ورودی | `wp_unslash` و بعد تابع `sanitize_*` مناسب |
| escape خروجی | `esc_html`، `esc_attr`، `esc_url` و مانند آن‌ها |
| پایگاه داده | `$wpdb->prepare` برای هر کوئری که ورودی دارد |
| مسیر AJAX یا REST | nonce و `permission_callback` درست |
| نام‌گذاری | پیشوند یکتا برای تابع، متا و گزینه |

می‌توانید از یک گفتگوی تازه هم بخواهید کد را با همین جدول بازبینی کند، ولی بازبین هم خطا می‌کند؛ حد و مرزش را در [بازبینی کد با هوش مصنوعی](https://di9.ir/blog/%D8%A8%D8%A7%D8%B2%D8%A8%DB%8C%D9%86%DB%8C-%DA%A9%D8%AF-%D8%A8%D8%A7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C) نوشته‌ایم.

## افزونه را چطور بی‌خطر آزمایش کنیم؟

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

1. در `wp-config.php` سایت آزمایشی، `WP_DEBUG` و `WP_DEBUG_LOG` را روشن کنید.
2. افزونه را فعال کنید و یک نوشته را همراه یادداشت ذخیره کنید.
3. صفحه را دوباره باز کنید و ببینید یادداشت سر جایش است.
4. متنی شامل یک تگ مثل `<b>` ذخیره کنید؛ تگ باید حذف شود و بقیه‌ی متن سالم بماند.
5. با کاربری وارد شوید که اجازه‌ی ویرایش نوشته‌ی دیگران را ندارد و ببینید نمی‌تواند یادداشت آن‌ها را عوض کند.
6. فایل `wp-content/debug.log` را نگاه کنید؛ هیچ هشداری نباید آن‌جا باشد.
7. افزونه را حذف کنید و ببینید متاها پاک شده‌اند.

اگر خطایی دیدید، متن کامل خطا را همراه کد به همان گفتگو بدهید، نه فقط جمله‌ی «کار نمی‌کند».

## هوش مصنوعی در کد وردپرس کجا اشتباه می‌کند؟

بیشتر در جاهایی که کد بدون آن‌ها هم کار می‌کند: امنیت، توابع قدیمی و نام‌هایی که وجود ندارند.

- **تابع منسوخ:** مدل از کدهای قدیمی اینترنت یاد گرفته و گاهی تابعی پیشنهاد می‌کند که مدت‌هاست جایگزین دارد.
- **اعتماد به `is_admin()`:** این تابع فقط می‌گوید درخواست مربوط به بخش مدیریت است، نه اینکه کاربر مدیر است.
- **nonce نیمه‌کاره:** فیلد در فرم هست ولی هنگام ذخیره بررسی نمی‌شود.
- **کوئری خام:** چسباندن مستقیم ورودی به SQL به‌جای `$wpdb->prepare`.
- **escape در جای اشتباه:** قاعده ساده است؛ هنگام ذخیره پاک‌سازی، هنگام نمایش escape.
- **تابع ساختگی:** هر تابع ناآشنا را در مرجع رسمی توسعه‌دهندگان وردپرس جستجو کنید.

پیش از نصب روی سایت اصلی، [چک‌لیست امنیت وردپرس](https://di9.ir/blog/%DA%86%DA%A9-%D9%84%DB%8C%D8%B3%D8%AA-%D8%A7%D9%85%D9%86%DB%8C%D8%AA-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3) را هم مرور کنید. هر افزونه‌ی تازه، هر قدر کوچک، سطح حمله را بزرگ‌تر می‌کند.

## کی نباید با هوش مصنوعی افزونه ساخت؟

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

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

دلیلش ساده است: کدی که خودتان نگه می‌دارید به‌روزرسانی امنیتی خودکار ندارد. برای کارهای کوچک و تک‌کاره اما، همان‌طور که در [هوش مصنوعی در وردپرس](https://di9.ir/blog/%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%AF%D8%B1-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3) گفتیم، هوش مصنوعی واقعاً وقت صرفه‌جویی می‌کند.

## این موضوع به کجا می‌رود؟

ابزارها از «چت و کپی‌کردن کد» به‌سمت دستیارهایی می‌روند که خودشان فایل‌ها را تغییر می‌دهند، دستور اجرا می‌کنند و نتیجه را می‌بینند. سرعت ساختن بیشتر می‌شود؛ مسئولیت بازبینی همچنان با شماست.

برای آماده شدن:

- خواندن کد PHP و شناختن توابع امنیتی وردپرس را یاد بگیرید؛ این مهارت کهنه نمی‌شود.
- همیشه یک سایت آزمایشی آماده داشته باشید.
- کد افزونه‌هایتان را در یک مخزن git نگه دارید تا هر تغییر قابل‌برگشت باشد.

## خلاصه

- کار را در یک جمله تعریف کنید و نسخه‌ی وردپرس و PHP را بگویید.
- nonce، بررسی دسترسی، پاک‌سازی ورودی و escape خروجی را صریح در پرامپت بخواهید.
- کد را با چک‌لیست خط‌به‌خط بخوانید؛ کار کردن دلیل امن بودن نیست.
- اول روی سایت آزمایشی با `WP_DEBUG` روشن امتحان کنید.
- برای پرداخت، ورود کاربر و آپلود فایل، کد تازه با هوش مصنوعی نسازید.

## پرسش‌های متداول

### آیا هوش مصنوعی می‌تواند بدون دانش برنامه‌نویسی برای من افزونه‌ی وردپرس بسازد؟

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

### کدی را که هوش مصنوعی برای وردپرس نوشته کجا بگذارم؟

در یک افزونه‌ی جدا داخل پوشه‌ی wp-content/plugins، نه در functions.php قالب. این‌طور کد با تعویض قالب از بین نمی‌رود و اگر خطا داد، با غیرفعال‌کردن افزونه یا تغییر نام پوشه‌اش سایت به حالت قبل برمی‌گردد.

### از کجا بفهمم کد وردپرسی که هوش مصنوعی نوشته امن است؟

دنبال چهار چیز بگردید: بررسی nonce در هر فرم، بررسی دسترسی کاربر با current_user_can، پاک‌سازی ورودی و escape خروجی. اگر کد با پایگاه داده کار می‌کند، هر کوئری که ورودی دارد باید با $wpdb->prepare ساخته شود. نبودن هر کدام یعنی کد هنوز آماده‌ی نصب نیست.

### اگر افزونه‌ای که با هوش مصنوعی ساختم سایت را از کار انداخت چه کنم؟

با FTP یا مدیر فایل هاست، نام پوشه‌ی افزونه را در wp-content/plugins عوض کنید تا وردپرس آن را غیرفعال کند و سایت برگردد. بعد متن کامل خطا را از فایل debug.log بردارید و همراه کد به دستیار هوش مصنوعی بدهید تا علت را پیدا کند.
