WC_Payment_Gateways::instance()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
eloc 4
nc 2
nop 0
1
<?php
2
3
if ( ! defined( 'ABSPATH' ) ) {
4
	exit; // Exit if accessed directly
5
}
6
7
/**
8
 * WooCommerce Payment Gateways class
9
 *
10
 * Loads payment gateways via hooks for use in the store.
11
 *
12
 * @class 		WC_Payment_Gateways
13
 * @version		2.2.0
14
 * @package		WooCommerce/Classes/Payment
15
 * @category	Class
16
 * @author 		WooThemes
17
 */
18
class WC_Payment_Gateways {
19
20
	/** @var array Array of payment gateway classes. */
21
	public $payment_gateways;
22
23
	/**
24
	 * @var WC_Payment_Gateways The single instance of the class
25
	 * @since 2.1
26
	 */
27
	protected static $_instance = null;
28
29
	/**
30
	 * Main WC_Payment_Gateways Instance.
31
	 *
32
	 * Ensures only one instance of WC_Payment_Gateways is loaded or can be loaded.
33
	 *
34
	 * @since 2.1
35
	 * @static
36
	 * @return WC_Payment_Gateways Main instance
37
	 */
38
	public static function instance() {
39
		if ( is_null( self::$_instance ) ) {
40
			self::$_instance = new self();
41
		}
42
		return self::$_instance;
43
	}
44
45
	/**
46
	 * Cloning is forbidden.
47
	 *
48
	 * @since 2.1
49
	 */
50
	public function __clone() {
51
		_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'woocommerce' ), '2.1' );
52
	}
53
54
	/**
55
	 * Unserializing instances of this class is forbidden.
56
	 *
57
	 * @since 2.1
58
	 */
59
	public function __wakeup() {
60
		_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'woocommerce' ), '2.1' );
61
	}
62
63
	/**
64
	 * Initialize payment gateways.
65
	 */
66
	public function __construct() {
67
		$this->init();
68
	}
69
70
	/**
71
	 * Load gateways and hook in functions.
72
	 */
73
	public function init() {
74
		$load_gateways = array(
75
			'WC_Gateway_BACS',
76
			'WC_Gateway_Cheque',
77
			'WC_Gateway_COD',
78
			'WC_Gateway_Paypal',
79
		);
80
81
		/**
82
		 * Simplify Commerce is @deprecated in 2.6.0. Only load when enabled.
83
		 */
84
		if ( ! class_exists( 'WC_Gateway_Simplify_Commerce_Loader' ) && in_array( WC()->countries->get_base_country(), apply_filters( 'woocommerce_gateway_simplify_commerce_supported_countries', array( 'US', 'IE' ) ) ) ) {
85
			$simplify_options = get_option( 'woocommerce_simplify_commerce_settings', array() );
86
87
			if ( ! empty( $simplify_options['enabled'] ) && 'yes' === $simplify_options['enabled'] ) {
88
				if ( function_exists( 'wcs_create_renewal_order' ) ) {
89
					$load_gateways[] = 'WC_Addons_Gateway_Simplify_Commerce';
90
				} else {
91
					$load_gateways[] = 'WC_Gateway_Simplify_Commerce';
92
				}
93
			}
94
		}
95
96
		// Filter
97
		$load_gateways = apply_filters( 'woocommerce_payment_gateways', $load_gateways );
98
99
		// Get sort order option
100
		$ordering  = (array) get_option( 'woocommerce_gateway_order' );
101
		$order_end = 999;
102
103
		// Load gateways in order
104
		foreach ( $load_gateways as $gateway ) {
105
			$load_gateway = is_string( $gateway ) ? new $gateway() : $gateway;
106
107
			if ( isset( $ordering[ $load_gateway->id ] ) && is_numeric( $ordering[ $load_gateway->id ] ) ) {
108
				// Add in position
109
				$this->payment_gateways[ $ordering[ $load_gateway->id ] ] = $load_gateway;
110
			} else {
111
				// Add to end of the array
112
				$this->payment_gateways[ $order_end ] = $load_gateway;
113
				$order_end++;
114
			}
115
		}
116
117
		ksort( $this->payment_gateways );
118
	}
119
120
	/**
121
	 * Get gateways.
122
	 * @return array
123
	 */
124
	public function payment_gateways() {
125
		$_available_gateways = array();
126
127
		if ( sizeof( $this->payment_gateways ) > 0 ) {
128
			foreach ( $this->payment_gateways as $gateway ) {
129
				$_available_gateways[ $gateway->id ] = $gateway;
130
			}
131
		}
132
133
		return $_available_gateways;
134
	}
135
136
	/**
137
	 * Get array of registered gateway ids
138
	 * @since 2.6.0
139
	 * @return array of strings
140
	 */
141
	public function get_payment_gateway_ids() {
142
		return wp_list_pluck( $this->payment_gateways, 'id' );
143
	}
144
145
	/**
146
	 * Get available gateways.
147
	 *
148
	 * @return array
149
	 */
150
	public function get_available_payment_gateways() {
151
		$_available_gateways = array();
152
153
		foreach ( $this->payment_gateways as $gateway ) {
154
			if ( $gateway->is_available() ) {
155
				if ( ! is_add_payment_method_page() ) {
156
					$_available_gateways[ $gateway->id ] = $gateway;
157
				} else if( $gateway->supports( 'add_payment_method' ) ) {
158
					$_available_gateways[ $gateway->id ] = $gateway;
159
				} else if ( $gateway->supports( 'tokenization' ) ) {
160
					$_available_gateways[ $gateway->id ] = $gateway;
161
				}
162
			}
163
		}
164
165
		return apply_filters( 'woocommerce_available_payment_gateways', $_available_gateways );
166
	}
167
168
	/**
169
	 * Set the current, active gateway.
170
	 *
171
	 * @param array $gateway Available payment gateways.
0 ignored issues
show
Documentation introduced by
There is no parameter named $gateway. Did you maybe mean $gateways?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
172
	 */
173
	public function set_current_gateway( $gateways ) {
174
		// Be on the defensive
175
		if ( ! is_array( $gateways ) || empty( $gateways ) ) {
176
			return;
177
		}
178
179
		if ( is_user_logged_in() ) {
180
			$default_token = WC_Payment_Tokens::get_customer_default_token( get_current_user_id() );
181
			if ( ! is_null( $default_token ) ) {
182
				$default_token_gateway = $default_token->get_gateway_id();
183
			}
184
		}
185
186
		$current = ( isset( $default_token_gateway ) ? $default_token_gateway : WC()->session->get( 'chosen_payment_method' ) );
187
188
		if ( $current && isset( $gateways[ $current ] ) ) {
189
			$current_gateway = $gateways[ $current ];
190
191
		} else {
192
			$current_gateway = current( $gateways );
193
		}
194
195
		// Ensure we can make a call to set_current() without triggering an error
196
		if ( $current_gateway && is_callable( array( $current_gateway, 'set_current' ) ) ) {
197
			$current_gateway->set_current();
198
		}
199
	}
200
201
	/**
202
	 * Save options in admin.
203
	 */
204
	public function process_admin_options() {
205
		$gateway_order = isset( $_POST['gateway_order'] ) ? $_POST['gateway_order'] : '';
206
		$order         = array();
207
208
		if ( is_array( $gateway_order ) && sizeof( $gateway_order ) > 0 ) {
209
			$loop = 0;
210
			foreach ( $gateway_order as $gateway_id ) {
211
				$order[ esc_attr( $gateway_id ) ] = $loop;
212
				$loop++;
213
			}
214
		}
215
216
		update_option( 'woocommerce_gateway_order', $order );
217
	}
218
}
219