Отключить плагин на странице - WordPress - PullRequest
0 голосов
/ 03 октября 2019

Я работаю над тем, чтобы отключить определенный плагин на определенной странице продукта. Я собрал это вместе из вещей, которые я нашел в сети, и из самого кода плагинов, но он не работает. Любопытно взглянуть свежим взглядом и дать мне знать, что может быть неудачным. Идентификационный номер продукта: 2679320. Действия, которые я установил для удаления, описаны в плагине wp_enqueue_scripts. Вот код, который я пытаюсь загрузить из фрагментов:

function remove__construct() {

global $post;
$ids = array(2679320);
if(in_array($post->ID,$ids)):
remove_action(‘wp_enqueue_scripts’,array($this,’enqueue_scripts’));
remove_action(‘plugins_loaded’,array($this,’load_txt_domain’),99);
remove_action(‘wp_footer’,array($this,’get_popup_markup’));
remove_filter( ‘pre_option_woocommerce_cart_redirect_after_add’, array($this,’prevent_cart_redirect’),10,1);

endif;
}

add_action(‘wp_head’, ‘remove__construct’, 1);

Есть идеи, почему это не работает? Что я пропустил? У кого-нибудь есть лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Вы можете использовать Plugin Organizer . Позволяет выборочно отключить плагин на странице или полный тип сообщения.

0 голосов
/ 03 октября 2019

Есть 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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...