- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Đôi khi các nhà phát triển cần phải sửa nội dung HTML của một widget sau khi đã render trên web, mà không có bộ lọc filter riêng của widget, hoặc không cung cấp hook filter cần thiết để làm như vậy. Tin buồn! WordPress không cung cấp một cách chính thống nào để lọc các kết quả cuối cùng của mọi widget. Vậy Làm thế nào để Lọc Đầu Ra của bất kỳ Widget WordPress? dưới đây là một số cách giải quyết mà tôi đã học được.
Bài toán của chúng tôi là, Làm sao để sửa nội dung HTML của mọi Widget WordPress ?
Sửa đổi các file nguồn của widget
Rõ ràng đây không phải là một phương án tốt, những thay đổi của bạn sẽ bị mất nếu WordPress, hoặc plugin tạo widget được cập nhật mới.
Đưa widget vào plugin hoặc wordpress theme của riêng bạn và sửa đổi nó
Bạn có thể sao chép toàn bộ code của widget, và tạo widget mới trong quá trình này bạn có những thay đổi của riêng mình, hoặc bạn có thể chỉ sao chép hàm callback hiển thị của widget vào giao diện wordpress hoặc plugin của bạn, & kế thừa widget class gốc. Cách này sẽ tốt hơn so với cách sửa đổi trực tiếp vào các tập tin cốt lõi , vì code của bạn sẽ không bị ghi đè bởi các bản cập nhật.
Sử dụng output buffer để lấy toàn bộ nội dung xuất ra HTML của widget và bộ lọc chạy trên đó. Bạn có thể sử dụng PHP buffer để lưu toàn bộ output của widget vào chuỗi, và sử dụng một bộ lọc filter qua nó. Giải pháp này vẫn có một số nhược điểm, nhưng nó có thể phù hợp cho một số người: Xem ví dụ dưới đây.
Trong tệp sidebar.php , chúng ta sẽ thay thế hàm dynamic_sidebar()
:
ob_start(); dynamic_sidebar( 'my-sidebar-id' ); $sidebar_output = ob_get_clean(); echo apply_filters( 'my_sidebar_output', $sidebar_output );
Sau đó, bạn thêm tùy chỉnh giống như thế này trong file giao diện functions.php của bạn, hoặc trong plugin tùy chỉnh của riêng bạn:
function my_widget_filter( $sidebar_output ) { /** * Perform some kind of search and replace here on $sidebar_output. * Regular Expressions will likely be required in order to restrict your * modifications to only the widgets you wish to modify, since $sidebar_output * contains the output of the entire sidebar, including all widgets. */ return $sidebar_output; } add_filter( 'my_sidebar_output', 'my_widget_filter' );
Những nhược điểm với phương pháp này là nó không làm việc trong WordPress Theme Customizer. Nó cũng đòi hỏi các theme wordpress có hỗ trợ bộ lọc cho widget , vì vậy bạn sẽ không thể áp dụng với mọi giao diện web, hoặc sửa đổi chủ đề hiện tại của bạn để hỗ trợ thêm cho phương pháp này. Nó cũng đòi hỏi phải sử dụng Regular Expressions để tìm ra widget bạn cần thay đổi /chỉnh sửa, bởi vì bộ lọc được chạy không chỉ trên 1 widget, mà là đầu ra của toàn bộ sidebar, trong đó có nhiều widgets đang hoạt động ở đó.
Thay thế hàm callback gốc hiển thị widget với một hàm tùy chỉnh, trong đó chạy callback gốc, nhưng thông qua một bộ lọc
Đây là kỹ thuật phù hợp nhất đối với tôi. Tuy nhiên, đây là cách tốt nhất mà chúng ta có bây giờ. Về cơ bản, hàm hiển thị callback ban đầu của widget được ghi đè với một hàm tùy chỉnh mới, chạy hàm callback gốc của widget, nhưng sử dụng buffer để xuất toàn bộ đầu ra, và chạy nó thông qua một bộ lọc trước khi hiển thị nó trên web. Phương pháp này đã được sử dụng trong plugin Widget logic với filter widget_content
, do đó, nó không phải là một khái niệm hoàn toàn mới. Dưới đây là đoạn code mà bạn có thể sử dụng trong theme hoặc plugin, mà sẽ cung cấp một bộ lọc widget_output
, chỉ định với các loại widget và tham số widget ID:
Đầu tiên, chúng ta cần thay thế hàm callback gốc hiển thị nội dung của widget với một hàm tùy chỉnh của riêng mình:
function my_filter_dynamic_sidebar_params( $sidebar_params ) { if ( is_admin() ) { return $sidebar_params; } global $wp_registered_widgets; $widget_id = $sidebar_params[0]['widget_id']; $wp_registered_widgets[ $widget_id ]['original_callback'] = $wp_registered_widgets[ $widget_id ]['callback']; $wp_registered_widgets[ $widget_id ]['callback'] = 'my_custom_widget_callback_function'; return $sidebar_params; } add_filter( 'dynamic_sidebar_params', 'my_filter_dynamic_sidebar_params' );
Tiếp theo, chúng ta sẽ tham chiếu nó trong đoạn mã trước, mà sẽ chạy hàm hiển thị gốc của widget, nhưng sẽ bắt đầu ra của nó sử dụng PHP buffering. Sau đó, đầu ra html của widget sẽ chạy qua bộ lọc widget_output
trước khi show ra trên trang web:
function my_custom_widget_callback_function() { global $wp_registered_widgets; $original_callback_params = func_get_args(); $widget_id = $original_callback_params[0]['widget_id']; $original_callback = $wp_registered_widgets[ $widget_id ]['original_callback']; $wp_registered_widgets[ $widget_id ]['callback'] = $original_callback; $widget_id_base = $wp_registered_widgets[ $widget_id ]['callback'][0]->id_base; if ( is_callable( $original_callback ) ) { ob_start(); call_user_func_array( $original_callback, $original_callback_params ); $widget_output = ob_get_clean(); echo apply_filters( 'widget_output', $widget_output, $widget_id_base, $widget_id ); } }
Với sau đó, bạn có thể tùy chỉnh lại widget trong một plugin hoặc chủ đề để thay đổi đầu ra của bất kỳ widget nào. VD:
function my_widget_output_filter( $widget_output, $widget_id_base, $widget_id ) { /* To target a specific widget ID: */ if ( 'target_widget_id' == $widget_id ) { // Apply your desired search and replace operations here } /* To target all widgets of a particular type: */ if ( 'target_widget_type' == $widget_type ) { // Apply your desired search and replace operations here } return $widget_output; } add_filter( 'widget_output', 'my_widget_output_filter', 10, 3 );
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype