Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress
Code

Những thông báo admin liên tục của WordPress: Phần 2

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Persisted WordPress Admin Notices.
Persisted WordPress Admin Notices: Part 1
Persisted WordPress Admin Notices: Part 3

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

Trong một phần của loạt bài này, chúng tôi đã học cách triển khai thông báo admin cơ bản, xuất hiện ở đầu mỗi trang admin của WordPress. Trong hướng dẫn này, chúng tôi sẽ bắt đầu xây dựng một plugin chứa tất cả code cho thông báo admin tự tạo của chúng tôi.

Chúng tôi sẽ bắt đầu bằng cách triển khai các thông báo admin chuẩn mực và sử dụng chúng làm cơ sở cho các ví dụ linh hoạt và nâng cao hơn.

Thiết lập plugin của chúng tôi

Trước tiên, chúng ta hãy thiết lập một plugin mới hoàn toàn, chúng tôi sẽ sử dụng plugin mới cho tất cả các thông báo admin của chúng tôi, do đó chúng tôi đã sẵn sàng để bắt đầu nhập code vào.

Tôi sẽ giả định ở đây rằng bạn đã thiết lập sẵn một trang web cục bộ để phát triển WP. Nếu chưa có thì hãy tham khảo lại các liên kết trong phần một của loạt bài hướng dẫn này.

Tạo một thư mục plugin mới được gọi là admin_notices bên trong /wp-content/plugins/, và sau đó tạo admin_notices.php sẽ làm file plugin chính.

Mở admin_notices.php trong editor (trình biên tập) yêu thích của bạn và bổ sung cấu trúc plugin cơ bản:

Chúng tôi đã thêm một tiêu đề plugin cơ bản để WordPress nhận ra plugin của chúng tôi. Tiếp theo là một lớp chứa các phương thức hiển thị thông báo admin của chúng ta.

Tôi đã đặt tên class là Gwyer_Admin_Notices để cố gắng và biến nó trở thành duy nhất. Bằng cách này, chúng ta sẽ không gặp xung đột với các class sẵn có.

Hãy bắt đầu bằng cách hiển thị một thông báo admin cơ bản, và sau đó bổ sung thêm để làm cho nó hữu dụng hơn. Để tạo một thông báo admin, thêm hook của admin_notices vào hàm init():

Hook bao gồm một hàm callback test_notice sẽ được sử dụng để xuất markup cho thông báo admin.

Thêm phương thức sau vào class Gwyer_Admin_Notices để hiển thị thông báo admin thực. Đối với các thông báo, chúng ta sẽ sử dụng trích dẫn phim cổ điển từ những bộ phim của 100 năm qua.

Kích hoạt plugin để xem phần thông bảo kiểm tra.

Adding a basic admin notice to our plugin

Chúng ta cũng hãy bổ sung các ví dụ về các loại thông báo admin khác mà chúng ta có thể hiển thị bao gồm cả kiểu có thể bị loại bỏ bằng cách thêm lớp CSS is-dismissible. Thêm những kiểu này vào phương thức test_notice() bên dưới thành phần div hiện có đang chứa thông báo admin:

Full set of admin notice types

Đây là mảng đầy đủ các kiểu thông báo admin, chúng tôi có thể hiển thị thông qua các lớp CSS cốt lõi của WordPress. Hãy nhớ rằng, thông báo có thể bị loại bỏ của trang admin sẽ xuất hiện lại mỗi khi trang tải lại!

Thông báo admin 'có thể loại bỏ' trong tình huống này chỉ có nghĩa đối với trang hiện hành. Việc có thông báo admin hiển thị liên tục dai dẵng không thực sự phù hợp, do đó sau đây chúng tôi sẽ nghiên cứu cụ thể những phương cách khác nhau để bạn có thể loại bỏ thông báo admin của bạn một cách hiệu quả.

Hooks cho thông báo admin

Cho đến thời điểm này, chúng tôi chỉ sử dụng hook của admin_notice để triển khai một thông báo admin. Trên thực tế, có 4 hooks riêng biệt cho thông báo admin mà bạn có thể sử dụng để hiển thị thông báo, nhưng admin_notice là một trong những cái được sử dụng phổ biến nhất.

Bốn hooks dụng được gồm:

*Hiện thời không có tài liệu chính thức nào cho những hook này.

Vì vậy cơ bản bạn sẽ dùng sử dụng all_admin_notices, user_admin_notices, và network_admin_notices ở đâu? Và chúng khác biệt với admin_notices như thế nào?

Trước đó tôi đã nói rằng hook của admin_notices hiển thị thông báo trên tất cả trang admin, nhưng điều này tuyệt nhiên không đúng. Nếu bạn nhìn vào admin-header.php trong core của WordPress, bạn sẽ thấy các admin_notices, network_admin_notices user_admin_notices đều không đồng nhất. Chỉ có một trong những hooks này được gọi trên một trang admin của WordPress.

Một loạt các biểu thức có điều kiện xem xét trang admin hiện tại và chỉ gọi ra một trong số chúng, tùy thuộc vào loại trang admin nào mà bạn đang sử dụng.

