@FrontendNoob

Как добавить платежный шлюз в Woocommerce, если он имеет пространство имен?

Доброго времени суток, коллеги! Мы имеем пространство имен, назовем его 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, а если не передавать - шлюз не подцепляется так, как класса шлюза не существует. Без пространства имен шлюз работает без проблем, отказываться от него не хотелось бы
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы