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ها نیز در همین جدول ذخیره میشوند.
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 ذخیره میشود:
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 ساده)
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 حرفهای
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)
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 سفارشی
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 بهجای کوئری مستقیم
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 بدرخشید
- افزونهها و تمهای حرفهای توسعه دهید
