8. Xây dựng WordPress plugin nâng cao

Mọi thứ sẽ bắt đầu khó khăn hơn kể từ bài xây dựng WordPress plugin nâng cao, nếu như bạn không xem kỹ kiến thức ở các bài trước thì tôi cam đoan bạn sẽ dễ dàng bỏ cuộc, lý do vì sao tôi lại nói như vậy ? Vì bài này thuộc dạng nâng cao và xử lý mã php nhiều hơn các bài trước, và nó có mối liên kết mật thiết với các bài kế tiếp. Như vậy ở bài xây dựng WordPress plugin căn bản thì tôi đã hướng dẫn bạn tạo thành công plugin đơn giản chỉ với một file duy nhất. Nội dung trong bài viết này thì tôi sẽ hướng dẫn bạn viết một plugin với tập hợp các file trong một folder, nó thuộc dạng plugin phức tạp và có tương tác với cơ sở dữ liệu.

Kết thúc bài này thì bạn sẽ được học những kiến thức sau.

· Các hàm xác định đường dẫn trong WordPress

· Hook Active kích hoạt plugin

· Giới thiệu biến toàn cục $wpdb, thao tác với database (Insert, Delete, Update)

· Hàm add_option để thêm một trường vào table bất kì trong hệ thống WordPress

· Hàm delete_option để xóa trường đã truyền vào table (Kết hợp với Hoọk Uninstall)

· Hook Deactive vô hiệu hóa plugin

· Hook Uninstall để xóa toàn bộ plugin (Bao gồm folder & database)

Rất nhiều kiến thức được truyền đạt trong bài này, vì thế tôi sẽ cố gắng viết thật dễ hiểu để bạn có thể thao tác thành công và không gặp trục trặc vấn đề gì.

1/ Hàm xác định đường dẫn trong WordPress

Ok, trước khi vào chủ đề chính ở mục này thì chắc hẳn nếu bạn nào đã từng học lập trình php thì sẽ được biết một hằng số dùng để xác định đường dẫn vật lý tuyệt đối từ folder trên máy tính của bạn.

Cú pháp hàm:

dirname(__FILE__);

Để hiểu rõ hoạt động của đoạn code trên thì bạn cần phải xây dựng cấu trúc plugin với tập hợp nhiều file trong một plugin, ở bài trước tôi cũng đã đề cập đến vấn đề kết hợp tiền tố để đặt tên cho plugin, điều này sẽ giúp bạn tránh khỏi các lỗi không mong muốn do xung đột hàm trong hệ thống WordPress.

Ở ví dụ này thì tôi sẽ tạo ra plugin có tên là lionel-myplugin, đây là folder chứa các file xử lý.

Ví dụ tôi tên Lionel vậy tiền tố bắt đầu sẽ là lionel_myplugin_tenham, bạn cũng có thế viết tắt đơn giản như là lionel_mp_tenham, vậy thì bạn sẽ có cấu trúc plugin như sau.

Cấu trúc plugin nâng cao

lionel-myplugin – css – js – includes – images – uninstall.php – lionel-myplugin.php (File xử lý chính của plugin)

Bạn vào htdocs nếu bạn xài xampp, vào folder wordpress tiếp đến vào folder wp-content và mở folder plugin ra, tạo ra folder lionel-myplugin giống với cấu trúc ở trên.

Tiếp đến bạn khai báo cấu hình cho plugin bằng đoạn code sau, cái này thì ở bài trước tôi có đề cập rồi nên sẽ không cần giải thích lại.

1

2

3

4

5

6

7

8

9

10

11

12

13

<?php

/**

* @package Lionel MyPlugin

* @version 1.0

*/

/*

Plugin Name: Lionel MyPlugin

Plugin URI: http://laptrinhweb.org

Description: Quá trình xử lý plugin đầu tiên của lionel.

Author: Lionel

Version: 1.0

Author URI: http://laptrinhweb.org

*/

Sau đó bạn đăng nhập vào trang quản trị bằng đường dẫn http://localhost/wordpress/wp-admin, với tài khoản và mật khẩu mà bạn đã khai báo ở quá trình cài đặt WordPress.

