VPS

WordPress hook: action và filter giải thích dễ hiểu

Thanh Nguyễn Đăng 9 phút đọc 4 khối lệnh

WordPress hook: action và filter giải thích dễ hiểu
Mục lục bài viết
  1. Action và filter, khác nhau ở một chỗ
  2. Độ ưu tiên và số tham số
  3. Tìm đúng hook cần dùng
  4. Đặt mã tùy biến ở đâu
  5. Vài hook dùng nhiều trong việc thật
  6. Phân biệt hai loại, khác nhau ở đúng một chỗ
  7. Bảng nơi đặt mã và khả năng sống qua cập nhật
  8. Ba thói quen tránh làm vỡ trang
  9. Câu hỏi thường gặp
  10. Bài viết liên quan

Trả lời nhanh: WordPress hook là điểm móc mà mã lõi chừa sẵn để bạn chen mã của mình vào, khỏi phải sửa file gốc. Có đúng hai loại và phân biệt rất đơn giản: action là làm thêm việc gì đó tại một thời điểm, còn filter là sửa một giá trị trước khi nó được dùng. Quy tắc nhớ được ngay: hàm gắn vào filter bắt buộc phải trả về giá trị, hàm gắn vào action thì không cần. Quên trả về ở filter là lỗi khiến nội dung biến mất trắng.

Hook là khái niệm nền của mọi thứ trong WordPress: plugin, giao diện, và cả cách lõi tự vận hành. Hiểu nó thì bạn tùy biến được gần như mọi thứ mà vẫn cập nhật lõi bình thường. Không hiểu thì sớm muộn cũng có người sửa thẳng file gốc, và mọi công sức bay sạch ở lần cập nhật kế tiếp.

Action và filter, khác nhau ở một chỗ

Action là lời mời làm thêm việc. Lõi chạy tới một điểm, thông báo ra, ai muốn làm gì thì làm, không ai chờ kết quả trả về.

TerminalAction và filter, khác nhau ở một chỗbash
add_action('wp_footer', function () {    echo '<p>Xin chào từ chân trang</p>';});

Filter là lời mời sửa một giá trị. Lõi đưa cho bạn giá trị hiện tại, bạn trả lại giá trị mới, và lõi dùng cái bạn trả về.

TerminalAction và filter, khác nhau ở một chỗbash
add_filter('the_title', function ($tieu_de) {    return $tieu_de . ' (đã cập nhật)';});

Toàn bộ khác biệt nằm ở chữ return. Đây cũng là lỗi số một của người mới: gắn hàm vào filter, xử lý xong nhưng quên trả về, kết quả là WordPress nhận giá trị rỗng và tiêu đề hay nội dung biến mất. Khi thấy một vùng nội dung tự nhiên trống, đây là chỗ đầu tiên nên soi.

Độ ưu tiên và số tham số

TerminalĐộ ưu tiên và số tham sốbash
add_filter('the_content', 'ham_cua_toi', 20, 1);//                        ten ham        ^   ^//                             uu tien --+   +-- so tham so

Độ ưu tiên quyết định thứ tự chạy khi nhiều hàm cùng gắn vào một hook. Mặc định là 10, số nhỏ hơn chạy trước. Bạn cần tới nó khi muốn chạy sau một plugin khác: đặt 20 thì hàm của bạn nhận kết quả đã qua tay plugin đó.

Số tham số phải khai báo nếu bạn muốn nhận hơn một tham số. Không khai báo thì hàm chỉ nhận tham số đầu tiên, và các tham số sau sẽ rỗng dù hook có cung cấp. Đây là lỗi khó chịu vì nó không báo gì cả, chỉ đơn giản là dữ liệu không có.

Mẹo gỡ rối nhanh khi hook không chạy: kiểm tra ba thứ theo thứ tự, tên hook có gõ đúng không, mã có được nạp không, và hook đã chạy qua trước khi mã của bạn được đăng ký chưa.

Tìm đúng hook cần dùng

WordPress có hàng nghìn hook nên câu hỏi thường không phải dùng thế nào mà là dùng cái nào. Ba cách tìm:

  • Đọc mã lõi tại chỗ bạn muốn can thiệp. Tìm các lời gọi phát hành hook ngay quanh đoạn xử lý đó, tên hook thường nói lên thời điểm rất rõ.
  • Dùng plugin liệt kê hook đang chạy trên một trang cụ thể. Cách này nhanh nhất khi bạn chưa quen mã lõi.
  • Hỏi agent kèm ngữ cảnh cụ thể. Ví dụ, muốn đổi nội dung email khi đơn hàng chuyển trạng thái thì hook nào phù hợp. Nhớ yêu cầu nó chỉ ra chỗ hook được phát hành để bạn tự kiểm chứng, đừng tin tên hook được nêu ra mà không kiểm.

Điểm cuối quan trọng vì tên hook là thứ mô hình rất dễ bịa ra một cái nghe hợp lý mà không tồn tại. Cách chống bịa và các bẫy khác khi để agent viết plugin nằm ở bài viết plugin WordPress an toàn.

Đặt mã tùy biến ở đâu

Ba chỗ, xếp theo mức độ nên dùng:

Plugin nhỏ của riêng bạn là lựa chọn phù hợp. Mã sống độc lập với giao diện, đổi giao diện không mất, và bạn tắt được khi cần gỡ lỗi. Chỉ cần một file với vài dòng khai báo ở đầu là thành plugin.

Giao diện con hợp với những tùy biến gắn chặt vào cách hiển thị của chính giao diện đó.

