Intereting Posts
Исключить текущую должность при получении связанной должности в пользовательском типе сообщений и таксономии Перенаправление отдельной персонализированной страницы на страницу 404 Есть ли в WordPress какие-то «комментирующие системы на YouTube»? Как получить выделение текста в редакторе WordPress Переопределение петли с фильтром или крюком E_WARNING: _ () ожидает ровно 1 параметр, 2 Ошибки разрешения на установку WordPress Как справляться со многими атрибутами, не создавая так много вариаций? Facebook Share Постоянная ссылка Javascript href Разрешить переменное количество комментариев перед разбиением на страницы Сделать Customizer Load Specific Page Tagit с json и автозаполнением Как получить возвращаемое значение wp.media ({frame: 'post?}) Во всех случаях? Как удалить & nbsp; от hr в текстовом редакторе wordpress Проблема с запросом wordpress на странице с использованием настраиваемых полей

Как отменить действие / фильтр WordPress при использовании ООП с анонимным обратным вызовом

Большинство плагинов wordpress, которые я нашел, – это functions based , например, плагин для akismet

 function akismet_init() { global $wpcom_api_key, $akismet_api_host, $akismet_api_port; // ... } add_action('init', 'akismet_init'); 

Есть несколько проблем с этим подходом:

  • вы не можете делиться состоянием между функцией, поэтому вы должны использовать глобальные переменные
  • трудно выполнить единичный тест, то есть никак не издеваться

Моя первоначальная попытка – обернуть объект, например, в akismet.php

 class Akismet { protected static $akismet_api_host; protected static $akismet_api_port; public function __construct() { add_action('init', array($this, 'init')); } public function init() { // Do my init here } } $GLOBALS['Akismet'] = new Akismet(); 

Однако до сих пор существуют некоторые проблемы с этим подходом

  • Мне нужно, чтобы большинство моих методов были общедоступными для вызова (что плохо)
  • Вы не можете передавать переменную в обратный вызов без использования анонимного обратного вызова (и если вы используете анонимный обратный вызов, вы не можете удалить их с помощью remove_action / remove_filter)

например

 public function __construct() { $foo = 'bar'; add_action('init', function() use ($foo) { echo $foo; // You can pass variable by using callback but you cannot this action later! }); } 

Итак, как иметь возможность передавать переменную в любой действие / фильтр WordPress и при этом сохранять гибкость, чтобы отменить их позже?

Один из способов – использовать классы и объекты. Это более эффективно, учитывая возможность повторного использования, коллективную работу и многое другое. Я не думаю, что использовать глобальные переменные плохо, если вы знаете, что делаете.

Поэтому я бы рекомендовал вам использовать ООП (объектно-ориентированное программирование), особенно с наследованием и полиморфизмом.

Итак, как иметь возможность передавать переменную в любой действие / фильтр WordPress и при этом сохранять гибкость, чтобы отменить их позже?

Вы можете назначить функцию одному из свойств класса:

 public function __construct() { $foo = 'bar'; $this->init_func = function() use ( $foo ) { echo $foo; }; add_action( 'init', $this->init_func ); } 

Затем вы можете это сделать:

 remove_action( 'init', $this->init_func ); 

Но, пожалуйста, не делай этого.

Я думаю, это сделало бы испытание кошмаром. Кроме того, вы находитесь в классе, где вы можете назначить значение, которое вы хотите использовать в функции, для свойства:

 public function __construct() { $this->foo = 'bar'; add_action( 'init', array( $this, 'init' ) ); } public function init() { echo $this->foo; } 

Для этого нужны классы. 🙂


У вас, похоже, есть страх перед тем, чтобы использовать методы публичного класса. Зачем? Вы хотите, чтобы WordPress мог вызвать код вашего класса, поэтому он должен иметь некоторый открытый API, который позволит это. Классы PHP предоставляют public методы, поэтому вы можете использовать их, а не пытаться изобретать колесо. 🙂