Trước nhất, hàm is_network_admin () kiểm tra xem liệu có phải bạn đang ở trên màn hình admin network (ví dụ: bất kỳ trang admin nào có đường dẫn /wp-admin/network/URL). Nếu có, thì hook network_admin_notices được gọi.

Nếu không, hàm is_user_admin() kiểm tra xem bạn đang ở trên màn hình admin user (trang admin của người dùng) (ví dụ: bất kỳ trang quản trị nào theo đường dẫn /wp-admin/user/URL). Nếu vậy, hook user_admin_notice được gọi.

Và có lẽ bạn có thể đoán ra, nếu cả hai hàm is_network_admin() và hàm is_user_admin() trả về false, sau đó hook admin_notices gửi đi.

Chỉ còn sót lại hook all_admin_notices. Hook này không phải là một phần của biểu thức có điều kiện được thảo luận ở trên, do đó hook này được đảm bảo hiển thị trên tất cả các trang admin dù có ra sao, gồm cả các trang network admin dạng multisite.

Để xác định rõ, đối với bất kỳ trang admin nào của WordPress, bảo đảm all_admin_notices hook luôn được gọi. Trong ba hooks khác, chỉ có một hook sẽ được gọi tùy thuộc vào bạn đang sử dụng trang admin nào.

Tôi khuyến khích bạn hãy nhìn qua admin-header.php (đến hết cả flle) để xem cho cách WordPress đánh giá khi nào sử dụng mỗi trình thông báo của admin

Chúng tôi sẽ chỉ sử dụng các admin_notices trong suốt loạt bài hướng dẫn này, nhưng bạn có thể thấy bạn cần một số móc khác trong dự án của riêng bạn, vì vậy rất đáng để xem qua húng.

Hiển thị thông báo admin trên những trang cụ thể

Bây giờ hãy chú ý đến việc hiển thị thông báo admin trên các trang cụ thể. Đầu tiên, hãy comment hàm add_action để cho những thông báo thử nghiệm của chúng ta không hiển thị nữa.

Bên trong hàm init(), gọi thêm một hàm add_action() mới, chúng tôi sẽ sử dụng hàm này để hiển thị thông báo admin trên một trang admin cụ thể.

Sau đó định nghĩa phương thức specific_admin_page() như sau:

Lưu thay đổi của bạn và xem bất kỳ trang nào trong phần quản trị của WordPress. Tôi sẽ thử trang quản trị chính.

Dashboard admin notice

Giờ bạn có thế nhìn thấy, ở bất kỳ trang admin nào, tên của trang cũng được hiển thị trong thông báo admin.

Hàm get_current_screen() trả về đối tượng WP_Screen với thông tin của màn hình admin hiện thời. Thuộc tính của object (đối tượng) cụ thể chúng tôi quan tâm là WP_Screen-> base, trong đó đánh giá với kiểu cơ sở của màn hình hiện tại. Hãy thử tải các trang quản trị WordPress khác nhau để xem các giá trị được trả lại cho WP_Screen-> base.

Chúng ta có thể sử dụng giá trị base (cơ bản) để tải thông báo admin của chúng tôi một cách có điều kiện, chỉ trên trang dashboard. Giá trị chúng ta cần kiểm tra là trang dashboard (bảng điều khiển). Đồng thời hãy hiển thị một thông báo admin thay thế nếu chúng ta không phải ở trên trang dashboard. Thay thế định nghĩa của hàm specific_admin_page() bằng:

Output base name of current admin page in the admin notice

Mọi thứ ổn khi chúng ta ở trang dashboard, nhưng hử đi đến trang admin khác bất kỳ và sẽ thấy điều gì xảy ra.

Error type admin notice shown when were not on the expected admin page

Sử dụng phương pháp tiếp cận đơn giản này cho phép chúng tôi sự linh hoạt khi hiển thị thông báo admin trên các trang admin cụ thể. Chúng ta có thể dễ mở rộng nó cho bất kỳ trang admin nào mà chúng ta muốn hiển thị thông báo quản trị trên.

Một lần nữa, hãy thay thế hàm specific_admin_pages(), lần này với đoạn code sau:

Thay vì kiểm tra một trang admin lẻ tẻ, bây giờ chúng ta kiểm tra xem liệu tên cơ sở - base name, của trang admin hiện tại nằm trong mảng $whitelist_admin_pages. Khi chúng tôi điều hướng đến trang dashboard, thư viện media hoặc các trang admin cho phần bình luận, chúng tôi sẽ thấy thông báo thành công của trang admin của chúng tôi.

Our success message shows on the admin comments page

Và khi chúng ta thăm bất cứ trang admin khác (không gồm các trang đã được lọc ra trong mảng), chúng ta thấy một thông báo admin khác.

Only allowed admin pages show the success message

Việc hiển thị một thông báo admin trên trang tuỳ chọn plugin thì sao? Làm sao để thực hiện điều đó? Trước khi xem xét việc này, trước tiên chúng ta cần thiết lập một trang options dummy (chỉ dùng cho quá trình phát triển) cho plugin của chúng ta.

