Advertisement
  1. Web Design
  2. WordPress

Hướng dẫn thay các hàm của theme cha bằng các hàm của theme con

by
Read Time:9 minsLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Nếu bạn đã có bất kỳ kinh nghiệm nào với các theme cha và con trong WordPress, thì bạn sẽ biết rằng các tập tin template trong theme con của bạn thay thế chúng trong theme cha của bạn. Ví dụ nếu theme cha có một tập tin page.php và bạn tạo một cái mới trong theme con của bạn, thì WordPress sẽ sử dụng cái trong theme con khi hiển thị các trang.

Có thể bạn nghĩ rằng các hàm sẽ làm việc theo cách tương tự: tạo một hàm mới trong tập tin functions.php của theme con với cùng tên như cái trong theme cha, và nó sẽ được ưu tiên. Thật không may, nó không đơn giản như vậy.

Trong hướng dẫn này tôi sẽ chỉ cho bạn ba phương pháp mà bạn có thể sử dụng để thay các hàm từ theme cha bằng các hàm trong theme con của bạn:

  • các hàm có thể gắn vào
  • ưu tiên hàm
  • xoá các hàm khỏi hook mà chúng được gắn vào

Cách các hàm trong theme cha và con làm việc

Trước khi xem xét các phương pháp để thay thế các hàm trong theme con của bạn, chúng ta cần phải hiểu cách các hàm làm việc trong theme cha và con.

Trước hết, bạn cần phải biết rằng tất cả các hàm trong theme cha của bạn sẽ được thực thi khi bạn sử dụng một theme con. Bạn không cần phải thêm bất cứ điều gì vào tập tin functions của theme để làm cho điều này xảy ra. Điều này là khác so với CSS, nơi bạn có để tự bao gồm stylesheet của theme cha trong stylesheet chủa theme con.

Các hàm trong theme con của bạn sẽ được nạp trước các hàm trong theme cha. Điều này có nghĩa là nếu cả hai theme cha và con có các hàm gọi là my_function() thực hiện cùng một công việc, thì cái trong theme cha sẽ được nạp sau cùng, có nghĩa là nó sẽ ghi đè lên cái trong theme con.

Tuy nhiên bạn có thể thay đổi thứ tự trong đó các hàm được thực thi, và bạn có thể hạn chế các hàm cùng thực thi, như chúng ta sẽ thấy trong chốc lát nữa.

Các hàm có thể gắn vào

Các hàm có thể gắn vào là thứ gì đó mà bạn code vào trong theme cha, vì vậy chúng không có tác dụng gì với bạn nếu bạn đang làm việc với một theme cha mà không có chúng.

Nếu bạn đang viết theme cha của chính bạn, có lẽ đây là điểm khởi đầu cho các dự án đó, hoặc nếu bạn đang tạo framework cho chính bạn, thì cách tốt nhất là tạo các hàm của bạn có thể gắn vào vì vậy mà bạn có thể dễ dàng ghi đè chúng trong các theme con. Một ý tưởng cũng tốt là hook thông qua các hàm mà được viết vào trong theme cha mà bạn đang sử dụng, giống như nhiều theme khác, bao gồm cả theme mặc định của WordPress, sẽ có các hàm có thể gắn vào.

Để viết một hàm có thể gắn vào, bạn chỉ đơn giản là bao nó trong một điều kiện để kiểm tra nếu một hàm với tên đó đã được chạy:

Vì vậy bạn bao các hàm trong theme cha trong một điều kiện giống như thế này, WordPress sẽ kiểm tra nếu có một hàm cùng tên trong theme con mà đã được chạy, và nếu trong trường hợp đó nó sẽ không chạy hàm từ theme cha.

Sau đó khi bạn đến viết một hàm trong theme con mà bạn muốn ghi đè lên cái ở trong theme cha, thì bạn chỉ cần cho nó một cái tên tương tự như cái ở trong theme cha:

WordPress sẽ chạy hàm trong theme con trước tiên, và khi đến lượt cái ở trong theme cha, nó sẽ kiểm tra nếu nó đã tồn tại thì nó sẽ không thực thi nữa.

Ưu tiên hàm

Nếu bạn không sử dung theme cha của chính bạn, hoặc bạn đang sử dụng một theme bên ngoài mà không có các hàm có thể gắn vào, thì bạn sẽ cần một phương thức khác.

