11. Sử dụng Filter Hook toàn tập

Trước khi bắt đầu vào trọng tâm của bài thì tôi cũng muốn các bạn lưu ý rằng, kể từ bài này tôi sẽ không nói quá nhiều về cách tạo plugin, tạo folder ra làm sao, vì những kiến thức này thì ở các bài trước tôi đã hướng dẫn khá rõ ràng và chi tiết, nhằm tiết kiệm thời gian viết bài cũng như để bài viết trở nên ngắn gọn, xúc tích hơn thì những gì đã học qua tôi sẽ không nhắc lại quá nhiều, sẽ đi lướt nhanh qua phần đó.

· Xây dựng WordPress plugin căn bản

· Xây dựng WordPress plugin nâng cao

· Giới thiệu WordPress Action Hook

· Xây dựng WordPress với lập trình hướng đối tượng

Đây là những kiến thức cần thiết và bắt buộc để xây dựng plugin mà bạn phải nắm vững đầy đủ kiến thức trên thì mới chinh phục lập trinh WordPress được.

Như vậy ở bài trước thì bạn đã hiểu thế nào là Hook và thế nào là Action Hook, Như bạn đã được biết WordPress có 2 loại Hook chính, ngoài Action Hook thì WordPress còn một Hook khá quan trọng là Filter Hook. vậy trong bài hôm nay tôi sẽ hướng dẫn bạn Sử dụng Filter Hook toàn tập.

Nội dung bài viết bao gồm:

· Filter Hook là gì?

· Filter Hook toàn tập

Ngoài ra tôi còn trình bày một số hàm nâng cao khác của Filter Hook. Kết thúc bài bạn sẽ biết Filter Hook làm nhiệm vụ gì trong hệ thống WordPress, khai báo và sử dụng nó một cách bài bản.

1/ Filter Hook là gì

Filter Hook là một hàm được lập trình bằng ngôn ngữ PHP, Nó có nhiệm vụ lọc dữ liệu input và output trong hệ thống WordPress.

Nó là một bộ lọc chức năng mà WordPress có thể đưa dữ liệu đi qua . Filter chịu trách nhiệm ngăn chặn, quản lý và trả lại dữ liệu trước khi hoàn trả dữ liệu vào trình duyệt hoặc lưu dữ liệu từ trình duyệt đến cơ sở dữ liệu.

Cũng giống như Action Hook, Filter sẽ xác định vị trí của Hook để cho phép các filter do bạn tạo ra tương tác với các hook có sẵn trong hệ thống WordPress.

Tóm lại Filter Hook có chức năng thay đổi tiêu đề toàn bộ bài viết, cũng như thêm vào nội dung bài viết một đoạn nội khác và một số tính năng khác. Nói chung bạn chỉ cần hiểu đơn giản là Filter có khả năng lọc dữ diệu từ csdl và gọi nó ra, sau khi thực thi xong một hành động nào đó sẽ lưu dữ liệu vào lại hệ thống WordPress.

Lý thuyết suông nhiêu đây là đủ rồi, kế tiếp sẽ đi thực hành thì mới hiểu bài được.

2/ Filter Hook toàn tập

Cú pháp và cách khai báo để sử dụng Filter Hook giống như cú pháp của Action Hook.

1

add_filter('ten_hook', array($this, 'ten_ham'));

Các tham số:

· $tag: Là tên của một Filter Hook

· $function: Tên hàm mà bạn viết để tương tác vào hệ thống

· $priority: Độ ưu tiên của filter

· $accepted_args: Số lượng các tham số được truyền vào

Bạn có thể vào link http://adambrown.info/p/wp_hooks/hook nó liệt kê đầy đủ các Hook và các kiểu Hook, vì trong bài này tôi chỉ có thể hướng dẫn bạn sử dụng 2 Filter Hook thông dụng mà thôi.

Do chúng ta đang tìm hiểu về một vấn đề trong plugin nên tôi sẽ tạo ra một plugin mới như có cấu trúc như sau.

