Entity در وردپرس چیست؟ – راهنمای جامع و حرفه‌ای برای توسعه‌دهندگان (به‌روزرسانی ۲۰۲۵)

وردپرس به‌عنوان قدرتمندترین CMS جهان، تمام داده‌های خود را بر پایه مفهوم Entity (موجودیت) مدیریت می‌کند. درک دقیق این مفهوم و ارتباط آن با ساختار دیتابیس، یکی از مهم‌ترین مهارت‌های یک توسعه‌دهنده حرفه‌ای وردپرس است – به‌خصوص زمانی که برای مصاحبه‌های شغلی ارشد یا پروژه‌های بزرگ آماده می‌شوید.

در این راهنمای جامع، به‌صورت ساختاریافته و با جزئیات فنی، به بررسی Entityها، جداول مرتبط، روابط بین آن‌ها و روش ایجاد موجودیت‌های سفارشی می‌پردازیم.

Entity در وردپرس چیست؟

در معماری وردپرس، Entity به هر نوع داده‌ای گفته می‌شود که به‌صورت مستقل در دیتابیس ذخیره و مدیریت می‌شود. این موجودیت‌ها از طریق توابع API وردپرس (مانند WP_Query، WP_User_Query و …) قابل دسترسی و دستکاری هستند.

هر Entity دارای:

  • یک جدول اصلی (یا چند جدول مرتبط)
  • یک شناسه یکتا (Primary Key)
  • مجموعه‌ای از متادیتا (Meta Data)
  • روابط با سایر Entityها

۱۲ جدول اصلی دیتابیس وردپرس و ارتباط آن‌ها با Entityها

جدول Entity اصلی کلید اصلی توضیحات مهم
wp_posts Post ID هسته مرکزی – تمام محتواها (post, page, product, attachment, custom post type)
wp_postmeta Post Meta meta_id متادیتای پست‌ها (ACF، Yoast، قیمت محصول و …)
wp_users User ID اطلاعات پایه کاربران
wp_usermeta User Meta umeta_id نقش‌ها، قابلیت‌ها، فیلدهای سفارشی
wp_comments Comment comment_ID نظرات و ریپلای‌ها
wp_commentmeta Comment Meta meta_id متادیتای نظرات (امتیاز، وضعیت تأیید و …)
wp_terms Term term_id نام دسته‌ها، تگ‌ها و تاکسونومی‌های سفارشی
wp_term_taxonomy Term Taxonomy term_taxonomy_id نوع تاکسونومی (category, post_tag, product_cat و …)
wp_term_relationships Term Relationship رابطه many-to-many بین پست و ترم‌ها
wp_termmeta Term Meta meta_id متادیتای ترم‌ها (تصویر دسته، رنگ و …)
wp_options Option option_id تنظیمات سایت، افزونه‌ها، تم‌ها
wp_links Link (منسوخ) link_id بلاگ‌رول – در نسخه‌های جدید استفاده نمی‌شود

پنج Entity اصلی وردپرس

۱. Post Entity

  • جدول اصلی: wp_posts
  • فیلد کلیدی: post_type
  • انواع پیش‌فرض: post, page, attachment, revision, nav_menu_item
  • نکته مهم: تمام Custom Post Typeها نیز در همین جدول ذخیره می‌شوند.
sql
SELECT post_type, COUNT(*) as count 
FROM wp_posts 
WHERE post_status IN ('publish', 'draft', 'private')
GROUP BY post_type;

۲. User Entity

  • جداول: wp_users + wp_usermeta
  • نقش کاربر در متای wp_capabilities به‌صورت serialized ذخیره می‌شود:
php
a:1:{s:13:"administrator";b:1;}

۳. Comment Entity

  • جدول: wp_comments
  • ساختار درختی با comment_parent
  • وضعیت: 1 (تأیید)، 0 (در انتظار)، spam, trash

۴. Term Entity

  • جداول: wp_terms ←→ wp_term_taxonomy ←→ wp_term_relationships
  • یک ترم می‌تواند چندین نوع داشته باشد (category, tag, product_brand و …)

۵. Relationship Entity

  • جدول: wp_term_relationships
  • کلیدهای خارجی: object_id (post_id) و term_taxonomy_id

نمودار روابط Entityها (ERD ساده)

text
wp_posts (ID) 
    ├── post_author → wp_users(ID)
    ├── ID → wp_comments(comment_post_ID)
    ├── ID → wp_term_relationships(object_id)
    └── ID → wp_postmeta(post_id)

