<?php defined('ABSPATH') || exit; class WC_Payment_Gateways { public $payment_gateways = array(); protected static $_instance = null; public static function instance() { if (is_null(self::$_instance)) { self::$_instance = new self(); } return self::$_instance; } public function __clone() { wc_doing_it_wrong(__FUNCTION__, __('Cloning is forbidden.', 'woocommerce'), '2.1'); } public function __wakeup() { wc_doing_it_wrong(__FUNCTION__, __('Unserializing instances of this class is forbidden.', 'woocommerce'), '2.1'); } public function __construct() { $this->init(); } public function init() { $load_gateways = array('WC_Gateway_BACS', 'WC_Gateway_Cheque', 'WC_Gateway_COD'); if ($this->should_load_paypal_standard()) { $load_gateways[] = 'WC_Gateway_Paypal'; } $load_gateways = apply_filters('woocommerce_payment_gateways', $load_gateways); $ordering = (array) get_option('woocommerce_gateway_order'); $order_end = 999; foreach ($load_gateways as $gateway) { if (is_string($gateway) && class_exists($gateway)) { $gateway = new $gateway(); } if (!is_a($gateway, 'WC_Payment_Gateway')) { continue; } if (isset($ordering[$gateway->id]) && is_numeric($ordering[$gateway->id])) { $this->payment_gateways[$ordering[$gateway->id]] = $gateway; } else { $this->payment_gateways[$order_end] = $gateway; $order_end++; } } ksort($this->payment_gateways); } public function payment_gateways() { $_available_gateways = array(); if (count($this->payment_gateways) > 0) { foreach ($this->payment_gateways as $gateway) { $_available_gateways[$gateway->id] = $gateway; } } return $_available_gateways; } public function get_payment_gateway_ids() { return wp_list_pluck($this->payment_gateways, 'id'); } public function get_available_payment_gateways() { $_available_gateways = array(); foreach ($this->payment_gateways as $gateway) { if ($gateway->is_available()) { if (!is_add_payment_method_page()) { $_available_gateways[$gateway->id] = $gateway; } elseif ($gateway->supports('add_payment_method') || $gateway->supports('tokenization')) { $_available_gateways[$gateway->id] = $gateway; } } } return array_filter((array) apply_filters('woocommerce_available_payment_gateways', $_available_gateways), array($this, 'filter_valid_gateway_class')); } protected function filter_valid_gateway_class($gateway) { return $gateway && is_a($gateway, 'WC_Payment_Gateway'); } public function set_current_gateway($gateways) { if (!is_array($gateways) || empty($gateways)) { return; } $current_gateway = false; if (WC()->session) { $current = WC()->session->get('chosen_payment_method'); if ($current && isset($gateways[$current])) { $current_gateway = $gateways[$current]; } } if (!$current_gateway) { $current_gateway = current($gateways); } if ($current_gateway && is_callable(array($current_gateway, 'set_current'))) { $current_gateway->set_current(); } } public function process_admin_options() { $gateway_order = isset($_POST['gateway_order']) ? wc_clean(wp_unslash($_POST['gateway_order'])) : ''; $order = array(); if (is_array($gateway_order) && count($gateway_order) > 0) { $loop = 0; foreach ($gateway_order as $gateway_id) { $order[esc_attr($gateway_id)] = $loop; $loop++; } } update_option('woocommerce_gateway_order', $order); } protected function should_load_paypal_standard() { $paypal = new WC_Gateway_Paypal(); return $paypal->should_load(); } }