Khi bạn viết các hàm bạn có thể chỉ định độ ưu tiên cho chúng, điều này nói cho WordPress biết khi nào thì nên chạy chúng. Bạn làm điều này khi thêm hàm của bạn vào một action hoặc filter. Sau đó WordPress sẽ chạy các hàm được gắn vào một hook cho trước theo thứ tự tưu tiên, vì vậy những cái nào mà có độ ưu tiên cao hơn sẽ chạy trước.

Hãy tưởng tượng hàm trong theme cha không có khả năng gắn vào, và trông như thế này:

Hàm này được gắn vào trong hook init và không được chỉ định một độ ưu tiên. Mặc định WordPress thiết lập một độ ưu tiên là 10 cho các hàm mà không được kèm theo một độ ưu tiên, vì vậy để chạy hàm của bạn sau nó bạn sử dụng một số lớn hơn 10. Tôi có xu hướng sử dụng số 15 vì vậy tôi có thể thêm một cái khác giữa chúng sau này.

Điều này có nghĩa là hàm trong theme con của bạn sẽ trông như thế này:

Ngược lại, hàm ở trong theme cha của bạn có thể đã có một độ ưu tiên được thiết lập sẵn:

Vì vậy bạn chỉ cần đảm bảo độ ưu tiên mà bạn gắn cho hàm trong theme con của bạn là cao hơn:

Xoá các hàm khỏi hook

Đôi khi chạy một hàm khác sau cái đầu tiên không đủ để ghi đè nó — bạn cần đảm bảo hàm trong theme cha hoàn toàn không chạy. Trong trường hợp này, bạn có thể xoá hàm của theme cha khỏi hook mà nó được gắn vào, bằng cách sử dụng các hàm remove_action() hoặc remove_filter(). Cái mà bạn sử dụng sẽ tuỳ thuộc vào hàm nào được gắn vào một action hook hoặc filter hook trong theme cha.

Vì vậy hãy trở lại hàm trước của chúng ta trong theme cha:

Để xoá hàm này khỏi action hook của nó và từ đó ngăn không cho nó thực thi, bạn có thể tạo một hàm trong theme con của bạn để xoá nó bằng cách sử dụng remove_action():

Tuy nhiên, điều này sẽ không có tác dụng trên chính nó — bạn cần gắn hàm này vào một hook mà sẽ thực thi sau hook mà hàm của theme cha được gắn vào. Điều này là bởi vì bạn không thể xoá action trước khi nó được chạy. Bạn có thể tìm thấy chi tiết về thứ tự trong đó các action được chạy trong Codex.

Một khi bạn đã thực hiện xong điều này, bạn có thể đơn giản là viết một hàm khác để thay thế hàm của theme cha trong tập tin functions của theme con, hoặc bạn có thể không làm gì cả nếu tất những gì bạn muốn làm là xoá hàm khỏi theme cha.

Lưu ý đối với độ ưu tiên

Lưu ý rằng nếu bạn đang cố gắng xoá một hàm sử dụng remove_action() hoặc remove_filter() và hàm đã có một độ ưu tiên được thiết lập vào nó, bạn phải bao gồm độ ưu tiên khi xoá nó, nếu không nó sẽ không có tác dụng.

Vì vậy nếu hàm trong theme cha trông giống như thế này:

... bạn sẽ cần bao gồm giá trị ưu tiên tương tự khi xoá nó:

Tổng kết

Ghi đè các hàm trong theme cha thì phức tạp hơn việc ghi đè các tập tin template hoặc phong cách, nhưng có thể thực hiện được. Ở đây tôi đã hướng dẫn cho bạn ba phương thức để làm điều này:

  • Nếu bạn đang viết theme cha của chính bạn, hoặc sử dụng một cái mà có chúng, sử dụng các hàm có thể gắn vào để một hàm trong theme con có cùng tên như cái trong theme cha sẽ thay thế nó.
  • Thiết lập độ ưu tiên cao hơn vào các hàm trong theme con của bạn để đảm bảo chúng chạy sau những hàm trong theme cha của bạn.
  • Sử dụng remove_action() hoặc remove_filter() để xoá hoàn toàn các hàm trong theme cha.

Phương thức nào mà bạn sẽ sử dụng tuỳ thuộc vào cách mà theme cha của bạn được code và trường hợp bạn cần xoá hoàn toàn hàm của theme cha hay chỉ cần chạy một hàm khác sau đó để ghi đè nó.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.