Sau khi đăng nhập vào trang quán trị thì bạn nhìn ở menu bên trái thấy chữ Plugins thì click vào còn không copy đường dẫn http://localhost/wordpress/wp-admin/plugins.php này paste lên thanh địa chỉ của trinh duyêt.

Active WordPress plugin lionel-myplugin

Bạn dễ dàng nhận ra rằng plugin Lionel Myplugin đã hiện hữu ở phần quản lý plugin rồi. Bạn cần Active plugin để làm việc.

Đường đẫn tuyệt đối:

Ok, bây giờ thì bạn có thể kiểm tra xem hàm dirname() hoạt động ra sao, để việc kiểm tra diễn ra suôn sẽ thì bạn vào folder css nằm trong folder lionel-myplugin tạo ra file style.css.

Tiếp đó bạn sẽ dùng hằng số này để show giá trị đường dẫn vật lý tuyệt đối gọi đến file style.css vừa tạo ra.

1

echo dirname(__FILE__) . '/css/style.css';

Bạn F5 lại trình duyệt nhìn lên trên phần đầu của trang quản trị thì sẽ thấy kết quả -> C:\xampp\htdocs\wordpress\wp-content\plugins\lionel-myplugin/css/style.css , như vậy bạn vừa lấy ra đường dẫn tuyệt đối một cách chính xác nhất.

Đây chỉ là một ví dụ nhỏ về đường dẫn tuyệt đối thông qua hàm dirname(), hàm này bắt buộc bạn phải truyền vào một tham số, hằng số __FILE__ sẽ lấy đúng vị trí folder bạn đang làm việc.

Vậy câu hỏi đặt ra là WordPress có hỗ trợ bạn các hàm tương tự như vậy không ? câu trả lời là có và bạn sẽ được trải nghiệm ở đoạn code sau.

1

echo plugin_dir_path(__FILE__);

Kết quả trình duyệt in ra là C:\xampp\htdocs\wordpress\wp-content\plugins\lionel-myplugin/, như vậy bạn có thể hiểu nôm na rằng hàm plugin_dir_path() sẽ lấy ra đường dẫn tuyệt đối của folder chứa plugin.

Phần đường dẫn tuyệt đối thế này là tạm ổn rồi.

Đường dẫn tương đối:

Vậy đường dẫn tương đối khác đường dẫn tuyệt đối như thế nào ? nếu đường dẫn tuyệt đối gọi đến thư mục chứa plugin , thì đường dẫn tương đối sẽ gọi tới chính xác tên file nằm trong thư mục plugin mà bạn cần lấy.

Hàm plugins_url() sẽ bao gồm 2 tham số, tham số đầu tiên là vị trí file bạn muốn lấy, tham số thứ hai là tên plugin, vậy tôi có đoạn code như sau.

1

echo plugins_url('css/style.css', __FILE__);

Kết quả trình duyệt trả về sẽ là http://localhost/wordpress/wp-content/plugins/lionel-myplugin/css/style.css, để lý giải cho đoạn code trên thì __FILE__ là hằng số chỉ folder chứa file php đang gọi hàm. Do tham số thứ hai là tên folder của plugin nên bạn cần dùng hằng số này để nó lấy tự đông tên folder.

Vậy bạn có thể hiểu đại loại là đường dẫn tuyệt đối là những đường dẫn tới folder plugin nằm trong khu vực localhost của bạn, còn đường dẫn tương đối là đường dẫn tới những file mà bạn muốn gọi ra để thể hiện nội dung file đó trên trình duyệt. Ví dụ như nạp file CSS chẳng hạn.

Tôi sẽ giới thiệu bạn vài hàm hỗ trợ lấy đường dẫn tương đối khác mà WordPress hỗ trợ.

· includes_url() – đường dẫn tương đối tới các file nằm ở folder wp-includes

· content_url() – đường dẫn tương đối tới các file nằm ở folder wp-content

· admin_url() – đường dẫn tương đối các file nằm ở folder wp-admin

Ví dụ về hàm includes_url():

1

echo includes_url('/css/editor.css');

Kết quả: http://localhost/wordpress/wp-includes/css/editor.css

Ví dụ về hàm content_url():

1

echo content_url('/plugins/lionel-myplugin/css/style.css');

Kết quả: http://localhost/wordpress/wp-content/plugins/lionel-myplugin/css/style.css

Ví dụ về hàm admin_url():

1

echo admin_url('/css/common.css');

Kết quả: http://localhost/wordpress/wp-admin/css/common.css

Bạn có thể kiểm tra xem việc lấy đường dẫn tuyệt đối của 3 hàm trên có đúng hay không bằng cách copy link vào trình duyệt và tự kiểm nghiệm nhé.

2/ Hook active plugin trong WordPress

Chắc hẳn bạn sẽ hỏi tôi rằng, cái hook active này là gì vậy ? không phải là đã kích hoạt plugin được rồi hay sao ? Vì bạn đang xây dựng plugin nâng cao nên cần phải tương tác với csdl, nếu với plugin đơn giản chỉ cần show ra câu thông báo thì active một phát là plugin nó chạy vù vù.

Hook này sẽ giúp bạn đăng ký plugin và thêm dữ liệu vào hệ thống WordPress, bao gồm thêm vào database một table, thêm một trường vào table optionss của database.

Cú pháp:

1

register_activation_hook(__FILE__, "lionel_mp_active");

Hàm này bao gồm 3 tham số, tham số đầu tiên là folder plugin bạn đang xử lý, tham số thứ hai là tên hàm dùng để active plugin, tham số thứ ba sẽ được giải thích bên dưới.

Bây giờ tôi muốn thêm trường ( field) vào trong table options , vậy chúng ta có đoạn code sau.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?php

/**

* @package Lionel MyPlugin

* @version 1.0

*/

/*

Plugin Name: Lionel MyPlugin

Plugin URI: http://laptrinhweb.org

Description: Quá trình xử lý plugin đầu tiên của lionel.

Author: Lionel

Version: 1.0

Author URI: http://laptrinhweb.org

*/

register_activation_hook(__FILE__, "lionel_mp_active");

function lionel_mp_active(){

$lio = '1.0';

add_option('lionel_mp_version', $lio, '');

}

Do ở hook active bạn đăng ký tên hàm là lionel_mp_active nên bạn buộc phải tạo ra hàm đỏ. Với đoạn code này thì tôi sẽ thực hiện việc thêm vào table options một trường có tên là lionel_mp_version và nó có giá trị là 1.0, tham số thứ ba là column “Autoload” có hai giá trị là yes hoặc no, nếu bạn để nó rỗng , tức là nó là yes. Yes ở đây có nghĩa là khi bạn chạy website thì hệ thống tự động load mọi thứ có giá trị là yes trong column autoload.

Do lúc nãy bạn đã active plugin rồi, nên giờ bạn phải deactive nó đi và active lại để nó nhận giá trị active mới của bạn đang xử lý trong file lionel-myplugin.php.

Kiểm tra bằng cách truy cập vào phpmyadmin theo đường dẫn http://localhost/phpmyadmin/, nếu bạn dùng xampp thì username là root & mật khẩu là rỗng nha.

Ngôn ngữ mặc định phpmyadmin là tiếng pháp, nên bạn phải điều chỉnh thành tiếng anh như sau.

Sau đó bạn chọn database là wp, click vào bảng wp_options và làm theo như hình bên dưới kéo chuột xuống dưới cùng sẽ thấy kết quả là trường lionel_mp_version có giá trị là 1.0 đã được thêm vào table wp_optíons.

Nếu như bạn kết quả giống như hình thì bạn vừa thêm một trường vào table wp_options.

Ok, câu hỏi được đưa ra, liệu có thể cùng một lúc thêm 2 trường vào table được không ? tất nhiên là được và đoạn code này sẽ thay bạn làm việc đó. Bạn cần phải vô hiệu hóa plugin và active lại để nhận giá trị mới.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<?php

/**

* @package Lionel MyPlugin

* @version 1.0

*/

/*

Plugin Name: Lionel MyPlugin

Plugin URI: http://laptrinhweb.org

Description: Quá trình xử lý plugin đầu tiên của lionel.

Author: Lionel

Version: 1.0

Author URI: http://laptrinhweb.org

*/

