Passed
Push — master ( eadd35...968588 )
by Brian
04:42
created
templates/emails/wpinv-email-new_invoice.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -7,22 +7,22 @@
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 // Print the email header.
13
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
13
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
14 14
 
15 15
 // Generate the custom message body.
16 16
 echo $message_body;
17 17
 
18 18
 // Print invoice details.
19
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
19
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
20 20
 
21 21
 // Print invoice items.
22
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
22
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
23 23
 
24 24
 // Print the billing details.
25
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
25
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
26 26
 
27 27
 // Print the email footer.
28
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
28
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
Please login to merge, or discard this patch.
templates/emails/wpinv-email-completed_invoice.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -7,22 +7,22 @@
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 // Print the email header.
13
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
13
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
14 14
 
15 15
 // Generate the custom message body.
16 16
 echo $message_body;
17 17
 
18 18
 // Print invoice details.
19
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
19
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
20 20
 
21 21
 // Print invoice items.
22
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
22
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
23 23
 
24 24
 // Print the billing details.
25
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
25
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
26 26
 
27 27
 // Print the email footer.
28
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
28
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
Please login to merge, or discard this patch.
templates/emails/wpinv-email-user_invoice.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -7,22 +7,22 @@
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 // Print the email header.
13
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
13
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
14 14
 
15 15
 // Generate the custom message body.
16 16
 echo $message_body;
17 17
 
18 18
 // Print invoice details.
19
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
19
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
20 20
 
21 21
 // Print invoice items.
22
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
22
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
23 23
 
24 24
 // Print the billing details.
25
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
25
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
26 26
 
27 27
 // Print the email footer.
28
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
28
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
Please login to merge, or discard this patch.
templates/emails/wpinv-email-cancelled_invoice.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -7,22 +7,22 @@
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 // Print the email header.
13
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
13
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
14 14
 
15 15
 // Generate the custom message body.
16 16
 echo $message_body;
17 17
 
18 18
 // Print invoice details.
19
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
19
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
20 20
 
21 21
 // Print invoice items.
22
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
22
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
23 23
 
24 24
 // Print the billing details.
25
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
25
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
26 26
 
27 27
 // Print the email footer.
28
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
28
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
Please login to merge, or discard this patch.
templates/emails/wpinv-email-refunded_invoice.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -7,22 +7,22 @@
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 // Print the email header.
13
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
13
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
14 14
 
15 15
 // Generate the custom message body.
16 16
 echo $message_body;
17 17
 
18 18
 // Print invoice details.
19
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
19
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
20 20
 
21 21
 // Print invoice items.
22
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
22
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
23 23
 
24 24
 // Print the billing details.
25
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
25
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
26 26
 
27 27
 // Print the email footer.
28
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
28
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
Please login to merge, or discard this patch.
templates/emails/wpinv-email-failed_invoice.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -7,22 +7,22 @@
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 // Print the email header.
13
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
13
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
14 14
 
15 15
 // Generate the custom message body.
16 16
 echo $message_body;
17 17
 
18 18
 // Print invoice details.
19
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
19
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
20 20
 
21 21
 // Print invoice items.
22
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
22
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
23 23
 
24 24
 // Print the billing details.
25
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
25
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
26 26
 
27 27
 // Print the email footer.
28
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
28
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-crud-controller.php 2 patches
Indentation   +471 added lines, -471 removed lines patch added patch discarded remove patch
@@ -17,476 +17,476 @@
 block discarded – undo
17 17
  */
