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

Đa phần khi bạn mới bắt tay vào tìm hiểu và phát triển WordPress hoặc điển hình là xây dựng plugin, thường sử dụng phương pháp lập trình hướng thủ tục php (function) để xử lý các chức năng. Nhưng bất cập bạn sẽ gặp phải về sau là khó phát triển và nâng cấp plugin,nếu bạn đã từng học Lập trình php thì cũng hiểu được những yếu điểm của phương pháp lập trình truyền thống.

Do đó bài Xây dựng WordPress plugin với lập trình hướng đối tượng ra đời sẽ giúp cho bạn có cái nhìn tổng quát hơn về một nền tảng xây dựng plugin có chiều sâu và độ mở rộng tốt. Bài này sẽ liên quan tới bài Giới thiệu WordPress Action Hook, nếu bạn chưa xem hoặc quên bài thì có thể xem lại để tiếp thu bài này tốt hơn.

Lập trình hướng đối tượng (OOP) là một khái niệm rất cần thiết trong quá trình phát triển WordPress chuyên nghiệp, vì nó có quá nhiều vấn đề nên tôi không thể trình bày hết trong bài được, bạn có thể google thêm hoặc chờ đợi tác giả Aki triển khai loạt bài về nó.

Nội dung bài bao gồm:

· Các Action Hook thông dụng

· Tạo mới WordPress Action Hook & truyền tham số

· Sử dụng class với WordPress Action Hook

1/ Các WordPress Action Hook thông dụng

Danh sách các Action Hook thông dụng:

· plugin_loaded(): Thực thi việc load plugin khi bắt đầu tải trang.

· init(): Thực thi hành động khi WordPress tải xong một trang nhưng trước khi các thông số trong phần head được gửi đi.

· admin_menu(): Thực thi hành động thêm vào trang quản trị một menu mới.

· wp_head(): Thực thi các hành động load và xử lý các file css , js khi tải trang.

· delete_post(): Thực thi hành động khi bạn xóa bài viết.

Ngoài ra còn khá là nhiều Action Hook được sử dụng thường xuyên, nhưng tôi không thể trình bày hết được, ở bài khác tôi sẽ hướng dẫn bạn nghiên cứu luồng xử lý dữ liệu và thứ tự chạy của Action Hook trong hệ thống WordPress.

1/ Tạo mới WordPress Action Hook & truyền tham số

Do nhu cầu hiển thị chức năng của website, bạn hoàn toàn có thể tạo ra các Action Hook theo ý của bạn , các action này thường được nhúng vào các themes.

Để tạo mới Action Hook thì WordPress cung cấp cho bạn hai hàm add_action()do_action()

Đoạn code xử lý:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?php

/**

* @package Demo Hook Action By Lionel

* @version 0.1

*/

/*

Plugin Name: Demo Hook Action

Plugin URI: http://laptrinhweb.org

Description: Demo về cách sử dụng Hook Action.

Author: Lionel

Version: 1.0

Author URI: None

*/

add_action('lionel_hook_head', 'lionel_new_hook_head');

function lionel_new_hook_head(){

echo "Lionel new hook head is working";

}

function lio_head(){

do_action('lionel_hook_head');

}

Ở ví dụ này tôi vẫn sử dụng lại plugin Demo Hook Action.

Lý giải code xử lý, tôi tạo mới Hook lionel_hook_head và action là lionel_new_hook_head, dùng hàm add_action cho phép action vừa khởi tạo truy cập vào vị trí của Hook mới.

Khai báo hàm lio_head() để hứng giá trị action vừa khởi tạo, hàm do_action() sẽ đăng ký Hook vào hệ thống WordPress và cho phép nó hiển thị ra trình duyệt.

Do nó là một Hook Action nếu bạn muốn hiển thị thì phải nhúng code vào themes bạn đang sử dụng và vị trí nhúng là phần header, hiện tại tôi đang dùng themes Twenty Thirteen nên tôi sẽ truy cập vào folder wp-content->themes->twentythirteen->header.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

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<?php

/**

* The Header template for our theme

*

* Displays all of the <head> section and everything up till <div id="main">

*

* @package WordPress

* @subpackage Twenty_Thirteen

* @since Twenty Thirteen 1.0

*/

?><!DOCTYPE html>

<!--[if IE 7]>

<html class="ie ie7" <?php language_attributes(); ?>>

<![endif]-->

<!--[if IE 8]>

<html class="ie ie8" <?php language_attributes(); ?>>

<![endif]-->

<!--[if !(IE 7) & !(IE 8)]><!-->

<html <?php language_attributes(); ?>>

<!--<![endif]-->

<head>

<meta charset="<?php bloginfo( 'charset' ); ?>">

