فیلد سفارشی، یکی از آن نیازهایی است که وقتی به آن می‌رسید، راه بازگشت به عقب وجود ندارد. یک نوشتهٔ خبری که نیاز به «منبع» دارد، یک محصول که نیاز به «گارانتی» دارد، یک رویداد که نیاز به «تاریخ برگزاری» دارد — همهٔ این‌ها با فیلدهای پیش‌فرض وردپرس قابل مدیریت نیستند. تجربهٔ من این است که بیشتر پروژه‌ها دو بار روی این موضوع کار می‌کنند: بار اول با کد سفارشی، بار دوم (پس از یادگیری) با ابزارهای استاندارد. این مقاله، هر دو مسیر را با معیار تصمیم‌گیری باز می‌کند: متای خام، متاباکس اختصاصی، ACF، و فیلدهای بلاکی گوتنبرگ. اگر با مفاهیم پایه آشنا نیستید، وردپرس چیست و افزونه وردپرس چیست را پیش از ادامه ببینید.

فیلد سفارشی چیست؟

فیلد سفارشی، دادهٔ اضافه‌ای است که به یک نوشته، برگه، کاربر، یا هر موجودیت دیگری در وردپرس وصل می‌شود. از نظر فنی، در جدول wp_postmeta (برای نوشته‌ها)، wp_usermeta (برای کاربران)، یا wp_termmeta (برای ترم‌ها) ذخیره می‌شود. سه کاربرد اصلی: یک — دادهٔ ساختاریافته: اطلاعاتی که بخشی از محتوا نیستند ولی نمایش داده می‌شوند (قیمت، گارانتی، منبع). دو — تنظیمات پشت صحنه: پارامترهایی که روی ظاهر یا رفتار نوشته اثر می‌گذارند (مثلاً «نمایش در اسلایدر صفحهٔ اصلی»). سه — دادهٔ متادیتای سئو: اگرچه افزونه‌های سئو این را در جای جداگانه‌ای مدیریت می‌کنند، می‌توان فیلدهای سفارشی برای ساختارهای غنی‌تر ساخت. نگاه کلی این مفهوم در کار با متاباکس‌ها و توابع وردپرس برای متادیتا آمده است.

فیلد سفارشی، مرز بین «محتوای متنی» و «دادهٔ ساختاریافته» است. هر پروژه‌ای که به این مرز می‌رسد، آمادهٔ رشد است.

چهار مسیر پیاده‌سازی

چهار مسیر برای ساخت فیلد سفارشی وجود دارد: یک — متای خام: استفاده از باکس Custom Fields پیش‌فرض وردپرس. سریع، بدون کد، ولی بدون رابط کاربری زیبا. دو — متاباکس اختصاصی: ساخت یک جعبهٔ سفارشی با HTML فرم و ذخیره‌سازی امن. کنترل کامل. سه — ACF و ابزارهای مشابه: افزونه‌های حرفه‌ای با رابط کاربری گرافیکی. سرعت ساخت بالا، ولی وابستگی به افزونه. چهار — فیلد بلاکی گوتنبرگ: ساخت فیلد به‌عنوان یک بلاک. مدرن، سازگار با گوتنبرگ. تجربه‌ام: در پروژه‌های مختلف، هر چهار مسیر به‌کار می‌رود؛ انتخاب به پیچیدگی، سطح تیم، و افق بلندمدت بستگی دارد.

مسیر اول: متای خام

ساده‌ترین مسیر: در ویرایشگر نوشته، گزینهٔ Custom Fields را فعال کنید (از تنظیمات صفحه)، و کلید-مقدار وارد کنید. مثال: کلید منبع، مقدار «کتاب X». خواندن در قالب:

$source = get_post_meta( get_the_ID(), 'منبع', true );
if ( $source ) {
    echo '<p>منبع: ' . esc_html( $source ) . '</p>';
}

مزیت: صفر کد اضافه. نقطهٔ ضعف: رابط کاربری خام، بدون اعتبارسنجی، بدون امکان ساخت فیلدهای پیچیده (تصویر، تاریخ، انتخاب چندگانه). مناسب پروژه‌های شخصی یا فیلدهای خیلی ساده. تجربه‌ام: برای مشتری غیرفنی، این مسیر توصیه نمی‌شود چون خطای تایپی کاربر زیاد است. الگوهای امنیتی در PHP امن در وردپرس.

مسیر دوم: متاباکس اختصاصی

یک متاباکس با HTML فرم و ذخیره‌سازی امن، راه‌حل حرفه‌ای برای کنترل کامل است. اسکلت پایه:

function my_plugin_add_metabox() {
    add_meta_box(
        'my_metabox',
        'اطلاعات اضافی',
        'my_plugin_render_metabox',
        'post',
        'normal',
        'default'
    );
}
add_action( 'add_meta_boxes', 'my_plugin_add_metabox' );

function my_plugin_render_metabox( $post ) {
    wp_nonce_field( 'my_metabox_save', 'my_metabox_nonce' );
    $source = get_post_meta( $post->ID, '_my_source', true );
    echo '<label>منبع:</label>';
    echo '<input type="text" name="my_source" value="' . esc_attr( $source ) . '" />';
}

