วิธีการใช้งานการปรับปรุงปลั๊กอิน WordPress ที่ปรับเปลี่ยนฐานข้อมูล?


10

ฉันพัฒนาปลั๊กอิน WordPress ซึ่งมีตารางฐานข้อมูลหลายตารางของตัวเอง ปลั๊กอินสร้างตารางเหล่านี้เมื่อเปิดใช้งานและลบออกเมื่อถูกลบ / ถอนการติดตั้ง

ฉันต้องใช้กระบวนการอัปเดตของปลั๊กอินที่อัปเดตโค้ดของปลั๊กอินรวมถึงโครงสร้างตาราง กรณีที่ง่ายที่สุดคือการเพิ่มคอลัมน์ใหม่ให้กับหนึ่งในตาราง กรณีที่ซับซ้อนมากขึ้นคือการสร้างโครงสร้างตารางใหม่และปรับปรุงเนื้อหาให้สอดคล้อง

คุณจะแนะนำวิธีแก้ปัญหานี้อย่างไร? มีฟังก์ชั่น WordPress ในตัวที่อาจช่วยได้บ้าง?

คำตอบ:


4

วิธีที่ถูกต้องในการทำวันนี้คือการรวมสคีมาของคุณเป็นไฟล์ในแหล่งปลั๊กอินและใช้ฟังก์ชั่น WordPress inbuilt dbDelta () เพื่ออัปเดตฐานข้อมูลตามต้องการโดยใช้แบบแผนนั้น รหัสจริงที่ต้องการนั้นง่ายมาก:

$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );

สิ่งนี้จะสร้างและอัพเดตฐานข้อมูลให้คุณตามต้องการ เมื่อฉันตรวจสอบครั้งล่าสุดจะไม่ลบคอลัมน์เก่าที่ไม่ได้ใช้ดังนั้นคุณจะต้องใช้รหัสในการตรวจสอบเวอร์ชัน นี่เป็นคุณสมบัติที่สวยงามของ WordPress และตัวจับเวลาขนาดใหญ่ ระวังเมื่อสร้างไฟล์ schema.sql ที่คุณคัดลอกระยะห่างในการส่งออก mysql schema ตามรหัส dbDelta () จะขึ้นชื่อว่าเป็นเรื่องจุกจิกเกี่ยวกับระยะห่าง คุณควรทดสอบเวอร์ชันของฐานข้อมูลและหากไม่ใช่เวอร์ชันล่าสุดให้โทรข้างต้นเพื่ออัพเดตฐานข้อมูล คุณอาจต้องทำการอัปเดตเฉพาะเพื่อครอบคลุมการเปลี่ยนแปลงที่ dbDelta () ไม่ถูกต้อง (เช่นการลบคอลัมน์) มันง่ายที่จะเขียนตรรกะง่าย ๆ ถ้าทดสอบเพื่อดูว่ารุ่นมีการปรับปรุงและทำการปรับปรุงด้วยตนเองเหล่านี้ผ่านทาง $ wpdb ตัวอย่างเช่นคุณอาจวางคอลัมน์ที่ไม่ได้ใช้ในขณะนี้

$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
        $wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
        $wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
        . "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
        . "NOT NULL DEFAULT CURRENT_TIMESTAMP");

update_option(MY_DB_VERSION, $db_version);

สิ่งนี้ง่ายจากการรันโค้ดขอโทษถ้าฉันทำมันแตกในขั้นตอนการทำให้มันง่ายขึ้นสำหรับการตีพิมพ์

โปรดจำไว้ว่า WordPress 3.9.2 นั้น WordPress ไม่ได้เรียกใช้ฮุกการเปิดใช้งานในการอัปเดตปลั๊กอินเสมอ


ทุกวันนี้ฉันได้เริ่มใช้ DB เวอร์ชันจากเวลา mod ของไฟล์ schema.sql ซึ่งหมายความว่าเพียงแค่อัพเดตไฟล์ schema.sql ก็เพียงพอที่จะทำให้การอัพเกรดฐานข้อมูล ไม่จำเป็นต้องจำเพื่อแก้ไขเวอร์ชันฐานข้อมูล สิ่งที่ต้องการ: $ db_version = filemtime (“ schema.sql”);
Brian C

