Wordpress Database Schema
Wordpress Database Schema
Table List
+———————–+ | Tables_in_map_by_kmt | +———————–+ | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_usermeta | | wp_users | +———————–+ 12 rows in set (0.000 sec)
ဒီထဲမှာ အဓိက အကျဆုံးက wp_posts
wp_posts
ဒီ Table ထဲမှာ ကိုယ့် app မှာ သုံးရမယ့် Entity တွေအကုန်လုံးလိုလိုကို သိမ်းထားတယ်။
MariaDB [map_by_kmt]> desc wp_posts; +———————–+———————+——+—–+———————+—————-+ | Field | Type | Null | Key | Default | Extra | +———————–+———————+——+—–+———————+—————-+ | ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | post_author | bigint(20) unsigned | NO | MUL | 0 | | | post_date | datetime | NO | | 0000-00-00 00:00:00 | | | post_date_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content | longtext | NO | | NULL | | | post_title | text | NO | | NULL | | | post_excerpt | text | NO | | NULL | | | post_status | varchar(20) | NO | | publish | | | comment_status | varchar(20) | NO | | open | | | ping_status | varchar(20) | NO | | open | | | post_password | varchar(255) | NO | | | | | post_name | varchar(200) | NO | MUL | | | | to_ping | text | NO | | NULL | | | pinged | text | NO | | NULL | | | post_modified | datetime | NO | | 0000-00-00 00:00:00 | | | post_modified_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content_filtered | longtext | NO | | NULL | | | post_parent | bigint(20) unsigned | NO | MUL | 0 | | | guid | varchar(255) | NO | | | | | menu_order | int(11) | NO | | 0 | | | post_type | varchar(20) | NO | MUL | post | | | post_mime_type | varchar(100) | NO | | | | | comment_count | bigint(20) | NO | | 0 | | +———————–+———————+——+—–+———————+—————-+ 23 rows in set (0.040 sec)
ဒီထဲမှာ အဓိက ကြည့်ရမှာက
MariaDB [map_by_kmt]> desc wp_posts; +———————–+———————+——+—–+———————+—————-+ | Field | Type | Null | Key | Default | Extra | +———————–+———————+——+—–+———————+—————-+ | ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | post_date_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content | longtext | NO | | NULL | | | post_title | text | NO | | NULL | | | post_excerpt | text | NO | | NULL | | | post_status | varchar(20) | NO | | publish | | | post_modified_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_parent | bigint(20) unsigned | NO | MUL | 0 | | | guid | varchar(255) | NO | | | | | post_type | varchar(20) | NO | MUL | post | | +———————–+———————+——+—–+———————+—————-+ ဒီ (၁၀) ခုလောက် ကြည့်ထားရင် အဆင်ပြေပြီ။
+———————–+———————+——+—–+———————+—————-+ | Field | Type | Description | +———————–+———————+——+—–+———————+—————-+ | ID | bigint(20) unsigned | Entity တိုင်းမှာ ပါမယ့် id | | post_date_gmt | datetime | created_at | | post_content | longtext | description | | post_title | text | title | | post_excerpt | text | sub_title | | post_status | varchar(20) | ဒါက publish ဖြစ်နေတဲ့ post တွေကိုပဲ ယူရမယ်။ | | post_modified_gmt | datetime | modified_at | | post_parent | bigint(20) unsigned | series တွေလိုမျိုး တစ်ခုနဲ့ တစ်ခု ချိတ်ထားရင် သုံးလို့ရအောင် | | guid | varchar(255) | original web link | | post_type | varchar(20) | post ကိုပဲ ယူတာများမယ် | +———————–+———————+——+—–+———————+—————-+
ဒါဆိုရင် မဖြစ်မနေ ပြကိုပြရမယ့် ဒီ (၅) ချက်ရပြီ။
- id
- title
- subtitle
- description
- created_at
- modified_at
ဒီမှာ thumbnail လိုလာပြီ။ Thumbnail ကိုလည်း များသော နောက်ထပ် Post တစ်ခု အနေနဲ့ ထည့်ထားတက်တယ်။ ဒါဆိုရင်တော့ wp_posts table ကို နောက်ထပ် wp_posts table တစ်ခုနဲ့ ထပ် join ရမယ်ဆိုပါတော့။ ဒါပေမယ့် သေချာသလားဆိုတော့ မပြောနိုင်ဘူး။ ဒီတော့ ON မှာပဲ multi-condition သုံးပြီးလုပ်ရမယ်။ condition မကိုက်ရင်တောင် ဘယ်ဘက်က အဓိက wp_posts က records တွေ ပျက်သွားမှာ မဟုတ်ဘူး။ ညာဘက်က ကောင်ကတော့ null နဲ့ ရလာလိမ့်မယ်။ ပြဿနာ မရှိဘူး။
/*
Thumbnail Column Added
*/
SELECT
wp_posts.ID AS id,
wp_posts.post_title AS title,
wp_posts.post_excerpt AS subtitle,
wp_posts.post_content AS description,
wp_posts.post_date_gmt AS created_at,
wp_posts.post_modified_gmt AS modified_at,
thumbnail.guid AS thumbnail_url
FROM
wp_posts
/* thumbnail table joined */
LEFT JOIN
wp_posts AS thumbnail
ON
wp_posts.ID = thumbnail.post_parent AND thumbnail.post_type = "attachment"
/* Critical Conditional Checking */
WHERE
wp_posts.post_status = "publish" AND
wp_posts.post_type = "post"
GROUP BY
wp_posts.ID /* to prevent duplicate posts */
ORDER BY
wp_posts.post_modified_gmt /* latest updated post come first as always */
LIMIT 0, 10; /* for pagination purpose */
အိုကေ Thumbnail တော့ ရလာပြီ။ နောက်ထပ် ဒီ post အတွက် အထောက်အကူပြု Column တွေရှိသေးတယ်။ ဒီမှာ wp_postmeta
table က ဝင်လာတယ်။
MariaDB [map_by_kmt]> desc wp_postmeta;
+————+———————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————+———————+——+—–+———+—————-+
| meta_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| post_id | bigint(20) unsigned | NO | MUL | 0 | |
| meta_key | varchar(255) | YES | MUL | NULL | |
| meta_value | longtext | YES | | NULL | |
+————+———————+——+—–+———+—————-+
4 rows in set (0.003 sec)
ဒီကောင်က wordpress table တွေထဲမှာ အရိုးရှင်းဆုံး ပြောရမယ်။ ချိတ်ဆက်တဲ့ နေရာမှာ ပြောပါတယ်။ သူတို့ရဲ့ ဆက်သွယ်ချက်က
wp_postmeta.post_id = wp_posts.ID
ဉပမာ ဒီ post က Featured Flag ဖွင့်ထားသလား ဖွင့်မထားဘူးလား? ဒါလည်း ကြည့်နိုင်မယ်။ နောက် တစ်ခြား custom field တွေအကုန် ထည့်ထားလို့ရမယ်။ ဉပမာ ဗီဒီယို post တွေမှာ ဆိုရင် duration ပါမယ်။ post_views_count လိုမျိုး ဘယ်နှစ်ခါ ကြည့်သွားပြီလဲ ပါမယ်။
+————+———————+——+—–+———+—————-+ | Field | Type | Description | +————+———————+——+—–+———+—————-+ | meta_id | bigint(20) unsigned | id လောလောဆယ်သုံးတာ မတွေ့သေးဘူး | | post_id | bigint(20) unsigned | wp_posts.id ကို ညွှန်းထားတာ | | meta_key | varchar(255) | ထပ်ဖြည့်ချင်တဲ့ column name | | meta_value | longtext | column | +————+———————+——+—–+———+—————-+
ဒီတော့ field တစ်ခု လိုချင်တယ် တိုးချင်တယ် ဆိုရင်
/*
Thumbnail Column Added
One custom field, duration Added
One more custom field and set default value using
*/
SELECT
wp_posts.ID AS id,
wp_posts.post_title AS title,
wp_posts.post_excerpt AS subtitle,
wp_posts.post_content AS description,
wp_posts.post_date_gmt AS created_at,
wp_posts.post_modified_gmt AS modified_at,
thumbnail.guid AS thumbnail_url,
/* duration.meta_value AS duration, */
IFNULL(duration.meta_value, 0) AS post_views_count,
/* ISNULL(post_views_count.meta_value, 0), */
IFNULL(post_views_count.meta_value, 0) AS post_views_count
FROM
wp_posts
/* thumbnail table joined */
LEFT JOIN
wp_posts AS thumbnail
ON
wp_posts.ID = thumbnail.post_parent AND thumbnail.post_type = "attachment"
/* duration table joined */
/* ဆိုလိုတာက "duration" column ရှိရင် လာ Join လှည့်၊ မရှိရင် null ပေါ့ */
LEFT JOIN
wp_postmeta AS duration
ON
wp_posts.ID = duration.post_id AND duration.meta_key = "duration"
/* post_views_count table joined */
/* ဆိုလိုတာက "post_views_count" column ရှိရင် လာ Join လှည့်၊ မရှိရင် null ပေါ့ */
/* မ null ပဲ default value တစ်ခုခု ပေးထားချင်ရင် ဘယ်လို လုပ်ကြမလဲ? ဒါက Google မှာ ပြန်ရှာရမယ့် သဘော */
/* TODO: how to set default value for column if it is null */
LEFT JOIN
wp_postmeta AS post_views_count
ON
wp_posts.ID = post_views_count.post_id AND post_views_count.meta_key = "post_views_count"
/* Critical Conditional Checking */
WHERE
wp_posts.post_status = "publish" AND
wp_posts.post_type = "post"
GROUP BY
wp_posts.ID /* to prevent duplicate posts */
ORDER BY
wp_posts.post_modified_gmt /* latest updated post come first as always */
LIMIT 0, 10; /* for pagination purpose */
အိုကေ ဒီတော့ Custom Column တွေကိုလည်း left join တစ်ခုနဲ့ စိတ်ကြိုက် ထပ်တိုးလို့ရပြီ။ ဘာကျန်ဉီးမလဲ? မထင်နဲ့ ဆရာ အခုမှ Table (၂) ခုပဲ ရှိသေးတယ်။ နောက်ထပ် Table (၃) (၄) ခုလောက် ကြည့်ဖို့ ရှိဉီးမယ်။
JSON-PHP-MYSQL-TEXT
ဒီ format ကို လည်း encode, decode လုပ်ရမယ်။ a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:1:{s:15:”162.158.162.102”;i:1657297449;}s:15:”162.158.162.170”;i:1657302288;}s:14:”162.158.163.21”;i:1657304017;}s:13:”172.68.210.32”;i:1658440811;}s:13:”172.70.147.78”;i:1658459884;}s:15:”162.158.146.250”;i:1658470435;}s:14:”172.70.246.194”;i:1658474913;}s:13:”172.70.147.78”;i:1658475109;}s:12:”172.70.90.94”;i:1658476408;}s:15:”162.158.162.102”;i:1658502028;}s:13:”172.70.147.76”;i:1658504646;}s:13:”172.70.147.64”;i:1658512326;}s:12:”172.71.98.98”;i:1658570483;}s:14:”172.70.142.228”;i:1658573246;}s:14:”141.101.76.164”;i:1658579467;}s:13:”172.70.147.78”;i:1658580758;}s:15:”162.158.170.100”;i:1658586058;}s:15:”162.158.162.156”;i:1658586431;}s:13:”172.70.147.64”;i:1658588590;}s:13:”172.70.143.41”;i:1658589961;}s:11:”172.70.93.8”;i:1658591202;}s:14:”172.71.114.156”;i:1658592843;}s:15:”162.158.162.110”;i:1658594311;}s:14:”172.70.189.123”;i:1658597049;}s:12:”172.70.34.58”;i:1658630151;}s:14:”172.71.102.122”;i:1658640164;}s:15:”162.158.170.110”;i:1658675994;}s:14:”172.70.116.150”;i:1658676865;}
$serializedString = "a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:2:{i:0;a:1:{s:15:"162.158.162.102";i:1657297449;}s:15:"162.158.162.170";i:1657302288;}s:14:"162.158.163.21";i:1657304017;}s:13:"172.68.210.32";i:1658440811;}s:13:"172.70.147.78";i:1658459884;}s:15:"162.158.146.250";i:1658470435;}s:14:"172.70.246.194";i:1658474913;}s:13:"172.70.147.78";i:1658475109;}s:12:"172.70.90.94";i:1658476408;}s:15:"162.158.162.102";i:1658502028;}s:13:"172.70.147.76";i:1658504646;}s:13:"172.70.147.64";i:1658512326;}s:12:"172.71.98.98";i:1658570483;}s:14:"172.70.142.228";i:1658573246;}s:14:"141.101.76.164";i:1658579467;}s:13:"172.70.147.78";i:1658580758;}s:15:"162.158.170.100";i:1658586058;}s:15:"162.158.162.156";i:1658586431;}s:13:"172.70.147.64";i:1658588590;}s:13:"172.70.143.41";i:1658589961;}s:11:"172.70.93.8";i:1658591202;}s:14:"172.71.114.156";i:1658592843;}s:15:"162.158.162.110";i:1658594311;}s:14:"172.70.189.123";i:1658597049;}s:12:"172.70.34.58";i:1658630151;}s:14:"172.71.102.122";i:1658640164;}s:15:"162.158.170.110";i:1658675994;}s:14:"172.70.116.150";i:1658676865;}";
$test = unserialize($data);
var_dump($test);