wp_terms(term_id) 
    └── term_id → wp_term_taxonomy(term_id)
         └── term_taxonomy_id → wp_term_relationships(term_taxonomy_id)

ایجاد Entity جدید – Custom Post Type حرفه‌ای

php
function register_course_cpt() {
    $labels = [
        'name'                  => _x('دوره‌های آموزشی', 'Post type general name', 'textdomain'),
        'singular_name'         => _x('دوره آموزشی', 'Post type singular name', 'textdomain'),
        'menu_name'             => __('دوره‌ها', 'textdomain'),
        'name_admin_bar'        => __('دوره', 'textdomain'),
    ];

    $args = [
        'label'                 => __('دوره آموزشی', 'textdomain'),
        'labels'                => $labels,
        'public'                => true,
        'show_in_rest'          => true, // فعال‌سازی Gutenberg
        'supports'              => ['title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'],
        'taxonomies'            => ['course_level', 'course_instructor'],
        'hierarchical'          => false,
        'has_archive'           => 'courses',
        'rewrite'               => ['slug' => 'course'],
        'menu_icon'             => 'dashicons-book-alt',
        'capability_type'       => 'course',
        'map_meta_cap'          => true,
    ];

    register_post_type('course', $args);
}
add_action('init', 'register_course_cpt');

افزودن متادیتا (Post Meta)

php
register_post_meta('course', 'course_price', [
    'type'         => 'number',
    'description'  => 'قیمت دوره',
    'single'       => true,
    'show_in_rest' => true,
    'auth_callback' => function() {
        return current_user_can('edit_posts');
    }
]);

register_post_meta('course', 'course_duration', [
    'type'         => 'string',
    'single'       => true,
    'show_in_rest' => true,
]);

ایجاد Taxonomy سفارشی

php
function register_course_taxonomies() {
    register_taxonomy('course_level', 'course', [
        'label'        => __('سطح دوره'),
        'hierarchical' => true,
        'show_in_rest' => true,
        'rewrite'      => ['slug' => 'course-level'],
    ]);

    register_taxonomy('course_instructor', 'course', [
        'label'        => __('مدرس'),
        'hierarchical' => false,
        'show_in_rest' => true,
    ]);
}
add_action('init', 'register_course_taxonomies');

نکات فنی پیشرفته برای توسعه‌دهندگان

۱. استفاده از $wpdb به‌جای کوئری مستقیم

php
global $wpdb;
$courses = $wpdb->get_results(
    "SELECT p.ID, p.post_title, pm.meta_value as price
     FROM {$wpdb->posts} p
     LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
     WHERE p.post_type = 'course' 
       AND pm.meta_key = 'course_price'"
);

۲. بهینه‌سازی دیتابیس

  • حذف transients منقضی شده
  • پاک‌سازی revisions و auto-drafts
  • استفاده از OBJECT storage برای فایل‌ها (نه دیتابیس)

۳. Multisite و Entityهای اضافی

در حالت شبکه‌ای، جداول جدید اضافه می‌شوند:

  • wp_blog_versions
  • wp_registration_log
  • wp_signups
  • جداول هر سایت با پیشوند جداگانه

نکات مصاحبه شغلی وردپرس (سطح Senior)

سؤال محتمل: “یک پست وردپرس در دیتابیس کجاها ذخیره می‌شود؟”

پاسخ حرفه‌ای:

یک پست در جدول wp_posts ذخیره می‌شود. عنوان و محتوا در فیلدهای post_title و post_content قرار دارد. متادیتا (مثل فیلدهای ACF) در wp_postmeta، دسته‌بندی‌ها از طریق wp_term_relationships به ترم‌ها متصل می‌شوند، نویسنده با post_author به wp_users لینک می‌شود و نظرات در wp_comments با comment_post_ID مرتبط هستند.

جمع‌بندی

  • وردپرس تمام داده‌ها را به‌صورت Entity مدیریت می‌کند
  • ۵ Entity اصلی: Post, User, Comment, Term, Relationship
  • تمام Custom Post Typeها در wp_posts ذخیره می‌شوند
  • با register_post_type، register_post_meta و register_taxonomy می‌توان موجودیت‌های پیچیده ساخت
  • درک ساختار دیتابیس و روابط بین جداول، تفاوت یک توسعه‌دهنده معمولی و حرفه‌ای است

با تسلط بر این مفاهیم، قادر خواهید بود:

  • پروژه‌های بزرگ با میلیون‌ها رکورد را مدیریت کنید
  • در مصاحبه‌های فنی Senior Developer بدرخشید
  • افزونه‌ها و تم‌های حرفه‌ای توسعه دهید