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’ 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’ 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. |
|
|
|
|
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
|
|
|
|
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.