19. Tương tác với WordPress database

Như vậy ở bài Sử dụng phương thức update & widget trong Widget API, thì tôi đã hướng dẫn bạn cập nhật dữ liệu từ form vào database,thông qua đó bạn cũng đã thấy rằng việc tạo mới một Widget thật dễ dàng phải không. Nhưng tất cả vẫn chưa phải gọi là quá cao siêu đâu, Kỹ thuật mà tôi sắp giới thiệu với bạn trong bài hôm nay chính là Tương tác với WordPress database, tức là chúng ta sẽ sử dụng biến toàn cục $wpdb và các phương thức hỗ trợ để lấy ra cột, dòng và thêm mới một dòng dữ liệu vào database.

1/ Cấu trúc folder plugin kenshin database

Việc đầu tiên thì bạn cần phải tạo mới một plugin, cách tạo mới plugin thì tôi sẽ không nhắc lại nửa vì nó thuộc kiến thức cũ rồi.

Cấu trúc plugin

kenshin-database – includes – views – kenshin-database.php (File xử lý chính của plugin)

Nội dung file kenshin-database.php:

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

<?php

/**

* @package Kenshin Database

* @version 0.1

*/

/*

Plugin Name: Kenshin Database

Plugin URI: http://laptrinhweb.org

Description: Đây là một plugin dùng để tương tác vói database.

Author: Kenshin

Version: 0.1

Author URI: None

*/

define('KENSHIN_DB_PLUGIN_URL', plugin_dir_url(__FILE__));

define('KENSHIN_DB_PLUGIN_DIR', plugin_dir_path(__FILE__));

define('KENSHIN_DB_VIEWS_DIR', KENSHIN_DB_PLUGIN_DIR . '/views');

define('KENSHIN_DB_INCLUDES_DIR', KENSHIN_DB_PLUGIN_DIR .'/includes');

define('KENSHIN_DB_DIR', KENSHIN_DB_PLUGIN_DIR . '/widgets');

if(!is_admin()){

require_once KENSHIN_DB_INCLUDES_DIR. '/frontend.php';

new KenshinFrontend();

}else{

require_once KENSHIN_DB_INCLUDES_DIR. '/backend.php';

new KenshinBackend();

}

Còn đây là nội dung file backend.php:

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

<?php

class KenshinBackend {

private $_menuSlug = 'kenshin-my-setting';

public function __construct(){

// Gọi Hook admin_menu xử lý và khởi tạo menu mới

//=====================================================

add_action('admin_menu', array($this, 'settingMenu'));

}

//=====================================================

// Phương thức settingMenu (Khởi tạo menu Kenshin Setting)

//=====================================================

public function settingMenu(){

add_menu_page(

'My Setting Page',

'Kenshin Setting',

'manage_options'

,$this->_menuSlug,

array($this, 'settingPage')

);

}

//=====================================================

// Phương thức settingPage gọi tới views hiển thị nội dung

//=====================================================

public function settingPage(){

require_once KENSHIN_DB_VIEWS_DIR . '/setting-page.php';

}

}

Phần code này thì cũng quá quen thuộc rồi hen, với lại tôi có ghi chú rõ ràng trong code luôn rồi đấy, bạn truy cập vào trang quản trị và active plugin lên và truy cập vào http://localhost/wp/wp-admin/admin.php?page=kenshin-my-setting, thay wp bằng tên folder chứa source của bạn nhé.

2/ Tạo mới table wp_kenshin_article

Do chúng ta sẽ tương tác và đụng chạm tơi database vì thế bắt buộc bạn phải tạo mới một table để thực hành, chứ không dùng các table mặc định do hệ thống WordPress cung cấp.

File sql:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

DROP TABLE IF EXISTS `wp_kenshin_article`;