18 18
 class GetPaid_REST_CRUD_Controller extends GetPaid_REST_Controller {
19 19
 
20
-	/**
21
-	 * Contains this controller's class name.
22
-	 *
23
-	 * @var string
24
-	 */
25
-	public $crud_class;
26
-
27
-	/**
28
-	 * Contains the current CRUD object.
29
-	 *
30
-	 * @var GetPaid_Data
31
-	 */
32
-	protected $data_object;
33
-
34
-	/**
35
-	 * Registers the routes for the objects of the controller.
36
-	 *
37
-	 * @since 1.0.19
38
-	 *
39
-	 * @see register_rest_route()
40
-	 */
41
-	public function register_namespace_routes( $namespace ) {
42
-
43
-		register_rest_route(
44
-			$namespace,
45
-			'/' . $this->rest_base,
46
-			array(
47
-				array(
48
-					'methods'             => WP_REST_Server::READABLE,
49
-					'callback'            => array( $this, 'get_items' ),
50
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
51
-					'args'                => $this->get_collection_params(),
52
-				),
53
-				array(
54
-					'methods'             => WP_REST_Server::CREATABLE,
55
-					'callback'            => array( $this, 'create_item' ),
56
-					'permission_callback' => array( $this, 'create_item_permissions_check' ),
57
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
58
-				),
59
-				'schema' => array( $this, 'get_public_item_schema' ),
60
-			)
61
-		);
62
-
63
-		$get_item_args = array(
64
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
65
-		);
66
-
67
-		register_rest_route(
68
-			$namespace,
69
-			'/' . $this->rest_base . '/(?P<id>[\d]+)',
70
-			array(
71
-				'args'   => array(
72
-					'id' => array(
73
-						'description' => __( 'Unique identifier for the object.', 'invoicing' ),
74
-						'type'        => 'integer',
75
-					),
76
-				),
77
-				array(
78
-					'methods'             => WP_REST_Server::READABLE,
79
-					'callback'            => array( $this, 'get_item' ),
80
-					'permission_callback' => array( $this, 'get_item_permissions_check' ),
81
-					'args'                => $get_item_args,
82
-				),
83
-				array(
84
-					'methods'             => WP_REST_Server::EDITABLE,
85
-					'callback'            => array( $this, 'update_item' ),
86
-					'permission_callback' => array( $this, 'update_item_permissions_check' ),
87
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
88
-				),
89
-				array(
90
-					'methods'             => WP_REST_Server::DELETABLE,
91
-					'callback'            => array( $this, 'delete_item' ),
92
-					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
93
-					'args'                => array(
94
-						'force' => array(
95
-							'type'        => 'boolean',
96
-							'default'     => false,
97
-							'description' => __( 'Whether to bypass Trash and force deletion.', 'invoicing' ),
98
-						),
99
-					),
100
-				),
101
-				'schema' => array( $this, 'get_public_item_schema' ),
102
-			)
103
-		);
104
-
105
-	}
106
-
107
-	/**
108
-	 * Saves a single object.
109
-	 *
110
-	 * @param GetPaid_Data $object Object to save.
111
-	 * @return WP_Error|GetPaid_Data
112
-	 */
113
-	protected function save_object( $object ) {
114
-		$object->save();
115
-
116
-		if ( ! empty( $object->last_error ) ) {
117
-			return new WP_Error( 'rest_cannot_save', $object->last_error, array( 'status' => 400 ) );
118
-		}
119
-
120
-		return new $this->crud_class( $object->get_id() );
121
-	}
122
-
123
-	/**
124
-	 * Retrieves a single object.
125
-	 *
126
-	 * @since 1.0.13
127
-	 *
128
-	 * @param int|WP_Post $object_id Supplied ID.
129
-	 * @return GetPaid_Data|WP_Error GetPaid_Data object if ID is valid, WP_Error otherwise.
130
-	 */
131
-	protected function get_object( $object_id ) {
132
-
133
-		// Do we have an object?
134
-		if ( empty( $this->crud_class ) || ! class_exists( $this->crud_class ) ) {
135
-			return new WP_Error( 'no_crud_class', __( 'You need to specify a CRUD class for this controller', 'invoicing' ) );
136
-		}
137
-
138
-		// Fetch the object.
139
-		$object = new $this->crud_class( $object_id );
140
-		if ( ! empty( $object->last_error ) ) {
141
-			return new WP_Error( 'rest_object_invalid_id', $object->last_error, array( 'status' => 404 ) );
142
-		}
143
-
144
-		$this->data_object = $object;
145
-		return $object->get_id() ? $object : new WP_Error( 'rest_object_invalid_id', __( 'Invalid ID.', 'invoicing' ), array( 'status' => 404 ) );
146
-
147
-	}
148
-
149
-	/**
150
-	 * Get a single object.
151
-	 *
152
-	 * @param WP_REST_Request $request Full details about the request.
153
-	 * @return WP_Error|WP_REST_Response
154
-	 */
155
-	public function get_item( $request ) {
156
-
157
-		// Fetch the item.
158
-		$object = $this->get_object( $request['id'] );
159
-
160
-		if ( is_wp_error( $object ) ) {
161
-			return $object;
162
-		}
163
-
164
-		// Generate a response.
165
-		return rest_ensure_response( $this->prepare_item_for_response( $object, $request ) );
166
-
167
-	}
168
-
169
-	/**
170
-	 * Create a single object.
171
-	 *
172
-	 * @param WP_REST_Request $request Full details about the request.
173
-	 * @return WP_Error|WP_REST_Response
174
-	 */
175
-	public function create_item( $request ) {
176
-
177
-		// Can not create an existing item.
178
-		if ( ! empty( $request['id'] ) ) {
179
-			/* translators: %s: post type */
180
-			return new WP_Error( "getpaid_rest_{$this->rest_base}_exists", __( 'Cannot create existing resource.', 'invoicing' ), array( 'status' => 400 ) );
181
-		}
182
-
183
-		// Generate a GetPaid_Data object from the request.
184
-		$object = $this->prepare_item_for_database( $request );
185
-		if ( is_wp_error( $object ) ) {
186
-			return $object;
187
-		}
188
-
189
-		// Save the object.
190
-		$object = $this->save_object( $object );
191
-		if ( is_wp_error( $object ) ) {
192
-			return $object;
193
-		}
194
-
195
-		// Save special fields.
196
-		$save_special = $this->update_additional_fields_for_object( $object, $request );
197
-		if ( is_wp_error( $save_special ) ) {
198
-			$object->delete( true );
199
-			return $save_special;
200
-		}
201
-
202
-		$request->set_param( 'context', 'edit' );
203
-		$response = $this->prepare_item_for_response( $object, $request );
204
-		$response = rest_ensure_response( $response );
205
-		$response->set_status( 201 );
206
-		$response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ) );
207
-
208
-		return $response;
209
-	}
210
-
211
-	/**
212
-	 * Update a single object.
213
-	 *
214
-	 * @param WP_REST_Request $request Full details about the request.
215
-	 * @return WP_Error|WP_REST_Response
216
-	 */
217
-	public function update_item( $request ) {
218
-
219
-		// Fetch the item.
220
-		$object = $this->get_object( $request['id'] );
221
-		if ( is_wp_error( $object ) ) {
222
-			return $object;
223
-		}
224
-
225
-		// Prepare the item for saving.
226
-		$object = $this->prepare_item_for_database( $request );
227
-		if ( is_wp_error( $object ) ) {
228
-			return $object;
229
-		}
230
-
231
-		// Save the item.
232
-		$object = $this->save_object( $object );
233
-		if ( is_wp_error( $object ) ) {
234
-			return $object;
235
-		}
236
-
237
-		// Save special fields (those added via hooks).
238
-		$save_special = $this->update_additional_fields_for_object( $object, $request );
239
-		if ( is_wp_error( $save_special ) ) {
240
-			return $save_special;
241
-		}
242
-
243
-		$request->set_param( 'context', 'edit' );
244
-		$response = $this->prepare_item_for_response( $object, $request );
245
-		return rest_ensure_response( $response );
246
-	}
247
-
248
-	/**
249
-	 * Prepare links for the request.
250
-	 *
251
-	 * @param GetPaid_Data    $object GetPaid_Data object.
252
-	 * @return array Links for the given object.
253
-	 */
254
-	protected function prepare_links( $object ) {
255
-
256
-		$links = array(
257
-			'self'       => array(
258
-				'href'   => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ),
259
-			),
260
-			'collection' => array(
261
-				'href'   => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
262
-			),
263
-		);
264
-
265
-		return $links;
266
-	}
267
-
268
-	/**
269
-	 * Get the query params for collections of attachments.
270
-	 *
271
-	 * @return array
272
-	 */
273
-	public function get_collection_params() {
274
-		$params = parent::get_collection_params();
275
-		$params['context']['default'] = 'view';
276
-		return $params;
277
-	}
278
-
279
-	/**
280
-	 * Only return writable props from schema.
281
-	 *
282
-	 * @param  array $schema Schema.
283
-	 * @return bool
284
-	 */
285
-	public function filter_writable_props( $schema ) {
286
-		return empty( $schema['readonly'] );
287
-	}
288
-
289
-	/**
290
-	 * Prepare a single object for create or update.
291
-	 *
292
-	 * @since 1.0.19
293
-	 * @param  WP_REST_Request $request Request object.
294
-	 * @return GetPaid_Data|WP_Error Data object or WP_Error.
295
-	 */
296
-	protected function prepare_item_for_database( $request ) {
297
-
298
-		// Do we have an object?
299
-		if ( empty( $this->crud_class ) || ! class_exists( $this->crud_class ) ) {
300
-			return new WP_Error( 'no_crud_class', __( 'You need to specify a CRUD class for this controller', 'invoicing' ) );
301
-		}
302
-
303
-		// Prepare the object.
304
-		$id        = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
305
-		$object    = new $this->crud_class( $id );
306
-
307
-		// Abort if an error exists.
308
-		if ( ! empty( $object->last_error ) ) {
309
-			return new WP_Error( 'invalid_item', $object->last_error );
310
-		}
311
-
312
-		$schema    = $this->get_item_schema();
313
-		$data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
314
-
315
-		// Handle all writable props.
316
-		foreach ( $data_keys as $key ) {
317
-			$value = $request[ $key ];
318
-
319
-			if ( ! is_null( $value ) ) {
320
-				switch ( $key ) {
321
-
322
-					case 'meta_data':
323
-						if ( is_array( $value ) ) {
324
-							foreach ( $value as $meta ) {
325
-								$object->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
326
-							}
327
-						}
328
-						break;
329
-
330
-					default:
331
-						if ( is_callable( array( $object, "set_{$key}" ) ) ) {
332
-							$object->{"set_{$key}"}( $value );
333
-						}
334
-						break;
335
-				}
336
-			}
337
-
338
-		}
339
-
340
-		// Filters an object before it is inserted via the REST API..
341
-		return apply_filters( "getpaid_rest_pre_insert_{$this->rest_base}_object", $object, $request );
342
-	}
343
-
344
-	/**
345
-	 * Retrieves data from a GetPaid class.
346
-	 *
347
-	 * @since  1.0.19
348
-	 * @param  GetPaid_Meta_Data[]    $meta_data  meta data objects.
349
-	 * @return array
350
-	 */
351
-	protected function prepare_object_meta_data( $meta_data ) {
352
-		$meta = array();
353
-
354
-		foreach( $meta_data as $object ) {
355
-			$meta[] = $object->get_data();
356
-		}
357
-
358
-		return $meta;
359
-	}
360
-
361
-	/**
362
-	 * Retrieves invoice items.
363
-	 *
364
-	 * @since  1.0.19
365
-	 * @param  WPInv_Invoice $invoice  Invoice items.
366
-	 * @param array            $fields Fields to include.
367
-	 * @return array
368
-	 */
369
-	protected function prepare_invoice_items( $invoice ) {
370
-		$items = array();
371
-
372
-		foreach( $invoice->get_items() as $item ) {
373
-
374
-			$item_data = $item->prepare_data_for_saving();
375
-
376
-			if ( 'amount' == $invoice->get_template() ) {
377
-				$item_data['quantity'] = 1;
378
-			}
379
-
380
-			$items[] = $item_data;
381
-		}
382
-
383
-		return $items;
384
-	}
385
-
386
-	/**
387
-	 * Retrieves data from a GetPaid class.
388
-	 *
389
-	 * @since  1.0.19
390
-	 * @param  GetPaid_Data    $object  Data object.
391
-	 * @param array            $fields Fields to include.
392
-	 * @param string           $context either view or edit.
393
-	 * @return array
394
-	 */
395
-	protected function prepare_object_data( $object, $fields, $context = 'view' ) {
396
-
397
-		$data = array();
398
-
399
-		// Handle all writable props.
400
-		foreach ( array_keys( $this->get_schema_properties() ) as $key ) {
401
-
402
-			// Abort if it is not included.
403
-			if ( ! empty( $fields ) && ! $this->is_field_included( $key, $fields ) ) {
404
-				continue;
405
-			}
406
-
407
-			// Or this current object does not support the field.
408
-			if ( ! $this->object_supports_field( $object, $key ) ) {
409
-				continue;
410
-			}
411
-
412
-			// Handle meta data.
413
-			if ( $key == 'meta_data' ) {
414
-				$data['meta_data'] = $this->prepare_object_meta_data( $object->get_meta_data() );
415
-				continue;
416
-			}
417
-
418
-			// Handle items.
419
-			if ( $key == 'items' && is_a( $object, 'WPInv_Invoice' )  ) {
420
-				$data['items'] = $this->prepare_invoice_items( $object );
421
-				continue;
422
-			}
423
-
424
-			// Booleans.
425
-			if ( is_callable( array( $object, $key ) ) ) {
426
-				$data[ $key ] = $object->$key( $context );
427
-				continue;
428
-			}
429
-
430
-			// Get object value.
431
-			if ( is_callable( array( $object, "get_{$key}" ) ) ) {
432
-				$value = $object->{"get_{$key}"}( $context );
433
-
434
-				// If the value is an instance of GetPaid_Data...
435
-				if ( is_a( $value, 'GetPaid_Data' ) ) {
436
-					$value = $value->get_data( $context );
437
-				}
438
-
439
-				// For objects, retrieves it's properties.
440
-				$data[ $key ] = is_object( $value ) ? get_object_vars( $value ) :  $value ;
441
-				continue;
442
-			}
443
-
444
-		}
445
-
446
-		return $data;
447
-	}
448
-
449
-	/**
450
-	 * Checks if a key should be included in a response.
451
-	 *
452
-	 * @since  1.0.19
453
-	 * @param  GetPaid_Data $object  Data object.
454
-	 * @param  string       $field_key The key to check for.
455
-	 * @return bool
456
-	 */
457
-	public function object_supports_field( $object, $field_key ) {
458
-		return apply_filters( 'getpaid_rest_object_supports_key', true, $object, $field_key );
459
-	}
460
-
461
-	/**
462
-	 * Prepare a single object output for response.
463
-	 *
464
-	 * @since  1.0.19
465
-	 * @param  GetPaid_Data    $object  Data object.
466
-	 * @param  WP_REST_Request $request Request object.
467
-	 * @return WP_REST_Response
468
-	 */
469
-	public function prepare_item_for_response( $object, $request ) {
470
-		remove_filter( 'rest_post_dispatch', 'rest_filter_response_fields', 10 );
471
-
472
-		$this->data_object = $object;
473
-
474
-		// Fetch the fields to include in this response.
475
-		$fields = $this->get_fields_for_response( $request );
476
-
477
-		// Prepare object data.
478
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
479
-		$data    = $this->prepare_object_data( $object, $fields, $context );
480
-		$data    = $this->add_additional_fields_to_object( $data, $request );
481
-		$data    = $this->limit_object_to_requested_fields( $data, $fields );
482
-		$data    = $this->filter_response_by_context( $data, $context );
483
-
484
-		// Prepare the response.
485
-		$response = rest_ensure_response( $data );
486
-		$response->add_links( $this->prepare_links( $object, $request ) );
487
-
488
-		// Filter item response.
489
-		return apply_filters( "getpaid_rest_prepare_{$this->rest_base}_object", $response, $object, $request );
490
-	}
20
+    /**
21
+     * Contains this controller's class name.
22
+     *
23
+     * @var string
24
+     */
25
+    public $crud_class;
26
+
27
+    /**
28
+     * Contains the current CRUD object.
29
+     *
30
+     * @var GetPaid_Data
31
+     */
32
+    protected $data_object;
33
+
34
+    /**
35
+     * Registers the routes for the objects of the controller.
36
+     *
37
+     * @since 1.0.19
38
+     *
39
+     * @see register_rest_route()
40
+     */
41
+    public function register_namespace_routes( $namespace ) {
42
+
43
+        register_rest_route(
44
+            $namespace,
45
+            '/' . $this->rest_base,
46
+            array(
47
+                array(
48
+                    'methods'             => WP_REST_Server::READABLE,
49
+                    'callback'            => array( $this, 'get_items' ),
50
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
51
+                    'args'                => $this->get_collection_params(),
52
+                ),
53
+                array(
54
+                    'methods'             => WP_REST_Server::CREATABLE,
55
+                    'callback'            => array( $this, 'create_item' ),
56
+                    'permission_callback' => array( $this, 'create_item_permissions_check' ),
57
+                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
58
+                ),
59
+                'schema' => array( $this, 'get_public_item_schema' ),
60
+            )
61
+        );
62
+
63
+        $get_item_args = array(
64
+            'context' => $this->get_context_param( array( 'default' => 'view' ) ),
65
+        );
66
+
67
+        register_rest_route(
68
+            $namespace,
69
+            '/' . $this->rest_base . '/(?P<id>[\d]+)',
70
+            array(
71
+                'args'   => array(
72
+                    'id' => array(
73
+                        'description' => __( 'Unique identifier for the object.', 'invoicing' ),
74
+                        'type'        => 'integer',
75
+                    ),
76
+                ),
77
+                array(
78
+                    'methods'             => WP_REST_Server::READABLE,
79
+                    'callback'            => array( $this, 'get_item' ),
80
+                    'permission_callback' => array( $this, 'get_item_permissions_check' ),
81
+                    'args'                => $get_item_args,
82
+                ),
83
+                array(
84
+                    'methods'             => WP_REST_Server::EDITABLE,
85
+                    'callback'            => array( $this, 'update_item' ),
86
+                    'permission_callback' => array( $this, 'update_item_permissions_check' ),
87
+                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
88
+                ),
89
+                array(
90
+                    'methods'             => WP_REST_Server::DELETABLE,
91
+                    'callback'            => array( $this, 'delete_item' ),
92
+                    'permission_callback' => array( $this, 'delete_item_permissions_check' ),
93
+                    'args'                => array(
94
+                        'force' => array(
95
+                            'type'        => 'boolean',
96
+                            'default'     => false,
97
+                            'description' => __( 'Whether to bypass Trash and force deletion.', 'invoicing' ),
98
+                        ),
99
+                    ),
100
+                ),
101
+                'schema' => array( $this, 'get_public_item_schema' ),
102
+            )
103
+        );
104
+
105
+    }
106
+
107
+    /**
108
+     * Saves a single object.
109
+     *
110
+     * @param GetPaid_Data $object Object to save.
111
+     * @return WP_Error|GetPaid_Data
112
+     */
113
+    protected function save_object( $object ) {
114
+        $object->save();
115
+
116
+        if ( ! empty( $object->last_error ) ) {
117
+            return new WP_Error( 'rest_cannot_save', $object->last_error, array( 'status' => 400 ) );
118
+        }
119
+
120
+        return new $this->crud_class( $object->get_id() );
121
+    }
122
+
123
+    /**
124
+     * Retrieves a single object.
125
+     *
126
+     * @since 1.0.13
127
+     *
128
+     * @param int|WP_Post $object_id Supplied ID.
129
+     * @return GetPaid_Data|WP_Error GetPaid_Data object if ID is valid, WP_Error otherwise.
130
+     */
131
+    protected function get_object( $object_id ) {
132
+
133
+        // Do we have an object?
134
+        if ( empty( $this->crud_class ) || ! class_exists( $this->crud_class ) ) {
135
+            return new WP_Error( 'no_crud_class', __( 'You need to specify a CRUD class for this controller', 'invoicing' ) );
136
+        }
137
+
138
+        // Fetch the object.
139
+        $object = new $this->crud_class( $object_id );
140
+        if ( ! empty( $object->last_error ) ) {
141
+            return new WP_Error( 'rest_object_invalid_id', $object->last_error, array( 'status' => 404 ) );
142
+        }
143
+
144
+        $this->data_object = $object;
145
+        return $object->get_id() ? $object : new WP_Error( 'rest_object_invalid_id', __( 'Invalid ID.', 'invoicing' ), array( 'status' => 404 ) );
146
+
147
+    }
148
+
149
+    /**
150
+     * Get a single object.
151
+     *
152
+     * @param WP_REST_Request $request Full details about the request.
153
+     * @return WP_Error|WP_REST_Response
154
+     */
155
+    public function get_item( $request ) {
156
+
157
+        // Fetch the item.
158
+        $object = $this->get_object( $request['id'] );
159
+
160
+        if ( is_wp_error( $object ) ) {
161
+            return $object;
162
+        }
163
+
164
+        // Generate a response.
165
+        return rest_ensure_response( $this->prepare_item_for_response( $object, $request ) );
166
+
167
+    }
168
+
169
+    /**
170
+     * Create a single object.
171
+     *
172
+     * @param WP_REST_Request $request Full details about the request.
173
+     * @return WP_Error|WP_REST_Response
174
+     */
175
+    public function create_item( $request ) {
176
+
177
+        // Can not create an existing item.
178
+        if ( ! empty( $request['id'] ) ) {
179
+            /* translators: %s: post type */
180
+            return new WP_Error( "getpaid_rest_{$this->rest_base}_exists", __( 'Cannot create existing resource.', 'invoicing' ), array( 'status' => 400 ) );
181
+        }
182
+
183
+        // Generate a GetPaid_Data object from the request.
184
+        $object = $this->prepare_item_for_database( $request );
185
+        if ( is_wp_error( $object ) ) {
186
+            return $object;
187
+        }
188
+
189
+        // Save the object.
190
+        $object = $this->save_object( $object );
191
+        if ( is_wp_error( $object ) ) {
192
+            return $object;
193
+        }
194
+
195
+        // Save special fields.
196
+        $save_special = $this->update_additional_fields_for_object( $object, $request );
197
+        if ( is_wp_error( $save_special ) ) {
198
+            $object->delete( true );
199
+            return $save_special;
200
+        }
201
+
202
+        $request->set_param( 'context', 'edit' );
203
+        $response = $this->prepare_item_for_response( $object, $request );
204
+        $response = rest_ensure_response( $response );
205
+        $response->set_status( 201 );
206
+        $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ) );
207
+
208
+        return $response;
209
+    }
210
+
211
+    /**
212
+     * Update a single object.
213
+     *
214
+     * @param WP_REST_Request $request Full details about the request.
215
+     * @return WP_Error|WP_REST_Response
216
+     */
217
+    public function update_item( $request ) {
218
+
219
+        // Fetch the item.
220
+        $object = $this->get_object( $request['id'] );
221
+        if ( is_wp_error( $object ) ) {
222
+            return $object;
223
+        }
224
+
225
+        // Prepare the item for saving.
226
+        $object = $this->prepare_item_for_database( $request );
227
+        if ( is_wp_error( $object ) ) {
228
+            return $object;
229
+        }
230
+
231
+        // Save the item.
232
+        $object = $this->save_object( $object );
233
+        if ( is_wp_error( $object ) ) {
234
+            return $object;
235
+        }
236
+
237
+        // Save special fields (those added via hooks).
238
+        $save_special = $this->update_additional_fields_for_object( $object, $request );
239
+        if ( is_wp_error( $save_special ) ) {
240
+            return $save_special;
241
+        }
242
+
243
+        $request->set_param( 'context', 'edit' );
244
+        $response = $this->prepare_item_for_response( $object, $request );
245
+        return rest_ensure_response( $response );
246
+    }
247
+
248
+    /**
249
+     * Prepare links for the request.
250
+     *
251
+     * @param GetPaid_Data    $object GetPaid_Data object.
252
+     * @return array Links for the given object.
253
+     */
254
+    protected function prepare_links( $object ) {
255
+
256
+        $links = array(
257
+            'self'       => array(
258
+                'href'   => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ),
259
+            ),
260
+            'collection' => array(
261
+                'href'   => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
262
+            ),
263
+        );
264
+
265
+        return $links;
266
+    }
267
+
268
+    /**
269
+     * Get the query params for collections of attachments.
270
+     *
271
+     * @return array
272
+     */
273
+    public function get_collection_params() {
274
+        $params = parent::get_collection_params();
275
+        $params['context']['default'] = 'view';
276
+        return $params;
277
+    }
278
+
279
+    /**
280
+     * Only return writable props from schema.
281
+     *
282
+     * @param  array $schema Schema.
283
+     * @return bool
284
+     */
285
+    public function filter_writable_props( $schema ) {
286
+        return empty( $schema['readonly'] );
287
+    }
288
+
289
+    /**
290
+     * Prepare a single object for create or update.
291
+     *
292
+     * @since 1.0.19
293
+     * @param  WP_REST_Request $request Request object.
294
+     * @return GetPaid_Data|WP_Error Data object or WP_Error.
295
+     */
296
+    protected function prepare_item_for_database( $request ) {
297
+
298
+        // Do we have an object?
299
+        if ( empty( $this->crud_class ) || ! class_exists( $this->crud_class ) ) {
300
+            return new WP_Error( 'no_crud_class', __( 'You need to specify a CRUD class for this controller', 'invoicing' ) );
301
+        }
302
+
303
+        // Prepare the object.
304
+        $id        = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
305
+        $object    = new $this->crud_class( $id );
306
+
307
+        // Abort if an error exists.
308
+        if ( ! empty( $object->last_error ) ) {
309
+            return new WP_Error( 'invalid_item', $object->last_error );
310
+        }
311
+
312
+        $schema    = $this->get_item_schema();
313
+        $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
314
+
315
+        // Handle all writable props.
316
+        foreach ( $data_keys as $key ) {
317
+            $value = $request[ $key ];
318
+
319
+            if ( ! is_null( $value ) ) {
320
+                switch ( $key ) {
321
+
322
+                    case 'meta_data':
323
+                        if ( is_array( $value ) ) {
324
+                            foreach ( $value as $meta ) {
325
+                                $object->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
326
+                            }
327
+                        }
328
+                        break;
329
+
330
+                    default:
331
+                        if ( is_callable( array( $object, "set_{$key}" ) ) ) {
332
+                            $object->{"set_{$key}"}( $value );
333
+                        }
334
+                        break;
335
+                }
336
+            }
337
+
338
+        }
339
+
340
+        // Filters an object before it is inserted via the REST API..
341
+        return apply_filters( "getpaid_rest_pre_insert_{$this->rest_base}_object", $object, $request );
342
+    }
343
+
344
+    /**
345
+     * Retrieves data from a GetPaid class.
346
+     *
347
+     * @since  1.0.19
348
+     * @param  GetPaid_Meta_Data[]    $meta_data  meta data objects.
349
+     * @return array
350
+     */
351
+    protected function prepare_object_meta_data( $meta_data ) {
352
+        $meta = array();
353
+
354
+        foreach( $meta_data as $object ) {
355
+            $meta[] = $object->get_data();
356
+        }
357
+
358
+        return $meta;
359
+    }
360
+
361
+    /**
362
+     * Retrieves invoice items.
363
+     *
364
+     * @since  1.0.19
365
+     * @param  WPInv_Invoice $invoice  Invoice items.
366
+     * @param array            $fields Fields to include.
367
+     * @return array
368
+     */
369
+    protected function prepare_invoice_items( $invoice ) {
370
+        $items = array();
371
+
372
+        foreach( $invoice->get_items() as $item ) {
373
+
374
+            $item_data = $item->prepare_data_for_saving();
375
+
376
+            if ( 'amount' == $invoice->get_template() ) {
377
+                $item_data['quantity'] = 1;
378
+            }
379
+
380
+            $items[] = $item_data;
381
+        }
382
+
383
+        return $items;
384
+    }
385
+
386
+    /**
387
+     * Retrieves data from a GetPaid class.
388
+     *
389
+     * @since  1.0.19
390
+     * @param  GetPaid_Data    $object  Data object.
391
+     * @param array            $fields Fields to include.
392
+     * @param string           $context either view or edit.
393
+     * @return array
394
+     */
395
+    protected function prepare_object_data( $object, $fields, $context = 'view' ) {
396
+
397
+        $data = array();
398
+
399
+        // Handle all writable props.
400
+        foreach ( array_keys( $this->get_schema_properties() ) as $key ) {
401
+
402
+            // Abort if it is not included.
403
+            if ( ! empty( $fields ) && ! $this->is_field_included( $key, $fields ) ) {
404
+                continue;
405
+            }
406
+
407
+            // Or this current object does not support the field.
408
+            if ( ! $this->object_supports_field( $object, $key ) ) {
409
+                continue;
410
+            }
411
+
412
+            // Handle meta data.
413
+            if ( $key == 'meta_data' ) {
414
+                $data['meta_data'] = $this->prepare_object_meta_data( $object->get_meta_data() );
415
+                continue;
416
+            }
417
+
418
+            // Handle items.
419
+            if ( $key == 'items' && is_a( $object, 'WPInv_Invoice' )  ) {
420
+                $data['items'] = $this->prepare_invoice_items( $object );
421
+                continue;
422
+            }
423
+
424
+            // Booleans.
425
+            if ( is_callable( array( $object, $key ) ) ) {
426
+                $data[ $key ] = $object->$key( $context );
427
+                continue;
428
+            }
429
+
430
+            // Get object value.
431
+            if ( is_callable( array( $object, "get_{$key}" ) ) ) {
432
+                $value = $object->{"get_{$key}"}( $context );
433
+
434
+                // If the value is an instance of GetPaid_Data...
435
+                if ( is_a( $value, 'GetPaid_Data' ) ) {
436
+                    $value = $value->get_data( $context );
437
+                }
438
+
439
+                // For objects, retrieves it's properties.
440
+                $data[ $key ] = is_object( $value ) ? get_object_vars( $value ) :  $value ;
441
+                continue;
442
+            }
443
+
444
+        }
445
+
446
+        return $data;
447
+    }
448
+
449
+    /**
450
+     * Checks if a key should be included in a response.
451
+     *
452
+     * @since  1.0.19
453
+     * @param  GetPaid_Data $object  Data object.
454
+     * @param  string       $field_key The key to check for.
455
+     * @return bool
456
+     */
457
+    public function object_supports_field( $object, $field_key ) {
458
+        return apply_filters( 'getpaid_rest_object_supports_key', true, $object, $field_key );
459
+    }
460
+
461
+    /**
462
+     * Prepare a single object output for response.
463
+     *
464
+     * @since  1.0.19
465
+     * @param  GetPaid_Data    $object  Data object.
466
+     * @param  WP_REST_Request $request Request object.
467
+     * @return WP_REST_Response
468
+     */
469
+    public function prepare_item_for_response( $object, $request ) {
470
+        remove_filter( 'rest_post_dispatch', 'rest_filter_response_fields', 10 );
471
+
472
+        $this->data_object = $object;
473
+
474
+        // Fetch the fields to include in this response.
475
+        $fields = $this->get_fields_for_response( $request );
476
+
477
+        // Prepare object data.
478
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
479
+        $data    = $this->prepare_object_data( $object, $fields, $context );
480
+        $data    = $this->add_additional_fields_to_object( $data, $request );
481
+        $data    = $this->limit_object_to_requested_fields( $data, $fields );
482
+        $data    = $this->filter_response_by_context( $data, $context );
483
+
484
+        // Prepare the response.
485
+        $response = rest_ensure_response( $data );
486
+        $response->add_links( $this->prepare_links( $object, $request ) );
487
+
488
+        // Filter item response.
489
+        return apply_filters( "getpaid_rest_prepare_{$this->rest_base}_object", $response, $object, $request );
490
+    }
491 491
 