File chức năng của giao diện cha là chỗ tệ nhất, vì cập nhật giao diện sẽ xóa sạch. Đáng tiếc đây lại là chỗ nhiều hướng dẫn trên mạng bảo bạn dán mã vào.

Nguyên tắc chung không đổi: không bao giờ sửa file lõi WordPress hay file của plugin bên thứ ba. Ngoài chuyện mất khi cập nhật, bạn còn mất luôn khả năng nhận bản vá bảo mật, thứ mà một trang công khai rất cần.

Vài hook dùng nhiều trong việc thật

init chạy sớm sau khi WordPress nạp xong, hợp để đăng ký loại nội dung và phân loại riêng.

wp_enqueue_scripts là nơi đúng để nạp file CSS và JavaScript. Chèn thẳng thẻ vào chân trang thì vẫn hiện, nhưng bạn mất quản lý phụ thuộc và mất luôn khả năng gộp file của các plugin tối ưu.

the_content để chèn thêm nội dung vào bài viết, ví dụ khối kêu gọi hành động cuối bài. Nhớ kiểm tra đang ở trang đơn lẻ để khỏi chèn cả vào danh sách bài.

pre_get_posts để đổi truy vấn trước khi nó chạy, ví dụ đổi số bài mỗi trang cho một chuyên mục. Đây là hook mạnh nên dễ gây hại: luôn kiểm tra đúng truy vấn chính và đúng ngữ cảnh trước khi đổi, nếu không bạn ảnh hưởng cả trang quản trị.

Với trang nhiều plugin cùng móc vào cùng một hook, thứ tự chạy trở nên khó đoán và hiệu năng cũng đi xuống. Cách chẩn đoán khi trang chậm nằm ở bài WordPress chậm.

Phân biệt hai loại, khác nhau ở đúng một chỗ

LoạiNó làm gìCó trả về giá trị không
Loại thực thiChạy thêm việc tại một thời điểmKhông, chỉ làm rồi thôi
Loại biến đổiNhận một giá trị, đổi nó rồi trả vềCó, bắt buộc phải trả về

Lỗi phổ biến nhất của người mới: dùng loại biến đổi mà quên trả về giá trị. Kết quả là nội dung biến mất hoặc giá bằng 0, và rất khó tìm ra nguyên nhân vì không có thông báo lỗi nào.

Bảng nơi đặt mã và khả năng sống qua cập nhật

Nơi đặtSống qua cập nhật khôngNên dùng không
Sửa thẳng tệp lõiKhông, mất sạchKhông, tuyệt đối
Tệp chức năng của giao diện mua sẵnKhông, mất khi giao diện cập nhậtKhông
Tệp chức năng của giao diện conCóĐược, cho phần hiển thị
Plugin riêng do bạn viếtCó, và đổi giao diện vẫn giữĐúng nhất, cho phần chức năng

Quy tắc phân biệt: nếu tùy biến đó liên quan tới cách hiển thị thì đặt trong giao diện con; nếu nó là chức năng nghiệp vụ thì đặt trong plugin riêng. Lý do: một ngày nào đó bạn đổi giao diện, và chức năng nghiệp vụ không được mất theo.

Ba thói quen tránh làm vỡ trang

TerminalBa thói quen tránh làm vỡ trangbash
# 1. Luon kiem ham co ton tai truoc khi goi,#    nhat la ham cua plugin khac#    if ( function_exists( 'ten_ham' ) ) Ellipsis # 2. Loai bien doi PHAI tra ve gia tri, ke ca khi khong doi gi#    Quen tra ve la noi dung bien mat # 3. Dat do uu tien co y thuc, dung de mac dinh het#    Hai doan ma cung diem moc se chay theo do uu tien # Kiem nhat ky khi trang trangtail -50 wp-content/debug.log 2>/dev/nulltail -50 /var/log/nginx/error.log # Bat ghi nhat ky loi trong file cau hinh WordPress khi dang phat trien,# va TAT tren trang chay that

Cách tìm đúng điểm móc cần dùng: đọc mã nguồn của phần bạn muốn can thiệp, tìm nơi hệ thống gọi ra các điểm móc. Đây là cách chắc chắn hơn nhiều so với tìm trên mạng, vì tên điểm móc thay đổi giữa các phiên bản.

Câu hỏi thường gặp

Làm sao nhớ được action hay filter?

Hỏi một câu: lõi có chờ giá trị trả về không. Nếu có thì đó là filter và hàm của bạn bắt buộc trả về. Nếu không thì đó là action và bạn chỉ cần làm việc của mình rồi thôi.

Vì sao hook của tôi không chạy?

Ba nguyên nhân theo thứ tự hay gặp: gõ sai tên hook, mã chưa được nạp vì đặt sai chỗ, hoặc bạn đăng ký quá muộn khi hook đã chạy qua rồi. Kiểm tra bằng cách in ra một dòng ngay trong hàm để xem nó có được gọi không.

Thay đổi bằng hook có mất khi cập nhật WordPress không?

Không, miễn là mã của bạn nằm trong plugin riêng hoặc giao diện con. Đó chính là lý do hook tồn tại. Chỉ mất khi bạn sửa thẳng file lõi hoặc file của plugin bên thứ ba.

Nhiều hook có làm trang chậm không?

Bản thân cơ chế hook rất nhẹ. Cái nặng là việc mà các hàm gắn vào đó làm, ví dụ truy vấn database trong một hook chạy ở mỗi lần tải trang. Hãy soi việc bên trong hàm chứ đừng đổ cho số lượng hook.

Chia sẻ:Facebook

Thanh Nguyễn

TND

Tư vấn bản quyền, VPS và máy chủ kèm hóa đơn VAT, hợp đồng đầy đủ cho doanh nghiệp.