1
ดังนั้นหากเวลาไฟล์เปลี่ยนจากสิ่งภายนอกเช่นการย้ายเซิร์ฟเวอร์ mtime และเวอร์ชัน db จะเปลี่ยนไปหรือไม่?
Walf

เวลาของไฟล์มักเป็น GMT และเซิร์ฟเวอร์ต่างกันเพียงไม่กี่วินาทีดังนั้นจึงเป็นไปไม่ได้เลยที่มันจะถูกทริกเกอร์สองครั้ง อย่างไรก็ตามแม้ว่ามันจะถูกทริกเกอร์อีกครั้งไม่มีอันตรายใด ๆ เกิดขึ้นเมื่อมันทำงานเพียงครั้งเดียวและทำการเปรียบเทียบกับฐานข้อมูลสดโดยไม่ต้องเปลี่ยนอะไรเลย นี่คือสิ่งที่สวยงามเกี่ยวกับ dbDelta () - มันสามารถทำงานได้หลายครั้งโดยไม่มีปัญหา เป็นคำถามที่ดีขอบคุณ
Brian C

3

ในระยะสั้นใช่$wpdbชั้นเรียน ดู Codexสำหรับข้อมูลเพิ่มเติม

เมื่อใดก็ตามที่คุณมีปฏิสัมพันธ์กับตารางที่กำหนดเอง (หรือตารางใด ๆ จริง ๆ ) คุณควรผ่าน$wpdb- โดยเฉพาะอย่างยิ่งให้แน่ใจว่าคุณคุ้นเคยกับprepareวิธีการที่สามารถช่วยในการค้นหาและป้องกันการฉีด

คุณควรคุ้นเคยกับมันอยู่แล้วเพราะคุณควรจะใช้มันเพื่อสร้างตาราง ที่ตะขอติดตั้งคุณควรมีสิ่งต่อไปนี้:

$charset_collate = '';
if ( ! empty($wpdb->charset) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
    $charset_collate .= " COLLATE $wpdb->collate";

//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
    id bigint(20) unsigned NOT NULL auto_increment,
    column_a varchar(255) default NULL,
    column_b varchar(255) default NULL,
    PRIMARY KEY  (id)
    ) $charset_collate; ";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_custom_table);

รหัสนี้จะทำงานจริงทุกครั้งที่เปิดใช้งานปลั๊กอิน (เช่นไม่ได้ติดตั้ง) ดังนั้นมันจะทำงานเมื่อมีคนปรับปรุง plug-in โดยอัตโนมัติ หมายเหตุ:หากพวกเขาอัปเกรดโดยแทนที่ปลั๊กอินด้วยตนเอง - จะไม่ - ดังนั้นคุณจะต้องทริกเกอร์โค้ดด้านบนadmin_initเมื่อปลั๊กอินของคุณได้รับการอัพเกรด (หมายเลขร้านค้าในตารางตัวเลือกตรวจสอบเวอร์ชันปัจจุบัน) .

ตอนนี้คุณไม่ต้องการให้CREATE TABLEคำสั่ง SQL รันทุกครั้งที่คุณอัพเดตปลั๊กอิน - นี่คือที่dBDelta()มา

ก่อนเรียกใช้คำสั่งด้านบน - มันจะตรวจสอบว่ามีตารางอยู่หรือไม่ ยิ่งไปกว่านั้นมันจะตรวจสอบประเภทคอลัมน์ ดังนั้นหากตารางไม่มีอยู่มันจะสร้างขึ้นมาถ้ามี แต่มีบางคอลัมน์ที่มีการเปลี่ยนแปลงมันจะทำการอัปเดตและหากไม่มีคอลัมน์ - จะเพิ่มเข้าไป

น่าเสียดาย - หากคุณลบคอลัมน์จากด้านบนคอลัมน์นั้นจะไม่ลบคอลัมน์โดยอัตโนมัติ ในการลบคอลัมน์ / ตารางคุณต้องระบุเฉพาะDROP(ตรวจสอบว่ามีอยู่ก่อนคุณ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.