492 492
 }
Please login to merge, or discard this patch.
Spacing   +117 added lines, -117 removed lines patch added patch discarded remove patch
@@ -8,7 +8,7 @@  discard block
 block discarded – undo
8 8
  * @version 1.0.19
9 9
  */
10 10
 
11
-defined( 'ABSPATH' ) || exit;
11
+defined('ABSPATH') || exit;
12 12
 
13 13
 /**
14 14
  * GetPaid REST CRUD controller class.
@@ -38,7 +38,7 @@  discard block
 block discarded – undo
38 38
 	 *
39 39
 	 * @see register_rest_route()
40 40
 	 */
41
-	public function register_namespace_routes( $namespace ) {
41
+	public function register_namespace_routes($namespace) {
42 42
 
43 43
 		register_rest_route(
44 44
 			$namespace,
@@ -46,22 +46,22 @@  discard block
 block discarded – undo
46 46
 			array(
47 47
 				array(
48 48
 					'methods'             => WP_REST_Server::READABLE,
49
-					'callback'            => array( $this, 'get_items' ),
50
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
49
+					'callback'            => array($this, 'get_items'),
50
+					'permission_callback' => array($this, 'get_items_permissions_check'),
51 51
 					'args'                => $this->get_collection_params(),
52 52
 				),
53 53
 				array(
54 54
 					'methods'             => WP_REST_Server::CREATABLE,
55
-					'callback'            => array( $this, 'create_item' ),
56
-					'permission_callback' => array( $this, 'create_item_permissions_check' ),
57
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
55
+					'callback'            => array($this, 'create_item'),
56
+					'permission_callback' => array($this, 'create_item_permissions_check'),
57
+					'args'                => $this->get_endpoint_args_for_item_schema(WP_REST_Server::CREATABLE),
58 58
 				),
59
-				'schema' => array( $this, 'get_public_item_schema' ),
59
+				'schema' => array($this, 'get_public_item_schema'),
60 60
 			)
61 61
 		);
62 62
 
63 63
 		$get_item_args = array(
64
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
64
+			'context' => $this->get_context_param(array('default' => 'view')),
65 65
 		);
66 66
 
67 67
 		register_rest_route(
@@ -70,35 +70,35 @@  discard block
 block discarded – undo
70 70
 			array(
71 71
 				'args'   => array(
72 72
 					'id' => array(
73
-						'description' => __( 'Unique identifier for the object.', 'invoicing' ),
73
+						'description' => __('Unique identifier for the object.', 'invoicing'),
74 74
 						'type'        => 'integer',
75 75
 					),
76 76
 				),
77 77
 				array(
78 78
 					'methods'             => WP_REST_Server::READABLE,
79
-					'callback'            => array( $this, 'get_item' ),
80
-					'permission_callback' => array( $this, 'get_item_permissions_check' ),
79
+					'callback'            => array($this, 'get_item'),
80
+					'permission_callback' => array($this, 'get_item_permissions_check'),
81 81
 					'args'                => $get_item_args,
82 82
 				),
83 83
 				array(
84 84
 					'methods'             => WP_REST_Server::EDITABLE,
85
-					'callback'            => array( $this, 'update_item' ),
86
-					'permission_callback' => array( $this, 'update_item_permissions_check' ),
87
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
85
+					'callback'            => array($this, 'update_item'),
86
+					'permission_callback' => array($this, 'update_item_permissions_check'),
87
+					'args'                => $this->get_endpoint_args_for_item_schema(WP_REST_Server::EDITABLE),
88 88
 				),
89 89
 				array(
90 90
 					'methods'             => WP_REST_Server::DELETABLE,
91
-					'callback'            => array( $this, 'delete_item' ),
92
-					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
91
+					'callback'            => array($this, 'delete_item'),
92
+					'permission_callback' => array($this, 'delete_item_permissions_check'),
93 93
 					'args'                => array(
94 94
 						'force' => array(
95 95
 							'type'        => 'boolean',
96 96
 							'default'     => false,
97
-							'description' => __( 'Whether to bypass Trash and force deletion.', 'invoicing' ),
97
+							'description' => __('Whether to bypass Trash and force deletion.', 'invoicing'),
98 98
 						),
99 99
 					),
100 100
 				),
101
-				'schema' => array( $this, 'get_public_item_schema' ),
101
+				'schema' => array($this, 'get_public_item_schema'),
102 102
 			)
103 103
 		);
104 104
 
@@ -110,14 +110,14 @@  discard block
 block discarded – undo
110 110
 	 * @param GetPaid_Data $object Object to save.
111 111
 	 * @return WP_Error|GetPaid_Data
112 112
 	 */
113
-	protected function save_object( $object ) {
113
+	protected function save_object($object) {
114 114
 		$object->save();
115 115
 
116
-		if ( ! empty( $object->last_error ) ) {
117
-			return new WP_Error( 'rest_cannot_save', $object->last_error, array( 'status' => 400 ) );
116
+		if (!empty($object->last_error)) {
117
+			return new WP_Error('rest_cannot_save', $object->last_error, array('status' => 400));
118 118
 		}
119 119
 
120
-		return new $this->crud_class( $object->get_id() );
120
+		return new $this->crud_class($object->get_id());
121 121
 	}
122 122
 
123 123
 	/**
@@ -128,21 +128,21 @@  discard block
 block discarded – undo
128 128
 	 * @param int|WP_Post $object_id Supplied ID.
129 129
 	 * @return GetPaid_Data|WP_Error GetPaid_Data object if ID is valid, WP_Error otherwise.
130 130
 	 */
131
-	protected function get_object( $object_id ) {
131
+	protected function get_object($object_id) {
132 132
 
133 133
 		// Do we have an object?
134
-		if ( empty( $this->crud_class ) || ! class_exists( $this->crud_class ) ) {
135
-			return new WP_Error( 'no_crud_class', __( 'You need to specify a CRUD class for this controller', 'invoicing' ) );
134
+		if (empty($this->crud_class) || !class_exists($this->crud_class)) {
135
+			return new WP_Error('no_crud_class', __('You need to specify a CRUD class for this controller', 'invoicing'));
136 136
 		}
137 137
 
138 138
 		// Fetch the object.
139
-		$object = new $this->crud_class( $object_id );
140
-		if ( ! empty( $object->last_error ) ) {
141
-			return new WP_Error( 'rest_object_invalid_id', $object->last_error, array( 'status' => 404 ) );
139
+		$object = new $this->crud_class($object_id);
140
+		if (!empty($object->last_error)) {
141
+			return new WP_Error('rest_object_invalid_id', $object->last_error, array('status' => 404));
142 142
 		}
143 143
 
144 144
 		$this->data_object = $object;
145
-		return $object->get_id() ? $object : new WP_Error( 'rest_object_invalid_id', __( 'Invalid ID.', 'invoicing' ), array( 'status' => 404 ) );
145
+		return $object->get_id() ? $object : new WP_Error('rest_object_invalid_id', __('Invalid ID.', 'invoicing'), array('status' => 404));
146 146
 
147 147
 	}
148 148
 
@@ -152,17 +152,17 @@  discard block
 block discarded – undo
152 152
 	 * @param WP_REST_Request $request Full details about the request.
153 153
 	 * @return WP_Error|WP_REST_Response
154 154
 	 */
155
-	public function get_item( $request ) {
155
+	public function get_item($request) {
156 156
 
157 157
 		// Fetch the item.
158
-		$object = $this->get_object( $request['id'] );
158
+		$object = $this->get_object($request['id']);
159 159
 
160
-		if ( is_wp_error( $object ) ) {
160
+		if (is_wp_error($object)) {
161 161
 			return $object;
162 162
 		}
163 163
 
164 164
 		// Generate a response.
165
-		return rest_ensure_response( $this->prepare_item_for_response( $object, $request ) );
165
+		return rest_ensure_response($this->prepare_item_for_response($object, $request));
166 166
 
167 167
 	}
168 168
 
@@ -172,38 +172,38 @@  discard block
 block discarded – undo
172 172
 	 * @param WP_REST_Request $request Full details about the request.
173 173
 	 * @return WP_Error|WP_REST_Response
174 174
 	 */
175
-	public function create_item( $request ) {
175
+	public function create_item($request) {
176 176
 
177 177
 		// Can not create an existing item.
178
-		if ( ! empty( $request['id'] ) ) {
178
+		if (!empty($request['id'])) {
179 179
 			/* translators: %s: post type */
180
-			return new WP_Error( "getpaid_rest_{$this->rest_base}_exists", __( 'Cannot create existing resource.', 'invoicing' ), array( 'status' => 400 ) );
180
+			return new WP_Error("getpaid_rest_{$this->rest_base}_exists", __('Cannot create existing resource.', 'invoicing'), array('status' => 400));
181 181
 		}
182 182
 
183 183
 		// Generate a GetPaid_Data object from the request.
184
-		$object = $this->prepare_item_for_database( $request );
185
-		if ( is_wp_error( $object ) ) {
184
+		$object = $this->prepare_item_for_database($request);
185
+		if (is_wp_error($object)) {
186 186
 			return $object;
187 187
 		}
188 188
 
189 189
 		// Save the object.
190
-		$object = $this->save_object( $object );
191
-		if ( is_wp_error( $object ) ) {
190
+		$object = $this->save_object($object);
191
+		if (is_wp_error($object)) {
192 192
 			return $object;
193 193
 		}
194 194
 
195 195
 		// Save special fields.
196
-		$save_special = $this->update_additional_fields_for_object( $object, $request );
197
-		if ( is_wp_error( $save_special ) ) {
198
-			$object->delete( true );
196
+		$save_special = $this->update_additional_fields_for_object($object, $request);
197
+		if (is_wp_error($save_special)) {
198
+			$object->delete(true);
199 199
 			return $save_special;
200 200
 		}
201 201
 
202
-		$request->set_param( 'context', 'edit' );
203
-		$response = $this->prepare_item_for_response( $object, $request );
204
-		$response = rest_ensure_response( $response );
205
-		$response->set_status( 201 );
206
-		$response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ) );
202
+		$request->set_param('context', 'edit');
203
+		$response = $this->prepare_item_for_response($object, $request);
204
+		$response = rest_ensure_response($response);
205
+		$response->set_status(201);
206
+		$response->header('Location', rest_url(sprintf('/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id())));
207 207
 
208 208
 		return $response;
209 209
 	}
@@ -214,35 +214,35 @@  discard block
 block discarded – undo
214 214
 	 * @param WP_REST_Request $request Full details about the request.
215 215
 	 * @return WP_Error|WP_REST_Response
216 216
 	 */
217
-	public function update_item( $request ) {
217
+	public function update_item($request) {
218 218
 
219 219
 		// Fetch the item.
220
-		$object = $this->get_object( $request['id'] );
221
-		if ( is_wp_error( $object ) ) {
220
+		$object = $this->get_object($request['id']);
221
+		if (is_wp_error($object)) {
222 222
 			return $object;
223 223
 		}
224 224
 
225 225
 		// Prepare the item for saving.
226
-		$object = $this->prepare_item_for_database( $request );
227
-		if ( is_wp_error( $object ) ) {
226
+		$object = $this->prepare_item_for_database($request);
227
+		if (is_wp_error($object)) {
228 228
 			return $object;
229 229
 		}
230 230
 
231 231
 		// Save the item.
232
-		$object = $this->save_object( $object );
233
-		if ( is_wp_error( $object ) ) {
232
+		$object = $this->save_object($object);
233
+		if (is_wp_error($object)) {
234 234
 			return $object;
235 235
 		}
236 236
 
237 237
 		// Save special fields (those added via hooks).
238
-		$save_special = $this->update_additional_fields_for_object( $object, $request );
239
-		if ( is_wp_error( $save_special ) ) {
238
+		$save_special = $this->update_additional_fields_for_object($object, $request);
239
+		if (is_wp_error($save_special)) {
240 240
 			return $save_special;
241 241
 		}
242 242
 
243
-		$request->set_param( 'context', 'edit' );
244
-		$response = $this->prepare_item_for_response( $object, $request );
245
-		return rest_ensure_response( $response );
243
+		$request->set_param('context', 'edit');
244
+		$response = $this->prepare_item_for_response($object, $request);
245
+		return rest_ensure_response($response);
246 246
 	}
247 247
 
248 248
 	/**
@@ -251,14 +251,14 @@  discard block
 block discarded – undo
251 251
 	 * @param GetPaid_Data    $object GetPaid_Data object.
252 252
 	 * @return array Links for the given object.
253 253
 	 */
254
-	protected function prepare_links( $object ) {
254
+	protected function prepare_links($object) {
255 255
 
256 256
 		$links = array(
257 257
 			'self'       => array(
258
-				'href'   => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ),
258
+				'href'   => rest_url(sprintf('/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id())),
259 259
 			),
260 260
 			'collection' => array(
261
-				'href'   => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
261
+				'href'   => rest_url(sprintf('/%s/%s', $this->namespace, $this->rest_base)),
262 262
 			),
263 263
 		);
264 264
 
@@ -282,8 +282,8 @@  discard block
 block discarded – undo
282 282
 	 * @param  array $schema Schema.
283 283
 	 * @return bool
284 284
 	 */
285
-	public function filter_writable_props( $schema ) {
286
-		return empty( $schema['readonly'] );
285
+	public function filter_writable_props($schema) {
286
+		return empty($schema['readonly']);
287 287
 	}
288 288
 
289 289
 	/**
@@ -293,43 +293,43 @@  discard block
 block discarded – undo
293 293
 	 * @param  WP_REST_Request $request Request object.
294 294
 	 * @return GetPaid_Data|WP_Error Data object or WP_Error.
295 295
 	 */
296
-	protected function prepare_item_for_database( $request ) {
296
+	protected function prepare_item_for_database($request) {
297 297
 
298 298
 		// Do we have an object?
299
-		if ( empty( $this->crud_class ) || ! class_exists( $this->crud_class ) ) {
300
-			return new WP_Error( 'no_crud_class', __( 'You need to specify a CRUD class for this controller', 'invoicing' ) );
299
+		if (empty($this->crud_class) || !class_exists($this->crud_class)) {
300
+			return new WP_Error('no_crud_class', __('You need to specify a CRUD class for this controller', 'invoicing'));
301 301
 		}
302 302
 
303 303
 		// Prepare the object.
304
-		$id        = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
305
-		$object    = new $this->crud_class( $id );
304
+		$id        = isset($request['id']) ? absint($request['id']) : 0;
305
+		$object    = new $this->crud_class($id);
306 306
 
307 307
 		// Abort if an error exists.
308
-		if ( ! empty( $object->last_error ) ) {
309
-			return new WP_Error( 'invalid_item', $object->last_error );
308
+		if (!empty($object->last_error)) {
309
+			return new WP_Error('invalid_item', $object->last_error);
310 310
 		}
311 311
 
312 312
 		$schema    = $this->get_item_schema();
313
-		$data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
313
+		$data_keys = array_keys(array_filter($schema['properties'], array($this, 'filter_writable_props')));
314 314
 
315 315
 		// Handle all writable props.
316
-		foreach ( $data_keys as $key ) {
317
-			$value = $request[ $key ];
316
+		foreach ($data_keys as $key) {
317
+			$value = $request[$key];
318 318
 
319
-			if ( ! is_null( $value ) ) {
320
-				switch ( $key ) {
319
+			if (!is_null($value)) {
320
+				switch ($key) {
321 321
 
322 322
 					case 'meta_data':
323
-						if ( is_array( $value ) ) {
324
-							foreach ( $value as $meta ) {
325
-								$object->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
323
+						if (is_array($value)) {
324
+							foreach ($value as $meta) {
325
+								$object->update_meta_data($meta['key'], $meta['value'], isset($meta['id']) ? $meta['id'] : '');
326 326
 							}
327 327
 						}
328 328
 						break;
329 329
 
330 330
 					default:
331
-						if ( is_callable( array( $object, "set_{$key}" ) ) ) {
332
-							$object->{"set_{$key}"}( $value );
331
+						if (is_callable(array($object, "set_{$key}"))) {
332
+							$object->{"set_{$key}"}($value);
333 333
 						}
334 334
 						break;
335 335
 				}
@@ -338,7 +338,7 @@  discard block
 block discarded – undo
338 338
 		}
339 339
 
340 340
 		// Filters an object before it is inserted via the REST API..
341
-		return apply_filters( "getpaid_rest_pre_insert_{$this->rest_base}_object", $object, $request );
341
+		return apply_filters("getpaid_rest_pre_insert_{$this->rest_base}_object", $object, $request);
342 342
 	}
343 343
 
344 344
 	/**
@@ -348,10 +348,10 @@  discard block
 block discarded – undo
348 348
 	 * @param  GetPaid_Meta_Data[]    $meta_data  meta data objects.
349 349
 	 * @return array
350 350
 	 */
351
-	protected function prepare_object_meta_data( $meta_data ) {
351
+	protected function prepare_object_meta_data($meta_data) {
352 352
 		$meta = array();
353 353
 
354
-		foreach( $meta_data as $object ) {
354
+		foreach ($meta_data as $object) {
355 355
 			$meta[] = $object->get_data();
356 356
 		}
357 357
 
@@ -366,14 +366,14 @@  discard block
 block discarded – undo
366 366
 	 * @param array            $fields Fields to include.
367 367
 	 * @return array
368 368
 	 */
369
-	protected function prepare_invoice_items( $invoice ) {
369
+	protected function prepare_invoice_items($invoice) {
370 370
 		$items = array();
371 371
 
372
-		foreach( $invoice->get_items() as $item ) {
372
+		foreach ($invoice->get_items() as $item) {
373 373
 
374 374
 			$item_data = $item->prepare_data_for_saving();
375 375
 
376
-			if ( 'amount' == $invoice->get_template() ) {
376
+			if ('amount' == $invoice->get_template()) {
377 377
 				$item_data['quantity'] = 1;
378 378
 			}
379 379
 
@@ -392,52 +392,52 @@  discard block
 block discarded – undo
392 392
 	 * @param string           $context either view or edit.
393 393
 	 * @return array
394 394
 	 */
395
-	protected function prepare_object_data( $object, $fields, $context = 'view' ) {
395
+	protected function prepare_object_data($object, $fields, $context = 'view') {
396 396
 
397 397
 		$data = array();
398 398
 
399 399
 		// Handle all writable props.
400
-		foreach ( array_keys( $this->get_schema_properties() ) as $key ) {
400
+		foreach (array_keys($this->get_schema_properties()) as $key) {
401 401
 
402 402
 			// Abort if it is not included.
403
-			if ( ! empty( $fields ) && ! $this->is_field_included( $key, $fields ) ) {
403
+			if (!empty($fields) && !$this->is_field_included($key, $fields)) {
404 404
 				continue;
405 405
 			}
406 406
 
407 407
 			// Or this current object does not support the field.
408
-			if ( ! $this->object_supports_field( $object, $key ) ) {
408
+			if (!$this->object_supports_field($object, $key)) {
409 409
 				continue;
410 410
 			}
411 411
 
412 412
 			// Handle meta data.
413
-			if ( $key == 'meta_data' ) {
414
-				$data['meta_data'] = $this->prepare_object_meta_data( $object->get_meta_data() );
413
+			if ($key == 'meta_data') {
414
+				$data['meta_data'] = $this->prepare_object_meta_data($object->get_meta_data());
415 415
 				continue;
416 416
 			}
417 417
 
418 418
 			// Handle items.
419
-			if ( $key == 'items' && is_a( $object, 'WPInv_Invoice' )  ) {
420
-				$data['items'] = $this->prepare_invoice_items( $object );
419
+			if ($key == 'items' && is_a($object, 'WPInv_Invoice')) {
420
+				$data['items'] = $this->prepare_invoice_items($object);
421 421
 				continue;
422 422
 			}
423 423
 
424 424
 			// Booleans.
425
-			if ( is_callable( array( $object, $key ) ) ) {
426
-				$data[ $key ] = $object->$key( $context );
425
+			if (is_callable(array($object, $key))) {
426
+				$data[$key] = $object->$key($context);
427 427
 				continue;
428 428
 			}
429 429
 
430 430
 			// Get object value.
431
-			if ( is_callable( array( $object, "get_{$key}" ) ) ) {
432
-				$value = $object->{"get_{$key}"}( $context );
431
+			if (is_callable(array($object, "get_{$key}"))) {
432
+				$value = $object->{"get_{$key}"}($context);
433 433
 
434 434
 				// If the value is an instance of GetPaid_Data...
435
-				if ( is_a( $value, 'GetPaid_Data' ) ) {
436
-					$value = $value->get_data( $context );
435
+				if (is_a($value, 'GetPaid_Data')) {
436
+					$value = $value->get_data($context);
437 437
 				}
438 438
 
439 439
 				// For objects, retrieves it's properties.
440
-				$data[ $key ] = is_object( $value ) ? get_object_vars( $value ) :  $value ;
440
+				$data[$key] = is_object($value) ? get_object_vars($value) : $value;
441 441
 				continue;
442 442
 			}
443 443
 
@@ -454,8 +454,8 @@  discard block
 block discarded – undo
454 454
 	 * @param  string       $field_key The key to check for.
455 455
 	 * @return bool
456 456
 	 */
457
-	public function object_supports_field( $object, $field_key ) {
458
-		return apply_filters( 'getpaid_rest_object_supports_key', true, $object, $field_key );
457
+	public function object_supports_field($object, $field_key) {
458
+		return apply_filters('getpaid_rest_object_supports_key', true, $object, $field_key);
459 459
 	}
460 460
 
461 461
 	/**
@@ -466,27 +466,27 @@  discard block
 block discarded – undo
466 466
 	 * @param  WP_REST_Request $request Request object.
467 467
 	 * @return WP_REST_Response
468 468
 	 */
469
-	public function prepare_item_for_response( $object, $request ) {
470
-		remove_filter( 'rest_post_dispatch', 'rest_filter_response_fields', 10 );
469
+	public function prepare_item_for_response($object, $request) {
470
+		remove_filter('rest_post_dispatch', 'rest_filter_response_fields', 10);
471 471
 
472 472
 		$this->data_object = $object;
473 473
 
474 474
 		// Fetch the fields to include in this response.
475
-		$fields = $this->get_fields_for_response( $request );
475
+		$fields = $this->get_fields_for_response($request);
476 476
 
477 477
 		// Prepare object data.
478
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
479
-		$data    = $this->prepare_object_data( $object, $fields, $context );
480
-		$data    = $this->add_additional_fields_to_object( $data, $request );
481
-		$data    = $this->limit_object_to_requested_fields( $data, $fields );
482
-		$data    = $this->filter_response_by_context( $data, $context );
478
+		$context = !empty($request['context']) ? $request['context'] : 'view';
479
+		$data    = $this->prepare_object_data($object, $fields, $context);
480
+		$data    = $this->add_additional_fields_to_object($data, $request);
481
+		$data    = $this->limit_object_to_requested_fields($data, $fields);
482
+		$data    = $this->filter_response_by_context($data, $context);
483 483
 
484 484
 		// Prepare the response.
485
-		$response = rest_ensure_response( $data );
486
-		$response->add_links( $this->prepare_links( $object, $request ) );
485
+		$response = rest_ensure_response($data);
486
+		$response->add_links($this->prepare_links($object, $request));
487 487
 
488 488
 		// Filter item response.
489
-		return apply_filters( "getpaid_rest_prepare_{$this->rest_base}_object", $response, $object, $request );
489
+		return apply_filters("getpaid_rest_prepare_{$this->rest_base}_object", $response, $object, $request);
490 490
 	}
491 491
 
492 492
 }
Please login to merge, or discard this patch.
includes/class-getpaid-subscriptions-query.php 2 patches
Indentation   +490 added lines, -490 removed lines patch added patch discarded remove patch
@@ -16,495 +16,495 @@
 block discarded – undo
16 16
  */
17 17
 class GetPaid_Subscriptions_Query {
18 18
 
19
-	/**
20
-	 * Query vars, after parsing
21
-	 *
22
-	 * @since 1.0.19
23
-	 * @var array
24
-	 */
25
-	public $query_vars = array();
26
-
27
-	/**
28
-	 * List of found subscriptions.
29
-	 *
30
-	 * @since 1.0.19
31
-	 * @var array
32
-	 */
33
-	private $results;
34
-
35
-	/**
36
-	 * Total number of found subscriptions for the current query
37
-	 *
38
-	 * @since 1.0.19
39
-	 * @var int
40
-	 */
41
-	private $total_subscriptions = 0;
42
-
43
-	/**
44
-	 * The SQL query used to fetch matching subscriptions.
45
-	 *
46
-	 * @since 1.0.19
47
-	 * @var string
48
-	 */
49
-	public $request;
50
-
51
-	// SQL clauses
52
-
53
-	/**
54
-	 * Contains the 'FIELDS' sql clause
55
-	 *
56
-	 * @since 1.0.19
57
-	 * @var string
58
-	 */
59
-	public $query_fields;
60
-
61
-	/**
62
-	 * Contains the 'FROM' sql clause
63
-	 *
64
-	 * @since 1.0.19
65
-	 * @var string
66
-	 */
67
-	public $query_from;
68
-
69
-	/**
70
-	 * Contains the 'WHERE' sql clause
71
-	 *
72
-	 * @since 1.0.19
73
-	 * @var string
74
-	 */
75
-	public $query_where;
76
-
77
-	/**
78
-	 * Contains the 'ORDER BY' sql clause
79
-	 *
80
-	 * @since 1.0.19
81
-	 * @var string
82
-	 */
83
-	public $query_orderby;
84
-
85
-	/**
86
-	 * Contains the 'LIMIT' sql clause
87
-	 *
88
-	 * @since 1.0.19
89
-	 * @var string
90
-	 */
91
-	public $query_limit;
92
-
93
-	/**
94
-	 * Class constructor.
95
-	 *
96
-	 * @since 1.0.19
97
-	 *
98
-	 * @param null|string|array $query Optional. The query variables.
99
-	 */
100
-	public function __construct( $query = null ) {
101
-		if ( ! is_null( $query ) ) {
102
-			$this->prepare_query( $query );
103
-			$this->query();
104
-		}
105
-	}
106
-
107
-	/**
108
-	 * Fills in missing query variables with default values.
109
-	 *
110
-	 * @since 1.0.19
111
-	 *
112
-	 * @param  string|array $args Query vars, as passed to `GetPaid_Subscriptions_Query`.
113
-	 * @return array Complete query variables with undefined ones filled in with defaults.
114
-	 */
115
-	public static function fill_query_vars( $args ) {
116
-		$defaults = array(
117
-			'status'            => 'all',
118
-			'customer_in'       => array(),
119
-			'customer_not_in'   => array(),
120
-			'product_in'        => array(),
121
-			'product_not_in'    => array(),
122
-			'include'           => array(),
123
-			'exclude'           => array(),
124
-			'orderby'           => 'id',
125
-			'order'             => 'DESC',
126
-			'offset'            => '',
127
-			'number'            => 10,
128
-			'paged'             => 1,
129
-			'count_total'       => true,
130
-			'fields'            => 'all',
131
-		);
132
-
133
-		return wp_parse_args( $args, $defaults );
134
-	}
135
-
136
-	/**
137
-	 * Prepare the query variables.
138
-	 *
139
-	 * @since 1.0.19
140
-	 *
141
-	 * @global wpdb $wpdb WordPress database abstraction object.
142
-	 *
143
-	 * @param string|array $query {
144
-	 *     Optional. Array or string of Query parameters.
145
-	 *
146
-	 *     @type string|array $status              The subscription status to filter by. Can either be a single status or an array of statuses.
147
-	 *                                             Default is all.
148
-	 *     @type int[]        $customer_in         An array of customer ids to filter by.
149
-	 *     @type int[]        $customer_not_in     An array of customer ids whose subscriptions should be excluded.
150
-	 *     @type int[]        $invoice_in          An array of invoice ids to filter by.
151
-	 *     @type int[]        $invoice_not_in      An array of invoice ids whose subscriptions should be excluded.
152
-	 *     @type int[]        $product_in          An array of product ids to filter by.
153
-	 *     @type int[]        $product_not_in      An array of product ids whose subscriptions should be excluded.
154
-	 *     @type array        $date_created_query  A WP_Date_Query compatible array use to filter subscriptions by their date of creation.
155
-	 *     @type array        $date_expires_query  A WP_Date_Query compatible array use to filter subscriptions by their expiration date.
156
-	 *     @type array        $include             An array of subscription IDs to include. Default empty array.
157
-	 *     @type array        $exclude             An array of subscription IDs to exclude. Default empty array.
158
-	 *     @type string|array $orderby             Field(s) to sort the retrieved subscription by. May be a single value,
159
-	 *                                             an array of values, or a multi-dimensional array with fields as
160
-	 *                                             keys and orders ('ASC' or 'DESC') as values. Accepted values are
161
-	 *                                             'id', 'customer_id', 'frequency', 'period', 'initial_amount,
162
-	 *                                             'recurring_amount', 'bill_times', 'parent_payment_id', 'created', 'expiration'
163
-	 *                                             'transaction_id', 'product_id', 'trial_period', 'include', 'status', 'profile_id'. Default array( 'id' ).
164
-	 *     @type string       $order               Designates ascending or descending order of subscriptions. Order values
165
-	 *                                             passed as part of an `$orderby` array take precedence over this
166
-	 *                                             parameter. Accepts 'ASC', 'DESC'. Default 'DESC'.
167
-	 *     @type int          $offset              Number of subscriptions to offset in retrieved results. Can be used in
168
-	 *                                             conjunction with pagination. Default 0.
169
-	 *     @type int          $number              Number of subscriptions to limit the query for. Can be used in
170
-	 *                                             conjunction with pagination. Value -1 (all) is supported, but
171
-	 *                                             should be used with caution on larger sites.
172
-	 *                                             Default 10.
173
-	 *     @type int          $paged               When used with number, defines the page of results to return.
174
-	 *                                             Default 1.
175
-	 *     @type bool         $count_total         Whether to count the total number of subscriptions found. If pagination
176
-	 *                                             is not needed, setting this to false can improve performance.
177
-	 *                                             Default true.
178
-	 *     @type string|array $fields              Which fields to return. Single or all fields (string), or array
179
-	 *                                             of fields. Accepts 'id', 'customer_id', 'frequency', 'period', 'initial_amount,
180
-	 *                                             'recurring_amount', 'bill_times', 'parent_payment_id', 'created', 'expiration'
181
-	 *                                             'transaction_id', 'product_id', 'trial_period', 'status', 'profile_id'.
182
-	 *                                             Use 'all' for all fields. Default 'all'.
183
-	 * }
184
-	 */
185
-	public function prepare_query( $query = array() ) {
186
-		global $wpdb;
187
-
188
-		if ( empty( $this->query_vars ) || ! empty( $query ) ) {
189
-			$this->query_limit = null;
190
-			$this->query_vars  = $this->fill_query_vars( $query );
191
-		}
192
-
193
-		if ( ! empty( $this->query_vars['fields'] ) && 'all' !== $this->query_vars['fields'] ) {
194
-			$this->query_vars['fields'] = wpinv_parse_list( $this->query_vars['fields'] );
195
-		}
196
-
197
-		do_action( 'getpaid_pre_get_subscriptions', array( &$this ) );
198
-
199
-		// Ensure that query vars are filled after 'getpaid_pre_get_subscriptions'.
200
-		$qv                =& $this->query_vars;
201
-		$qv                = $this->fill_query_vars( $qv );
202
-		$table             = $wpdb->prefix . 'wpinv_subscriptions';
203
-		$this->query_from  = "FROM $table";
204
-
205
-		// Prepare query fields.
206
-		$this->prepare_query_fields( $qv, $table );
207
-
208
-		// Prepare query where.
209
-		$this->prepare_query_where( $qv, $table );
210
-
211
-		// Prepare query order.
212
-		$this->prepare_query_order( $qv, $table );
213
-
214
-		// limit
215
-		if ( isset( $qv['number'] ) && $qv['number'] > 0 ) {
216
-			if ( $qv['offset'] ) {
217
-				$this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] );
218
-			} else {
219
-				$this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] );
220
-			}
221
-		}
222
-
223
-		do_action_ref_array( 'getpaid_after_subscriptions_query', array( &$this ) );
224
-	}
225
-
226
-	/**
227
-	 * Prepares the query fields.
228
-	 *
229
-	 * @since 1.0.19
230
-	 *
231
-	 * @param array $qv Query vars.
232
-	 * @param string $table Table name.
233
-	 */
234
-	protected function prepare_query_fields( &$qv, $table ) {
235
-
236
-		if ( is_array( $qv['fields'] ) ) {
237
-			$qv['fields'] = array_unique( $qv['fields'] );
238
-
239
-			$query_fields = array();
240
-			foreach ( $qv['fields'] as $field ) {
241
-				$field          = sanitize_key( $field );
242
-				$query_fields[] = "$table.`$field`";
243
-			}
244
-			$this->query_fields = implode( ',', $query_fields );
245
-		} else {
246
-			$this->query_fields = "$table.*";
247
-		}
248
-
249
-		if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
250
-			$this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;
251
-		}
252
-
253
-	}
254
-
255
-	/**
256
-	 * Prepares the query where.
257
-	 *
258
-	 * @since 1.0.19
259
-	 *
260
-	 * @param array $qv Query vars.
261
-	 * @param string $table Table name.
262
-	 */
263
-	protected function prepare_query_where( &$qv, $table ) {
264
-		global $wpdb;
265
-		$this->query_where = 'WHERE 1=1';
266
-
267
-		// Status.
268
-		if ( 'all' !== $qv['status'] ) {
269
-			$statuses           = wpinv_clean( wpinv_parse_list( $qv['status'] ) );
270
-			$prepared_statuses  = join( ',', array_fill( 0, count( $statuses ), '%s' ) );
271
-			$this->query_where .= $wpdb->prepare( " AND $table.`status` IN ( $prepared_statuses )", $statuses );
272
-		}
273
-
274
-		if ( ! empty( $qv['customer_in'] ) ) {
275
-			$customer_in        = implode( ',', wp_parse_id_list( $qv['customer_in'] ) );
276
-			$this->query_where .= " AND $table.`customer_id` IN ($customer_in)";
277
-		} elseif ( ! empty( $qv['customer_not_in'] ) ) {
278
-			$customer_not_in    = implode( ',', wp_parse_id_list( $qv['customer_not_in'] ) );
279
-			$this->query_where .= " AND $table.`customer_id` NOT IN ($customer_not_in)";
280
-		}
281
-
282
-		if ( ! empty( $qv['product_in'] ) ) {
283
-			$product_in         = implode( ',', wp_parse_id_list( $qv['product_in'] ) );
284
-			$this->query_where .= " AND $table.`product_id` IN ($product_in)";
285
-		} elseif ( ! empty( $qv['product_not_in'] ) ) {
286
-			$product_not_in     = implode( ',', wp_parse_id_list( $qv['product_not_in'] ) );
287
-			$this->query_where .= " AND $table.`product_id` NOT IN ($product_not_in)";
288
-		}
289
-
290
-		if ( ! empty( $qv['invoice_in'] ) ) {
291
-			$invoice_in         = implode( ',', wp_parse_id_list( $qv['invoice_in'] ) );
292
-			$this->query_where .= " AND $table.`parent_payment_id` IN ($invoice_in)";
293
-		} elseif ( ! empty( $qv['invoice_not_in'] ) ) {
294
-			$invoice_not_in     = implode( ',', wp_parse_id_list( $qv['invoice_not_in'] ) );
295
-			$this->query_where .= " AND $table.`parent_payment_id` NOT IN ($invoice_not_in)";
296
-		}
297
-
298
-		if ( ! empty( $qv['include'] ) ) {
299
-			$include            = implode( ',', wp_parse_id_list( $qv['include'] ) );
300
-			$this->query_where .= " AND $table.`id` IN ($include)";
301
-		} elseif ( ! empty( $qv['exclude'] ) ) {
302
-			$exclude            = implode( ',', wp_parse_id_list( $qv['exclude'] ) );
303
-			$this->query_where .= " AND $table.`id` NOT IN ($exclude)";
304
-		}
305
-
306
-		// Date queries are allowed for the subscription creation date.
307
-		if ( ! empty( $qv['date_created_query'] ) && is_array( $qv['date_created_query'] ) ) {
308
-			$date_created_query = new WP_Date_Query( $qv['date_created_query'], "$table.created" );
309
-			$this->query_where .= $date_created_query->get_sql();
310
-		}
311
-
312
-		// Date queries are also allowed for the subscription expiration date.
313
-		if ( ! empty( $qv['date_expires_query'] ) && is_array( $qv['date_expires_query'] ) ) {
314
-			$date_expires_query = new WP_Date_Query( $qv['date_expires_query'], "$table.expiration" );
315
-			$this->query_where .= $date_expires_query->get_sql();
316
-		}
317
-
318
-	}
319
-
320
-	/**
321
-	 * Prepares the query order.
322
-	 *
323
-	 * @since 1.0.19
324
-	 *
325
-	 * @param array $qv Query vars.
326
-	 * @param string $table Table name.
327
-	 */
328
-	protected function prepare_query_order( &$qv, $table ) {
329
-
330
-		// sorting.
331
-		$qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';
332
-		$order       = $this->parse_order( $qv['order'] );
333
-
334
-		// Default order is by 'id' (latest subscriptions).
335
-		if ( empty( $qv['orderby'] ) ) {
336
-			$qv['orderby'] = array( 'id' );
337
-		}
338
-
339
-		// 'orderby' values may be an array, comma- or space-separated list.
340
-		$ordersby      = array_filter( wpinv_parse_list(  $qv['orderby'] ) );
341
-
342
-		$orderby_array = array();
343
-		foreach ( $ordersby as $_key => $_value ) {
344
-
345
-			if ( is_int( $_key ) ) {
346
-				// Integer key means this is a flat array of 'orderby' fields.
347
-				$_orderby = $_value;
348
-				$_order   = $order;
349
-			} else {
350
-				// Non-integer key means that the key is the field and the value is ASC/DESC.
351
-				$_orderby = $_key;
352
-				$_order   = $_value;
353
-			}
354
-
355
-			$parsed = $this->parse_orderby( $_orderby, $table );
356
-
357
-			if ( $parsed ) {
358
-				$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
359
-			}
360
-
361
-		}
362
-
363
-		// If no valid clauses were found, order by id.
364
-		if ( empty( $orderby_array ) ) {
365
-			$orderby_array[] = "id $order";
366
-		}
367
-
368
-		$this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array );
369
-
370
-	}
371
-
372
-	/**
373
-	 * Execute the query, with the current variables.
374
-	 *
375
-	 * @since 1.0.19
376
-	 *
377
-	 * @global wpdb $wpdb WordPress database abstraction object.
378
-	 */
379
-	public function query() {
380
-		global $wpdb;
381
-
382
-		$qv =& $this->query_vars;
383
-
384
-		// Return a non-null value to bypass the default GetPaid subscriptions query and remember to set the
385
-		// total_subscriptions property.
386
-		$this->results = apply_filters_ref_array( 'getpaid_subscriptions_pre_query', array( null, &$this ) );
387
-
388
-		if ( null === $this->results ) {
389
-			$this->request = "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit";
390
-
391
-			if ( ( is_array( $qv['fields'] ) && 1 != count( $qv['fields'] ) ) || 'all' == $qv['fields'] ) {
392
-				$this->results = $wpdb->get_results( $this->request );
393
-			} else {
394
-				$this->results = $wpdb->get_col( $this->request );
395
-			}
396
-
397
-			if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
398
-				$found_subscriptions_query = apply_filters( 'getpaid_found_subscriptions_query', 'SELECT FOUND_ROWS()', $this );
399
-				$this->total_subscriptions   = (int) $wpdb->get_var( $found_subscriptions_query );
400
-			}
401
-		}
402
-
403
-		if ( 'all' == $qv['fields'] ) {
404
-			foreach ( $this->results as $key => $subscription ) {
405
-				wp_cache_set( $subscription->id, $subscription, 'getpaid_subscriptions' );
406
-				wp_cache_set( $subscription->profile_id, $subscription->id, 'getpaid_subscription_profile_ids_to_subscription_ids' );
407
-				wp_cache_set( $subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids' );
408
-				wp_cache_set( $subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids' );
409
-				$this->results[ $key ] = new WPInv_Subscription( $subscription );
410
-			}
411
-		}
412
-
413
-	}
414
-
415
-	/**
416
-	 * Retrieve query variable.
417
-	 *
418
-	 * @since 1.0.19
419
-	 *
420
-	 * @param string $query_var Query variable key.
421
-	 * @return mixed
422
-	 */
423
-	public function get( $query_var ) {
424
-		if ( isset( $this->query_vars[ $query_var ] ) ) {
425
-			return $this->query_vars[ $query_var ];
426
-		}
427
-
428
-		return null;
429
-	}
430
-
431
-	/**
432
-	 * Set query variable.
433
-	 *
434
-	 * @since 1.0.19
435
-	 *
436
-	 * @param string $query_var Query variable key.
437
-	 * @param mixed $value Query variable value.
438
-	 */
439
-	public function set( $query_var, $value ) {
440
-		$this->query_vars[ $query_var ] = $value;
441
-	}
442
-
443
-	/**
444
-	 * Return the list of subscriptions.
445
-	 *
446
-	 * @since 1.0.19
447
-	 *
448
-	 * @return WPInv_Subscription[]|array Found subscriptions.
449
-	 */
450
-	public function get_results() {
451
-		return $this->results;
452
-	}
453
-
454
-	/**
455
-	 * Return the total number of subscriptions for the current query.
456
-	 *
457
-	 * @since 1.0.19
458
-	 *
459
-	 * @return int Number of total subscriptions.
460
-	 */
461
-	public function get_total() {
462
-		return $this->total_subscriptions;
463
-	}
464
-
465
-	/**
466
-	 * Parse and sanitize 'orderby' keys passed to the subscriptions query.
467
-	 *
468
-	 * @since 1.0.19
469
-	 *
470
-	 * @param string $orderby Alias for the field to order by.
471
-	 *  @param string $table The current table.
472
-	 * @return string Value to use in the ORDER clause, if `$orderby` is valid.
473
-	 */
474
-	protected function parse_orderby( $orderby, $table ) {
475
-
476
-		$_orderby = '';
477
-		if ( in_array( $orderby, array( 'customer_id', 'frequency', 'period', 'initial_amount', 'recurring_amount', 'bill_times', 'transaction_id', 'parent_payment_id', 'product_id', 'created', 'expiration', 'trial_period', 'status', 'profile_id' ) ) ) {
478
-			$_orderby = "$table.`$orderby`";
479
-		} elseif ( 'id' === strtolower( $orderby ) ) {
480
-			$_orderby = "$table.id";
481
-		} elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) {
482
-			$include     = wp_parse_id_list( $this->query_vars['include'] );
483
-			$include_sql = implode( ',', $include );
484
-			$_orderby    = "FIELD( $table.id, $include_sql )";
485
-		}
486
-
487
-		return $_orderby;
488
-	}
489
-
490
-	/**
491
-	 * Parse an 'order' query variable and cast it to ASC or DESC as necessary.
492
-	 *
493
-	 * @since 1.0.19
494
-	 *
495
-	 * @param string $order The 'order' query variable.
496
-	 * @return string The sanitized 'order' query variable.
497
-	 */
498
-	protected function parse_order( $order ) {
499
-		if ( ! is_string( $order ) || empty( $order ) ) {
500
-			return 'DESC';
501
-		}
502
-
503
-		if ( 'ASC' === strtoupper( $order ) ) {
504
-			return 'ASC';
505
-		} else {
506
-			return 'DESC';
507
-		}
508
-	}
19
+    /**
20
+     * Query vars, after parsing
21
+     *
22
+     * @since 1.0.19
23
+     * @var array
24
+     */
25
+    public $query_vars = array();
26
+
27
+    /**
28
+     * List of found subscriptions.
29
+     *
30
+     * @since 1.0.19
31
+     * @var array
32
+     */
33
+    private $results;
34
+
35
+    /**
36
+     * Total number of found subscriptions for the current query
37
+     *
38
+     * @since 1.0.19
39
+     * @var int
40
+     */
41
+    private $total_subscriptions = 0;
42
+
43
+    /**
44
+     * The SQL query used to fetch matching subscriptions.
45
+     *
46
+     * @since 1.0.19
47
+     * @var string
48
+     */
49
+    public $request;
50
+
51
+    // SQL clauses
52
+
53
+    /**
54
+     * Contains the 'FIELDS' sql clause
55
+     *
56
+     * @since 1.0.19
57
+     * @var string
58
+     */
59
+    public $query_fields;
60
+
61
+    /**
62
+     * Contains the 'FROM' sql clause
63
+     *
64
+     * @since 1.0.19
65
+     * @var string
66
+     */
67
+    public $query_from;
68
+
69
+    /**
70
+     * Contains the 'WHERE' sql clause
71
+     *
72
+     * @since 1.0.19
73
+     * @var string
74
+     */
75
+    public $query_where;
76
+
77
+    /**
78
+     * Contains the 'ORDER BY' sql clause
79
+     *
80
+     * @since 1.0.19
81
+     * @var string
82
+     */
83
+    public $query_orderby;
84
+
85
+    /**
86
+     * Contains the 'LIMIT' sql clause
87
+     *
88
+     * @since 1.0.19
89
+     * @var string
90
+     */
91
+    public $query_limit;
92
+
93
+    /**
94
+     * Class constructor.
95
+     *
96
+     * @since 1.0.19
97
+     *
98
+     * @param null|string|array $query Optional. The query variables.
99
+     */
100
+    public function __construct( $query = null ) {
101
+        if ( ! is_null( $query ) ) {
102
+            $this->prepare_query( $query );
103
+            $this->query();
104
+        }
105
+    }
106
+
107
+    /**
108
+     * Fills in missing query variables with default values.
109
+     *
110
+     * @since 1.0.19
111
+     *
112
+     * @param  string|array $args Query vars, as passed to `GetPaid_Subscriptions_Query`.
113
+     * @return array Complete query variables with undefined ones filled in with defaults.
114
+     */
115
+    public static function fill_query_vars( $args ) {
116
+        $defaults = array(
117
+            'status'            => 'all',
118
+            'customer_in'       => array(),
119
+            'customer_not_in'   => array(),
120
+            'product_in'        => array(),
121
+            'product_not_in'    => array(),
122
+            'include'           => array(),
123
+            'exclude'           => array(),
124
+            'orderby'           => 'id',
125
+            'order'             => 'DESC',
126
+            'offset'            => '',
127
+            'number'            => 10,
128
+            'paged'             => 1,
129
+            'count_total'       => true,
130
+            'fields'            => 'all',
131
+        );
132
+
133
+        return wp_parse_args( $args, $defaults );
134
+    }
135
+
136
+    /**
137
+     * Prepare the query variables.
138
+     *
139
+     * @since 1.0.19
140
+     *
141
+     * @global wpdb $wpdb WordPress database abstraction object.
142
+     *
143
+     * @param string|array $query {
144
+     *     Optional. Array or string of Query parameters.
145
+     *
146
+     *     @type string|array $status              The subscription status to filter by. Can either be a single status or an array of statuses.
147
+     *                                             Default is all.
148
+     *     @type int[]        $customer_in         An array of customer ids to filter by.
149
+     *     @type int[]        $customer_not_in     An array of customer ids whose subscriptions should be excluded.
150
+     *     @type int[]        $invoice_in          An array of invoice ids to filter by.
151
+     *     @type int[]        $invoice_not_in      An array of invoice ids whose subscriptions should be excluded.
152
+     *     @type int[]        $product_in          An array of product ids to filter by.
153
+     *     @type int[]        $product_not_in      An array of product ids whose subscriptions should be excluded.
154
+     *     @type array        $date_created_query  A WP_Date_Query compatible array use to filter subscriptions by their date of creation.
155
+     *     @type array        $date_expires_query  A WP_Date_Query compatible array use to filter subscriptions by their expiration date.
156
+     *     @type array        $include             An array of subscription IDs to include. Default empty array.
157
+     *     @type array        $exclude             An array of subscription IDs to exclude. Default empty array.
158
+     *     @type string|array $orderby             Field(s) to sort the retrieved subscription by. May be a single value,
159
+     *                                             an array of values, or a multi-dimensional array with fields as
160
+     *                                             keys and orders ('ASC' or 'DESC') as values. Accepted values are
161
+     *                                             'id', 'customer_id', 'frequency', 'period', 'initial_amount,
162
+     *                                             'recurring_amount', 'bill_times', 'parent_payment_id', 'created', 'expiration'
163
+     *                                             'transaction_id', 'product_id', 'trial_period', 'include', 'status', 'profile_id'. Default array( 'id' ).
164
+     *     @type string       $order               Designates ascending or descending order of subscriptions. Order values
165
+     *                                             passed as part of an `$orderby` array take precedence over this
166
+     *                                             parameter. Accepts 'ASC', 'DESC'. Default 'DESC'.
167
+     *     @type int          $offset              Number of subscriptions to offset in retrieved results. Can be used in
168
+     *                                             conjunction with pagination. Default 0.
169
+     *     @type int          $number              Number of subscriptions to limit the query for. Can be used in
170
+     *                                             conjunction with pagination. Value -1 (all) is supported, but
171
+     *                                             should be used with caution on larger sites.
172
+     *                                             Default 10.
173
+     *     @type int          $paged               When used with number, defines the page of results to return.
174
+     *                                             Default 1.
175
+     *     @type bool         $count_total         Whether to count the total number of subscriptions found. If pagination
176
+     *                                             is not needed, setting this to false can improve performance.
177
+     *                                             Default true.
178
+     *     @type string|array $fields              Which fields to return. Single or all fields (string), or array
179
+     *                                             of fields. Accepts 'id', 'customer_id', 'frequency', 'period', 'initial_amount,
180
+     *                                             'recurring_amount', 'bill_times', 'parent_payment_id', 'created', 'expiration'
181
+     *                                             'transaction_id', 'product_id', 'trial_period', 'status', 'profile_id'.
182
+     *                                             Use 'all' for all fields. Default 'all'.
183
+     * }
184
+     */
185
+    public function prepare_query( $query = array() ) {
186
+        global $wpdb;
187
+
188
+        if ( empty( $this->query_vars ) || ! empty( $query ) ) {
189
+            $this->query_limit = null;
190
+            $this->query_vars  = $this->fill_query_vars( $query );
191
+        }
192
+
193
+        if ( ! empty( $this->query_vars['fields'] ) && 'all' !== $this->query_vars['fields'] ) {
194
+            $this->query_vars['fields'] = wpinv_parse_list( $this->query_vars['fields'] );
195
+        }
196
+
197
+        do_action( 'getpaid_pre_get_subscriptions', array( &$this ) );
198
+
199
+        // Ensure that query vars are filled after 'getpaid_pre_get_subscriptions'.
200
+        $qv                =& $this->query_vars;
201
+        $qv                = $this->fill_query_vars( $qv );
202
+        $table             = $wpdb->prefix . 'wpinv_subscriptions';
203
+        $this->query_from  = "FROM $table";
204
+
205
+        // Prepare query fields.
206
+        $this->prepare_query_fields( $qv, $table );
207
+
208
+        // Prepare query where.
209
+        $this->prepare_query_where( $qv, $table );
210
+
211
+        // Prepare query order.
212
+        $this->prepare_query_order( $qv, $table );
213
+
214
+        // limit
215
+        if ( isset( $qv['number'] ) && $qv['number'] > 0 ) {
216
+            if ( $qv['offset'] ) {
217
+                $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] );
218
+            } else {
219
+                $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] );
220
+            }
221
+        }
222
+
223
+        do_action_ref_array( 'getpaid_after_subscriptions_query', array( &$this ) );
224
+    }
225
+
226
+    /**
227
+     * Prepares the query fields.
228
+     *
229
+     * @since 1.0.19
230
+     *
231
+     * @param array $qv Query vars.
232
+     * @param string $table Table name.
233
+     */
234
+    protected function prepare_query_fields( &$qv, $table ) {
235
+
236
+        if ( is_array( $qv['fields'] ) ) {
237
+            $qv['fields'] = array_unique( $qv['fields'] );
238
+
239
+            $query_fields = array();
240
+            foreach ( $qv['fields'] as $field ) {
241
+                $field          = sanitize_key( $field );
242
+                $query_fields[] = "$table.`$field`";
243
+            }
244
+            $this->query_fields = implode( ',', $query_fields );
245
+        } else {
246
+            $this->query_fields = "$table.*";
247
+        }
248
+
249
+        if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
250
+            $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;
251
+        }
252
+
253
+    }
254
+
255
+    /**
256
+     * Prepares the query where.
257
+     *
258
+     * @since 1.0.19
259
+     *
260
+     * @param array $qv Query vars.
261
+     * @param string $table Table name.
262
+     */
263
+    protected function prepare_query_where( &$qv, $table ) {
264
+        global $wpdb;
265
+        $this->query_where = 'WHERE 1=1';
266
+
267
+        // Status.
268
+        if ( 'all' !== $qv['status'] ) {
269
+            $statuses           = wpinv_clean( wpinv_parse_list( $qv['status'] ) );
270
+            $prepared_statuses  = join( ',', array_fill( 0, count( $statuses ), '%s' ) );
271
+            $this->query_where .= $wpdb->prepare( " AND $table.`status` IN ( $prepared_statuses )", $statuses );
272
+        }
273
+
274
+        if ( ! empty( $qv['customer_in'] ) ) {
275
+            $customer_in        = implode( ',', wp_parse_id_list( $qv['customer_in'] ) );
276
+            $this->query_where .= " AND $table.`customer_id` IN ($customer_in)";
277
+        } elseif ( ! empty( $qv['customer_not_in'] ) ) {
278
+            $customer_not_in    = implode( ',', wp_parse_id_list( $qv['customer_not_in'] ) );
279
+            $this->query_where .= " AND $table.`customer_id` NOT IN ($customer_not_in)";
280
+        }
281
+
282
+        if ( ! empty( $qv['product_in'] ) ) {
283
+            $product_in         = implode( ',', wp_parse_id_list( $qv['product_in'] ) );
284
+            $this->query_where .= " AND $table.`product_id` IN ($product_in)";
285
+        } elseif ( ! empty( $qv['product_not_in'] ) ) {
286
+            $product_not_in     = implode( ',', wp_parse_id_list( $qv['product_not_in'] ) );
287
+            $this->query_where .= " AND $table.`product_id` NOT IN ($product_not_in)";
288
+        }
289
+
290
+        if ( ! empty( $qv['invoice_in'] ) ) {
291
+            $invoice_in         = implode( ',', wp_parse_id_list( $qv['invoice_in'] ) );
292
+            $this->query_where .= " AND $table.`parent_payment_id` IN ($invoice_in)";
293
+        } elseif ( ! empty( $qv['invoice_not_in'] ) ) {
294
+            $invoice_not_in     = implode( ',', wp_parse_id_list( $qv['invoice_not_in'] ) );
295
+            $this->query_where .= " AND $table.`parent_payment_id` NOT IN ($invoice_not_in)";
296
+        }
297
+
298
+        if ( ! empty( $qv['include'] ) ) {
299
+            $include            = implode( ',', wp_parse_id_list( $qv['include'] ) );
300
+            $this->query_where .= " AND $table.`id` IN ($include)";
301
+        } elseif ( ! empty( $qv['exclude'] ) ) {
302
+            $exclude            = implode( ',', wp_parse_id_list( $qv['exclude'] ) );
303
+            $this->query_where .= " AND $table.`id` NOT IN ($exclude)";
304
+        }
305
+
306
+        // Date queries are allowed for the subscription creation date.
307
+        if ( ! empty( $qv['date_created_query'] ) && is_array( $qv['date_created_query'] ) ) {
308
+            $date_created_query = new WP_Date_Query( $qv['date_created_query'], "$table.created" );
309
+            $this->query_where .= $date_created_query->get_sql();
310
+        }
311
+
312
+        // Date queries are also allowed for the subscription expiration date.
313
+        if ( ! empty( $qv['date_expires_query'] ) && is_array( $qv['date_expires_query'] ) ) {
314
+            $date_expires_query = new WP_Date_Query( $qv['date_expires_query'], "$table.expiration" );
315
+            $this->query_where .= $date_expires_query->get_sql();
316
+        }
317
+
318
+    }
319
+
320
+    /**
321
+     * Prepares the query order.
322
+     *
323
+     * @since 1.0.19
324
+     *
325
+     * @param array $qv Query vars.
326
+     * @param string $table Table name.
327
+     */
328
+    protected function prepare_query_order( &$qv, $table ) {
329
+
330
+        // sorting.
331
+        $qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';
332
+        $order       = $this->parse_order( $qv['order'] );
333
+
334
+        // Default order is by 'id' (latest subscriptions).
335
+        if ( empty( $qv['orderby'] ) ) {
336
+            $qv['orderby'] = array( 'id' );
337
+        }
338
+
339
+        // 'orderby' values may be an array, comma- or space-separated list.
340
+        $ordersby      = array_filter( wpinv_parse_list(  $qv['orderby'] ) );
341
+
342
+        $orderby_array = array();
343
+        foreach ( $ordersby as $_key => $_value ) {
344
+
345
+            if ( is_int( $_key ) ) {
346
+                // Integer key means this is a flat array of 'orderby' fields.
347
+                $_orderby = $_value;
348
+                $_order   = $order;
349
+            } else {
350
+                // Non-integer key means that the key is the field and the value is ASC/DESC.
351
+                $_orderby = $_key;
352
+                $_order   = $_value;
353
+            }
354
+
355
+            $parsed = $this->parse_orderby( $_orderby, $table );
356
+
357
+            if ( $parsed ) {
358
+                $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
359
+            }
360
+
361
+        }
362
+
363
+        // If no valid clauses were found, order by id.
364
+        if ( empty( $orderby_array ) ) {
365
+            $orderby_array[] = "id $order";
366
+        }
367
+
368
+        $this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array );
369
+
370
+    }
371
+
372
+    /**
373
+     * Execute the query, with the current variables.
374
+     *
375
+     * @since 1.0.19
376
+     *
377
+     * @global wpdb $wpdb WordPress database abstraction object.
378
+     */
379
+    public function query() {
380
+        global $wpdb;
381
+
382
+        $qv =& $this->query_vars;
383
+
384
+        // Return a non-null value to bypass the default GetPaid subscriptions query and remember to set the
385
+        // total_subscriptions property.
386
+        $this->results = apply_filters_ref_array( 'getpaid_subscriptions_pre_query', array( null, &$this ) );
387
+
388
+        if ( null === $this->results ) {
389
+            $this->request = "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit";
390
+
391
+            if ( ( is_array( $qv['fields'] ) && 1 != count( $qv['fields'] ) ) || 'all' == $qv['fields'] ) {
392
+                $this->results = $wpdb->get_results( $this->request );
393
+            } else {
394
+                $this->results = $wpdb->get_col( $this->request );
395
+            }
396
+
397
+            if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
398
+                $found_subscriptions_query = apply_filters( 'getpaid_found_subscriptions_query', 'SELECT FOUND_ROWS()', $this );
399
+                $this->total_subscriptions   = (int) $wpdb->get_var( $found_subscriptions_query );
400
+            }
401
+        }
402
+
403
+        if ( 'all' == $qv['fields'] ) {
404
+            foreach ( $this->results as $key => $subscription ) {
405
+                wp_cache_set( $subscription->id, $subscription, 'getpaid_subscriptions' );
406
+                wp_cache_set( $subscription->profile_id, $subscription->id, 'getpaid_subscription_profile_ids_to_subscription_ids' );
407
+                wp_cache_set( $subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids' );
408
+                wp_cache_set( $subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids' );
409
+                $this->results[ $key ] = new WPInv_Subscription( $subscription );
410
+            }
411
+        }
412
+
413
+    }
414
+
415
+    /**
416
+     * Retrieve query variable.
417
+     *
418
+     * @since 1.0.19
419
+     *
420
+     * @param string $query_var Query variable key.
421
+     * @return mixed
422
+     */
423
+    public function get( $query_var ) {
424
+        if ( isset( $this->query_vars[ $query_var ] ) ) {
425
+            return $this->query_vars[ $query_var ];
426
+        }
427
+
428
+        return null;
429
+    }
430
+
431
+    /**
432
+     * Set query variable.
433
+     *
434
+     * @since 1.0.19
435
+     *
436
+     * @param string $query_var Query variable key.
437
+     * @param mixed $value Query variable value.
438
+     */
439
+    public function set( $query_var, $value ) {
440
+        $this->query_vars[ $query_var ] = $value;
441
+    }
442
+
443
+    /**
444
+     * Return the list of subscriptions.
445
+     *
446
+     * @since 1.0.19
447
+     *
448
+     * @return WPInv_Subscription[]|array Found subscriptions.
449
+     */
450
+    public function get_results() {
451
+        return $this->results;
452
+    }
453
+
454
+    /**
455
+     * Return the total number of subscriptions for the current query.
456
+     *
457
+     * @since 1.0.19
458
+     *
459
+     * @return int Number of total subscriptions.
460
+     */
461
+    public function get_total() {
462
+        return $this->total_subscriptions;
463
+    }
464
+
465
+    /**
466
+     * Parse and sanitize 'orderby' keys passed to the subscriptions query.
467
+     *
468
+     * @since 1.0.19
469
+     *
470
+     * @param string $orderby Alias for the field to order by.
471
+     *  @param string $table The current table.
472
+     * @return string Value to use in the ORDER clause, if `$orderby` is valid.
473
+     */
474
+    protected function parse_orderby( $orderby, $table ) {
475
+
476
+        $_orderby = '';
477
+        if ( in_array( $orderby, array( 'customer_id', 'frequency', 'period', 'initial_amount', 'recurring_amount', 'bill_times', 'transaction_id', 'parent_payment_id', 'product_id', 'created', 'expiration', 'trial_period', 'status', 'profile_id' ) ) ) {
478
+            $_orderby = "$table.`$orderby`";
479
+        } elseif ( 'id' === strtolower( $orderby ) ) {
480
+            $_orderby = "$table.id";
481
+        } elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) {
482
+            $include     = wp_parse_id_list( $this->query_vars['include'] );
483
+            $include_sql = implode( ',', $include );
484
+            $_orderby    = "FIELD( $table.id, $include_sql )";
485
+        }
486
+
487
+        return $_orderby;
488
+    }
489
+
490
+    /**
491
+     * Parse an 'order' query variable and cast it to ASC or DESC as necessary.
492
+     *
493
+     * @since 1.0.19
494
+     *
495
+     * @param string $order The 'order' query variable.
496
+     * @return string The sanitized 'order' query variable.
497
+     */
498
+    protected function parse_order( $order ) {
499
+        if ( ! is_string( $order ) || empty( $order ) ) {
500
+            return 'DESC';
501
+        }
502
+
503
+        if ( 'ASC' === strtoupper( $order ) ) {
504
+            return 'ASC';
505
+        } else {
506
+            return 'DESC';
507
+        }
508
+    }
509 509
 
510 510
 }
Please login to merge, or discard this patch.
Spacing   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -97,9 +97,9 @@  discard block
 block discarded – undo
97 97
 	 *
98 98
 	 * @param null|string|array $query Optional. The query variables.
99 99
 	 */
100
-	public function __construct( $query = null ) {
101
-		if ( ! is_null( $query ) ) {
102
-			$this->prepare_query( $query );
100
+	public function __construct($query = null) {
101
+		if (!is_null($query)) {
102
+			$this->prepare_query($query);
103 103
 			$this->query();
104 104
 		}
105 105
 	}
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
 	 * @param  string|array $args Query vars, as passed to `GetPaid_Subscriptions_Query`.
113 113
 	 * @return array Complete query variables with undefined ones filled in with defaults.
114 114
 	 */
115
-	public static function fill_query_vars( $args ) {
115
+	public static function fill_query_vars($args) {
116 116
 		$defaults = array(
117 117
 			'status'            => 'all',
118 118
 			'customer_in'       => array(),
@@ -130,7 +130,7 @@  discard block
 block discarded – undo
130 130
 			'fields'            => 'all',
131 131
 		);
132 132
 
133
-		return wp_parse_args( $args, $defaults );
133
+		return wp_parse_args($args, $defaults);
134 134
 	}
135 135
 
136 136
 	/**
@@ -182,45 +182,45 @@  discard block
 block discarded – undo
182 182
 	 *                                             Use 'all' for all fields. Default 'all'.
183 183
 	 * }
184 184
 	 */
185
-	public function prepare_query( $query = array() ) {
185
+	public function prepare_query($query = array()) {
186 186
 		global $wpdb;
187 187
 
188
-		if ( empty( $this->query_vars ) || ! empty( $query ) ) {
188
+		if (empty($this->query_vars) || !empty($query)) {
189 189
 			$this->query_limit = null;
190
-			$this->query_vars  = $this->fill_query_vars( $query );
190
+			$this->query_vars  = $this->fill_query_vars($query);
191 191
 		}
192 192
 
193
-		if ( ! empty( $this->query_vars['fields'] ) && 'all' !== $this->query_vars['fields'] ) {
194
-			$this->query_vars['fields'] = wpinv_parse_list( $this->query_vars['fields'] );
193
+		if (!empty($this->query_vars['fields']) && 'all' !== $this->query_vars['fields']) {
194
+			$this->query_vars['fields'] = wpinv_parse_list($this->query_vars['fields']);
195 195
 		}
196 196
 
197
-		do_action( 'getpaid_pre_get_subscriptions', array( &$this ) );
197
+		do_action('getpaid_pre_get_subscriptions', array(&$this));
198 198
 
199 199
 		// Ensure that query vars are filled after 'getpaid_pre_get_subscriptions'.
200
-		$qv                =& $this->query_vars;
201
-		$qv                = $this->fill_query_vars( $qv );
200
+		$qv                = & $this->query_vars;
201
+		$qv                = $this->fill_query_vars($qv);
202 202
 		$table             = $wpdb->prefix . 'wpinv_subscriptions';
203 203
 		$this->query_from  = "FROM $table";
204 204
 
205 205
 		// Prepare query fields.
206
-		$this->prepare_query_fields( $qv, $table );
206
+		$this->prepare_query_fields($qv, $table);
207 207
 
208 208
 		// Prepare query where.
209
-		$this->prepare_query_where( $qv, $table );
209
+		$this->prepare_query_where($qv, $table);
210 210
 
211 211
 		// Prepare query order.
212
-		$this->prepare_query_order( $qv, $table );
212
+		$this->prepare_query_order($qv, $table);
213 213
 
214 214
 		// limit
215
-		if ( isset( $qv['number'] ) && $qv['number'] > 0 ) {
216
-			if ( $qv['offset'] ) {
217
-				$this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] );
215
+		if (isset($qv['number']) && $qv['number'] > 0) {
216
+			if ($qv['offset']) {
217
+				$this->query_limit = $wpdb->prepare('LIMIT %d, %d', $qv['offset'], $qv['number']);
218 218
 			} else {
219
-				$this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] );
219
+				$this->query_limit = $wpdb->prepare('LIMIT %d, %d', $qv['number'] * ($qv['paged'] - 1), $qv['number']);
220 220
 			}
221 221
 		}
222 222
 
223
-		do_action_ref_array( 'getpaid_after_subscriptions_query', array( &$this ) );
223
+		do_action_ref_array('getpaid_after_subscriptions_query', array(&$this));
224 224
 	}
225 225
 
226 226
 	/**
@@ -231,22 +231,22 @@  discard block
 block discarded – undo
231 231
 	 * @param array $qv Query vars.
232 232
 	 * @param string $table Table name.
233 233
 	 */
234
-	protected function prepare_query_fields( &$qv, $table ) {
234
+	protected function prepare_query_fields(&$qv, $table) {
235 235
 
236
-		if ( is_array( $qv['fields'] ) ) {
237
-			$qv['fields'] = array_unique( $qv['fields'] );
236
+		if (is_array($qv['fields'])) {
237
+			$qv['fields'] = array_unique($qv['fields']);
238 238
 
239 239
 			$query_fields = array();
240
-			foreach ( $qv['fields'] as $field ) {
241
-				$field          = sanitize_key( $field );
240
+			foreach ($qv['fields'] as $field) {
241
+				$field          = sanitize_key($field);
242 242
 				$query_fields[] = "$table.`$field`";
243 243
 			}
244
-			$this->query_fields = implode( ',', $query_fields );
244
+			$this->query_fields = implode(',', $query_fields);
245 245
 		} else {
246 246
 			$this->query_fields = "$table.*";
247 247
 		}
248 248
 
249
-		if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
249
+		if (isset($qv['count_total']) && $qv['count_total']) {
250 250
 			$this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;
251 251
 		}
252 252
 
@@ -260,58 +260,58 @@  discard block
 block discarded – undo
260 260
 	 * @param array $qv Query vars.
261 261
 	 * @param string $table Table name.
262 262
 	 */
263
-	protected function prepare_query_where( &$qv, $table ) {
263
+	protected function prepare_query_where(&$qv, $table) {
264 264
 		global $wpdb;
265 265
 		$this->query_where = 'WHERE 1=1';
266 266
 
267 267
 		// Status.
268
-		if ( 'all' !== $qv['status'] ) {
269
-			$statuses           = wpinv_clean( wpinv_parse_list( $qv['status'] ) );
270
-			$prepared_statuses  = join( ',', array_fill( 0, count( $statuses ), '%s' ) );
271
-			$this->query_where .= $wpdb->prepare( " AND $table.`status` IN ( $prepared_statuses )", $statuses );
268
+		if ('all' !== $qv['status']) {
269
+			$statuses           = wpinv_clean(wpinv_parse_list($qv['status']));
270
+			$prepared_statuses  = join(',', array_fill(0, count($statuses), '%s'));
271
+			$this->query_where .= $wpdb->prepare(" AND $table.`status` IN ( $prepared_statuses )", $statuses);
272 272
 		}
273 273
 
274
-		if ( ! empty( $qv['customer_in'] ) ) {
275
-			$customer_in        = implode( ',', wp_parse_id_list( $qv['customer_in'] ) );
274
+		if (!empty($qv['customer_in'])) {
275
+			$customer_in        = implode(',', wp_parse_id_list($qv['customer_in']));
276 276
 			$this->query_where .= " AND $table.`customer_id` IN ($customer_in)";
277
-		} elseif ( ! empty( $qv['customer_not_in'] ) ) {
278
-			$customer_not_in    = implode( ',', wp_parse_id_list( $qv['customer_not_in'] ) );
277
+		} elseif (!empty($qv['customer_not_in'])) {
278
+			$customer_not_in    = implode(',', wp_parse_id_list($qv['customer_not_in']));
279 279
 			$this->query_where .= " AND $table.`customer_id` NOT IN ($customer_not_in)";
280 280
 		}
281 281
 
282
-		if ( ! empty( $qv['product_in'] ) ) {
283
-			$product_in         = implode( ',', wp_parse_id_list( $qv['product_in'] ) );
282
+		if (!empty($qv['product_in'])) {
283
+			$product_in         = implode(',', wp_parse_id_list($qv['product_in']));
284 284
 			$this->query_where .= " AND $table.`product_id` IN ($product_in)";
285
-		} elseif ( ! empty( $qv['product_not_in'] ) ) {
286
-			$product_not_in     = implode( ',', wp_parse_id_list( $qv['product_not_in'] ) );
285
+		} elseif (!empty($qv['product_not_in'])) {
286
+			$product_not_in     = implode(',', wp_parse_id_list($qv['product_not_in']));
287 287
 			$this->query_where .= " AND $table.`product_id` NOT IN ($product_not_in)";
288 288
 		}
289 289
 
290
-		if ( ! empty( $qv['invoice_in'] ) ) {
291
-			$invoice_in         = implode( ',', wp_parse_id_list( $qv['invoice_in'] ) );
290
+		if (!empty($qv['invoice_in'])) {
291
+			$invoice_in         = implode(',', wp_parse_id_list($qv['invoice_in']));
292 292
 			$this->query_where .= " AND $table.`parent_payment_id` IN ($invoice_in)";
293
-		} elseif ( ! empty( $qv['invoice_not_in'] ) ) {
294
-			$invoice_not_in     = implode( ',', wp_parse_id_list( $qv['invoice_not_in'] ) );
293
+		} elseif (!empty($qv['invoice_not_in'])) {
294
+			$invoice_not_in     = implode(',', wp_parse_id_list($qv['invoice_not_in']));
295 295
 			$this->query_where .= " AND $table.`parent_payment_id` NOT IN ($invoice_not_in)";
296 296
 		}
297 297
 
298
-		if ( ! empty( $qv['include'] ) ) {
299
-			$include            = implode( ',', wp_parse_id_list( $qv['include'] ) );
298
+		if (!empty($qv['include'])) {
299
+			$include            = implode(',', wp_parse_id_list($qv['include']));
300 300
 			$this->query_where .= " AND $table.`id` IN ($include)";
301
-		} elseif ( ! empty( $qv['exclude'] ) ) {
302
-			$exclude            = implode( ',', wp_parse_id_list( $qv['exclude'] ) );
301
+		} elseif (!empty($qv['exclude'])) {
302
+			$exclude            = implode(',', wp_parse_id_list($qv['exclude']));
303 303
 			$this->query_where .= " AND $table.`id` NOT IN ($exclude)";
304 304
 		}
305 305
 
306 306
 		// Date queries are allowed for the subscription creation date.
307
-		if ( ! empty( $qv['date_created_query'] ) && is_array( $qv['date_created_query'] ) ) {
308
-			$date_created_query = new WP_Date_Query( $qv['date_created_query'], "$table.created" );
307
+		if (!empty($qv['date_created_query']) && is_array($qv['date_created_query'])) {
308
+			$date_created_query = new WP_Date_Query($qv['date_created_query'], "$table.created");
309 309
 			$this->query_where .= $date_created_query->get_sql();
310 310
 		}
311 311
 
312 312
 		// Date queries are also allowed for the subscription expiration date.
313
-		if ( ! empty( $qv['date_expires_query'] ) && is_array( $qv['date_expires_query'] ) ) {
314
-			$date_expires_query = new WP_Date_Query( $qv['date_expires_query'], "$table.expiration" );
313
+		if (!empty($qv['date_expires_query']) && is_array($qv['date_expires_query'])) {
314
+			$date_expires_query = new WP_Date_Query($qv['date_expires_query'], "$table.expiration");
315 315
 			$this->query_where .= $date_expires_query->get_sql();
316 316
 		}
317 317
 
@@ -325,24 +325,24 @@  discard block
 block discarded – undo
325 325
 	 * @param array $qv Query vars.
326 326
 	 * @param string $table Table name.
327 327
 	 */
328
-	protected function prepare_query_order( &$qv, $table ) {
328
+	protected function prepare_query_order(&$qv, $table) {
329 329
 
330 330
 		// sorting.
331
-		$qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';
332
-		$order       = $this->parse_order( $qv['order'] );
331
+		$qv['order'] = isset($qv['order']) ? strtoupper($qv['order']) : '';
332
+		$order       = $this->parse_order($qv['order']);
333 333
 
334 334
 		// Default order is by 'id' (latest subscriptions).
335
-		if ( empty( $qv['orderby'] ) ) {
336
-			$qv['orderby'] = array( 'id' );
335
+		if (empty($qv['orderby'])) {
336
+			$qv['orderby'] = array('id');
337 337
 		}
338 338
 
339 339
 		// 'orderby' values may be an array, comma- or space-separated list.
340
-		$ordersby      = array_filter( wpinv_parse_list(  $qv['orderby'] ) );
340
+		$ordersby      = array_filter(wpinv_parse_list($qv['orderby']));
341 341
 
342 342
 		$orderby_array = array();
343
-		foreach ( $ordersby as $_key => $_value ) {
343
+		foreach ($ordersby as $_key => $_value) {
344 344
 
345
-			if ( is_int( $_key ) ) {
345
+			if (is_int($_key)) {
346 346
 				// Integer key means this is a flat array of 'orderby' fields.
347 347
 				$_orderby = $_value;
348 348
 				$_order   = $order;
@@ -352,20 +352,20 @@  discard block
 block discarded – undo
352 352
 				$_order   = $_value;
353 353
 			}
354 354
 
355
-			$parsed = $this->parse_orderby( $_orderby, $table );
355
+			$parsed = $this->parse_orderby($_orderby, $table);
356 356
 
357
-			if ( $parsed ) {
358
-				$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
357
+			if ($parsed) {
358
+				$orderby_array[] = $parsed . ' ' . $this->parse_order($_order);
359 359
 			}
360 360
 
361 361
 		}
362 362
 
363 363
 		// If no valid clauses were found, order by id.
364
-		if ( empty( $orderby_array ) ) {
364
+		if (empty($orderby_array)) {
365 365
 			$orderby_array[] = "id $order";
366 366
 		}
367 367
 
368
-		$this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array );
368
+		$this->query_orderby = 'ORDER BY ' . implode(', ', $orderby_array);
369 369
 
370 370
 	}
371 371
 
@@ -379,34 +379,34 @@  discard block
 block discarded – undo
379 379
 	public function query() {
380 380
 		global $wpdb;
381 381
 
382
-		$qv =& $this->query_vars;
382
+		$qv = & $this->query_vars;
383 383
 
384 384
 		// Return a non-null value to bypass the default GetPaid subscriptions query and remember to set the
385 385
 		// total_subscriptions property.
386
-		$this->results = apply_filters_ref_array( 'getpaid_subscriptions_pre_query', array( null, &$this ) );
386
+		$this->results = apply_filters_ref_array('getpaid_subscriptions_pre_query', array(null, &$this));
387 387
 
388
-		if ( null === $this->results ) {
388
+		if (null === $this->results) {
389 389
 			$this->request = "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit";
390 390
 
391
-			if ( ( is_array( $qv['fields'] ) && 1 != count( $qv['fields'] ) ) || 'all' == $qv['fields'] ) {
392
-				$this->results = $wpdb->get_results( $this->request );
391
+			if ((is_array($qv['fields']) && 1 != count($qv['fields'])) || 'all' == $qv['fields']) {
392
+				$this->results = $wpdb->get_results($this->request);
393 393
 			} else {
394
-				$this->results = $wpdb->get_col( $this->request );
394
+				$this->results = $wpdb->get_col($this->request);
395 395
 			}
396 396
 
397
-			if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
398
-				$found_subscriptions_query = apply_filters( 'getpaid_found_subscriptions_query', 'SELECT FOUND_ROWS()', $this );
399
-				$this->total_subscriptions   = (int) $wpdb->get_var( $found_subscriptions_query );
397
+			if (isset($qv['count_total']) && $qv['count_total']) {
398
+				$found_subscriptions_query = apply_filters('getpaid_found_subscriptions_query', 'SELECT FOUND_ROWS()', $this);
399
+				$this->total_subscriptions = (int) $wpdb->get_var($found_subscriptions_query);
400 400
 			}
401 401
 		}
402 402
 
403
-		if ( 'all' == $qv['fields'] ) {
404
-			foreach ( $this->results as $key => $subscription ) {
405
-				wp_cache_set( $subscription->id, $subscription, 'getpaid_subscriptions' );
406
-				wp_cache_set( $subscription->profile_id, $subscription->id, 'getpaid_subscription_profile_ids_to_subscription_ids' );
407
-				wp_cache_set( $subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids' );
408
-				wp_cache_set( $subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids' );
409
-				$this->results[ $key ] = new WPInv_Subscription( $subscription );
403
+		if ('all' == $qv['fields']) {
404
+			foreach ($this->results as $key => $subscription) {
405
+				wp_cache_set($subscription->id, $subscription, 'getpaid_subscriptions');
406
+				wp_cache_set($subscription->profile_id, $subscription->id, 'getpaid_subscription_profile_ids_to_subscription_ids');
407
+				wp_cache_set($subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids');
408
+				wp_cache_set($subscription->transaction_id, $subscription->id, 'getpaid_subscription_transaction_ids_to_subscription_ids');
409
+				$this->results[$key] = new WPInv_Subscription($subscription);
410 410
 			}
411 411
 		}
412 412
 
@@ -420,9 +420,9 @@  discard block
 block discarded – undo
420 420
 	 * @param string $query_var Query variable key.
421 421
 	 * @return mixed
422 422
 	 */
423
-	public function get( $query_var ) {
424
-		if ( isset( $this->query_vars[ $query_var ] ) ) {
425
-			return $this->query_vars[ $query_var ];
423
+	public function get($query_var) {
424
+		if (isset($this->query_vars[$query_var])) {
425
+			return $this->query_vars[$query_var];
426 426
 		}
427 427
 
428 428
 		return null;
@@ -436,8 +436,8 @@  discard block
 block discarded – undo
436 436
 	 * @param string $query_var Query variable key.
437 437
 	 * @param mixed $value Query variable value.
438 438
 	 */
439
-	public function set( $query_var, $value ) {
440
-		$this->query_vars[ $query_var ] = $value;
439
+	public function set($query_var, $value) {
440
+		$this->query_vars[$query_var] = $value;
441 441
 	}
442 442
 
443 443
 	/**
@@ -471,16 +471,16 @@  discard block
 block discarded – undo
471 471
 	 *  @param string $table The current table.
472 472
 	 * @return string Value to use in the ORDER clause, if `$orderby` is valid.
473 473
 	 */
474
-	protected function parse_orderby( $orderby, $table ) {
474
+	protected function parse_orderby($orderby, $table) {
475 475
 
476 476
 		$_orderby = '';
477
-		if ( in_array( $orderby, array( 'customer_id', 'frequency', 'period', 'initial_amount', 'recurring_amount', 'bill_times', 'transaction_id', 'parent_payment_id', 'product_id', 'created', 'expiration', 'trial_period', 'status', 'profile_id' ) ) ) {
477
+		if (in_array($orderby, array('customer_id', 'frequency', 'period', 'initial_amount', 'recurring_amount', 'bill_times', 'transaction_id', 'parent_payment_id', 'product_id', 'created', 'expiration', 'trial_period', 'status', 'profile_id'))) {
478 478
 			$_orderby = "$table.`$orderby`";
479
-		} elseif ( 'id' === strtolower( $orderby ) ) {
479
+		} elseif ('id' === strtolower($orderby)) {
480 480
 			$_orderby = "$table.id";
481
-		} elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) {
482
-			$include     = wp_parse_id_list( $this->query_vars['include'] );
483
-			$include_sql = implode( ',', $include );
481
+		} elseif ('include' === $orderby && !empty($this->query_vars['include'])) {
482
+			$include     = wp_parse_id_list($this->query_vars['include']);
483
+			$include_sql = implode(',', $include);
484 484
 			$_orderby    = "FIELD( $table.id, $include_sql )";
485 485
 		}
486 486
 
@@ -495,12 +495,12 @@  discard block
 block discarded – undo
495 495
 	 * @param string $order The 'order' query variable.
496 496
 	 * @return string The sanitized 'order' query variable.
497 497
 	 */
498
-	protected function parse_order( $order ) {
499
-		if ( ! is_string( $order ) || empty( $order ) ) {
498
+	protected function parse_order($order) {
499
+		if (!is_string($order) || empty($order)) {
500 500
 			return 'DESC';
501 501
 		}
502 502
 
503
-		if ( 'ASC' === strtoupper( $order ) ) {
503
+		if ('ASC' === strtoupper($order)) {
504 504
 			return 'ASC';
505 505
 		} else {
506 506
 			return 'DESC';
Please login to merge, or discard this patch.
includes/class-getpaid-notification-email.php 2 patches
Indentation   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -13,36 +13,36 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Notification_Email {
14 14
 
15 15
     /**
16
-	 * Contains the type of this notification email.
17
-	 *
18
-	 * @var string
19
-	 */
16
+     * Contains the type of this notification email.
17
+     *
18
+     * @var string
19
+     */
20 20
     public $id;
21 21
 
22 22
     /**
23
-	 * Contains any object to use in filters.
24
-	 *
25
-	 * @var false|WPInv_Invoice|WPInv_Item|WPInv_Subscription
26
-	 */
23
+     * Contains any object to use in filters.
24
+     *
25
+     * @var false|WPInv_Invoice|WPInv_Item|WPInv_Subscription
26
+     */
27 27
     public $object;
28 28
 
29 29
     /**
30
-	 * Class constructor.
31
-	 *
30
+     * Class constructor.
31
+     *
32 32
      * @param string $id Email Type.
33 33
      * @param mixed $object Optional. Associated object.
34
-	 */
35
-	public function __construct( $id, $object = false ) {
34
+     */
35
+    public function __construct( $id, $object = false ) {
36 36
         $this->id     = $id;
37 37
         $this->object = $object;
38 38
     }
39 39
 
40 40
     /**
41
-	 * Retrieves an option
42
-	 *
41
+     * Retrieves an option
42
+     *
43 43
      * @return mixed
44
-	 */
45
-	public function get_option( $key ) {
44
+     */
45
+    public function get_option( $key ) {
46 46
 
47 47
         $key   = "email_{$this->id}_$key";
48 48
         $value = wpinv_get_option( $key, null );
@@ -60,80 +60,80 @@  discard block
 block discarded – undo
60 60
     }
61 61
 
62 62
     /**
63
-	 * Retrieves the email body.
64
-	 *
63
+     * Retrieves the email body.
64
+     *
65 65
      * @return string
66
-	 */
67
-	public function get_body() {
66
+     */
67
+    public function get_body() {
68 68
         $body = $this->get_option( 'body' );
69 69
         return apply_filters( 'getpaid_get_email_body', $body, $this->id, $this->object );
70 70
     }
71 71
 
72 72
     /**
73
-	 * Retrieves the email subject.
74
-	 *
73
+     * Retrieves the email subject.
74
+     *
75 75
      * @return string
76
-	 */
77
-	public function get_subject() {
76
+     */
77
+    public function get_subject() {
78 78
         $subject = $this->get_option( 'subject' );
79 79
         return apply_filters( 'getpaid_get_email_subject', $subject, $this->id, $this->object );
80 80
     }
81 81
 
82 82
     /**
83
-	 * Retrieves the email heading.
84
-	 *
83
+     * Retrieves the email heading.
84
+     *
85 85
      * @return string
86
-	 */
87
-	public function get_heading() {
86
+     */
87
+    public function get_heading() {
88 88
         $heading = $this->get_option( 'heading' );
89 89
         return apply_filters( 'getpaid_get_email_heading', $heading, $this->id, $this->object );
90 90
     }
91 91
 
92 92
     /**
93
-	 * Checks if an email is active.
94
-	 *
93
+     * Checks if an email is active.
94
+     *
95 95
      * @return bool
96
-	 */
97
-	public function is_active() {
96
+     */
97
+    public function is_active() {
98 98
         $is_active = ! empty( $this->get_option( 'active' ) );
99 99
         return apply_filters( 'getpaid_email_type_is_active', $is_active, $this->id, $this->object );
100 100
     }
101 101
 
102 102
     /**
103
-	 * Checks if the site's admin should receive email notifications.
104
-	 *
103
+     * Checks if the site's admin should receive email notifications.
104
+     *
105 105
      * @return bool
106
-	 */
107
-	public function include_admin_bcc() {
106
+     */
107
+    public function include_admin_bcc() {
108 108
         $include_admin_bcc = ! empty( $this->get_option( 'admin_bcc' ) );
109 109
         return apply_filters( 'getpaid_email_type_include_admin_bcc', $include_admin_bcc, $this->id, $this->object );
110 110
     }
111 111
 
112 112
     /**
113
-	 * Checks whether this email should be sent to the customer or admin.
114
-	 *
113
+     * Checks whether this email should be sent to the customer or admin.
114
+     *
115 115
      * @return bool
116
-	 */
117
-	public function is_admin_email() {
116
+     */
117
+    public function is_admin_email() {
118 118
         $is_admin_email = in_array( $this->id, array( 'new_invoice', 'cancelled_invoice', 'failed_invoice' ) );
119 119
         return apply_filters( 'getpaid_email_type_is_admin_email', $is_admin_email, $this->id, $this->object );
120 120
     }
121 121
 
122 122
     /**
123
-	 * Returns email attachments.
124
-	 *
123
+     * Returns email attachments.
124
+     *
125 125
      * @return array
126
-	 */
127
-	public function get_attachments() {
126
+     */
127
+    public function get_attachments() {
128 128
         return apply_filters( 'getpaid_get_email_attachments', array(), $this->id, $this->object );
129 129
     }
130 130
 
131 131
     /**
132
-	 * Returns an array of merge tags.
133
-	 *
132
+     * Returns an array of merge tags.
133
+     *
134 134
      * @return array
135
-	 */
136
-	public function get_merge_tags() {
135
+     */
136
+    public function get_merge_tags() {
137 137
 
138 138
         $merge_tags = array(
139 139
             '{site_title}' => wpinv_get_blogname(),
@@ -144,13 +144,13 @@  discard block
 block discarded – undo
144 144
     }
145 145
 
146 146
     /**
147
-	 * Adds merge tags to a text.
148
-	 *
147
+     * Adds merge tags to a text.
148
+     *
149 149
      * @param string string $text
150 150
      * @param array $merge_tags
151 151
      * @return string
152
-	 */
153
-	public function add_merge_tags( $text, $merge_tags = array() ) {
152
+     */
153
+    public function add_merge_tags( $text, $merge_tags = array() ) {
154 154
 
155 155
         foreach ( $merge_tags as $key => $value ) {
156 156
             $text = str_replace( $key, $value, $text );
@@ -160,13 +160,13 @@  discard block
 block discarded – undo
160 160
     }
161 161
 
162 162
     /**
163
-	 * Returns the email content
164
-	 *
163
+     * Returns the email content
164
+     *
165 165
      * @param array $merge_tags
166 166
      * @param array $extra_args Extra template args
167 167
      * @return string
168
-	 */
169
-	public function get_content( $merge_tags = array(), $extra_args = array() ) {
168
+     */
169
+    public function get_content( $merge_tags = array(), $extra_args = array() ) {
170 170
 
171 171
         $content = wpinv_get_template_html(
172 172
             "emails/wpinv-email-{$this->id}.php",
Please login to merge, or discard this patch.
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 
7
-defined( 'ABSPATH' ) || exit;
7
+defined('ABSPATH') || exit;
8 8
 
9 9
 /**
10 10
  * Represents a single email type.
@@ -32,7 +32,7 @@  discard block
 block discarded – undo
32 32
      * @param string $id Email Type.
33 33
      * @param mixed $object Optional. Associated object.
34 34
 	 */
35
-	public function __construct( $id, $object = false ) {
35
+	public function __construct($id, $object = false) {
36 36
         $this->id     = $id;
37 37
         $this->object = $object;
38 38
     }
@@ -42,18 +42,18 @@  discard block
 block discarded – undo
42 42
 	 *
43 43
      * @return mixed
44 44
 	 */
45
-	public function get_option( $key ) {
45
+	public function get_option($key) {
46 46
 
47 47
         $key   = "email_{$this->id}_$key";
48
-        $value = wpinv_get_option( $key, null );
49
-        if ( is_null( $value ) ) {
48
+        $value = wpinv_get_option($key, null);
49
+        if (is_null($value)) {
50 50
             $options = wpinv_get_emails();
51 51
 
52
-            if ( ! isset( $options[ $this->id ] ) || ! isset( $options[ $this->id ][ $key ] ) ) {
52
+            if (!isset($options[$this->id]) || !isset($options[$this->id][$key])) {
53 53
                 return '';
54 54
             }
55 55
 
56
-            $value = isset( $options[ $this->id ][ $key ]['std'] ) ? $options[ $this->id ][ $key ]['std'] : '';
56
+            $value = isset($options[$this->id][$key]['std']) ? $options[$this->id][$key]['std'] : '';
57 57
         }
58 58
 
59 59
         return $value;
@@ -65,8 +65,8 @@  discard block
 block discarded – undo
65 65
      * @return string
66 66
 	 */
67 67
 	public function get_body() {
68
-        $body = $this->get_option( 'body' );
69
-        return apply_filters( 'getpaid_get_email_body', $body, $this->id, $this->object );
68
+        $body = $this->get_option('body');
69
+        return apply_filters('getpaid_get_email_body', $body, $this->id, $this->object);
70 70
     }
71 71
 
72 72
     /**
@@ -75,8 +75,8 @@  discard block
 block discarded – undo
75 75
      * @return string
76 76
 	 */
77 77
 	public function get_subject() {
78
-        $subject = $this->get_option( 'subject' );
79
-        return apply_filters( 'getpaid_get_email_subject', $subject, $this->id, $this->object );
78
+        $subject = $this->get_option('subject');
79
+        return apply_filters('getpaid_get_email_subject', $subject, $this->id, $this->object);
80 80
     }
81 81
 
82 82
     /**
@@ -85,8 +85,8 @@  discard block
 block discarded – undo
85 85
      * @return string
86 86
 	 */
87 87
 	public function get_heading() {
88
-        $heading = $this->get_option( 'heading' );
89
-        return apply_filters( 'getpaid_get_email_heading', $heading, $this->id, $this->object );
88
+        $heading = $this->get_option('heading');
89
+        return apply_filters('getpaid_get_email_heading', $heading, $this->id, $this->object);
90 90
     }
91 91
 
92 92
     /**
@@ -95,8 +95,8 @@  discard block
 block discarded – undo
95 95
      * @return bool
96 96
 	 */
97 97
 	public function is_active() {
98
-        $is_active = ! empty( $this->get_option( 'active' ) );
99
-        return apply_filters( 'getpaid_email_type_is_active', $is_active, $this->id, $this->object );
98
+        $is_active = !empty($this->get_option('active'));
99
+        return apply_filters('getpaid_email_type_is_active', $is_active, $this->id, $this->object);
100 100
     }
101 101
 
102 102
     /**
@@ -105,8 +105,8 @@  discard block
 block discarded – undo
105 105
      * @return bool
106 106
 	 */
107 107
 	public function include_admin_bcc() {
108
-        $include_admin_bcc = ! empty( $this->get_option( 'admin_bcc' ) );
109
-        return apply_filters( 'getpaid_email_type_include_admin_bcc', $include_admin_bcc, $this->id, $this->object );
108
+        $include_admin_bcc = !empty($this->get_option('admin_bcc'));
109
+        return apply_filters('getpaid_email_type_include_admin_bcc', $include_admin_bcc, $this->id, $this->object);
110 110
     }
111 111
 
112 112
     /**
@@ -115,8 +115,8 @@  discard block
 block discarded – undo
115 115
      * @return bool
116 116
 	 */
117 117
 	public function is_admin_email() {
118
-        $is_admin_email = in_array( $this->id, array( 'new_invoice', 'cancelled_invoice', 'failed_invoice' ) );
119
-        return apply_filters( 'getpaid_email_type_is_admin_email', $is_admin_email, $this->id, $this->object );
118
+        $is_admin_email = in_array($this->id, array('new_invoice', 'cancelled_invoice', 'failed_invoice'));
119
+        return apply_filters('getpaid_email_type_is_admin_email', $is_admin_email, $this->id, $this->object);
120 120
     }
121 121
 
122 122
     /**
@@ -125,7 +125,7 @@  discard block
 block discarded – undo
125 125
      * @return array
126 126
 	 */
127 127
 	public function get_attachments() {
128
-        return apply_filters( 'getpaid_get_email_attachments', array(), $this->id, $this->object );
128
+        return apply_filters('getpaid_get_email_attachments', array(), $this->id, $this->object);
129 129
     }
130 130
 
131 131
     /**
@@ -137,10 +137,10 @@  discard block
 block discarded – undo
137 137
 
138 138
         $merge_tags = array(
139 139
             '{site_title}' => wpinv_get_blogname(),
140
-            '{date}'       => getpaid_format_date_value( current_time( 'mysql' ) ),
140
+            '{date}'       => getpaid_format_date_value(current_time('mysql')),
141 141
         );
142 142
 
143
-        return apply_filters( 'getpaid_get_email_merge_tags', $merge_tags, $this->object, $this->id );
143
+        return apply_filters('getpaid_get_email_merge_tags', $merge_tags, $this->object, $this->id);
144 144
     }
145 145
 
146 146
     /**
@@ -150,13 +150,13 @@  discard block
 block discarded – undo
150 150
      * @param array $merge_tags
151 151
      * @return string
152 152
 	 */
153
-	public function add_merge_tags( $text, $merge_tags = array() ) {
153
+	public function add_merge_tags($text, $merge_tags = array()) {
154 154
 
155
-        foreach ( $merge_tags as $key => $value ) {
156
-            $text = str_replace( $key, $value, $text );
155
+        foreach ($merge_tags as $key => $value) {
156
+            $text = str_replace($key, $value, $text);
157 157
         }
158 158
 
159
-        return wptexturize( $text );
159
+        return wptexturize($text);
160 160
     }
161 161
 
162 162
     /**
@@ -166,7 +166,7 @@  discard block
 block discarded – undo
166 166
      * @param array $extra_args Extra template args
167 167
      * @return string
168 168
 	 */
169
-	public function get_content( $merge_tags = array(), $extra_args = array() ) {
169
+	public function get_content($merge_tags = array(), $extra_args = array()) {
170 170
 
171 171
         $content = wpinv_get_template_html(
172 172
             "emails/wpinv-email-{$this->id}.php",
@@ -176,15 +176,15 @@  discard block
 block discarded – undo
176 176
                     'invoice'       => $this->object, // Backwards compat.
177 177
                     'object'        => $this->object,
178 178
                     'email_type'    => $this->id,
179
-                    'email_heading' => $this->add_merge_tags( $this->get_heading(), $merge_tags ),
179
+                    'email_heading' => $this->add_merge_tags($this->get_heading(), $merge_tags),
180 180
                     'sent_to_admin' => $this->is_admin_email(),
181 181
                     'plain_text'    => false,
182
-                    'message_body'  => wpautop( $this->add_merge_tags( $this->get_body(), $merge_tags ) ),
182
+                    'message_body'  => wpautop($this->add_merge_tags($this->get_body(), $merge_tags)),
183 183
                 )
184 184
             )
185 185
         );
186 186
 
187
-        return wpinv_email_style_body( $content );
187
+        return wpinv_email_style_body($content);
188 188
     }
189 189
 
190 190
 }
Please login to merge, or discard this patch.