<meta name="viewport" content="width=device-width">

<title><?php wp_title( '|', true, 'right' ); ?></title>

<link rel="profile" href="http://gmpg.org/xfn/11">

<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>">

<!--[if lt IE 9]>

<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js"></script>

<![endif]-->

<?php lio_head(); ?>

<?php wp_head(); ?>

</head>

<body <?php body_class(); ?>>

<div id="page" class="hfeed site">

<header id="masthead" class="site-header" role="banner">

<a class="home-link" href="<?php echo esc_url( home_url( '/' ) ); ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">

<h1 class="site-title"><?php bloginfo( 'name' ); ?></h1>

<h2 class="site-description"><?php bloginfo( 'description' ); ?></h2>

</a>

<div id="navbar" class="navbar">

<nav id="site-navigation" class="navigation main-navigation" role="navigation">

<button class="menu-toggle"><?php _e( 'Menu', 'twentythirteen' ); ?></button>

<a class="screen-reader-text skip-link" href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentythirteen' ); ?>"><?php _e( 'Skip to content', 'twentythirteen' ); ?></a>

<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) ); ?>

<?php get_search_form(); ?>

</nav><!-- #site-navigation -->

</div><!-- #navbar -->

</header><!-- #masthead -->

<div id="main" class="site-main">

Do hàm lio_head() đã hứng giá trị của action lionel_new_hook_head, nên bạn chỉ cần nhúng ở phía trên hàm wp_head() và kết quả là phần head của website đã xuất hiện dòng “Lionel new hook head is working”.

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

Lionel Hook New Head

Kế tiếp tôi sẽ hướng dẫn bạn truyền tham số vào Action Hook.

Như bạn đã biết, hàm add_action có tất cả là 4 tham số, tham số thứ tư sẽ xác định số lượng các tham số bạn truyền vào action.

1

add_action('lionel_hook_head', 'lionel_new_hook_head', '', 2);

Do tham số thứ ba mặc định là số 10, nên nó sẽ hoạt đồng ngầm, để sử dụng được tham số thứ tư bạn cần set giá trị cho tham số thứ ba là một con số bất kì hoặc cho nó rỗng. Ở ví dụ này tôi sẽ truyền hai tham số $css = ‘css’ , $js = ‘jquery’ vào action, nên tôi sẽ cho tham số thứ tư thuộc hàm add_action là 2.

Đoạn code xử lý:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?php

/**

* @package Demo Hook Action By Lionel

* @version 0.1

*/

/*

Plugin Name: Demo Hook Action

Plugin URI: http://laptrinhweb.org

Description: Demo về cách sử dụng Hook Action.

Author: Lionel

Version: 1.0

Author URI: None

*/

add_action('lionel_hook_head', 'lionel_new_hook_head', '', 2);

function lionel_new_hook_head($css, $js){

echo 'Lionel new hook head is working with '.$css. ' and '.$js.'';

}

function lio_head($css = 'css', $js = 'jquery'){

do_action('lionel_hook_head', $css, $js);

}

Phần action lionel_new_hook_head bạn truyền tham số rỗng vào còn ở phần hàm lio_head() hứng giá trị của action thì bạn cho giá trị vào tham số, ở hàm do_action() ngoài tên Hook ra bạn cần phải truyền vào 2 tham số vừa khai báo. Làm theo đoạn code bạn sẽ nhận được kết quả.

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

Lionel Hook New Head Param

Lưu ý:

Nếu bạn truyền vào 4 tham số thì ở hàm add_action() ở tham số thứ tư bạn phải điền vào là số 4, tức là khai báo bao nhiêu tham số thì điền đúng số lượng vào là được.

3/ Sử dụng class với WordPress Action Hook

Ở mục 2 trong bài thì bạn đang viết plugin với phương pháp lập trình truyền thống là hướng thủ túc, ở phần này tôi sẽ hướng dẫn bạn tạo ra class lionelHook để xử lý mọi hành động của plugin.

Bạn sẽ cần phải thêm vào cấu trúc folder plugin một folder mới là inc, trong folder này sẽ chứa file frontend.php.

Nội dung file frontend.php:

1

2

3

4

5

6

<?php

class LionelHook{

public function lionel_hook_demo(){

echo "Lionel Hook is working with OOP";

}

}

Khởi tạo Lớp (class) LionelHook chứa phương thức lionel_hook_demo (action).

Nội dung file lionel-hook.php:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?php

/**

* @package Demo Hook Action By Lionel

* @version 0.1

*/

/*

Plugin Name: Demo Hook Action

Plugin URI: http://laptrinhweb.org

Description: Demo về cách sử dụng Hook Action.

Author: Lionel

Version: 1.0

Author URI: None

*/