Cấu trúc plugin

– images – includes — frontend.php — backend.php – views – lionel-filter.php

Nội dung file lionel-filter.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

<?php

/**

* @package Lionel Filter Hook

* @version 0.1

*/

/*

Plugin Name: Lionel Filter Hook

Plugin URI: http://laptrinhweb.org

Description: Đây là một plugin dUng để tương tác vói Filter Hook.

Author: Lionel

Version: 0.1

Author URI: None

*/

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

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

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

define('LIONEL_FILTER_VIEWS_DIR', LIONEL_FILTER_PLUGIN_DIR . '/views');

define('LIONEL_FILTER_IMG_DIR', LIONEL_FILTER_PLUGIN_URL . 'images');

if(!is_admin()){

require LIONEL_FILTER_INCLUDES_DIR. 'includes/frontend.php';

new LionelFrontend();

}else{

require LIONEL_FILTER_INCLUDES_DIR. 'includes/backend.php';

new LionelBackend();

}

Sau khi kích hoạt plugin xong thì bạn tiến hành tạo ra năm hằng số vật lý để định nghĩa đường dẫn tuyệt đối cho thư mục includes, images, views. Cái này thuộc về kiến thức php căn bản nên tôi sẽ không nhắc lại.

Sau đó bạn dUng hàm is_admin() để check khu vực xử lý code, nếu không phải đang làm việc ở khu vực admin thì sẽ gọi đến file frontend.php để xử lý hiển thị chức năng ở ngoài trang chủ. Ngược lại khi bạn tiến hành tương tác và hiển thị dữ liệu trong admin thì sẽ gọi đến file backend.php để xứ lý code. Việc check quyền để gọi từng file riêng biệt rất là cần thiết , điều này sẽ giúp bạn dễ nhìn và phân biệt được chính xác khu vực làm việc của plugin.

Thực hiện xong việc check quyền thì bạn vào folder includes trong thư mục của plugin tạo ra 2 file như trên rồi khởi tạo đối tượng và trong ví dụ của bài thì tôi chỉ hướng dẫn bạn xử lý file frontend.php mà thôi.

Nội dung file frontend.php:

1

2

3

4

5

6

7

<?php

class LionelFrontend {

public function __construct(){

echo "<br />" . __METHOD__;

}

}

Kết quả: Trình duyệt sẽ in ra tên class và hàm khởi tạo LionelFrontend::__construct

filter-hook-show-method-class

Ok, bây giờ sẽ là vài ví dụ nhỏ để cho bạn thấy được sức mạnh mà Filter Hook mang lại cho chúng ta như thế nào.

# Filter Hook the_title (Hai tham số là $title, $id)

Ví dụ 1:

Ở ví dụ này thì tôi sẽ sử dụng Hook the_title, và tạo ra hàm theTitle có nhiệm vụ thay đổi toàn bộ tiêu đề bài viết trong hệ thống WordPress.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?php

class LionelFrontend{

public function __construct(){

// Add filter theTitle thay đổi tiêu đề bài viết

add_filter('the_title', array($this, 'theTitle'));

}

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

// Filter the_title đơn giản

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

public function theTitle(){

$title = 'Thay doi tieu de bai viet';

return $title;

}

}

Do chúng ta đang sử dụng bộ lọc Filter để gọi dữ liệu ra và thực thi một hành động nào đó rồi nạp nó vào lại csdl. nên khác với Action Hook, bạn buộc phải return tên biến để lấy kết quả trả về.

filter-hook-the-title-change

Sau khi cho phép hàm theTitle truy cập vào Hook the_title thì nó sẽ tương tác với csdl bên trong và thực thi code xử lý trong hàm xử lý và nạp dữ liệu vào lại csdl. Nên tiêu đề cũ là Hello world! đã thay đổi thành “Thay doi tieu de bai viet”.

Ví dụ 2:

Trong ví dụ này thì bạn sẽ làm quen với việc truyền tham số vào hàm, xác định nếu id = 1 thì mới thay đổi tiêu để bài viết. Filter the_title có hai tham số mặc định là $id , $title, bạn có thể xem chi tiết hơn ở link này.

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

<?php

class LionelFrontend{

public function __construct(){

// Add filter theTitle thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle'));

// Add filter theTitle2 kiểm tra nếu id = 1 mới thay đổi tiêu đề bài viết

add_filter('the_title', array($this, 'theTitle2'),10 ,2);

}

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

// Filter the_title đơn giản

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

public function theTitle(){

$title = 'Thay doi tieu de bai viet';

return $title;

}

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

// Filter the_title truyền tham số

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

public function theTitle2($title , $id){

if ($id == "1"){

$title = 'Thay doi tieu de bai viet';

}

return $title;

}

}

Do bạn đã truyền vào hai tham số nên ở hàm add_filter() bạn phải khai báo số lượng tham số được truyền vào, độ ưu tiên của hàm cũng phải được khai báo là 10 (mặc định) để không gặp lỗi.

Table chứa tiêu đề của post & page là cUng một table nên bạn phải kiểm tra nếu $id =1 thì mới thay đổi tiêu đề mới mà bạn vừa gán vào.

Bạn có thể kiểm tra bằng cách click vào sample page có id được gán là 2, xem tiêu đề của nó có thay đổi không? Nếu nó không thay đổi thì bạn đã thành công rồi đấy.

Ví dụ 3:

Tôi vừa hướng dẫn bạn cách kiểm tra điều kiện nếu id thỏa yêu cầu thì mới cho phép thực thi các hành động trong hàm, bây giờ tôi sẽ giới thiệu đến bạn một biến toàn cục mới có tên gọi là $post , biến này chứa toàn bộ giá trị của table wp_post.

Bạn có thể in ra nó ra bằng hàm print_r để kiểm tra các giá trị bên trong nó là gì.

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

<?php

class LionelFrontend{

public function __construct(){

// Add filter theTitle thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle'));

// Add filter theTitle2 kiểm tra nếu id = 1 mới thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle2'),10 ,2);

// Add filter changeTitlePage để xác định nếu là page sẽ tiến hành thay đổi tiêu đề

add_filter('the_title', array($this, 'changeTitlePage'));

}

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

// Filter the_title đơn giản

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

public function theTitle(){

$title = 'Thay doi tieu de bai viet';

return $title;

}

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

// Filter the_title truyền tham số

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

public function theTitle2($title , $id){

if ($id == "1"){

$title = 'Thay doi tieu de bai viet';

}

return $title;

}

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

// Filter the_title, nếu là page sẽ thay đổi tiêu đề

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

public function changeTitlePage(){

// Biến toàn cục $post

global $post;

echo '<pre>';

print_r($post);

echo '</pre>';

}

}

Đây là kết quả sau khi in ra

