Есть 2 способа отключить плагин. Первый способ - создать собственный плагин, который удаляет действие, которое использовалось для инициализации вашего целевого плагина. Второй способ - удалить действия и фильтры, которые добавляют скрипты, стили и вносят изменения на странице.
В любом случае вы должны удалить действия после того, как они были добавлены, и до того, как они действительно сработали. Это означает, что для первого способа в большинстве случаев вы должны использовать хук plugins_loaded
, который не может быть использован в вашем functions.php
(первый хук, который можно использовать в functions.php
, это load_textdomain
хук). в случае, если вы хотите отключить плагин на определенных страницах, вы должны каким-то образом получить идентификатор текущей записи, что не так просто, потому что глобальная переменная $ post еще не доступна (самая ранняя ловушка с $ post - wp
).
Параметры вашего remove_action
зависят от плагина add_action
. Суть в том, что все параметры вашего remove_action
должны совпадать с параметрами add_action
. Вот несколько примеров:
add_action('plugins_loaded', 'init_function_name');
remove_action('plugins_loaded', 'init_function_name');
add_action('plugins_loaded', 'init_function_name', 100);
remove_action('plugins_loaded', 'init_function_name', 100);
class Plugin_Classname {
public static function init() {
add_action( 'plugins_loaded', array( __CLASS__, 'on_init' ) );
}
}
remove_action( 'plugins_loaded', array( 'Plugin_Classname', 'on_init' ) );
class Plugin_Classname {
public function __construct(){
add_action('plugins_loaded', array($this, 'init'), 99);
}
public static function get_instance(){
if(self::$instance === null){
self::$instance = new self();
}
return self::$instance;
}
}
remove_action('plugins_loaded', array( Plugin_Classname::get_instance() , 'init'), 99);
Давайте начнем с самого простого пути. Предположим, что удаления сценариев и стилей достаточно. Затем вы должны найти wp_enqueue_scripts
хуков в источнике плагина. Уравнение:
class Xoo_CP_Public{
protected static $instance = null;
public function __construct(){
add_action('plugins_loaded',array($this,'load_txt_domain'),99);
add_action('wp_enqueue_scripts',array($this,'enqueue_scripts'));
add_action('wp_footer',array($this,'get_popup_markup'));
add_filter( 'pre_option_woocommerce_cart_redirect_after_add', array($this,'prevent_cart_redirect'),10,1);
}
public static function get_instance(){
if(self::$instance === null){
self::$instance = new self();
}
return self::$instance;
}
}
Поскольку нам нужна глобальная переменная $ post, мы будем использовать wp
hook. Поместите код ниже в functions.php
:
function disable_plugin() {
global $post;
$ids = array( 2679320 ); // Disable plugin at page with ID = 2679320
if( in_array( $post->ID ,$ids ) ) {
remove_action('wp_enqueue_scripts',array( Xoo_CP_Public::get_instance(),'enqueue_scripts'));
remove_action('plugins_loaded',array(Xoo_CP_Public::get_instance(),'load_txt_domain'),99);
remove_action('wp_footer',array(Xoo_CP_Public::get_instance(),'get_popup_markup'));
remove_filter( 'pre_option_woocommerce_cart_redirect_after_add', array(Xoo_CP_Public::get_instance(),'prevent_cart_redirect'),10,1);
}
}
add_action( 'wp', 'disable_plugin' );
Что если мы хотим удалить действие, используемое для инициализации этого плагина? Давайте посмотрим на add_action
:
add_action('plugins_loaded','xoo_cp_rock_the_world');
В этом случае мы не можем использовать plugins_loaded
hook, потому что add_action
вызывается без параметра priority
. Если он вызывается с параметром priority
, мы могли бы просто создать файл disable-plugin.php
в папке /wp-content/plugins
и поместить туда этот код:
function disable_plugin() {
remove_action('plugins_loaded', 'xoo_cp_rock_the_world', 100);
}
add_action('plugins_loaded','disable_plugin');
Но в этом случае он бесполезен без параметра priority
. Тем не менее мы можем обмануть! Нам не нужно использовать какие-либо перехватчики и звонить remove_action
напрямую. Мы должны вызвать его после вызова целевого плагина add_action
. Плагины загружаются в алфавитном порядке, поэтому если мы назвали наш плагин 'zzz-disable-plugin.php` с такими строками кода:
/* Plugin Name: zzz-disable-plugin */
remove_action('plugins_loaded', 'xoo_cp_rock_the_world');
Целевой плагин будет отключен. На всех страницах, хотя. Я не нашел способа получить идентификатор текущей страницы на таком раннем хуке. Но мы можем использовать URI:
/* Plugin Name: zzz-disable-plugin */
if( 'product/polo' == trim( $_SERVER[ 'REQUEST_URI' ], '/' ) ) {
remove_action('plugins_loaded', 'xoo_cp_rock_the_world');
}