$path = plugin_dir_path(__FILE__);

require_once ''.$path.'inc/frontend.php';

$lioHook = new LionelHook();

add_action('wp_head', array($lioHook, 'lionel_hook_demo'));

Do class LionelHook được định nghĩa ở file frontend.php, vì thế bạn phải nhúng dường dẫn tuyệt đối của nó vào file xử lý chính của plugin, lúc ấy mới có thể gọi đến các phương thức bên trong class.

Tạo biến $lioHook để khởi tạo một đối tượng mới, dùng hàm add_action để cho phép Action này hoạt động. Do là một đối tượng nên tham số thứ hải của hàm add_action bạn phải dùng array($tenbien, ‘ten_action’).

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

Lionel Hook Demo With OOP

Kết quả: Trình duyệt sẽ in ra dòng Lionel Hook is working with OOP như hình.

Lúc này tôi muốn tối ưu file xử lý chính của plugin hơn. bằng cách tôi muốn các action sẽ được gọi cùng một lúc khi bắt đầu kích hoạt và tải trang.

Đoạn code xử lý file frontend.php:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?php

class LionelHook{

public function __construct(){

add_action('wp_head', array($this, 'lionel_hook_demo'), 19);

add_action('wp_head', array($this, 'lionel_hook_demo1'), 18);

}

public function lionel_hook_demo(){

echo "Lionel Hook is working with OOP <br />";

}

public function lionel_hook_demo1(){

echo "Lionel Hook Demo is working with OOP <br />";

}

}

Với việc khai báo hai hàm add_action() vào hàm khởi tạo _construct() thì bạn sẽ tiết kiệm đc thời gian viết code hơn. Vì hàm construct sẽ giúp bạn load cùng lúc hai hoặc nhiều action vào một Hook nào đó. $this (chính nó) là tên của class. Khi đó file xử lý chính sẽ nhìn đơn giản và gọn gàng hơn rất nhiều.

File lionel-hook.php:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?php

/**

* @package Demo Hook Action By Lionel

* @version 0.1

*/

/*

Plugin Name: Demo Hook Action

Plugin URI: http://laptrinhweb.org

Description: Demo về cách sử dụng Hook Action.

Author: Lionel

Version: 1.0

Author URI: None

*/

$path = plugin_dir_path(__FILE__);

require_once ''.$path.'inc/frontend.php';

// Khởi tạo đối tượng để thực thi các hành động bên trong class

new LionelHook();

Kết quả: Phần head sẽ xuất hiện hai câu thông báo.

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

Lionel Hook Demo With OOP Construct

Vấn đề cuối cùng, dùng phương thức static trong lập trình hướng đối tượng để gọi đến bất kì phương thức nào trong class mà không cần khởi tạo một đối tượng mới.

File frontend.php:

1

2

3

4

5

6

7

8

9

10

11

<?php

class LionelHook{

public function __construct(){

add_action('wp_head', array($this, 'runHook'));

}

public static function runHook(){

echo "Lionel Hook Demo is working with OOP <br />";

}

}

File lionel-hook.php:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?php

/**

* @package Demo Hook Action By Lionel

* @version 0.1

*/

/*

Plugin Name: Demo Hook Action

Plugin URI: http://laptrinhweb.org

Description: Demo về cách sử dụng Hook Action.

Author: Lionel

Version: 1.0

Author URI: None

*/

$path = plugin_dir_path(__FILE__);

require_once ''.$path.'inc/frontend.php';

// Dùng phương thức static gọi tói phương thức runHook mà không cần khởi tạo đối tượng

LionelHook::runHook();

Kết quả: Phần head xuất ra câu thông báo Lionel Hook Demo is working with OOP.

Như vậy, thông qua 3 ví dụ trên thì bạn đã thấy được sức mạnh của lập trình hướng đối tượng bổ ích ra sao rồi đấy,nó giúp bạn tinh giản các dòng code hơn, file xử lý chính sẽ nhẹ nhàng và load nhanh hơn.

4/ Kết bài

Qua bài viết Xây dựng plugin với lập trình hướng đối tượng, tôi hy vọng bạn sẽ lựa chọn cho mình phương pháp coding hiệu quả và dễ nâng cấp, tôi không ép bạn phải từ bỏ cách lâp trình truyền thống, nhưng bạn sẽ thấy nhiều cái lợi nếu áp dụng phương pháp OOP để xây dựng plugin. Ở bài tiếp theo bạn sẽ phải làm quen với kiểu Hook Filter.

Series Navigation<< Giới thiệu WordPress Action HookSử dụng Filter Hook toàn tập >>

Nguồn: laptrinhweb.org

Last updated