Chuyên mục
Wordpress

Loại bỏ action hook hoặc filter hook gán sẵn trong class

Như chia sẻ ở bài viết trước, bạn có thể loại bỏ action hoăc filter có sẵn bằng hàm remove_action() hoặc remove_filter(). Ví dụ như dưới đây

Một plugin nào đó gán action và filter như sau:

add_action('save_post', 'my_action_callback');
add_filter('the_content', 'my_filter_callback');

Vì lý do nào đó, bạn muốn loại bỏ action và filter trên. Bạn có thể sử dụng đoạn mã này:

remove_action('save_post', 'my_action_callback');
remove_filter('the_content', 'my_filter_callback');

Quá dễ dàng!

Nhưng vấn đề sẽ không đơn giản như thế nếu action / filter được gán bên trong class riêng biệt của plugin. Chẳng hạn như đoạn code sau:

class Thuan_Bui_Class {
	function __construct() {
		add_action( 'save_post', array( $this, 'my_action_callback' ));
        }
        function my_action_callback(){
         //do something
        }

}
$some_plugin_class = new Thuan_Bui_Class();

Bạn không thể loại bỏ action my_action_callback 1 cách đơn giản như trên được nữa. Dưới đây là giải pháp.

Cách dùng remove_action() nếu action hook được gán trong lớp (class)

Do action được gán trong class, bạn cần phải sử dụng đối tượng (class object) để truy xuất hook bên trong nó. Cách sử dụng như sau:

global $some_plugin_class; //lấy quyền truy xuất class object
remove_action('save_post', array($some_plugin_class, 'my_action_callback')); //loại bỏ action hook

Cách dùng remove_action() nếu chưa có đối tượng

Vì lý do nào đó mà chưa có đối tượng nào được khai báo, bạn có thể sử dụng trực tiếp tên của class cho hàm remove_action() như sau

remove_action('save_post', array('Thuan_Bui_Class', 'my_action_callback')); //remove static class hook

Chú ý: tham số priorities phải giống nhau

Nếu action / filter được thêm vào cùng tham số priority, bạn cần phải dùng tham số giống hệt khi dùng hàm remove_action() / remove_filter()

Ví dụ:

class Thuan_Bui_Class {

	function __construct() {
		add_action( 'save_post', array( $this, 'my_action_callback' ), 57);
        }

        function my_action_callback(){
         //do something
        }

}

$some_plugin_class = new Thuan_Bui_Class();

Bạn cần dùng tham số priority “57” khi muốn loại bỏ action bằng hàm remove_action()

global $some_plugin_class; //get access to the class object instance
remove_action('save_post', array($some_plugin_class, 'my_action_callback'), 57); //remove class hook using the same priorit

Vậy là xong!

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại gửi tặng mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Trả lời