WP Table Postmeta Custom
create table custom postmeta and new function
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/mynameispond/wp-table-postmeta-custom/archive/refs/heads/main.zipReadme
WP Table Postmeta Custom
เวอร์ชัน: 1.2.0
ปลั๊กอิน WordPress สำหรับสร้างและใช้งานตาราง postmeta แยกตาม slug เช่น product, seo_data, campaign2026 เพื่อแยกกลุ่มข้อมูลออกจาก wp_postmeta หลัก และมีเครื่องมือหลังบ้านสำหรับจัดการตาราง, index, import/export และ sync ข้อมูล
ปลั๊กอินจะไม่สร้างตาราง custom อัตโนมัติหลัง activate ต้องสร้าง slug เองในหน้า admin ก่อนใช้งาน
API หลัก
ปลั๊กอินใช้ helper API กลางชุดเดียว:
wppc_get_post_meta()
wppc_update_post_meta()
wppc_delete_post_meta()
wppc_get_post_custom()
wppc_get_post_meta_batch()
wppc_update_post_meta_batch()
wppc_delete_post_meta_batch()
ค่า meta_value จะถูกเก็บและอ่านกลับเป็น string เสมอ ถ้าส่ง array/object เข้าไป ระบบจะแปลงเป็น JSON string ก่อนบันทึก
WP_Query
ใช้ argument รูปแบบนี้เพื่อ query จากตาราง custom:
meta_query_wppc-{table_slug}
ตัวอย่าง query จากตาราง product:
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query_wppc-product' => array(
array(
'key' => 'price',
'value' => '100',
'compare' => '>=',
'type' => 'NUMERIC',
),
),
));
ความสามารถหลัก
- สร้างตาราง custom postmeta ได้หลายตารางในรูปแบบ
{$wpdb->prefix}postmeta_<slug> - สร้างและลบตารางจากหน้า admin ได้
- จัดการข้อมูลในตาราง custom และ
wp_postmetaหลักได้จากหน้า admin: เพิ่ม, แก้ไข, ลบทีละรายการ, ค้นหาตามpost_id,meta_key,meta_valueและแบ่งหน้า - อ่าน/เขียน/ลบ meta ผ่าน helper API กลางชุด
wppc_* - บังคับ unique key ระหว่าง
post_idและmeta_key - Query post จากตาราง custom ผ่าน
WP_Query - ใช้ร่วมกับ
meta_queryปกติของ WordPress ได้ - เพิ่ม/ลบ index จาก preset ได้
- Import/Export ข้อมูลเป็น JSON หรือ CSV
- Sync ข้อมูลกับ
wp_postmetaได้แบบ batch/cursor - มี nonce และ capability check สำหรับ action หลังบ้าน
ความต้องการระบบ
- WordPress ที่มี
$wpdbและระบบ admin ปกติ - PHP ที่รองรับ syntax แบบ WordPress plugin มาตรฐาน
- MySQL/MariaDB ที่รองรับ table/index ตามโครงสร้างของ WordPress
- ผู้ใช้งานหน้า admin ของปลั๊กอินต้องมี capability
manage_options
การติดตั้ง
- วางไฟล์ปลั๊กอินไว้ในโฟลเดอร์
wp-content/plugins/wp-table-postmeta-custom/ - เข้าเมนู
Pluginsใน WordPress admin - กด
Activate - ไปสร้าง slug ที่
Tools > WP Postmeta Custom > รายการประเภทตาราง
หลัง activate จะยังไม่มีตาราง postmeta_<slug> ใด ๆ จนกว่าจะสร้าง slug เอง
เริ่มใช้งานเร็ว
- ไปที่
Tools > WP Postmeta Custom > รายการประเภทตาราง - สร้าง slug เช่น
product - ระบบจะสร้างตาราง:
{$wpdb->prefix}postmeta_product
- บันทึกข้อมูล:
wppc_update_post_meta('product', 123, 'price', '199.50');
- อ่านข้อมูล:
$price = wppc_get_post_meta('product', 123, 'price');
- Query post จากข้อมูลในตาราง
product:
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query_wppc-product' => array(
array(
'key' => 'price',
'value' => '100',
'compare' => '>=',
'type' => 'NUMERIC',
),
),
));
แนวคิดหลัก
Table slug
slug คือชื่อสั้น ๆ ที่ใช้ต่อท้ายชื่อตาราง custom
ถ้า slug คือ:
product
ตารางจริงจะเป็น:
{$wpdb->prefix}postmeta_product
Helper API
การอ่าน/เขียน/ลบข้อมูลให้เรียกผ่าน helper กลาง และส่ง slug เป็น argument แรกเสมอ:
wppc_update_post_meta('product', 123, 'color', 'blue');
$color = wppc_get_post_meta('product', 123, 'color');
wppc_delete_post_meta('product', 123, 'color');
Unique Key
ทุกตาราง custom บังคับ unique key ระหว่าง:
post_id + meta_key
ดังนั้น wppc_update_post_meta('product', 123, 'price', '199.50') จะเขียนไปยังแถวเดียวของ post_id = 123 และ meta_key = price เสมอ
โครงสร้างตาราง
ทุกตาราง custom ใช้โครงสร้างหลัก:
meta_id bigint unsigned auto increment
post_id bigint unsigned
meta_key varchar(191)
meta_value longtext
index เริ่มต้น:
PRIMARY KEY (meta_id)UNIQUE KEY uniq_post_id_meta_key (post_id, meta_key)KEY meta_key (meta_key)
กติกา slug
slug ใช้สำหรับสร้างชื่อตาราง
กติกาที่อนุญาต:
- ต้องขึ้นต้นด้วยตัวอักษร
a-z - ใช้ได้เฉพาะ
a-z,0-9,_ - ระบบจะแปลงเป็น lowercase
- ชื่อตารางจริงต้องไม่ยาวเกินข้อจำกัดของ MySQL
ตัวอย่าง slug ที่ถูกต้อง:
productproduct_metacampaign2026seo_data
ตัวอย่าง slug ที่ไม่ถูกต้อง:
1productproduct-metaproduct metaสินค้า
เมนูหลังบ้าน
เมนูหลักอยู่ที่:
Tools > WP Postmeta Custom
หน้าในระบบ:
ภาพรวม: แสดงจำนวนตาราง, จำนวนแถวรวม และ versionรายการประเภทตาราง: สร้างและลบตารางตาม slugจัดการข้อมูล: เลือกตาราง custom หรือwp_postmetaหลักเพื่อค้นหาและจัดการข้อมูลนำเข้า/ส่งออก: ย้ายข้อมูลด้วยไฟล์ CSV/JSON ระหว่างตาราง custom และตารางหลัก
การสร้างตารางใหม่
ไปที่:
Tools > WP Postmeta Custom > รายการประเภทตาราง
กรอก slug เช่น:
product
ระบบจะสร้างตาราง:
{$wpdb->prefix}postmeta_product
และ register slug ไว้ใน option:
wppc_table_registry
ถ้าสร้างตารางไม่สำเร็จ ระบบจะไม่ register slug นั้น
การลบตาราง
ลบได้ทุก slug ที่สร้างไว้
เมื่อลบสำเร็จ ระบบจะ:
DROP TABLEตารางนั้น- ลบ slug ออกจาก registry
- ลบ sync state ของ slug นั้น
ถ้า DROP TABLE ไม่สำเร็จ ระบบจะไม่ลบ registry/sync state
Helper API
อ่านค่า
wppc_get_post_meta($table_slug, $post_id, $meta_key, $from_main = false);
ตัวอย่าง:
$color = wppc_get_post_meta('product', 123, 'color');
wppc_get_post_meta() จะคืนค่า meta_value เป็น raw string จากฐานข้อมูลเสมอ ไม่มีการ maybe_unserialize() และไม่มีการ decode JSON อัตโนมัติ
ถ้า $from_main = true และไม่พบค่าในตาราง custom ระบบจะ fallback ไปอ่าน raw string จาก wp_postmeta
$color = wppc_get_post_meta('product', 123, 'color', true);
เพิ่มหรืออัปเดตค่า
wppc_update_post_meta($table_slug, $post_id, $meta_key, $meta_value);
ตัวอย่าง:
wppc_update_post_meta('product', 123, 'color', 'blue');
ถ้าตารางยังไม่มีอยู่ ระบบจะพยายามสร้างตารางก่อนบันทึก
ค่าที่ส่งเข้า wppc_update_post_meta() จะถูกแปลงก่อนเก็บดังนี้:
- string, number และ scalar อื่น ๆ จะถูก cast เป็น string
trueจะเก็บเป็น1falseและnullจะเก็บเป็นค่าว่าง- array/object จะถูกแปลงเป็น JSON string
ลบค่า
wppc_delete_post_meta($table_slug, $post_id, $meta_key, $meta_value = null);
ลบแถวของ key นั้น:
wppc_delete_post_meta('product', 123, 'color');
ลบเฉพาะเมื่อค่าตรงกัน:
wppc_delete_post_meta('product', 123, 'color', 'blue');
อ่าน meta ทั้งหมดของโพสต์ (Batch Custom Meta)
wppc_get_post_custom($table_slug, $post_id);
ตัวอย่าง:
$all_meta = wppc_get_post_custom('product', 123);
// ได้ผลลัพธ์เป็น associative array: array('price' => '199.50', 'color' => 'blue', ...)
อ่านเฉพาะชุด key ที่ระบุแบบ Batch
wppc_get_post_meta_batch($table_slug, $post_id, array $meta_keys);
ตัวอย่าง:
$meta = wppc_get_post_meta_batch('product', 123, array('price', 'color'));
// ได้ผลลัพธ์: array('price' => '199.50', 'color' => 'blue')
เพิ่มหรืออัปเดตข้อมูลแบบ Batch (Transaction)
wppc_update_post_meta_batch($table_slug, $post_id, array $meta_data);
ตัวอย่าง:
$result = wppc_update_post_meta_batch('product', 123, array(
'price' => '250.00',
'color' => 'red',
'sku' => 'SKU-RED-123',
));
// $result = array('updated' => 3, 'keys' => array('price', 'color', 'sku'))
ลบข้อมูลชุด key แบบ Batch
wppc_delete_post_meta_batch($table_slug, $post_id, array $meta_keys);
ตัวอย่าง:
$deleted_count = wppc_delete_post_meta_batch('product', 123, array('color', 'sku'));
// คืนค่าจำนวนแถวที่ถูกลบจริง
WP_Query
ใช้ meta_query_wppc-{table_slug} เพื่อกรอง post ด้วย meta จากตาราง custom
ตัวอย่างพื้นฐาน
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query_wppc-product' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => '=',
),
),
));
ใช้ relation
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query_wppc-product' => array(
'relation' => 'OR',
array(
'key' => 'color',
'value' => 'blue',
'compare' => '=',
),
array(
'key' => 'size',
'value' => 'large',
'compare' => '=',
),
),
));
ใช้ร่วมกับ meta_query ปกติ
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS',
),
),
'meta_query_wppc-product' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => '=',
),
),
));
ใช้หลายตาราง custom พร้อมกัน
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query_wppc-product' => array(
array(
'key' => 'price',
'value' => '100',
'compare' => '>=',
'type' => 'NUMERIC',
),
),
'meta_query_wppc-seo_data' => array(
array(
'key' => 'indexable',
'value' => '1',
'compare' => '=',
),
),
));
compare ที่รองรับ
=!=>>=<<=LIKENOT LIKEINNOT INBETWEENNOT BETWEENEXISTSNOT EXISTS
type/cast ที่รองรับ
CHARBINARYSIGNEDUNSIGNEDDECIMAL(20,6)DATEDATETIMETIMENUMERICจะถูก map เป็นSIGNED
ตัวอย่าง query ตัวเลข:
$query = new WP_Query(array(
'post_type' => 'post',
'meta_query_wppc-product' => array(
array(
'key' => 'price',
'value' => '100',
'compare' => '>=',
'type' => 'NUMERIC',
),
),
));
ค้นหาข้อมูลหลังบ้าน
หน้า จัดการข้อมูล มีแท็บ wp_postmeta หลัก และแท็บของตาราง custom แต่ละ slug พร้อมช่องค้นหาแยกกัน:
post_id: ค้นหาแบบตรงตัวmeta_key: ค้นหาแบบ partial match ด้วยLIKEmeta_value: ค้นหาแบบ partial match ด้วยLIKE
ถ้ากรอกหลายช่อง ระบบจะใช้เงื่อนไขแบบ AND และแสดงผลหน้าละ 20 รายการ โดยเรียง meta_id จากใหม่ไปเก่า
สำหรับ wp_postmeta หลัก:
- ต้องระบุคำค้นอย่างน้อยหนึ่งช่อง ระบบจะไม่สแกนทั้งตารางทันทีเมื่อเปิดแท็บ
- เพิ่มข้อมูลได้เฉพาะ post ที่มีอยู่และผู้ใช้มีสิทธิ์แก้ไข
- WordPress อนุญาตให้ post เดียวมี
meta_keyซ้ำกันได้ การเพิ่มจากหน้านี้จึงไม่บังคับ unique key - แก้ไขได้ทีละรายการ โดย
post_idถูกล็อกหลังสร้าง และแก้ได้เฉพาะmeta_keyกับmeta_value - ลบได้ทีละรายการ ไม่มี bulk delete และไม่มีคำสั่งล้างข้อมูลทั้งตาราง
- ค่า string/scalar และ JSON string แก้ไขได้ ส่วนค่า PHP serialized สามารถค้นหาและลบได้ แต่ไม่อนุญาตให้เพิ่มหรือแก้ไขจาก textarea เพื่อป้องกันข้อมูลเสียรูป
Index Manager
ไปที่:
จัดการข้อมูลตาราง > จัดการดัชนี (Index)
ตารางจะมี unique index uniq_post_id_meta_key อยู่แล้วและลบผ่านหน้า admin ไม่ได้
Preset ที่เพิ่มได้:
idx_meta_key_post_id:(meta_key, post_id)idx_post_id_meta_key_value:(post_id, meta_key, meta_value(191))
คำแนะนำ:
- ถ้าค้นหาตาม
post_id + meta_keyใช้ unique index ที่มีอยู่แล้ว - ถ้าค้นหาตาม
meta_keyก่อน แล้วค่อยกรองpost_idให้เพิ่มidx_meta_key_post_id - ถ้ากรองค่า
meta_valueสั้น ๆ ด้วย ให้พิจารณาidx_post_id_meta_key_value
Import / Export
ไปที่:
จัดการข้อมูลตาราง > นำเข้า/ส่งออกข้อมูล
รองรับ:
- JSON
- CSV
ขนาดไฟล์นำเข้าสูงสุด:
10MB
คอลัมน์/field ขั้นต่ำที่ต้องมี:
post_idmeta_keymeta_value
Import จะ upsert ตาม unique key post_id + meta_key
Export JSON
JSON export จะส่งค่า raw string ใน meta_value
ตัวอย่าง:
[
{
"meta_id": "1",
"post_id": "123",
"meta_key": "config",
"meta_value": "{\"enabled\":true,\"limit\":10}"
}
]
Export CSV
CSV export จะส่งค่า raw string ใน meta_value
ตัวอย่าง header:
meta_id,post_id,meta_key,meta_value
Import JSON
ตัวอย่าง:
[
{
"post_id": 123,
"meta_key": "color",
"meta_value": "blue"
},
{
"post_id": 123,
"meta_key": "config",
"meta_value": {
"enabled": true,
"limit": 10
}
}
]
ถ้า meta_value เป็น array/object ระบบจะแปลงเป็น JSON string ก่อนบันทึก
Import CSV
ตัวอย่าง:
post_id,meta_key,meta_value
123,color,blue
123,size,large
CSV จะอ่านทุกค่าเป็น string ตามเนื้อหาในไฟล์
Sync กับ wp_postmeta
ไปที่:
จัดการข้อมูลตาราง > ซิงก์ข้อมูลกับ wp_postmeta
ทิศทางที่รองรับ:
from_main: จากwp_postmetaไปตาราง customto_main: จากตาราง custom ไปwp_postmeta
การทำงาน:
- ทำงานเป็น batch
- ใช้
cursorจากmeta_id - ตั้ง batch size ได้ระหว่าง
10ถึง1000 - เก็บสถานะ
running,direction,cursor,copied,skipped,last_message - กด run batch ได้ทีละรอบ
- reset sync state ได้
- sync จะ upsert ตาม unique key
post_id + meta_key
ข้อควรระวัง:
- Sync เป็นการกดรันจากหน้า admin ยังไม่มี cron อัตโนมัติ
- ควรทดสอบบน staging ก่อน sync ข้อมูลจำนวนมาก
Security และ Validation
ปลั๊กอินมีการป้องกันหลัก ๆ ดังนี้:
- ทุกหน้า admin ตรวจ
current_user_can('manage_options') - ทุก action admin ใช้ nonce ผ่าน
check_admin_referer() - ทุก AJAX action ตรวจ nonce และ capability แยกกัน
- แหล่งข้อมูลยอมรับเฉพาะ
customหรือmainและชื่อตารางหลักมาจาก$wpdb->postmetaฝั่งเซิร์ฟเวอร์ - การเพิ่ม แก้ไข และลบทีละรายการใน Data Manager ของ
wp_postmetaหลักตรวจสิทธิ์ของ post เป้าหมาย และใช้ WordPress Metadata API เพื่อรักษา hooks กับ object cache - slug ถูก validate ด้วย regex
- table name และ index name ถูก escape เป็น SQL identifier
- input จาก admin ใช้
wp_unslash()และ sanitize ตามชนิดข้อมูล - output หลังบ้านใช้
esc_html(),esc_attr(),esc_url(),esc_textarea() - export ต้องผ่าน nonce URL
Option ที่ใช้
ปลั๊กอินเก็บข้อมูลสถานะใน WordPress options:
wppc_table_registry
wppc_sync_state