Làm sao để vô hiệu hoá một hàm filter hook đã được gắn sẵn trong theme / plugin?
Có thể bạn đã biết đến hàm remove_filter để loại bỏ filter có sẵn ra khỏi hook:
remove_filter( $tag, $function, $priority);
- $ tag – Là tên của một ‘filter hook’ của WP
- $function – Tên Filter mà bạn muốn loại bỏ khỏi hệ thống.
- $priority – Độ ưu tiên của Filter
Tuy nhiên, không phải cứ dùng trực tiếp hàm trong file functions.php của child theme này là có thể loại bỏ được filter đã được gán sẵn vào hook trong parent theme / plugin.
Lý do vì theo cấu trúc của WordPress các hàm của child theme được ưu tiên tải trước tiên, sau đó mới đến parent theme. Do đó khi bạn dùng hàm remove_filter trong child theme, bạn đang loại bỏ 1 filter chưa tồn tại, vì nó chưa đến thứ tự được tải. Đó là lý do hàm remove_filter của bạn không hoạt động.
Để hàm remove_filter hoạt động chính xác, bạn cần phải đặt nó trong hook after_setup_theme như sau
//Remove a function from the parent theme
function remove_parent_filters(){
remove_filter('init', 'function_to_be_removed');
}
add_action( 'after_setup_theme', 'remove_parent_filters' );
Hook after_setup_theme được dùng khi tải trang, sau khi theme đã được tải hoàn tất. Do đó khi đặt gán remove_filter trong vào hook after_setup_theme, nó sẽ hoạt động chính xác: loại bỏ filter đã được gán sẵn trong parent theme.
Chẳng hạn khi dùng theme Astra, nó sử dụng hàm add_filter sau để tuỳ biến cách hiển thị tình trạng kho hàng:
add_filter( 'woocommerce_get_stock_html', 'astra_woo_product_in_stock', 10, 2 );
Mình không muốn Astra thay đổi cách hiển thị mặc định của Woocoomerce, nên sẽ loại bỏ filter astra_woo_product_in_stock với đoạn code sau:
function remove_parent_filters(){
remove_filter( 'woocommerce_get_stock_html', 'astra_woo_product_in_stock', 10, 2 );
}
add_action( 'after_setup_theme', 'remove_parent_filters' );
Bạn có thể đặt đoạn code này vào file functions.php của child theme, hoặc sử dụng plugin Code Snippets.
Vậy là xong.