Доброго времени суток, коллеги! Мы имеем пространство имен, назовем его Site, внутри него мы имеем пространство имен Gateways.
Класс со шлюзом подцепляется через функцию:
use \Site\Gateways\initGateways as gates;
add_action('plugins_loaded', function () {
if (!class_exists('\WC_Payment_Gateway'))
return;
if (!class_exists('\Site\Gateways\Gateway'))
return;
$gates = new gates();
$available = new \WC_Payment_Gateways();
$array = $available->get_available_payment_gateways();
$gate = $gates -> initialize($array);
foreach ($gate as $g):
if(!class_exists($g)):
return;
endif;
endforeach;
add_filter('woocommerce_payment_gateways', array($gate, 'initialize'));
});
Сам класс выглядит вот так:
namespace Site\Gateways;
defined('ABSPATH') || die('Cheating, ya? Die.');
/**
* Class initGateways
* @package Site\Gateways
*/
class initGateways
{
/**
* @var array
*
* Содержит имена классов которые должны интерпритироваться как платежные шлюзы.
*/
protected $gates = array();
/**
* initGateways constructor.
*/
public function __construct()
{
$this -> gates[] = 'GatewayProd';
$this -> gates[] = 'GatewayTest';
}
/**
* @param $methods
* @return array
*
* Возвращаем платежные шлюзы
*/
public function initialize($methods)
{
$gates = $this -> gates;
foreach ($gates as $gate) {
$methods[] = $gate;
}
return $methods;
}
}
Ну и тестовый платежный шлюз (код основного шлюза думаю прикреплять бессмысленно):
namespace Site\Gateways;
defined('ABSPATH') || die('Cheating, ya? Die.');
/**
* Class GatewayTest
* @package Site\Gateways
*/
class GatewayTest extends Gateway
{
public function __construct()
{
$this->id = 'test';
$this->method_title = "Тестовый шлюз";
$this->title = 'Тест';
$this->method_description = __('qwerty123', 'woocommerce');
parent::__construct();
}
}
Так, как класс находится в пространстве имен, его необходимо передать в Woocommerce, в противном случае, класс не будет существовать, что логично.
Если передавать в Woocommerce пространство имен - получаем ошибку : call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object, а если не передавать - шлюз не подцепляется так, как класса шлюза не существует. Без пространства имен шлюз работает без проблем, отказываться от него не хотелось бы