Làm cách nào để triển khai cập nhật plugin WordPress sửa đổi cơ sở dữ liệu?


10

Tôi phát triển một plugin WordPress, có một số bảng cơ sở dữ liệu riêng. Plugin tạo các bảng này khi được kích hoạt và xóa chúng khi bị xóa / gỡ cài đặt.

Tôi phải thực hiện quy trình cập nhật của plugin để cập nhật mã của plugin cũng như cấu trúc bảng. Trường hợp đơn giản nhất là thêm một cột mới vào một trong các bảng. Trường hợp phức tạp hơn sẽ là tạo cấu trúc bảng mới và cập nhật nội dung tương ứng.

Làm thế nào bạn sẽ đề nghị để giải quyết vấn đề này? Có bất kỳ chức năng WordPress tích hợp nào có thể giúp đỡ?

Câu trả lời:


4

Cách chính xác để thực hiện điều này hiện nay là đưa lược đồ của bạn dưới dạng tệp vào nguồn plugin và sử dụng hàm WordPress sẵn có dbDelta () để cập nhật cơ sở dữ liệu khi cần sử dụng lược đồ đó. Mã thực tế yêu cầu rất đơn giản:

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

Điều này sẽ tạo và cập nhật cơ sở dữ liệu cho bạn theo yêu cầu. Khi tôi kiểm tra lần cuối, nó không xóa các cột cũ không sử dụng, vì vậy bạn cần mã hóa thông qua kiểm tra phiên bản. Đây là một tính năng tuyệt vời của WordPress và một trình tiết kiệm thời gian khổng lồ. Cẩn thận khi tạo tệp giản đồ.s.s mà bạn sao chép khoảng cách trong lược đồ mysql xuất chính xác như mã dbDelta () được cho là rất phức tạp về khoảng cách. Bạn cũng nên kiểm tra phiên bản của cơ sở dữ liệu và nếu không phải là phiên bản mới nhất, hãy gọi phần trên để cập nhật cơ sở dữ liệu. Bạn cũng có thể cần thực hiện các cập nhật cụ thể để bao gồm các thay đổi mà dbDelta () không đúng (ví dụ: xóa một cột). Thật dễ dàng để viết một logic đơn giản nếu kiểm tra xem phiên bản đã được cập nhật chưa và thực hiện các cập nhật thủ công này qua $ wpdb. Chẳng hạn, bạn có thể bỏ một cột hiện không được sử dụng.

$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);

Điều này được đơn giản hóa từ việc chạy mã, xin lỗi nếu tôi đã phá vỡ nó trong quá trình đơn giản hóa nó để xuất bản.

Cũng lưu ý rằng kể từ WordPress 3.9.2, WordPress không phải lúc nào cũng chạy móc kích hoạt khi cập nhật plugin (cụ thể, nếu cập nhật hàng loạt được thực hiện từ trang Cập nhật Bảng điều khiển).


Ngày nay, tôi đã bắt đầu dùng phiên bản DB từ thời gian mod của tệp giản đồ. Điều này có nghĩa là chỉ cần cập nhật tệp lược đồ là đủ để nâng cấp cơ sở dữ liệu; không cần phải nhớ để chỉnh sửa phiên bản cơ sở dữ liệu. Một cái gì đó như: $ db_version = filemtime (giản đồ lược đồ.
Brian C

1
Vì vậy, nếu thời gian tập tin thay đổi từ một cái gì đó bên ngoài như máy chủ di chuyển, mtime và phiên bản db thay đổi?
Walf

Thời gian tập tin luôn tính theo GMT và các máy chủ hiếm khi khác nhau vài giây, do đó gần như không thể được kích hoạt hai lần bởi điều đó. Tuy nhiên, ngay cả khi nó được kích hoạt trở lại, không có tác hại nào được thực hiện khi nó chạy một lần và so sánh với DB trực tiếp, rõ ràng là không thay đổi bất cứ điều gì. Đây là điều hay về dbDelta () - nó có thể chạy nhiều lần mà không gặp vấn đề gì. Câu hỏi hay, cảm ơn.
Brian C

3

Trong ngắn hạn, có - $wpdblớp. Xem Codex để biết thêm thông tin.

Bất cứ khi nào bạn tương tác với một bảng tùy chỉnh (hoặc bất kỳ bảng nào, thực sự), bạn nên trải qua $wpdb- đặc biệt đảm bảo rằng bạn quen thuộc với preparephương pháp có thể giúp thoát khỏi các truy vấn và ngăn ngừa tiêm.

Bạn nên làm quen với nó, vì bạn nên sử dụng nó để tạo bảng. Trên hook cài đặt của bạn, bạn nên có một cái gì đó như:

$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);

Mã này thực sự được chạy bất cứ khi nào trình cắm được kích hoạt (tức là không chỉ cài đặt). Vì vậy, nó sẽ chạy khi ai đó tự động cập nhật trình cắm . Lưu ý: Nếu họ nâng cấp bằng cách thay thế trình cắm một cách thủ công - thì nó sẽ không - vì vậy bạn sẽ cần kích hoạt mã trên admin_initkhi trình cắm của bạn được nâng cấp (lưu số phiên bản trong bảng tùy chọn, kiểm tra phiên bản hiện tại) .

Bây giờ bạn thường không muốn CREATE TABLElệnh SQL chạy mỗi khi bạn cập nhật trình cắm - đây là nơi dBDelta()xuất hiện.

Trước khi chạy lệnh trên - nó kiểm tra nếu bảng tồn tại. Hơn nữa, nó kiểm tra các loại cột. Vì vậy, nếu bảng không tồn tại, nó sẽ tạo ra nó, nếu có, nhưng một số loại cột đã thay đổi, nó sẽ cập nhật chúng và nếu một cột không tồn tại - nó sẽ thêm nó.

Thật không may - nếu bạn xóa một cột ở trên, nó sẽ không tự động xóa cột. Để loại bỏ các cột / bảng bạn cần phải cụ thể DROPchúng (kiểm tra chúng tồn tại trước khi bạn làm).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.