register_activation_hook(__FILE__, "lionel_mp_active");

function lionel_mp_active(){

$lio = '1.0';

$lioArr = array(

'source' => 'WordPress 4.x',

'author' => 'Lionel',

'website' => 'http://laptrinhweb.org'

);

add_option('lionel_mp_options', $lioArr, '');

add_option('lionel_mp_version', $lio, '');

}

Vầ đây là kết quả.

Thêm 2 field vào table wp_options

Tiếp theo tôi sẽ thêm vào database một table mới có tên là lionel_mp_test, table này sẽ được tự động thêm vào database sau khi tôi active plugin. Tới phần quan trọng rồi đây.

3/ Biến toàn cục $wpdb trong WordPresss

Để có thể thực hiện được thao tác tự động thêm table vào database sau khi kích hoạt plugin thì tôi sẽ giới thiệu bạn một biến khá là quan trọng trong hệ thống WordPress, biến này có nhiệm vụ tương tác với các phương thức nằm ở file Upgrade.php trong folder wp-admin.

Biến toàn cục được sử dụng để truy cập từ bất cứ nơi nào trong đoạn mã PHP (bao gồm cả trong hàm và phương thức).

Để có thể tiếp thu tốt bài này tôi sẽ liệt kê các hàm sử dụng xử lý code thêm table vào database.

· $wpdb->prefix() – Lấy ra tên tiền tố đã khai báo ở phần cài đặt WordPress.

· $wpdb->get_var() – Xác định chính xác tên table cần thêm vào database, nếu trùng sẽ không thực hiện điều gì cả

· dbDelta() – Hàm thực thi câu lệnh sql, thêm table vào database.

Ok, bắt đầu vào chủ đề chính trong mục này thôi.

1

2

global $wpdb;

echo $wpdb->prefix ."options";

Với đoạn code xử lý, sẽ cho bạn kết quả trả về là wp_options, hiện trên phần đầu của trang quản trị. $wpdb->prefix lấy ra tên tiền tố và nuối chuỗi với table options.

1

2

3

global $wpdb;

$tableName = $wpdb->prefix ."options";

echo $wpdb->get_var("SHOW TABLES LIKE '" . $tableName . "'");

Tạo biến $tableName để hứng giá trị bên trong, sử dụng phương thức $wpdb->get_var(“SHOW TABLES LIKE”) xác định xem có đúng là table mà bạn đang chỉ định gọi ra không.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<?php

/**

* @package Lionel MyPlugin

* @version 1.0

*/

/*

Plugin Name: Lionel MyPlugin

Plugin URI: http://laptrinhweb.org

Description: Quá trình xử lý plugin đầu tiên của lionel.

Author: Lionel

Version: 1.0

Author URI: http://laptrinhweb.org

*/

register_activation_hook(__FILE__, "lionel_mp_active");