CREATE TABLE `wp_kenshin_article`(

`id` int(11) NOT NULL AUTO_INCREMENT,

`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

`picture` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

`content` text COLLATE utf8_unicode_ci NOT NULL,

`status` tinyint(4) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `wp_kenshin_article` */

insert into `wp_kenshin_article`(`id`,`title`,`picture`,`content`,`status`) values (1,'Hàn Quốc vô địch, Thái Lan trắng tay tại ASIAD 17','picture001.png','Bàn thắng vàng ở phút 120+2 giúp Hàn Quốc giành chiến thắng nghẹt thở 1-0 trước CHDCND Triều Tiên ở trận chung kết. Trong khi đó Iraq đánh bại Thái Lan với cùng tỷ số để đoạt HCĐ.',0),(2,'Messi Hàn Quốc dẫn đầu bộ tứ siêu đẳng đối đầu U19 Việt Nam','picture002.png','Liên đoàn bóng đá Hàn Quốc (KFA) đã công bố đội hình 23 cầu thủ đội U19 chuẩn bị cho giải châu Á sắp tới. Họ tự tin cho rằng đây là đội hình mạnh nhất từ trước đến nay.',1),(3,'Niềm vui nhân đôi của chàng thủ quân Olympic Việt Nam','picture003.png','Thi đấu ấn tượng tại Asian Games 17, được triệu tập vào đội tuyển Việt Nam tham dự chuyến tập huấn Nhật Bản, tiền vệ Ngô Hoàng Thịnh còn nhận thêm tin vui từ gia đình.',1),(4,'ĐT U19 Việt Nam sẽ tạo bất ngờ cho đối thủ','picture004.png','Dù nằm ở bảng đấu được coi là “tử thần” tại VCK U19 châu Á 2014, nhưng U19 Việt Nam đã và đang chuẩn bị những món quà bất ngờ dành cho các “đại gia” đến từ Đông Á.',1),(5,'Đối thủ của U19 VN chỉ cần 5 ngày chuẩn bị cho giải châu Á','picture005.png','Hôm 29/9 vừa qua, tuyển U19 Nhật Bản đã tập trung trở lại để chuẩn bị cho VCK U19 châu Á sẽ khởi tranh trong ít ngày tới tại Myanmar.',1),(6,' Lịch thi đấu của U19 Việt Nam tại VCK châu Á 2014','picture006.png','Dù có được lịch thi đấu thuận lợi thì thầy trò HLV Graechen vẫn sẽ gặp rất nhiều khó khăn khi nằm ở bảng đấu tử thần cùng với U19 Hàn Quốc, Nhật Bản và Trung Quốc.',1),(7,'U19 Australia nhắm vé dự giải U20 thế giới','picture007.png','HLV Paul Okon của U19 Australia đã chốt danh sách 23 cầu thủ dự VCK U19 châu Á diễn ra tại Myanmar tháng 10 tới với mục tiêu giành quyền tham dự giải U20 thế giới 2015.',0),(8,'Tuấn Anh trở lại tập luyện, hoàn tất giáo án nặng','picture008.png','Chấn thương đầu gối của Tuấn Anh đã bình phục hoàn toàn, tiền vệ trụ cột trở lại tập luyện cùng các đồng đội U19 Việt Nam từ sáng qua (29/9).',1),(9,'Bổ sung HLV ngoại chuyên về thể lực cho U19 Việt Nam','picture009.png','Các cầu thủ U19 VN liên tiếp gặp phải những chấn thương trên sân cỏ vì điểm yếu về thể lực. Bầu Đức sẽ tuyển thêm một HLV thể lực người Pháp làm trợ lý cho HLV Graechen.',0),(10,'Công Phượng lập cú đúp vào lưới đội hình hai U19 VN','picture010.png','Để giảm bớt sự nhàm chán sau hơn 1 tuần tập luyện tại Hàm Rồng, HLV Graechen đã chia đội hình U19 Việt Nam làm đôi để tổ chức một trận thi đấu đối kháng.',0),(11,'Bầu Đức tuyển sinh gà nòi tiếp bước đàn anh ở U19 Việt Nam','picture011.png','Học viện HAGL Arsenal-JMG của bầu Đức tiếp tục tuyển sinh cầu thủ nhí cho khóa 3 và 4 để tiếp nối các đàn anh Công Phượng, Tuấn Anh, Xuân Trường... đang thi đấu thành công ở U19 VN',0),(12,'Cầu thủ người Gia Rai trở lại thi đấu cho U19 Việt Nam','picture012.png','Theo quy định của AFC, các đội tham dự VCK U19 châu Á sẽ được đăng ký thêm 3 cầu thủ so với số lượng đăng ký tại giải U19 Đông Nam Á vừa diễn ra tại Hà Nội.',1),(13,'Thầy Giôm đi học để dẫn dắt sao U19 dự V.League 2015','picture013.png','HLV Guillaume Greachen sẽ theo học lớp HLV bằng A, để có chứng chỉ đủ điều kiện dẫn dắt đội HAGL với nòng cốt là cầu thủ đang thuộc biên chế đội U19 Việt Nam dự V.League 2015.',0),(14,'HLV Graechen: \'Học trò của tôi đủ sức đá V.League\'','picture014.png','HLV Guillaume Graechen tự tin nói rằng các học trò của ông luôn biết cách để tránh xa những cám dỗ, đứng vững trên con đường trở thành cầu thủ chuyên nghiệp',0),(17,'Harriet\'s Adages','tmp.png','WordPress\' database interface is like Sunday Morning: Easy.',1),(18,'This is a test 123','abc123.jpg','This is a content 123',0),(20,'This is a test 246','abc123.jpg','This is a content 246',1),(23,'This is a test','abcddf.png','This is a content',0),(24,'This is a test','abcddf.png','This is a content',0);

Tôi đã tạo sẵn table cũng như thêm vào table một số dòng dữ liệu mẫu, bạn copy code về vào phpmyadmin và run câu sql hoặc import vào đúng database nha.

Kế tiếp tôi sẽ khai báo và sử dụng biến toàn cục $wpdb và gọi tới đối tượng prefix để lấy ra chính xác tên table cần tương tác, tôi thực hiện thao tác này ở trong file setting-page.php.

Nội dung file setting-page.php:

1

2

3

4

5

6

7

8

9

10

11

12

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gọi đến đối tượng prefix để lấy ra tiền tố của table

echo $wpdb->prefix. 'kenshin_article';

?>

</div>

table-prefix

Phần chuẩn bị xem như xong, kế tiếp tôi sẽ hướng dẫn bạn khai báo và sử dụng các phương thức nằm trong biến toàn cục $wpdb.

3/ Phương thức get_row()

Phương thức get_row() giúp chúng ta lấy ra một dòng dữ liệu trong một table do bạn chỉ định, nó có tất cả là ba tham số.

Cú pháp:

1

$wpdb->get_row($query,$output,$y)

Tham số:

· $query: Câu truy vấn SQL

· $output : Kiểu hiển thị dữ liệu sau khi lấy dữ liệu từ table raARRAY_A | ARRAY_N | OBJECT

· $y : Thứ tự sắp xếp record

Ok, bây giờ tôi muốn lấy ra các dòng dữ liệu với điều kiện cột status = 1 thì thực hiện việc đó như thế nào ? Đầu tiên bạn cần thay thế echo bằng một biến $table để hứng giá trị mà prefix trả về.

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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Kiểu hiển thị dữ liệu trả về, mặc định là object

// Kiểu ARRAY_A sẽ lấy ra trả về dữ liệu với các key giống array

// Kiểu ARRAY_N sẽ trả về dữ liệu với số thứ tự giống array

// Sắp xếp dữ liệu theo cơ chế bắt đầu từ số 0

$ouput = OBJECT;

$data = $wpdb->get_row($query, $ouput, 0);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($data);

echo "</pre>";

?>

</div>

Đoạn code trên tôi có ghi chú nên bạn sẽ hiểu được tính năng của từng tham số, nhưng tôi vẫn sẽ giải thích sơ một tí, về phần câu truy vấn thì chắc có lẽ không có vấn đề gì hen vì nó quá căn bản rồi, bạn chú ý phần tham số $ouput là nó có 3 kiểu hiển thị dữ liệu, bạn có thể khai báo bất kì kiểu dữ liệu mà bạn thích, bình thường thì kiểu OBJECT hoặc ARRAY_A là 2 kiểu dữ liệu được sử dụng nhiều nhất.

Dữ liệu kiểu OBJECT:

1

2

3

4

5

6

7

8

stdClass Object

(

[id] => 2

[title] => Messi Hàn Quốc dẫn đầu bộ tứ siêu đẳng đối đầu U19 Việt Nam

[picture] => picture002.png

[content] => Liên đoàn bóng đá Hàn Quốc (KFA) đã công bốđội hình 23 cầu thủđội U19 chuẩn bị cho giải châu Á sắp tới. Họ tự tin cho rằng đây làđội hình mạnh nhất từ trước đến nay.

[status] => 1

)

Dữ liệu kiểu ARRAY_A:

1

2

3

4

5

6

7

8

Array

(

[id] => 2

[title] => Messi Hàn Quốc dẫn đầu bộ tứ siêu đẳng đối đầu U19 Việt Nam

[picture] => picture002.png

[content] => Liên đoàn bóng đá Hàn Quốc (KFA) đã công bốđội hình 23 cầu thủđội U19 chuẩn bị cho giải châu Á sắp tới. Họ tự tin cho rằng đây làđội hình mạnh nhất từ trước đến nay.

[status] => 1

)

4/ Phương thức get_col()

Phương thức get_col() sẽ giúp bạn lấy ra dữ liệu từ một cột bất kì do bạn chỉ định, phương thức này bao gồm hai tham số, nhưng với phương thức này thì nó chỉ giúp bạn lấy ra các dòng chỉ có duy nhất một cột.

Cú pháp:

1

$wpdb->get_col($query, $x);

Tham số:

· $query: Câu truy vấn đến table trong database

· $x: Chỉ số cột chúng ta muốn lấy dữ liệu ra, bắt đầu từ số 0.

Bây giờ tôi sẽ lấy ra một dòng dữ liệu ở cột title, tôi sẽ sử dụng lại câu truy vấn ở phía trên chỉ thay đổi phương thức mà thô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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Chỉ số cột theo thứ tự bắt đầu bằng số 0 là id, title, picture, content, status

$data = $wpdb->get_col($query, 1); // 1 là chỉ số cột của title, tôi sẽ lấy ra các title có status là 1

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($data);

echo "</pre>";

?>

</div>

Và đây là kết quả mà tôi nhận được từ trình duyệt sau khi sử dụng phương thức.

phuong-thuc-get-col-database-wordpress

Bạn có thể nhận thấy rằng, tôi đã lấy ra toàn bộ dòng dữ liệu nằm trong cột title với điều kiện các dòng dữ liệu này phải có giá trị trong cột status = 1.

5/ Phương thức get_results()

Phương thức get_results() giúp chúng ta lấy ra một tập hợp các dòng dữ liệu trong một table nào đó của database. Nó có tất cả là hai tham số.

Cú pháp:

1

$wpdb->get_results( $query = null, $output = OBJECT )

Tham số:

· $query: Câu truy vấn SQL

· $output : Kiểu hiển thị dữ liệu sau khi lấy dữ liệu từ table ra là các kiểu ARRAY_A | ARRAY_N | OBJECT

Bây giờ tôi sẽ lấy ra tập hợp các dòng dữ liệu với điều kiện là status = 1.

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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Lấy ra tập hợp các dòng dữ liệu với điều kiện là status = 1

// Tham số thứ hai mặc định là kiểu OBJECT, nếu không khai báo thì nó sẽ lấy kiểu hiển thị dữ liệu này.

$data = $wpdb->get_results($query);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($data);

echo "</pre>";

?>

</div>

Với đoạn code trên tôi sẽ lấy ra tập hợp các dòng dữ liệu của 5 cột là kiểu hiển thị OBJECT.

phuong-thuc-get-results-database-wordpress

Bạn có thể đặt biến $ouput có giá trị là một trong 2 kiểu dữ liệu còn lại cũng được, tôi thì sử dụng quen kiểu OBJECT nên tôi chọn nó cho dễ làm việc.

6/ Phương thức insert()

Phương thức này giúp chúng ta một dòng dữ liệu trong một table nào đó của database. Nếu đưa vào thành công thì trình duyệt sẽ trả về giá trị là 1, có tất cả là ba tham số.

Cú pháp:

1

$wpdb->insert( $table, $data, $format );

Tham số:

· $table: Tên của table cần insert dữ liệu

· $data: Mảng chứa dữ liệu của dòng mới

· $format: Định dạng dữ liệu trước khi thêm vào table

Lúc bấy giờ tôi sẽ thêm mới một dòng dữ liệu vào table với đoạn code 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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Mảng chứa dữ liệu dòng mới

// Do id là một số nguyên và nó tự động tăng dần khi dòng mới được thêm vào

$data = array(

'title' => 'Xin chào ! tôi là Kenshin',

'picture' => 'kenshin.jpg',

'content' => 'Chào mừng bạn đến với website laptrinhweb.org',

'status' => 1

);

// %s là đại diện cho một chuỗi

// %d là đại diện cho số nguyên

// Tham số này kiểm tra định dạng các giá trị dữ liệu trước khi cho phép đưa dữ liệu vào table.

$format = array('%s', '%s', '%s', '%d');

// Phương thức thêm mới dòng dữ liệu vào table

$info = $wpdb->insert($table, $data, $format);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($info);

echo "</pre>";

?>

</div>

Hai tham số đầu thì cũng không có gì để giải thích, vì tôi đã ghi chú tường minh trong code rồi, tham số thứ ba dùng để định dạng dữ liệu trước khi đưa nó vào table, Bạn F5 lại trang Setting nếu trình duyệt trả về kết quả là 1 thì xem như thành công.

Bạn kiểm tra bằng cách truy cập vào phpmyadmin tìm đến table wp_kenshin_article xem có dòng mới nào vừa được thêm vào hay không.

phuong-thuc-insert-database-wordpress

7/ Phương thức replace()

Phương thức replace() giúp chúng ta giúp thay đổi thông tin của một dòng trong table nếu nó tồn tại, và thêm mới nếu nó chưa tồn tại. Nếu trình duyệt trả về kết quả là 2 thì xem như thành công, ngược lại nếu id cần thay đổi không tồn tại thì nó sẽ thêm mới luôn dòng dữ liệu đó vào table, thì kết quả trả về sẽ là 1 giống với phương thức insert().

Cú pháp:

1

$wpdb->replace( $table, $data, $format );

Tham số:

· $table: Tên của table

· $data: Mảng chứa dữ liệu của dòng mới

· $format: Định dạng dữ liệu trước khi thêm vào table

Phương thức này có các tham số khá giống với phương thức insert(), lúc này tôi sẽ thay đổi giá trị dữ liệu của id 25, tức là dòng mới mà tôi vừa thêm vào từ phương thức insert().

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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Mảng chứa dữ liệu dòng mới

// Chỉ định id 25 được thay đổi giá trị dữ liệu

$data = array(

'id' => 25,

'title' => 'Xin chào ! tôi là Himura Kenshin',

'picture' => 'himura-kenshin.jpg',

'content' => 'Chào mừng bạn đến với website laptrinhweb.org, chúc bạn ngày mới vui vẻ',

'status' => 0

);

// %s là đại diện cho một chuỗi

// %d là đại diện cho số nguyên

// Tham số này kiểm tra định dạng các giá trị dữ liệu trước khi cho phép đưa dữ liệu vào table.

$format = array('%d','%s', '%s', '%s', '%d');

// Phương thức thay đổi một dòng dữ liệu trong table

$info = $wpdb->replace($table, $data, $format);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($info);

echo "</pre>";

?>

</div>

Bạn nên lưu ý là ở tham số thứ ba $format do chúng ta vừa thêm key id vào mảng dữ liệu thì bạn buộc phải khai báo thêm ở phần định dạng cho key id là %d, tức là chúng ta có 5 phần định dạng, nếu bạn không khai báo thì lúc chạy phương thức phần dữ liệu ở content sẽ là số 0.

phuong-thuc-replace-database-wordpress

Tôi sẽ thử thay đổi một dòng dữ liệu không tồn tại trong table để xem nó có tự thêm mới dòng dữ liệu đó vào table 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

39

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Mảng chứa dữ liệu dòng mới

// Chỉ định id 25 được thay đổi giá trị dữ liệu

$data = array(

'id' => 26,

'title' => 'Đây là ID 26',

'picture' => 'id-26.jpg',

'content' => 'Đài phát thanh nhân dân việt nam, ID 26',

'status' => 0

);

// %s là đại diện cho một chuỗi

// %d là đại diện cho số nguyên

// Tham số này kiểm tra định dạng các giá trị dữ liệu trước khi cho phép đưa dữ liệu vào table.

$format = array('%d','%s', '%s', '%s', '%d');

// Phương thức thay đổi một dòng dữ liệu trong table

$info = $wpdb->replace($table, $data, $format);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($info);

echo "</pre>";

?>

</div>

ID 26 là một id không tồn tại, vì vậy khi tôi F5 lại trình duyệt sẽ trả về kết quả là 1, tức là đã thêm mới dòng dữ liệu vào table rồi đấy, bạn vào ngay phpmyadmin để kiểm tra xem có đúng như sự kì vọng của bạn không.

8/ Phương thức delete()

Phương thức delete() giúp chúng ta xóa một dòng dữ liệu trong table và nó cũng có ba tham số tất cả , nếu trình duyệt trả về kết quả lả 1 thì thành công, còn trả về 0 tức là thất bại.

Cú pháp:

1

$wpdb->delete( $table, $where, $where_format);

Tham số:

· $table: Tên table chứa dữ liệu

· $where: Tìm id được chỉ định để xóa

· $where_format: Định dạng kiểu dữ liệu cho điều kiện $where, id đại diện cho một con số nên nó là %d

Bây giờ tôi sẽ xóa đi dòng dữ liệu có ID là 26, tức là dòng dữ liệu mà tôi vừa thêm vào từ phương thức replace(). vậy tôi thực hiện việc xóa dòng dữ liệu 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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix. 'kenshin_article';

// Câu truy vấn sql

$query = "SELECT * FROM {$table} WHERE status = 1";

// Chỉ đinh xóa dòng dữ liệu thuộc ID là 26

$where = array('id' => 26);

// Định dạng dữ liệu là con số.

$where_format = array('%d');

// Phương thức xóa một dòng dữ liệu trong table

$info = $wpdb->delete($table, $where, $where_format);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r($info);

echo "</pre>";

?>

</div>

Với đoạn code này thì tôi vừa xóa dòng dữ liệu với ID là 26, còn trong trường hợp ID không tồn tại thì bạn sẽ nhận kết quả là 0 từ trình duyệt, xem như việc xóa dữ liệu không thực hiện được.

9/ Phương thức prepare() & query()

Phương thức prepare():

Phương thức prepare() giúp chúng ta tạo ra một câu truy vấn an toàn để bảo mật website tránh được các lỗi SQL injection. Nó có tất cả là hai tham số.

Cú pháp:

1

$wpdb->prepare( $query, $args )

Tham số:

· $query: Câu truy vấn SQL

· $args: Các tham số truyền vào câu truy vấn

Lưu ý: Phương thức này chỉ giúp bạn lọc câu truy vấn và các tham số truyền vào chứ nó không thực hiện việc thêm mới dòng dữ liệu vào table.

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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix . 'kenshin_article';

// Các tham số cần lọc dữ liệu

$title = "This is a test";

$picture = "abc.png";

$content = "This is a content";

$status = 0;

// Câu truy vấn

$query = "INSERT INTO {$table} (`title`, `picture`, `content`, `status`)

VALUES (%s, %s, %s, %d)";

// Phương thức lọc các tham số truyền vào để bảo mật website

$info = $wpdb->prepare($query, $title, $picture, $content, $status);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r ( $info );

echo "</pre>";

?>

</div>

Phương thức query():

Các phương thức tôi đã hướng dẫn ở phía trên trong core của WordPress không thể nào đáp ứng được mọi trường hợp trong quá trình truy vấn vào database vì vậy bạn sẽ thường xuyên phải viết các câu SQL theo cách thông thường, phương thức này thường được sử dụng chung với phương thức prepare() để bảo mật website.

Cú pháp:

1

$wpdb->query( $query )

Tham số:

· $query: Câu truy vấn SQL được xây dựng từ phương thức prepare()

Tôi sẽ kết hợp với phương thức prepare() để hạn chế lỗi SQL Injection, và sau đó thực thi câu truy vấn chạy câu lệnh SQL Insert thêm mới dòng dữ liệu vào table.

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

<div class="wrap">

<h2>My Setting page</h2>

<p>Đây là trang thiết lập cấu hình plugin Kenshin Setting</p>

<?php

// Khởi tạo biến toàn cục

global $wpdb;

// Gán biến $table để hứng giá trị

$table = $wpdb->prefix . 'kenshin_article';

// Các tham số cần lọc dữ liệu

$title = "This is a test";

$picture = "abc.png";

$content = "This is a content";

$status = 0;

// Câu truy vấn

$query = "INSERT INTO {$table} (`title`, `picture`, `content`, `status`)

VALUES (%s, %s, %s, %d)";

// Phương thức lọc các tham số truyền vào để bảo mật website

$info = $wpdb->prepare($query, $title, $picture, $content, $status);

// Thực thi câu truy vấn

$wpdb->query($info);

// In dữ liệu ra để xem kết quả

echo "<pre>";

print_r ($info);

echo "</pre>";

?>

</div>

Trình duyệt sẽ in ra câu SQL Insert, và bạn vào phpmyadmin để kiểm tra xem dòng mới đã được thêm vào chưa.

phuong-thuc-query-database-wordpress

10/ Lời kết

Bài viết khá dài, nhưng nó chứa đầy đủ các phương thức nằm trong biến toàn cục $wpdb vì thế bạn nên xem kỹ và thực hành viết code lại ít nhất là 2 lần, đây chỉ là những ví dụ đơn giản nhưng nó chứa đựng những kiến thức khá là quan trọng trong việc tương tác database WordPress. Chỉ với 10 phương thức như trên thì bạn có thể thao tác với bất kì table nào trên hệ thống WordPress, tuy nhiên lời khuyên mà tôi đưa ra là bạn nên tạo table mới để vọc vạch nhé, đừng đụng vào 10 table mặc định kia, nếu bạn sửa gì trong đó sẽ phát sinh ra một số lỗi và không biết đường fix đâu đấy. Trong bài Tương tác với WordPress database thì tôi đã hướng dẫn bạn sử dụng đầy đủ các phương thức cần thiết, và trong bài tiếp theo tôi sẽ giới thiệu đến bạn một đối tượng khác trong WordPress cũng có nhiệm vụ là tương tác với database nhưng nó mạnh mẽ và mượt mà hơn.

Series Navigation<< Sử dụng phương thức update & widget trong Widget APITìm hiểu đối tượng WP_Query trong WordPress >>

Nguồn: laptrinhweb.org

Last updated