function my_plugin_save_metabox( $post_id ) {
    if ( ! isset( $_POST['my_metabox_nonce'] ) ) return;
    if ( ! wp_verify_nonce( $_POST['my_metabox_nonce'], 'my_metabox_save' ) ) return;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if ( ! current_user_can( 'edit_post', $post_id ) ) return;

    if ( isset( $_POST['my_source'] ) ) {
        update_post_meta( $post_id, '_my_source', sanitize_text_field( $_POST['my_source'] ) );
    }
}
add_action( 'save_post', 'my_plugin_save_metabox' );

پنج نکتهٔ حیاتی: یک — nonce: الزامی. دو — check_user_can: الزامی. سه — DOING_AUTOSAVE: جلوگیری از ذخیره در autosave. چهار — sanitize: هر فیلد بسته به نوع. پنج — پیشوند _ در نام meta: مخفی‌کردن از باکس Custom Fields پیش‌فرض. راهنمای کامل در کار با متاباکس‌ها، پاک‌سازی داده‌ها، و اعتبارسنجی داده‌ها.

مسیر سوم: ACF و ابزارهای مشابه

Advanced Custom Fields (ACF) محبوب‌ترین ابزار فیلد سفارشی در وردپرس است. مزایا: رابط کاربری گرافیکی، پشتیبانی از انواع فیلد (تصویر، گالری، تاریخ، انتخاب، تکرارشونده)، امکان ساخت گروه فیلد برای انواع مختلف محتوا. نقطهٔ ضعف: وابستگی به افزونه. اگر ACF حذف شود، داده‌ها در دیتابیس می‌مانند ولی نمایش نیاز به کد دستی دارد. تجربه‌ام: برای پروژه‌های محتوا-محور با تیم غیرفنی، ACF انتخاب درجه‌یک است. برای پروژه‌های کوچک با دو فیلد ساده، ممکن است زیاده‌روی باشد. الگوی کار با فیلدهای سفارشی در متاباکس‌ها برای نسخهٔ دستی. یک نکتهٔ مهم: ACF داده‌ها را در همان جدول wp_postmeta ذخیره می‌کند؛ بنابراین اگر روزی افزونه را حذف کنید، داده‌ها باقی می‌مانند و می‌توانید با کد سفارشی نمایششان دهید.

مسیر چهارم: فیلد بلاکی گوتنبرگ

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

جدول تصمیم‌گیری

نیازمسیر پیشنهادی
یک فیلد ساده، پروژهٔ شخصیمتای خام
چند فیلد، نیاز به کنترل کاملمتاباکس اختصاصی
انواع مختلف فیلد، تیم غیرفنیACF
پروژهٔ مدرن، گوتنبرگفیلد بلاکی

تذکر: در هر پروژه، فقط یک مسیر را انتخاب نکنید؛ بسته به نوع فیلد، می‌توانید ترکیب کنید. مثلاً ACF برای فیلدهای محتوایی، متاباکس اختصاصی برای تنظیمات ساختاری.

امنیت فیلد سفارشی

سه قاعده: یک — nonce الزامی. دو — check_user_can الزامی. سه — sanitize بسته به نوع: sanitize_text_field برای متن، absint برای عدد، esc_url_raw برای URL، wp_kses_post برای HTML مجاز. تجربه‌ام: بیشتر آسیب‌پذیری‌های افزونه‌ها، از همین سه قاعده سرپیچی می‌آید. راهنمای کامل در PHP امن در وردپرس و امنیت وردپرس برای مبتدیان.

نمایش در قالب

نمایش فیلد سفارشی در قالب، سه نکته دارد: یک — استفاده از get_post_meta با ID صحیح: در حلقه، get_the_ID() استفاده کنید. دو — escape خروجی: esc_html برای متن، wp_kses_post برای HTML. سه — چک وجود: اگر فیلد خالی است، نمایش ندهید. الگو:

$source = get_post_meta( get_the_ID(), '_my_source', true );
if ( ! empty( $source ) ) {
    printf( '<p class="source">منبع: %s</p>', esc_html( $source ) );
}

نمایش در فایل template، یا با فیلتر the_content. الگوی فیلتر در هوک‌های محتوای نوشته.

اشتباهات رایج

  • نبود nonce و check_user_can: خطر امنیتی جدی.
  • ذخیره بدون sanitize: XSS و SQLi.
  • نبود _ در نام meta: نمایش در Custom Fields پیش‌فرض و آشفتگی.
  • نمایش بدون escape: XSS در front-end.
  • استفاده از نام‌های عمومی meta: تعارض با افزونه‌های دیگر. همیشه پیشوند.
  • نادیده‌گرفتن خالی بودن فیلد: نمایش «منبع: » بدون مقدار.
  • ذخیرهٔ آرایه در متای خام: نمایش serialize در رابط؛ همیشه از توابع سریال‌سازی استاندارد استفاده کنید.
  • نادیده‌گرفتن revision: در ویرایش نوشته، فیلد سفارشی ذخیره می‌شود ولی در revision بازیابی نمی‌شود، مگر کد اضافه کنید.

جمع‌بندی

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