WP_Post Object ( [ID] => 1 [post_author] => 1 [post_date] => 2015-03-10 03:24:43 [post_date_gmt] => 2015-03-10 03:24:43 [post_content] => Welcome to WordPress. This is your first post. Edit or delete it, then start blogging! [post_title] => Hello world! [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => hello-world [to_ping] => [pinged] => [post_modified] => 2015-03-10 03:24:43 [post_modified_gmt] => 2015-03-10 03:24:43 [post_content_filtered] => [post_parent] => 0 [guid] => http://hocwp.com/wordpress/?p=1 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 1 [filter] => raw )

Trong các key trên bạn chỉ cần quan tới tới post_type là đủ rồi, còn các vấn đề khác thì tôi sẽ trình bày ở một bài viết khác.

Kế tiếp bạn sẽ phải kiểm tra nếu kiểu bài viết là page thì mới thay đổi tiêu đề bài viết, còn dạng post sẽ giữ nguyên giá trị mặc định.

Vậy thì kiểm tra bằng cách nào ? bạn đã có biến toàn cục là $post thì chỉ cần gọi đến phương thức là post_type, thì ngay lập tức bạn sẽ có câu trả lời liền.

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

<?php

class LionelFrontend{

public function __construct(){

// Add filter theTitle thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle'));

// Add filter theTitle2 kiểm tra nếu id = 1 mới thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle2'),10 ,2);

// Add filter changeTitlePage để xác định nếu là page sẽ tiến hành thay đổi tiêu đề

add_filter('the_title', array($this, 'changeTitlePage'));

}

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

// Filter the_title đơn giản

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

public function theTitle(){

$title = 'Thay doi tieu de bai viet';

return $title;

}

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

// Filter the_title truyền tham số

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

public function theTitle2($title , $id){

if ($id == "1"){

$title = 'Thay doi tieu de bai viet';

}

return $title;

}

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

// Filter the_title, nếu là page sẽ thay đổi tiêu đề

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

public function changeTitlePage(){

// Biến toàn cục $post

global $post;

if($post->post_type == "page"){

$title = 'Trang đơn giản';

}

return $title;

}

}

filter-hook-the-title-add-titl-check-page

ID = 2 tức là bạn đang truy cập vào trang sample page, và tiêu để đã được thay đổi.

Phần ví dụ về Hook the_title, xem như tạm ổn, kế tiếp tôi sẽ ví dụ về Hook the_content , để viết một số hàm thực hiện việc thay đổi nội dung, thêm nội dung, xóa toàn bộ nội dung.

# Filter Hook the_content (Một tham số duy nhất là $content)

Xóa toàn bộ nội dung:

Bạn khởi tạo hàm contentNull(), hàm này được định nghĩa là rỗng tức là nếu bạn tạo ra $content và cho nó nó giá trị rỗng, sau đó return trả kết quả về thì toàn bộ nội dung bài viết trên hệ thống WordPress sẽ trở nên rỗng hết.

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

<?php

class LionelFrontend{

public function __construct(){

// Add filter theTitle thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle'));

// Add filter theTitle2 kiểm tra nếu id = 1 mới thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle2'),10 ,2);

// Add filter changeTitlePage để xác định nếu là page sẽ tiến hành thay đổi tiêu đề

//add_filter('the_title', array($this, 'changeTitlePage'));

// Add filter contentNull cho phép nội dung thành rỗng

add_filter('the_content', array($this, 'contentNull'));

}

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

// Filter the_title đơn giản

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

public function theTitle(){

$title = 'Thay doi tieu de bai viet';

return $title;

}

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

// Filter the_title truyền tham số

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

public function theTitle2($title , $id){

if ($id == "1"){

$title = 'Thay doi tieu de bai viet';

}

return $title;

}

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

// Filter the_title, nếu là page sẽ thay đổi tiêu đề

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

public function changeTitlePage($title){

// Biến toàn cục $post

global $post;

if($post->post_type == "page"){

$title = 'Trang đơn giản';

}

return $title;

}

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

// Filter the_content thay đổi nội bài viết thành rỗng

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

public function contentNull(){

$content = '';

return $content;

}

}

filter-hook-the-content-post-null

filter-hook-the-content-page-null

Trình duyệt trả về kết quả là nội dung của id 1 , 2 đều là rỗng.

Kế tiếp tôi sẽ thêm vào nội dung của sample page một đoạn text bất kì, tức là bạn vẫn giữ nguyên giá trị nội dung cũ và thêm vào phía sau nội dung đó một đoạn văn bản khác. Nhưng tôi muốn đoạn nội dung mới chỉ được thêm ở các id có kiểu bài viết là page 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

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

<?php

class LionelFrontend{

public function __construct(){

// Add filter theTitle thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle'));

// Add filter theTitle2 kiểm tra nếu id = 1 mới thay đổi tiêu đề bài viết

//add_filter('the_title', array($this, 'theTitle2'),10 ,2);

// Add filter changeTitlePage để xác định nếu là page sẽ tiến hành thay đổi tiêu đề

//add_filter('the_title', array($this, 'changeTitlePage'));

// Add filter contentNull cho phép nội dung thành rỗng

//add_filter('the_content', array($this, 'contentNull'));

//Add filter addContent vào page, nếu không phải page sẽ không thêm vào

add_filter('the_content', array($this, 'addContent'));

}

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

// Filter the_title đơn giản

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

public function theTitle(){

$title = 'Thay doi tieu de bai viet';

return $title;

}

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

// Filter the_title truyền tham số

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

public function theTitle2($title , $id){

if ($id == "1"){

$title = 'Thay doi tieu de bai viet';

}

return $title;

}

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

// Filter the_title, nếu là page sẽ thay đổi tiêu đề

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

public function changeTitlePage(){

// Biến toàn cục $post

global $post;

if($post->post_type == "page"){

$title = 'Trang đơn giản';

}

return $title;

}

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

// Filter the_content thay đổi nội bài viết thành rỗng

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

public function contentNull(){

$content = '';

return $content;

}

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

// Filter the_content thêm một đoạn nội dung mới vào nội dung hiện tại.

// Nếu đang ở page thì mới cho phép thêm đoạn nội dung mới vào.

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

public function addContent($content){

global $post;

if ($post->post_type == "page")

$content .= 'Xin chào ! Tôi là Lionel và tôi sẽ hướng dẫn bạn từng bước chinh phục WordPress 4.x';

return $content;

}

}

Với đoạn mã ở hàm addContent() thì bạn đã thêm thành công đoạn text mới vào phía sau nội dung của sample page.

filter-hook-the-content-addcontent-page

# Hàm has_filter() – Kiểm tra sự tồn tại của filter

Cú pháp:

1

has_filter('ten_hook', array($this, 'ten_filter'));

Ok, hàm này tương tự hàm has_action() nên tôi sẽ không giải thích quá nhiều.

Giờ bạn sẽ phải kiểm tra xem hàm addContent có tồn tại trên hệ thống không.

1

2

// Kiểm tra xem filter addContent có tồn tại không

echo "<br />" .has_filter('the_content', array($this, 'addContent'));

Gọi hàm này ở bên trong hàm construct, kết quả trình duyệt sẽ trả về con số 10, tức con số mặc định của độ ưu tiên thuộc hàm add_filter().

# Hàm remove_filter() – Loại bỏ một filter được chỉ định

Cú pháp:

1

remove_filter('the_content', array($this, 'addContent'));

Hàm này chỉ hoạt động nếu nó được xếp phia sau hàm add_filter().

Với đoạn code trên thì bạn se loại bỏ được hàm addContent thuộc Filter Hook the_title

# Hàm remove_all_filters() – Loại bỏ một filter được chỉ định

Cú pháp:

1

remove_all_filters('the_content');

Với đoạn code này thì toàn bộ các giá trị bên trong Filter the_content sẽ bị loại bỏ hoàn toàn.

Sử dụng độ ưu tiên:

1

remove_all_filters('the_content',10);

Sẽ chỉ đinh ra các hàm có độ ưu tiên là là 10 và loại bỏ nó ra khỏi hệ thống WordPress.

3/ Kết bài

Filter Hook còn chứa đựng rất nhiều giá trị khác, nhưng tôi không thể nào trình bày hết trong bài viết này được mà tôi sẽ cố gắng hướng dẫn bạn ở các bài về sau, vậy sau khi kết thúc bài Sử dụng Filter Hook toàn tập, chắc hẳn bạn đã hiểu vì sao tôi nói 2 kiểu Hook chính là Action Hook & Filter Hook chiếm hết 60% sức mạnh của WordPress. Nếu bạn nắm vững bài này thì ở phần xây dựng themes hoặc xử lý plugin bạn sẽ không mất nhiều thời gian để tìm hiểu cách sử dụng.

Series Navigation<< Xây dựng WordPress plugin với lập trình hướng đối tượngTạo mới WordPress admin menu page >>

Nguồn: laptrinhweb.org

Last updated