function lionel_mp_active(){

global $wpdb;

$lio = '1.0';

$lioArr = array(

'source' => 'WordPress 4.x',

'author' => 'Lionel',

'website' => 'http://laptrinhweb.org'

);

add_option('lionel_mp_options', $lioArr, '');

add_option('lionel_mp_version', $lio, '');

$tableName = $wpdb->prefix ."lionel_mp_test";

if($wpdb->get_var("SHOW TABLES LIKE '" . $tableName . "'") != $tableName){

$sql = "CREATE TABLE `" . $tableName . "` (

`myid` tinyint(4) unsigned NOT NULL AUTO_INCREMENT,

`my_name` varchar(50) DEFAULT NULL,

PRIMARY KEY (`myid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";

require_once ABSPATH . 'wp-admin/includes/upgrade.php';

dbDelta($sql);

}

}

Bạn sẽ phải kiểm tra xem $tableName được xác định bằng phương thức get_var() có khác với $tableName được chỉ định hay không , nếu khác nó sẽ thao tác thêm table wp_lionel_mp_test vào database.

Tạo $sql hứng các giá trị mang ý nghĩa khởi tạo column trong table, sủ dụng hằng số ABSPATH lấy ra đường dẫn tuyệt đối đến file upgrade.php thuộc folder wp-admin.

Và cuối cùng dùng hàm dbDelta() để thực thi câu truy vấn. Một lần nửa bạn cần phải deactive plugin đi và active lại để nhận giá trị mới, và kết quả sẽ như hình nếu code của bạn không vấn đề gì.

Với đoạn code trên thì bạn vừa add_option vừa có thể thêm table vào database một cách dễ dàng.

Tôi vừa hướng dẫn xong cách để bạn viết hàm lionel_mp_active và truyền vào các giá trị mới cho plugin theo ý của bạn.

4/ Hook deactive plugin trong WordPress

Ok, active được rồi vậy muốn deactive thì sao ? một ngày đep trời nào đó bạn muốn nâng cấp plugin thì việc đầu tiên bạn phải vô hiệu hóa nó đi, chức năng deactive mà hệ thống WordPress hỗ trợ bạn là chưa đủ, nó chỉ close cái plugin tạm thời nhưng các giá trị bạn thêm trong csdl vẫn tồn tại.

Chắc hẳn bạn còn nhớ giá trị bạn thêm vào table wp_option ở cột autoload mang giá trị là yes, nếu bạn vô hiệu hóa plugin đi mà tham số này không đổi thành no thì khi website bạn load lên sẽ gặp lỗi ngay.

Để thay đổi được giá trị bên trong table thì WordPress hỗ trợ cho bạn hook.

Cú pháp:

1

register_deactivation_hook(__FILE__, "lionel_mp_deactive");

Giống như hook active thì hook deactive sẽ giúp bạn vô hiệu hóa các giá trị mỗi khi bạn deactive plugin đi. Vì thế nhiệm vụ của bạn lúc này là mỗi khi deactive plugin đi tôi muốn giá trị ở cột autoload sẽ thay đổi giá trị của trường lionel_mp_options thành no.

Vậy chúng ta có đoạn code xử lý thao tác này như sau.

1

2

3

4

5

function lionel_mp_deactive(){

global $wpdb;

$tableName = $wpdb->prefix ."options";

$wpdb->update();

}

Phương thức $wpdb->update sẽ giúp bạn thực hiện thao tác mỗi khi deactive plugin sẽ chuyển giá trị trường lionel_mp_options thành no.

Phương thức này bao gồm 5 tham số.

· Tham số thứ nhất : Tên table

· Tham số thứ hai: Xác định tên cột và giá trị muốn thay đổi

· Tham số thứ ba: Xác định cột chứa tên trường để thực hiện việc thay đổi giá trị ở tham số thứ hai.

· Tham số thứ tư: Xác định giá trị ở cột thay đổi là con số hay chuỗi, nếu là số thì điền vào %s, chuỗi thì %d.

Tham số thứ năm: Xác định tên trường là con số hay chuỗi điền giống như tham số thứ tư.

1

2

3

4

5

6

7

8

9

10

11

function lionel_mp_deactive(){

global $wpdb;

$tableName = $wpdb->prefix ."options";

$wpdb->update(

$tableName,

array("autoload" => "no"),

array("option_name" => "lionel_mp_options"),

array("%s"),

array("%s")

);

}

Lý giải đoạn code, thì đầu tiên là $tableName (Table wp_options) , sau đó dùng array để chỉ định key là autoload và giá trị muốn thay đổi từ yes sang no, key ở tham số thứ ba là tên cột chứa trường lionel_mp_options. Hai tham số còn lại thì khỏi giải thích hen.

Ok, bây giờ do lúc này plugin đang ở trạng thái active, bạn cần phải deactive và vào phpmyadmin để kiểm tra xem giá trị ở cột autoload của trường có thay đổi thành no chưa.

Deactive plugin

Wow, giá trị ở cột autoload thuộc trường lionel_mp_options đổi thành no rồi, nhưng đừng vội mừng nha, vì điều này sẽ làm nảy sinh một vấn đề, khi bạn active plugin thì giá trị nó vẫn là no không chuyển sang yes.

Bài toán đặt ra là làm sao, khi bạn active plugin thì trường lionel_mp_options sẽ có giá trị là yes ?

Phương thức $wpdb->update() sẽ làm điều đó giúp bạn, vậy suy ra hàm lionel_mp_active sẽ thao tác cùng một lúc 3 nhiệm vụ khi bạn active plugin.

– Thêm trường vào table wp_options – Thêm table wp_lionel_mp_test vào dabatase. – Mắc định khi active plugin thì trường lionel_mp_options sẽ mang giá trị là yes.

Đoạn code xử lý như sau.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

<?php

/**

* @package Lionel MyPlugin

* @version 1.0

*/

/*

Plugin Name: Lionel MyPlugin

Plugin URI: http://laptrinhweb.org

Description: Quá trình xử lý plugin đầu tiên của lionel.

Author: Lionel

Version: 1.0

Author URI: http://laptrinhweb.org

*/

register_activation_hook(__FILE__, "lionel_mp_active");

register_deactivation_hook(__FILE__, "lionel_mp_deactive");

function lionel_mp_active(){

global $wpdb;

$lio = '1.0';

$lioArr = array(

'source' => 'WordPress 4.x',

'author' => 'Lionel',

'website' => 'http://laptrinhweb.org'

);

// Add options

add_option('lionel_mp_options', $lioArr, '');

add_option('lionel_mp_version', $lio, '');

$tableName = $wpdb->prefix ."lionel_mp_test";

// Insert table

if($wpdb->get_var("SHOW TABLES LIKE '" . $tableName . "'") != $tableName){

$sql = "CREATE TABLE `" . $tableName . "` (

`myid` tinyint(4) unsigned NOT NULL AUTO_INCREMENT,

`my_name` varchar(50) DEFAULT NULL,

PRIMARY KEY (`myid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";

require_once ABSPATH . 'wp-admin/includes/upgrade.php';

dbDelta($sql);

}

// Update field

$tableName = $wpdb->prefix. "options";

$wpdb->update(

$tableName,

array('autoload'=>'yes'),

array('option_name'=> 'lionel_mp_options'),

array('%s'),

array('%s')

);

}

function lionel_mp_deactive(){

global $wpdb;

$tableName = $wpdb->prefix ."options";

$wpdb->update(

$tableName,

array("autoload" => "no"),

array("option_name" => "lionel_mp_options"),

array("%s"),

array("%s")

);

}

Thực hiện xong đoạn code trên thì khi bạn active & deactive sẽ trả về kết quả mà bạn mong muốn.

5/ Hook Uninstall plugin trong WordPress

Để viết ra một plugin sẽ mất rất nhiều thời gian, nhưng muốn xóa nó đi thì chỉ một click chuột, vì vậy trong phần này bạn nên cẩn thận backup folder plugin. Nếu không sẽ khóc vì phải tự gõ code lại từ đầu đấy.

Cơ chế Uninstall plugin mặc định của hệ thống WordPress chỉ đơn thuần giúp bạn xóa đi folder của plugin chứ không xóa toàn bộ dữ liệu mà bạn thêm vào trong database.

Do phần này khá là đơn giản nên tôi sẽ lướt qua thật nhanh.

Cú pháp hook uninstall:

1

register_uninstall_hook(__FILE__, 'lionel_mp_uninstall');

Vậy đoạn code xử lý uninstall plugin như sau.

1

2

3

4

5

6

7

8

9

10

function lionel_mp_uninstall(){

global $wpdb;

// OPTION API

delete_option('lionel_mp_options');

delete_option('lionel_mp_version');

$tableName = $wpdb->prefix. "lionel_mp_test";

$sql = "DROP TABLE IF EXISTS" . $tableName;

$wpdb->query($sql);

}

Ở đoạn code này bạn chỉ cần quan tâm hàm delete_option, nó giúp bạn xóa đi các trường mà bạn đã thêm trong table wp_options. Còn phương thức $wpdb->query() dùng để thực thi câu truy vấn giống như lệnh mysql_query thông thường.

Ok, bây giờ bạn đã có thể xóa toàn bộ dữ liệu trong database mỗi khi bạn tiến hành xóa plugin.

Full code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

<?php

/**

* @package Lionel MyPlugin

* @version 1.0

*/

/*

Plugin Name: Lionel MyPlugin

Plugin URI: http://laptrinhweb.org

Description: Quá trình xử lý plugin đầu tiên của lionel.

Author: Lionel

Version: 1.0

Author URI: http://laptrinhweb.org

*/

register_activation_hook(__FILE__, "lionel_mp_active");

register_deactivation_hook(__FILE__, "lionel_mp_deactive");

register_uninstall_hook(__FILE__, "lionel_mp_uninstall");

function lionel_mp_active(){

global $wpdb;

$lio = '1.0';

$lioArr = array(

'source' => 'WordPress 4.x',

'author' => 'Lionel',

'website' => 'http://laptrinhweb.org'

);

// Add options

add_option('lionel_mp_options', $lioArr, '');

add_option('lionel_mp_version', $lio, '');

$tableName = $wpdb->prefix ."lionel_mp_test";

// Insert table

if($wpdb->get_var("SHOW TABLES LIKE '" . $tableName . "'") != $tableName){

$sql = "CREATE TABLE `" . $tableName . "` (

`myid` tinyint(4) unsigned NOT NULL AUTO_INCREMENT,

`my_name` varchar(50) DEFAULT NULL,

PRIMARY KEY (`myid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";

require_once ABSPATH . 'wp-admin/includes/upgrade.php';

dbDelta($sql);

}

// Update field

$tableName = $wpdb->prefix. "options";

$wpdb->update(

$tableName,

array('autoload'=>'yes'),

array('option_name'=> 'lionel_mp_options'),

array('%s'),

array('%s')

);

}

function lionel_mp_deactive(){

global $wpdb;

$tableName = $wpdb->prefix ."options";

$wpdb->update(

$tableName,

array("autoload" => "no"),

array("option_name" => "lionel_mp_options"),

array("%s"),

array("%s")

);

}

function lionel_mp_uninstall(){

global $wpdb;

// OPTION API

delete_option('lionel_mp_options');

delete_option('lionel_mp_version');

$tableName = $wpdb->prefix. "lionel_mp_test";

$sql = "DROP TABLE IF EXIST" . $tableName;

$wpdb->query($sql);

}

Để cho chuyên nghiệp hơn thì bạn nên tách hàm lionel_mp_uninstall ra ngoài file uninstall.php mà bạn đã tạo sẵn.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?php

if(!defined("WP_UNINSTALL_PLUGIN")){

exit();

}

lionel_mp_uninstall();

function lionel_mp_uninstall(){

global $wpdb;

// OPTION API

delete_option('lionel_mp_options');

delete_option('lionel_mp_version');

$tableName = $wpdb->prefix. "lionel_mp_test";

$sql = "DROP TABLE IF EXIST" . $tableName;

$wpdb->query($sql);

}

Hằng số WP_UNINSTALL_PLUGIN, sẽ kiểm tra nếu không tồn tại nó thì hủy luôn không cho thực thi đoạn code phía sau nó. Nếu nó có tồn tại sẽ gọi tới hàm lionel_mp_uninstall().

Trước khi bạn click và nút delete plugin trong trang quản trị, bạn nhớ backup folder plugin nha, vì bấm 1 phát là nó xóa toàn bộ các thứ liên quan tới plugin luôn đó.

Bấm nút đó xong, bạn tự kiểm tra bằng cách vào folder wp-content -> plugins xem coi folder lionel-myplugin còn tồn tại không, rồi vào phpmyadmin xem table wp_lionel_mp_test và các trường còn hay không nha. Nếu mất hết xem như bạn xóa thành công plugin. còn không thì bạn vui lòng xem lại hướng dẫn và thực hiện lại.

6/ Kết bài

Kết thúc bài này thì tôi tin chắc rằng bạn sẽ nắm vững các hàm, phương thức và hook để xây dựng WordPress plugin nâng cao một cách khoa học và nền tãng vững chắc nhất. Với cấu trúc plugin này thì bạn sẽ dễ dàng nâng cấp và phát triển mỗi khi bạn có ý tường mới. Ở bài sau tôi sẽ trình bày về hai dạng hook trong WordPress.

Series Navigation<< Xây dựng WordPress plugin căn bảnGiới thiệu WordPress Action Hook >>

Nguồn: laptrinhweb.org

Last updated