Tạo một file mới gọi là plugin-options.php bên trong thư mục plugin admin-notices chúng ta đã tạo trước đó, và bổ sung đoạn code sau:

Ngay đầu file admin-notices.php (ngay phía trên phần khai báo của class), kèm thêm class của plugin vào file plugin chính cùng với:

Tôi sẽ không đi vào chi tiết quá nhiều về cách code trong plugin-options.php hoạt động như thể có thể là một hướng dẫn toàn bộ riêng của mình! Nếu bạn muốn được làm mới thì tôi khuyên bạn nên xem trang WordPress Codex về cách thêm các trang tùy chọn plugin.

Về cơ bản, tất cả những gì chúng tôi đang làm là thêm một trang phụ Admin Notices vào menu Settings. Trang tùy chọn plugin chứa một trường văn bản đơn lẻ mà bạn có thể nhập một chuỗi vào. Khi nút Save Changes được nhấp vào, nội dung của trường văn bản được lưu vào cơ sở dữ liệu WordPress.

Đây chỉ là ví dụ điển hình của một trang cấu hình plugin cho mục đích demo. Nó không bao gồm các chức năng sàng lọc cần thiết hay các hàm thông dịch được khuyến khích cho một sản phẩm plugin có dự định được phát hành rộng rãi.

Đến Settings > Admin Notices để xem trang options của plugin.

Plugin options page

Như mong đợi, thông báo của admin mà chúng tôi đã thêm trước đó hiển thị trên trang tuỳ chọn plugin của chúng tôi. Thông báo lỗi được hiển thị bởi vì trang option plugin của chúng tôi không nằm trong mảng $whitelist_admin_pages array các trang quản trị được cho phép. Hãy sửa lỗi đó ngay bây giờ.

Để thêm trang option của chúng tôi vào mảng, chúng ta cần phải biết base name của trang đó. Bên trong hàm specific_admin_page(), thay đổi thông báo lỗi admin thông báo div như sau:

Chúng tôi vẫn nhận được thông báo lỗi của admin giống như trước đây, nhưng lần này nó bao gồm base name chúng ta cần, nó trở thành settings_page_admin-notice/plugin-options. Đó không phải là một cái tên mà chúng ta có thể dễ dàng đoán ra, vì vậy nên dành thời gian để xuất ra nó!

Bổ sung base name vào mảng $whitelist_admin_pages, nó sẽ trông như thế này:

Tải lại trang options của plugin để xem thông báo admin đã được cập nhật.

Updated admin notice

Bây giờ chúng ta đã biết tên base của trang options của plugin, chúng ta có thể dễ dàng tạo một thông báo admin chỉ hiển thị chính trên trang admin đó. Xoá settings_page_admin-notice/plugin-options khỏi mảng $whitelist_admin_pages và comment lại hàm add_action thứ hai trong init(). Sau đó, bổ sung hoạt động thứ ba mà chúng tôi sẽ sử dụng cho thông báo admin trang plugin của chúng tôi. Chức năng init () của bạn bây giờ sẽ giống như sau:

Bây giờ chúng ta hãy khai thác hàm callback plugin_admin_notice(). Thêm phương thức mới này vào class Gwyer_Admin_Notices:

Điều này rất giống với hàm specific_admin_page() ngoại trừ chúng tôi đã xoá biểu thức có điều kiện. Chúng tôi cũng đã thêm một button is-dismissible bằng cách thêm lớp CSS có thể loại bỏ đi, vì vậy thông báo của admin bây giờ cũng có thể bị đóng.

Plugin options page only admin notice

Thử tải những trang admin khác để xác nhận rằng thông báo admin chỉ hiện lên ở trang tuỳ chọn (options) của plugin.

Tổng kết

Trong bài hướng dẫn này, chúng ta đã biết thêm về thông báo admin và những hook khác nhau sẵn có để hiển thị các thông báo đó. Chúng ta cũng xem kỹ làm sao để chỉ hiển thị thông báo admin trên những trang cụ thể của phần quản trị WordPress. Chúng tôi phát triển một plugin cho dashboard để chứa tất cả những code liên quan đến thông báo quản trị tự tạo.

Trong phần ba, chúng ta sẽ mở rộng plugin thêm bằng chỉ ra cách để kích hoạt các thông báo admin khi có sự kiện xảy ra. Hãy ghi nhớ, bản chất mã nguồn mở của WordPress làm nó dễ học và mở rộng. Để kết thúc, chúng ta có nhiều để xem và nghiên cứu tại Envato Market nếu bạn có hứng thú.

Sau đó, chúng tôi sẽ tập trung để tìm ra cách chúng tôi có thể giải quyết vấn đề thông báo liên tục của admin để chúng không tái xuất hiện khi trang được tải lại. Chúng tôi sẽ triển khai một số phương pháp khác nhau trong plugin của chúng tôi để cho phép chúng tôi thực hiện việc này.

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.