Passed
Push — master ( 6086f2...9dee83 )
by Kiran
09:50 queued 20s
created
includes/api/class-wpinv-rest-invoice-controller.php 1 patch
Indentation   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -15,132 +15,132 @@
 block discarded – undo
15 15
 class WPInv_REST_Invoice_Controller extends GetPaid_REST_Posts_Controller {
16 16
 
17 17
     /**
18
-	 * Post type.
19
-	 *
20
-	 * @var string
21
-	 */
22
-	protected $post_type = 'wpi_invoice';
23
-
24
-	/**
25
-	 * The base of this controller's route.
26
-	 *
27
-	 * @since 1.0.13
28
-	 * @var string
29
-	 */
30
-	protected $rest_base = 'invoices';
31
-
32
-	/** Contains this controller's class name.
33
-	 *
34
-	 * @var string
35
-	 */
36
-	public $crud_class = 'WPInv_Invoice';
18
+     * Post type.
19
+     *
20
+     * @var string
21
+     */
22
+    protected $post_type = 'wpi_invoice';
37 23
 
38 24
     /**
39
-	 * Retrieves the query params for the invoices collection.
40
-	 *
41
-	 * @since 1.0.13
42
-	 *
43
-	 * @return array Collection parameters.
44
-	 */
45
-	public function get_collection_params() {
46
-
47
-		$params = array_merge(
48
-			parent::get_collection_params(),
49
-			array(
50
-
51
-				'customers'         => array(
52
-					'description'       => __( 'Limit result set to invoices for specific user ids.', 'invoicing' ),
53
-					'type'              => 'array',
54
-					'items'             => array(
55
-						'type' => 'integer',
56
-					),
57
-					'default'           => array(),
58
-					'sanitize_callback' => 'wp_parse_id_list',
59
-				),
60
-
61
-				'exclude_customers' => array(
62
-					'description'       => __( 'Exclude invoices to specific users.', 'invoicing' ),
63
-					'type'              => 'array',
64
-					'items'             => array(
65
-						'type' => 'integer',
66
-					),
67
-					'default'           => array(),
68
-					'sanitize_callback' => 'wp_parse_id_list',
69
-				),
70
-
71
-				'parent'            => array(
72
-					'description'       => __( 'Limit result set to those of particular parent IDs.', 'invoicing' ),
73
-					'type'              => 'array',
74
-					'items'             => array(
75
-						'type' => 'integer',
76
-					),
77
-					'sanitize_callback' => 'wp_parse_id_list',
78
-					'default'           => array(),
79
-				),
80
-
81
-				'parent_exclude'    => array(
82
-					'description'       => __( 'Limit result set to all items except those of a particular parent ID.', 'invoicing' ),
83
-					'type'              => 'array',
84
-					'items'             => array(
85
-						'type' => 'integer',
86
-					),
87
-					'sanitize_callback' => 'wp_parse_id_list',
88
-					'default'           => array(),
89
-				),
90
-
91
-			)
92
-		);
93
-
94
-		// Filter collection parameters for the invoices controller.
95
-		return apply_filters( 'getpaid_rest_invoices_collection_params', $params, $this );
96
-	}
97
-
98
-	/**
99
-	 * Determine the allowed query_vars for a get_items() response and
100
-	 * prepare for WP_Query.
101
-	 *
102
-	 * @param array           $prepared_args Prepared arguments.
103
-	 * @param WP_REST_Request $request Request object.
104
-	 * @return array          $query_args
105
-	 */
106
-	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
107
-
108
-		$query_args = parent::prepare_items_query( $prepared_args );
109
-
110
-		// Retrieve invoices for specific customers.
111
-		if ( ! empty( $request['customers'] ) ) {
112
-			$query_args['author__in'] = $request['customers'];
113
-		}
114
-
115
-		// Skip invoices for specific customers.
116
-		if ( ! empty( $request['exclude_customers'] ) ) {
117
-			$query_args['author__not_in'] = $request['exclude_customers'];
118
-		}
119
-
120
-		return apply_filters( 'getpaid_rest_invoices_prepare_items_query', $query_args, $request, $this );
121
-
122
-	}
123
-
124
-	/**
125
-	 * Retrieves a valid list of post statuses.
126
-	 *
127
-	 * @since 1.0.15
128
-	 *
129
-	 * @return array A list of registered item statuses.
130
-	 */
131
-	public function get_post_statuses() {
132
-		return array_keys( wpinv_get_invoice_statuses( true, false, $this->post_type ) );
133
-	}
134
-
135
-	/**
136
-	 * Saves a single invoice.
137
-	 *
138
-	 * @param WPInv_Invoice $invoice Invoice to save.
139
-	 * @return WP_Error|WPInv_Invoice
140
-	 */
141
-	protected function save_object( $invoice ) {
142
-		$invoice->recalculate_total();
143
-		return parent::save_object( $invoice );
144
-	}
25
+     * The base of this controller's route.
26
+     *
27
+     * @since 1.0.13
28
+     * @var string
29
+     */
30
+    protected $rest_base = 'invoices';
31
+
32
+    /** Contains this controller's class name.
33
+     *
34
+     * @var string
35
+     */
36
+    public $crud_class = 'WPInv_Invoice';
37
+
38
+    /**
39
+     * Retrieves the query params for the invoices collection.
40
+     *
41
+     * @since 1.0.13
42
+     *
43
+     * @return array Collection parameters.
44
+     */
45
+    public function get_collection_params() {
46
+
47
+        $params = array_merge(
48
+            parent::get_collection_params(),
49
+            array(
50
+
51
+                'customers'         => array(
52
+                    'description'       => __( 'Limit result set to invoices for specific user ids.', 'invoicing' ),
53
+                    'type'              => 'array',
54
+                    'items'             => array(
55
+                        'type' => 'integer',
56
+                    ),
57
+                    'default'           => array(),
58
+                    'sanitize_callback' => 'wp_parse_id_list',
59
+                ),
60
+
61
+                'exclude_customers' => array(
62
+                    'description'       => __( 'Exclude invoices to specific users.', 'invoicing' ),
63
+                    'type'              => 'array',
64
+                    'items'             => array(
65
+                        'type' => 'integer',
66
+                    ),
67
+                    'default'           => array(),
68
+                    'sanitize_callback' => 'wp_parse_id_list',
69
+                ),
70
+
71
+                'parent'            => array(
72
+                    'description'       => __( 'Limit result set to those of particular parent IDs.', 'invoicing' ),
73
+                    'type'              => 'array',
74
+                    'items'             => array(
75
+                        'type' => 'integer',
76
+                    ),
77
+                    'sanitize_callback' => 'wp_parse_id_list',
78
+                    'default'           => array(),
79
+                ),
80
+
81
+                'parent_exclude'    => array(
82
+                    'description'       => __( 'Limit result set to all items except those of a particular parent ID.', 'invoicing' ),
83
+                    'type'              => 'array',
84
+                    'items'             => array(
85
+                        'type' => 'integer',
86
+                    ),
87
+                    'sanitize_callback' => 'wp_parse_id_list',
88
+                    'default'           => array(),
89
+                ),
90
+
91
+            )
92
+        );
93
+
94
+        // Filter collection parameters for the invoices controller.
95
+        return apply_filters( 'getpaid_rest_invoices_collection_params', $params, $this );
96
+    }
97
+
98
+    /**
99
+     * Determine the allowed query_vars for a get_items() response and
100
+     * prepare for WP_Query.
101
+     *
102
+     * @param array           $prepared_args Prepared arguments.
103
+     * @param WP_REST_Request $request Request object.
104
+     * @return array          $query_args
105
+     */
106
+    protected function prepare_items_query( $prepared_args = array(), $request = null ) {
107
+
108
+        $query_args = parent::prepare_items_query( $prepared_args );
109
+
110
+        // Retrieve invoices for specific customers.
111
+        if ( ! empty( $request['customers'] ) ) {
112
+            $query_args['author__in'] = $request['customers'];
113
+        }
114
+
115
+        // Skip invoices for specific customers.
116
+        if ( ! empty( $request['exclude_customers'] ) ) {
117
+            $query_args['author__not_in'] = $request['exclude_customers'];
118
+        }
119
+
120
+        return apply_filters( 'getpaid_rest_invoices_prepare_items_query', $query_args, $request, $this );
121
+
122
+    }
123
+
124
+    /**
125
+     * Retrieves a valid list of post statuses.
126
+     *
127
+     * @since 1.0.15
128
+     *
129
+     * @return array A list of registered item statuses.
130
+     */
131
+    public function get_post_statuses() {
132
+        return array_keys( wpinv_get_invoice_statuses( true, false, $this->post_type ) );
133
+    }
134
+
135
+    /**
136
+     * Saves a single invoice.
137
+     *
138
+     * @param WPInv_Invoice $invoice Invoice to save.
139
+     * @return WP_Error|WPInv_Invoice
140
+     */
141
+    protected function save_object( $invoice ) {
142
+        $invoice->recalculate_total();
143
+        return parent::save_object( $invoice );
144
+    }
145 145
 
146 146
 }
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-reports-controller.php 1 patch
Indentation   +170 added lines, -170 removed lines patch added patch discarded remove patch
@@ -18,178 +18,178 @@
 block discarded – undo
18 18
  */
19 19
 class GetPaid_REST_Reports_Controller extends GetPaid_REST_Controller {
20 20
 
21
-	/**
22
-	 * Route base.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	protected $rest_base = 'reports';
27
-
28
-	/**
29
-	 * Registers the routes for the objects of the controller.
30
-	 *
31
-	 * @since 2.0.0
32
-	 *
33
-	 * @see register_rest_route()
34
-	 */
35
-	public function register_namespace_routes( $namespace ) {
36
-
37
-		// List all available reports.
38
-		register_rest_route(
39
-			$namespace,
40
-			$this->rest_base,
41
-			array(
42
-				array(
43
-					'methods'             => WP_REST_Server::READABLE,
44
-					'callback'            => array( $this, 'get_items' ),
45
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
46
-					'args'                => $this->get_collection_params(),
47
-				),
48
-				'schema' => array( $this, 'get_public_item_schema' ),
49
-			)
50
-		);
51
-
52
-	}
53
-
54
-	/**
55
-	 * Makes sure the current user has access to READ the report APIs.
56
-	 *
57
-	 * @since  2.0.0
58
-	 * @param WP_REST_Request $request Full data about the request.
59
-	 * @return WP_Error|boolean
60
-	 */
61
-	public function get_items_permissions_check( $request ) {
62
-
63
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
64
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
65
-		}
66
-
67
-		return true;
68
-	}
69
-
70
-	/**
71
-	 * Get reports list.
72
-	 *
73
-	 * @since 2.0.0
74
-	 * @return array
75
-	 */
76
-	protected function get_reports() {
77
-
78
-		$reports = array(
79
-			array(
80
-				'slug'        => 'sales',
81
-				'description' => __( 'List of sales reports.', 'invoicing' ),
82
-			),
83
-			array(
84
-				'slug'        => 'top_sellers',
85
-				'description' => __( 'List of top selling items.', 'invoicing' ),
86
-			),
87
-			array(
88
-				'slug'        => 'top_earners',
89
-				'description' => __( 'List of top earning items.', 'invoicing' ),
90
-			),
91
-			array(
92
-				'slug'        => 'invoices/counts',
93
-				'description' => __( 'Invoice counts.', 'invoicing' ),
94
-			),
95
-		);
96
-
97
-		return apply_filters( 'getpaid_available_api_reports', $reports );
98
-
99
-	}
100
-
101
-	/**
102
-	 * Get all reports.
103
-	 *
104
-	 * @since 2.0.0
105
-	 * @param WP_REST_Request $request
106
-	 * @return array|WP_Error
107
-	 */
108
-	public function get_items( $request ) {
109
-		$data    = array();
110
-		$reports = $this->get_reports();
111
-
112
-		foreach ( $reports as $report ) {
113
-			$item   = $this->prepare_item_for_response( (object) $report, $request );
114
-			$data[] = $this->prepare_response_for_collection( $item );
115
-		}
116
-
117
-		return rest_ensure_response( $data );
118
-	}
119
-
120
-	/**
121
-	 * Prepare a report object for serialization.
122
-	 *
123
-	 * @since 2.0.0
124
-	 * @param stdClass $report Report data.
125
-	 * @param WP_REST_Request $request Request object.
126
-	 * @return WP_REST_Response $response Response data.
127
-	 */
128
-	public function prepare_item_for_response( $report, $request ) {
129
-		$data = array(
130
-			'slug'        => $report->slug,
131
-			'description' => $report->description,
132
-		);
133
-
134
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
135
-		$data = $this->add_additional_fields_to_object( $data, $request );
136
-		$data = $this->filter_response_by_context( $data, $context );
137
-
138
-		// Wrap the data in a response object.
139
-		$response = rest_ensure_response( $data );
140
-		$response->add_links(
21
+    /**
22
+     * Route base.
23
+     *
24
+     * @var string
25
+     */
26
+    protected $rest_base = 'reports';
27
+
28
+    /**
29
+     * Registers the routes for the objects of the controller.
30
+     *
31
+     * @since 2.0.0
32
+     *
33
+     * @see register_rest_route()
34
+     */
35
+    public function register_namespace_routes( $namespace ) {
36
+
37
+        // List all available reports.
38
+        register_rest_route(
39
+            $namespace,
40
+            $this->rest_base,
141 41
             array(
142
-				'self'       => array(
143
-					'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $report->slug ) ),
144
-				),
145
-				'collection' => array(
146
-					'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
147
-				),
42
+                array(
43
+                    'methods'             => WP_REST_Server::READABLE,
44
+                    'callback'            => array( $this, 'get_items' ),
45
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
46
+                    'args'                => $this->get_collection_params(),
47
+                ),
48
+                'schema' => array( $this, 'get_public_item_schema' ),
148 49
             )
149 50
         );
150 51
 
151
-		return apply_filters( 'getpaid_rest_prepare_report', $response, $report, $request );
152
-	}
153
-
154
-	/**
155
-	 * Get the Report's schema, conforming to JSON Schema.
156
-	 *
157
-	 * @since 2.0.0
158
-	 * @return array
159
-	 */
160
-	public function get_item_schema() {
161
-		$schema = array(
162
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
163
-			'title'      => 'report',
164
-			'type'       => 'object',
165
-			'properties' => array(
166
-				'slug'        => array(
167
-					'description' => __( 'An alphanumeric identifier for the resource.', 'invoicing' ),
168
-					'type'        => 'string',
169
-					'context'     => array( 'view' ),
170
-					'readonly'    => true,
171
-				),
172
-				'description' => array(
173
-					'description' => __( 'A human-readable description of the resource.', 'invoicing' ),
174
-					'type'        => 'string',
175
-					'context'     => array( 'view' ),
176
-					'readonly'    => true,
177
-				),
178
-			),
179
-		);
180
-
181
-		return $this->add_additional_fields_schema( $schema );
182
-	}
183
-
184
-	/**
185
-	 * Get the query params for collections.
186
-	 *
187
-	 * @since 2.0.0
188
-	 * @return array
189
-	 */
190
-	public function get_collection_params() {
191
-		return array(
192
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
193
-		);
194
-	}
52
+    }
53
+
54
+    /**
55
+     * Makes sure the current user has access to READ the report APIs.
56
+     *
57
+     * @since  2.0.0
58
+     * @param WP_REST_Request $request Full data about the request.
59
+     * @return WP_Error|boolean
60
+     */
61
+    public function get_items_permissions_check( $request ) {
62
+
63
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
64
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
65
+        }
66
+
67
+        return true;
68
+    }
69
+
70
+    /**
71
+     * Get reports list.
72
+     *
73
+     * @since 2.0.0
74
+     * @return array
75
+     */
76
+    protected function get_reports() {
77
+
78
+        $reports = array(
79
+            array(
80
+                'slug'        => 'sales',
81
+                'description' => __( 'List of sales reports.', 'invoicing' ),
82
+            ),
83
+            array(
84
+                'slug'        => 'top_sellers',
85
+                'description' => __( 'List of top selling items.', 'invoicing' ),
86
+            ),
87
+            array(
88
+                'slug'        => 'top_earners',
89
+                'description' => __( 'List of top earning items.', 'invoicing' ),
90
+            ),
91
+            array(
92
+                'slug'        => 'invoices/counts',
93
+                'description' => __( 'Invoice counts.', 'invoicing' ),
94
+            ),
95
+        );
96
+
97
+        return apply_filters( 'getpaid_available_api_reports', $reports );
98
+
99
+    }
100
+
101
+    /**
102
+     * Get all reports.
103
+     *
104
+     * @since 2.0.0
105
+     * @param WP_REST_Request $request
106
+     * @return array|WP_Error
107
+     */
108
+    public function get_items( $request ) {
109
+        $data    = array();
110
+        $reports = $this->get_reports();
111
+
112
+        foreach ( $reports as $report ) {
113
+            $item   = $this->prepare_item_for_response( (object) $report, $request );
114
+            $data[] = $this->prepare_response_for_collection( $item );
115
+        }
116
+
117
+        return rest_ensure_response( $data );
118
+    }
119
+
120
+    /**
121
+     * Prepare a report object for serialization.
122
+     *
123
+     * @since 2.0.0
124
+     * @param stdClass $report Report data.
125
+     * @param WP_REST_Request $request Request object.
126
+     * @return WP_REST_Response $response Response data.
127
+     */
128
+    public function prepare_item_for_response( $report, $request ) {
129
+        $data = array(
130
+            'slug'        => $report->slug,
131
+            'description' => $report->description,
132
+        );
133
+
134
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
135
+        $data = $this->add_additional_fields_to_object( $data, $request );
136
+        $data = $this->filter_response_by_context( $data, $context );
137
+
138
+        // Wrap the data in a response object.
139
+        $response = rest_ensure_response( $data );
140
+        $response->add_links(
141
+            array(
142
+                'self'       => array(
143
+                    'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $report->slug ) ),
144
+                ),
145
+                'collection' => array(
146
+                    'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
147
+                ),
148
+            )
149
+        );
150
+
151
+        return apply_filters( 'getpaid_rest_prepare_report', $response, $report, $request );
152
+    }
153
+
154
+    /**
155
+     * Get the Report's schema, conforming to JSON Schema.
156
+     *
157
+     * @since 2.0.0
158
+     * @return array
159
+     */
160
+    public function get_item_schema() {
161
+        $schema = array(
162
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
163
+            'title'      => 'report',
164
+            'type'       => 'object',
165
+            'properties' => array(
166
+                'slug'        => array(
167
+                    'description' => __( 'An alphanumeric identifier for the resource.', 'invoicing' ),
168
+                    'type'        => 'string',
169
+                    'context'     => array( 'view' ),
170
+                    'readonly'    => true,
171
+                ),
172
+                'description' => array(
173
+                    'description' => __( 'A human-readable description of the resource.', 'invoicing' ),
174
+                    'type'        => 'string',
175
+                    'context'     => array( 'view' ),
176
+                    'readonly'    => true,
177
+                ),
178
+            ),
179
+        );
180
+
181
+        return $this->add_additional_fields_schema( $schema );
182
+    }
183
+
184
+    /**
185
+     * Get the query params for collections.
186
+     *
187
+     * @since 2.0.0
188
+     * @return array
189
+     */
190
+    public function get_collection_params() {
191
+        return array(
192
+            'context' => $this->get_context_param( array( 'default' => 'view' ) ),
193
+        );
194
+    }
195 195
 }
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-posts-controller.php 1 patch
Indentation   +617 added lines, -617 removed lines patch added patch discarded remove patch
@@ -18,626 +18,626 @@
 block discarded – undo
18 18
 class GetPaid_REST_Posts_Controller extends GetPaid_REST_CRUD_Controller {
19 19
 
20 20
     /**
21
-	 * Post type.
22
-	 *
23
-	 * @var string
24
-	 */
25
-	protected $post_type;
26
-
27
-	/**
28
-	 * Controls visibility on frontend.
29
-	 *
30
-	 * @var string
31
-	 */
32
-	public $public = false;
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
-		parent::register_namespace_routes( $namespace );
44
-
45
-		register_rest_route(
46
-			$namespace,
47
-			'/' . $this->rest_base . '/batch',
48
-			array(
49
-				array(
50
-					'methods'             => WP_REST_Server::EDITABLE,
51
-					'callback'            => array( $this, 'batch_items' ),
52
-					'permission_callback' => array( $this, 'batch_items_permissions_check' ),
53
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
54
-				),
55
-				'schema' => array( $this, 'get_public_batch_schema' ),
56
-			)
57
-		);
58
-
59
-	}
60
-
61
-	/**
62
-	 * Check permissions of items on REST API.
63
-	 *
64
-	 * @since 1.0.19
65
-	 * @param string $context   Request context.
66
-	 * @param int    $object_id Post ID.
67
-	 * @return bool
68
-	 */
69
-	public function check_post_permissions( $context = 'read', $object_id = 0 ) {
70
-
71
-		$contexts = array(
72
-			'read'   => 'read_private_posts',
73
-			'create' => 'publish_posts',
74
-			'edit'   => 'edit_post',
75
-			'delete' => 'delete_post',
76
-			'batch'  => 'edit_others_posts',
77
-		);
78
-
79
-		$cap              = $contexts[ $context ];
80
-		$post_type_object = get_post_type_object( $this->post_type );
81
-		$permission       = current_user_can( $post_type_object->cap->$cap, $object_id );
82
-
83
-		return apply_filters( 'getpaid_rest_check_permissions', $permission, $context, $object_id, $this->post_type );
84
-	}
85
-
86
-	/**
87
-	 * Check if a given request has access to read items.
88
-	 *
89
-	 * @param  WP_REST_Request $request Full details about the request.
90
-	 * @return WP_Error|boolean
91
-	 */
92
-	public function get_items_permissions_check( $request ) {
93
-		return $this->check_post_permissions() ? true : new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
94
-	}
95
-
96
-	/**
97
-	 * Check if a given request has access to create an item.
98
-	 *
99
-	 * @param  WP_REST_Request $request Full details about the request.
100
-	 * @return WP_Error|boolean
101
-	 */
102
-	public function create_item_permissions_check( $request ) {
103
-		return $this->check_post_permissions( 'create' ) ? true : new WP_Error( 'rest_cannot_create', __( 'Sorry, you are not allowed to create resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
104
-	}
105
-
106
-	/**
107
-	 * Check if a given request has access to read an item.
108
-	 *
109
-	 * @param  WP_REST_Request $request Full details about the request.
110
-	 * @return WP_Error|boolean
111
-	 */
112
-	public function get_item_permissions_check( $request ) {
113
-		$post = get_post( (int) $request['id'] );
114
-
115
-		if ( $post && ! $this->check_post_permissions( 'read', $post->ID ) ) {
116
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
117
-		}
118
-
119
-		return true;
120
-	}
121
-
122
-	/**
123
-	 * Check if a given request has access to update an item.
124
-	 *
125
-	 * @param  WP_REST_Request $request Full details about the request.
126
-	 * @return WP_Error|boolean
127
-	 */
128
-	public function update_item_permissions_check( $request ) {
129
-		$post = get_post( (int) $request['id'] );
130
-
131
-		if ( $post && ! $this->check_post_permissions( 'edit', $post->ID ) ) {
132
-			return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
133
-		}
134
-
135
-		return true;
136
-	}
137
-
138
-	/**
139
-	 * Check if a given request has access to delete an item.
140
-	 *
141
-	 * @param  WP_REST_Request $request Full details about the request.
142
-	 * @return bool|WP_Error
143
-	 */
144
-	public function delete_item_permissions_check( $request ) {
145
-		$post = get_post( (int) $request['id'] );
146
-
147
-		if ( $post && ! $this->check_post_permissions( 'delete', $post->ID ) ) {
148
-			return new WP_Error( 'rest_cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
149
-		}
150
-
151
-		return true;
152
-	}
153
-
154
-	/**
155
-	 * Check if a given request has access batch create, update and delete items.
156
-	 *
157
-	 * @param  WP_REST_Request $request Full details about the request.
158
-	 *
159
-	 * @return boolean|WP_Error
160
-	 */
161
-	public function batch_items_permissions_check( $request ) {
162
-		return $this->check_post_permissions( 'batch' ) ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
163
-	}
164
-
165
-	/**
166
-	 * @deprecated
167
-	 */
168
-	public function get_post( $object_id ) {
169
-		return $this->get_object( $object_id );
21
+     * Post type.
22
+     *
23
+     * @var string
24
+     */
25
+    protected $post_type;
26
+
27
+    /**
28
+     * Controls visibility on frontend.
29
+     *
30
+     * @var string
31
+     */
32
+    public $public = false;
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
+        parent::register_namespace_routes( $namespace );
44
+
45
+        register_rest_route(
46
+            $namespace,
47
+            '/' . $this->rest_base . '/batch',
48
+            array(
49
+                array(
50
+                    'methods'             => WP_REST_Server::EDITABLE,
51
+                    'callback'            => array( $this, 'batch_items' ),
52
+                    'permission_callback' => array( $this, 'batch_items_permissions_check' ),
53
+                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
54
+                ),
55
+                'schema' => array( $this, 'get_public_batch_schema' ),
56
+            )
57
+        );
58
+
59
+    }
60
+
61
+    /**
62
+     * Check permissions of items on REST API.
63
+     *
64
+     * @since 1.0.19
65
+     * @param string $context   Request context.
66
+     * @param int    $object_id Post ID.
67
+     * @return bool
68
+     */
69
+    public function check_post_permissions( $context = 'read', $object_id = 0 ) {
70
+
71
+        $contexts = array(
72
+            'read'   => 'read_private_posts',
73
+            'create' => 'publish_posts',
74
+            'edit'   => 'edit_post',
75
+            'delete' => 'delete_post',
76
+            'batch'  => 'edit_others_posts',
77
+        );
78
+
79
+        $cap              = $contexts[ $context ];
80
+        $post_type_object = get_post_type_object( $this->post_type );
81
+        $permission       = current_user_can( $post_type_object->cap->$cap, $object_id );
82
+
83
+        return apply_filters( 'getpaid_rest_check_permissions', $permission, $context, $object_id, $this->post_type );
84
+    }
85
+
86
+    /**
87
+     * Check if a given request has access to read items.
88
+     *
89
+     * @param  WP_REST_Request $request Full details about the request.
90
+     * @return WP_Error|boolean
91
+     */
92
+    public function get_items_permissions_check( $request ) {
93
+        return $this->check_post_permissions() ? true : new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
94
+    }
95
+
96
+    /**
97
+     * Check if a given request has access to create an item.
98
+     *
99
+     * @param  WP_REST_Request $request Full details about the request.
100
+     * @return WP_Error|boolean
101
+     */
102
+    public function create_item_permissions_check( $request ) {
103
+        return $this->check_post_permissions( 'create' ) ? true : new WP_Error( 'rest_cannot_create', __( 'Sorry, you are not allowed to create resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
104
+    }
105
+
106
+    /**
107
+     * Check if a given request has access to read an item.
108
+     *
109
+     * @param  WP_REST_Request $request Full details about the request.
110
+     * @return WP_Error|boolean
111
+     */
112
+    public function get_item_permissions_check( $request ) {
113
+        $post = get_post( (int) $request['id'] );
114
+
115
+        if ( $post && ! $this->check_post_permissions( 'read', $post->ID ) ) {
116
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
117
+        }
118
+
119
+        return true;
120
+    }
121
+
122
+    /**
123
+     * Check if a given request has access to update an item.
124
+     *
125
+     * @param  WP_REST_Request $request Full details about the request.
126
+     * @return WP_Error|boolean
127
+     */
128
+    public function update_item_permissions_check( $request ) {
129
+        $post = get_post( (int) $request['id'] );
130
+
131
+        if ( $post && ! $this->check_post_permissions( 'edit', $post->ID ) ) {
132
+            return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
133
+        }
134
+
135
+        return true;
136
+    }
137
+
138
+    /**
139
+     * Check if a given request has access to delete an item.
140
+     *
141
+     * @param  WP_REST_Request $request Full details about the request.
142
+     * @return bool|WP_Error
143
+     */
144
+    public function delete_item_permissions_check( $request ) {
145
+        $post = get_post( (int) $request['id'] );
146
+
147
+        if ( $post && ! $this->check_post_permissions( 'delete', $post->ID ) ) {
148
+            return new WP_Error( 'rest_cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
149
+        }
150
+
151
+        return true;
152
+    }
153
+
154
+    /**
155
+     * Check if a given request has access batch create, update and delete items.
156
+     *
157
+     * @param  WP_REST_Request $request Full details about the request.
158
+     *
159
+     * @return boolean|WP_Error
160
+     */
161
+    public function batch_items_permissions_check( $request ) {
162
+        return $this->check_post_permissions( 'batch' ) ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
163
+    }
164
+
165
+    /**
166
+     * @deprecated
167
+     */
168
+    public function get_post( $object_id ) {
169
+        return $this->get_object( $object_id );
170
+    }
171
+
172
+    /**
173
+     * Get a single object.
174
+     *
175
+     * @param WP_REST_Request $request Full details about the request.
176
+     * @return WP_Error|WP_REST_Response
177
+     */
178
+    public function get_item( $request ) {
179
+
180
+        // Fetch item.
181
+        $response = parent::get_item( $request );
182
+
183
+        // (Maybe) add a link to the html pagee.
184
+        if ( $this->public && ! is_wp_error( $response ) ) {
185
+            $response->link_header( 'alternate', get_permalink( $this->data_object->get_id() ), array( 'type' => 'text/html' ) );
186
+        }
187
+
188
+        return $response;
189
+    }
190
+
191
+    /**
192
+     * Create a single object.
193
+     *
194
+     * @param WP_REST_Request $request Full details about the request.
195
+     * @return WP_Error|WP_REST_Response
196
+     */
197
+    public function create_item( $request ) {
198
+
199
+        // Create item.
200
+        $response = parent::create_item( $request );
201
+
202
+        // Fire a hook after an item is created.
203
+        if ( ! is_wp_error( $response ) ) {
204
+
205
+            /**
206
+             * Fires after a single item is created or updated via the REST API.
207
+             *
208
+             * @param WP_Post         $post      Post object.
209
+             * @param WP_REST_Request $request   Request object.
210
+             * @param boolean         $creating  True when creating item, false when updating.
211
+             */
212
+            do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, true );
213
+
214
+        }
215
+
216
+        return $response;
217
+
170 218
     }
171 219
 
172
-	/**
173
-	 * Get a single object.
174
-	 *
175
-	 * @param WP_REST_Request $request Full details about the request.
176
-	 * @return WP_Error|WP_REST_Response
177
-	 */
178
-	public function get_item( $request ) {
179
-
180
-		// Fetch item.
181
-		$response = parent::get_item( $request );
182
-
183
-		// (Maybe) add a link to the html pagee.
184
-		if ( $this->public && ! is_wp_error( $response ) ) {
185
-			$response->link_header( 'alternate', get_permalink( $this->data_object->get_id() ), array( 'type' => 'text/html' ) );
186
-		}
187
-
188
-		return $response;
189
-	}
190
-
191
-	/**
192
-	 * Create a single object.
193
-	 *
194
-	 * @param WP_REST_Request $request Full details about the request.
195
-	 * @return WP_Error|WP_REST_Response
196
-	 */
197
-	public function create_item( $request ) {
198
-
199
-		// Create item.
200
-		$response = parent::create_item( $request );
201
-
202
-		// Fire a hook after an item is created.
203
-		if ( ! is_wp_error( $response ) ) {
204
-
205
-			/**
206
-			 * Fires after a single item is created or updated via the REST API.
207
-			 *
208
-			 * @param WP_Post         $post      Post object.
209
-			 * @param WP_REST_Request $request   Request object.
210
-			 * @param boolean         $creating  True when creating item, false when updating.
211
-			 */
212
-			do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, true );
213
-
214
-		}
215
-
216
-		return $response;
217
-
218
-	}
219
-
220
-	/**
221
-	 * Update a single object.
222
-	 *
223
-	 * @param WP_REST_Request $request Full details about the request.
224
-	 * @return WP_Error|WP_REST_Response
225
-	 */
226
-	public function update_item( $request ) {
227
-
228
-		// Create item.
229
-		$response = parent::update_item( $request );
230
-
231
-		// Fire a hook after an item is created.
232
-		if ( ! is_wp_error( $response ) ) {
233
-
234
-			/**
235
-			 * Fires after a single item is created or updated via the REST API.
236
-			 *
237
-			 * @param WP_Post         $post      Post object.
238
-			 * @param WP_REST_Request $request   Request object.
239
-			 * @param boolean         $creating  True when creating item, false when updating.
240
-			 */
241
-			do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, false );
242
-
243
-		}
244
-
245
-		return $response;
246
-
247
-	}
248
-
249
-	/**
250
-	 * Get a collection of objects.
251
-	 *
252
-	 * @param WP_REST_Request $request Full details about the request.
253
-	 * @return WP_Error|WP_REST_Response
254
-	 */
255
-	public function get_items( $request ) {
256
-
257
-		$args                         = array();
258
-		$args['offset']               = $request['offset'];
259
-		$args['order']                = $request['order'];
260
-		$args['orderby']              = $request['orderby'];
261
-		$args['paged']                = $request['page'];
262
-		$args['post__in']             = $request['include'];
263
-		$args['post__not_in']         = $request['exclude'];
264
-		$args['posts_per_page']       = $request['per_page'];
265
-		$args['name']                 = $request['slug'];
266
-		$args['post_parent__in']      = $request['parent'];
267
-		$args['post_parent__not_in']  = $request['parent_exclude'];
268
-		$args['s']                    = $request['search'];
269
-		$args['post_status']          = wpinv_parse_list( $request['status'] );
270
-
271
-		$args['date_query'] = array();
272
-
273
-		// Set before into date query. Date query must be specified as an array of an array.
274
-		if ( isset( $request['before'] ) ) {
275
-			$args['date_query'][0]['before'] = $request['before'];
276
-		}
277
-
278
-		// Set after into date query. Date query must be specified as an array of an array.
279
-		if ( isset( $request['after'] ) ) {
280
-			$args['date_query'][0]['after'] = $request['after'];
281
-		}
282
-
283
-		// Force the post_type & fields arguments, since they're not a user input variable.
284
-		$args['post_type'] = $this->post_type;
285
-		$args['fields']    = 'ids';
286
-
287
-		// Filter the query arguments for a request.
288
-		$args       = apply_filters( "getpaid_rest_{$this->post_type}_query", $args, $request );
289
-		$query_args = $this->prepare_items_query( $args, $request );
290
-
291
-		$posts_query = new WP_Query();
292
-		$query_result = $posts_query->query( $query_args );
293
-
294
-		$posts = array();
295
-		foreach ( $query_result as $post_id ) {
296
-			if ( ! $this->check_post_permissions( 'read', $post_id ) ) {
297
-				continue;
298
-			}
299
-
300
-			$data    = $this->prepare_item_for_response( $this->get_object( $post_id ), $request );
301
-			$posts[] = $this->prepare_response_for_collection( $data );
302
-		}
303
-
304
-		$page        = (int) $query_args['paged'];
305
-		$total_posts = $posts_query->found_posts;
306
-
307
-		if ( $total_posts < 1 ) {
308
-			// Out-of-bounds, run the query again without LIMIT for total count.
309
-			unset( $query_args['paged'] );
310
-			$count_query = new WP_Query();
311
-			$count_query->query( $query_args );
312
-			$total_posts = $count_query->found_posts;
313
-		}
314
-
315
-		$max_pages = ceil( $total_posts / (int) $query_args['posts_per_page'] );
316
-
317
-		$response = rest_ensure_response( $posts );
318
-		$response->header( 'X-WP-Total', (int) $total_posts );
319
-		$response->header( 'X-WP-TotalPages', (int) $max_pages );
320
-
321
-		$request_params = $request->get_query_params();
322
-		$base = add_query_arg( $request_params, rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ) );
323
-
324
-		if ( $page > 1 ) {
325
-			$prev_page = $page - 1;
326
-			if ( $prev_page > $max_pages ) {
327
-				$prev_page = $max_pages;
328
-			}
329
-			$prev_link = add_query_arg( 'page', $prev_page, $base );
330
-			$response->link_header( 'prev', $prev_link );
331
-		}
332
-		if ( $max_pages > $page ) {
333
-			$next_page = $page + 1;
334
-			$next_link = add_query_arg( 'page', $next_page, $base );
335
-			$response->link_header( 'next', $next_link );
336
-		}
337
-
338
-		return $response;
339
-	}
340
-
341
-	/**
342
-	 * Delete a single item.
343
-	 *
344
-	 * @param WP_REST_Request $request Full details about the request.
345
-	 * @return WP_REST_Response|WP_Error
346
-	 */
347
-	public function delete_item( $request ) {
348
-
349
-		// Fetch the item.
350
-		$item = $this->get_object( $request['id'] );
351
-		if ( is_wp_error( $item ) ) {
352
-			return $item;
353
-		}
354
-
355
-		$supports_trash = EMPTY_TRASH_DAYS > 0;
356
-		$force          = $supports_trash && (bool) $request['force'];
357
-
358
-		if ( ! $this->check_post_permissions( 'delete', $item->ID ) ) {
359
-			return new WP_Error( 'cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
360
-		}
361
-
362
-		$request->set_param( 'context', 'edit' );
363
-		$response = $this->prepare_item_for_response( $item, $request );
364
-
365
-		if ( ! wp_delete_post( $item->ID, $force ) ) {
366
-			return new WP_Error( 'rest_cannot_delete', sprintf( __( 'The resource cannot be deleted.', 'invoicing' ), $this->post_type ), array( 'status' => 500 ) );
367
-		}
368
-
369
-		return $response;
370
-	}
371
-
372
-	/**
373
-	 * Prepare links for the request.
374
-	 *
375
-	 * @param GetPaid_Data    $object GetPaid_Data object.
376
-	 * @return array Links for the given object.
377
-	 */
378
-	protected function prepare_links( $object ) {
379
-
380
-		$links = parent::prepare_links( $object );
381
-
382
-		if ( is_callable( array( $object, 'get_user_id' ) ) ) {
383
-			$links['user'] = array(
384
-				'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_user_id' ) ) ),
385
-				'embeddable' => true,
386
-			);
387
-		}
388
-
389
-		if ( is_callable( array( $object, 'get_owner' ) ) ) {
390
-			$links['owner']  = array(
391
-				'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_owner' ) ) ),
392
-				'embeddable' => true,
393
-			);
394
-		}
395
-
396
-		if ( is_callable( array( $object, 'get_parent_id' ) ) && call_user_func( array( $object, 'get_parent_id' ) ) ) {
397
-			$links['parent']  = array(
398
-				'href'       => rest_url( "$this->namespace/$this->rest_base/" . call_user_func( array( $object, 'get_parent_id' ) ) ),
399
-				'embeddable' => true,
400
-			);
401
-		}
402
-
403
-		return $links;
404
-	}
405
-
406
-	/**
407
-	 * Determine the allowed query_vars for a get_items() response and
408
-	 * prepare for WP_Query.
409
-	 *
410
-	 * @param array           $prepared_args Prepared arguments.
411
-	 * @param WP_REST_Request $request Request object.
412
-	 * @return array          $query_args
413
-	 */
414
-	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
415
-
416
-		$valid_vars = array_flip( $this->get_allowed_query_vars() );
417
-		$query_args = array();
418
-		foreach ( $valid_vars as $var => $index ) {
419
-			if ( isset( $prepared_args[ $var ] ) ) {
420
-				$query_args[ $var ] = apply_filters( "getpaid_rest_query_var-{$var}", $prepared_args[ $var ], $index );
421
-			}
422
-		}
423
-
424
-		$query_args['ignore_sticky_posts'] = true;
425
-
426
-		if ( 'include' === $query_args['orderby'] ) {
427
-			$query_args['orderby'] = 'post__in';
428
-		} elseif ( 'id' === $query_args['orderby'] ) {
429
-			$query_args['orderby'] = 'ID'; // ID must be capitalized.
430
-		} elseif ( 'slug' === $query_args['orderby'] ) {
431
-			$query_args['orderby'] = 'name';
432
-		}
433
-
434
-		return apply_filters( 'getpaid_rest_prepare_items_query', $query_args, $request, $this );
435
-
436
-	}
437
-
438
-	/**
439
-	 * Get all the WP Query vars that are allowed for the API request.
440
-	 *
441
-	 * @return array
442
-	 */
443
-	protected function get_allowed_query_vars() {
444
-		global $wp;
445
-
446
-		/**
447
-		 * Filter the publicly allowed query vars.
448
-		 *
449
-		 * Allows adjusting of the default query vars that are made public.
450
-		 *
451
-		 * @param array  Array of allowed WP_Query query vars.
452
-		 */
453
-		$valid_vars = apply_filters( 'query_vars', $wp->public_query_vars );
454
-
455
-		$post_type_obj = get_post_type_object( $this->post_type );
456
-		if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
457
-			$private = apply_filters( 'getpaid_rest_private_query_vars', $wp->private_query_vars );
458
-			$valid_vars = array_merge( $valid_vars, $private );
459
-		}
460
-
461
-		// Define our own in addition to WP's normal vars.
462
-		$rest_valid = array(
463
-			'post_status',
464
-			'date_query',
465
-			'ignore_sticky_posts',
466
-			'offset',
467
-			'post__in',
468
-			'post__not_in',
469
-			'post_parent',
470
-			'post_parent__in',
471
-			'post_parent__not_in',
472
-			'posts_per_page',
473
-			'meta_query',
474
-			'tax_query',
475
-			'meta_key',
476
-			'meta_value',
477
-			'meta_compare',
478
-			'meta_value_num',
479
-		);
480
-		$valid_vars = array_merge( $valid_vars, $rest_valid );
481
-
482
-		// Filter allowed query vars for the REST API.
483
-		$valid_vars = apply_filters( 'getpaid_rest_query_vars', $valid_vars, $this );
484
-
485
-		return $valid_vars;
486
-	}
487
-
488
-	/**
489
-	 * Get the query params for collections of attachments.
490
-	 *
491
-	 * @return array
492
-	 */
493
-	public function get_collection_params() {
494
-
495
-		return array_merge(
496
-			parent::get_collection_params(),
497
-			array(
498
-				'status'  => array(
499
-					'default'           => $this->get_post_statuses(),
500
-					'description'       => __( 'Limit result set to resources assigned one or more statuses.', 'invoicing' ),
501
-					'type'              => array( 'array', 'string' ),
502
-					'items'             => array(
503
-						'enum' => $this->get_post_statuses(),
504
-						'type' => 'string',
505
-					),
506
-					'validate_callback' => 'rest_validate_request_arg',
507
-					'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
508
-				),
509
-				'after'   => array(
510
-					'description'       => __( 'Limit response to resources created after a given ISO8601 compliant date.', 'invoicing' ),
511
-					'type'              => 'string',
512
-					'format'            => 'string',
513
-					'validate_callback' => 'rest_validate_request_arg',
514
-					'sanitize_callback' => 'sanitize_text_field',
515
-				),
516
-				'before'  => array(
517
-					'description'       => __( 'Limit response to resources created before a given ISO8601 compliant date.', 'invoicing' ),
518
-					'type'              => 'string',
519
-					'format'            => 'string',
520
-					'validate_callback' => 'rest_validate_request_arg',
521
-					'sanitize_callback' => 'sanitize_text_field',
522
-				),
523
-				'exclude' => array(
524
-					'description'       => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
525
-					'type'              => 'array',
526
-					'items'             => array(
527
-						'type' => 'integer',
528
-					),
529
-					'default'           => array(),
530
-					'sanitize_callback' => 'wp_parse_id_list',
531
-					'validate_callback' => 'rest_validate_request_arg',
532
-				),
533
-				'include' => array(
534
-					'description'       => __( 'Limit result set to specific ids.', 'invoicing' ),
535
-					'type'              => 'array',
536
-					'items'             => array(
537
-						'type' => 'integer',
538
-					),
539
-					'default'           => array(),
540
-					'sanitize_callback' => 'wp_parse_id_list',
541
-					'validate_callback' => 'rest_validate_request_arg',
542
-				),
543
-				'offset'  => array(
544
-					'description'       => __( 'Offset the result set by a specific number of items.', 'invoicing' ),
545
-					'type'              => 'integer',
546
-					'sanitize_callback' => 'absint',
547
-					'validate_callback' => 'rest_validate_request_arg',
548
-				),
549
-				'order'   => array(
550
-					'description'       => __( 'Order sort attribute ascending or descending.', 'invoicing' ),
551
-					'type'              => 'string',
552
-					'default'           => 'desc',
553
-					'enum'              => array( 'asc', 'desc' ),
554
-					'validate_callback' => 'rest_validate_request_arg',
555
-				),
556
-				'orderby' => array(
557
-					'description'       => __( 'Sort collection by object attribute.', 'invoicing' ),
558
-					'type'              => 'string',
559
-					'default'           => 'date',
560
-					'enum'              => array(
561
-						'date',
562
-						'id',
563
-						'include',
564
-						'title',
565
-						'slug',
566
-						'modified',
567
-					),
568
-					'validate_callback' => 'rest_validate_request_arg',
569
-				),
570
-			)
571
-		);
572
-	}
573
-
574
-	/**
575
-	 * Retrieves the items's schema, conforming to JSON Schema.
576
-	 *
577
-	 * @since 1.0.19
578
-	 *
579
-	 * @return array Item schema data.
580
-	 */
581
-	public function get_item_schema() {
582
-
583
-		// Maybe retrieve the schema from cache.
584
-		if ( ! empty( $this->schema ) ) {
585
-			return $this->add_additional_fields_schema( $this->schema );
586
-		}
587
-
588
-		$type   = str_replace( 'wpi_', '', $this->post_type );
589
-		$schema = array(
590
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
591
-			'title'      => $this->post_type,
592
-			'type'       => 'object',
593
-			'properties' => wpinv_get_data( "$type-schema" ),
594
-		);
595
-
596
-		// Filters the invoice schema for the REST API.
220
+    /**
221
+     * Update a single object.
222
+     *
223
+     * @param WP_REST_Request $request Full details about the request.
224
+     * @return WP_Error|WP_REST_Response
225
+     */
226
+    public function update_item( $request ) {
227
+
228
+        // Create item.
229
+        $response = parent::update_item( $request );
230
+
231
+        // Fire a hook after an item is created.
232
+        if ( ! is_wp_error( $response ) ) {
233
+
234
+            /**
235
+             * Fires after a single item is created or updated via the REST API.
236
+             *
237
+             * @param WP_Post         $post      Post object.
238
+             * @param WP_REST_Request $request   Request object.
239
+             * @param boolean         $creating  True when creating item, false when updating.
240
+             */
241
+            do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, false );
242
+
243
+        }
244
+
245
+        return $response;
246
+
247
+    }
248
+
249
+    /**
250
+     * Get a collection of objects.
251
+     *
252
+     * @param WP_REST_Request $request Full details about the request.
253
+     * @return WP_Error|WP_REST_Response
254
+     */
255
+    public function get_items( $request ) {
256
+
257
+        $args                         = array();
258
+        $args['offset']               = $request['offset'];
259
+        $args['order']                = $request['order'];
260
+        $args['orderby']              = $request['orderby'];
261
+        $args['paged']                = $request['page'];
262
+        $args['post__in']             = $request['include'];
263
+        $args['post__not_in']         = $request['exclude'];
264
+        $args['posts_per_page']       = $request['per_page'];
265
+        $args['name']                 = $request['slug'];
266
+        $args['post_parent__in']      = $request['parent'];
267
+        $args['post_parent__not_in']  = $request['parent_exclude'];
268
+        $args['s']                    = $request['search'];
269
+        $args['post_status']          = wpinv_parse_list( $request['status'] );
270
+
271
+        $args['date_query'] = array();
272
+
273
+        // Set before into date query. Date query must be specified as an array of an array.
274
+        if ( isset( $request['before'] ) ) {
275
+            $args['date_query'][0]['before'] = $request['before'];
276
+        }
277
+
278
+        // Set after into date query. Date query must be specified as an array of an array.
279
+        if ( isset( $request['after'] ) ) {
280
+            $args['date_query'][0]['after'] = $request['after'];
281
+        }
282
+
283
+        // Force the post_type & fields arguments, since they're not a user input variable.
284
+        $args['post_type'] = $this->post_type;
285
+        $args['fields']    = 'ids';
286
+
287
+        // Filter the query arguments for a request.
288
+        $args       = apply_filters( "getpaid_rest_{$this->post_type}_query", $args, $request );
289
+        $query_args = $this->prepare_items_query( $args, $request );
290
+
291
+        $posts_query = new WP_Query();
292
+        $query_result = $posts_query->query( $query_args );
293
+
294
+        $posts = array();
295
+        foreach ( $query_result as $post_id ) {
296
+            if ( ! $this->check_post_permissions( 'read', $post_id ) ) {
297
+                continue;
298
+            }
299
+
300
+            $data    = $this->prepare_item_for_response( $this->get_object( $post_id ), $request );
301
+            $posts[] = $this->prepare_response_for_collection( $data );
302
+        }
303
+
304
+        $page        = (int) $query_args['paged'];
305
+        $total_posts = $posts_query->found_posts;
306
+
307
+        if ( $total_posts < 1 ) {
308
+            // Out-of-bounds, run the query again without LIMIT for total count.
309
+            unset( $query_args['paged'] );
310
+            $count_query = new WP_Query();
311
+            $count_query->query( $query_args );
312
+            $total_posts = $count_query->found_posts;
313
+        }
314
+
315
+        $max_pages = ceil( $total_posts / (int) $query_args['posts_per_page'] );
316
+
317
+        $response = rest_ensure_response( $posts );
318
+        $response->header( 'X-WP-Total', (int) $total_posts );
319
+        $response->header( 'X-WP-TotalPages', (int) $max_pages );
320
+
321
+        $request_params = $request->get_query_params();
322
+        $base = add_query_arg( $request_params, rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ) );
323
+
324
+        if ( $page > 1 ) {
325
+            $prev_page = $page - 1;
326
+            if ( $prev_page > $max_pages ) {
327
+                $prev_page = $max_pages;
328
+            }
329
+            $prev_link = add_query_arg( 'page', $prev_page, $base );
330
+            $response->link_header( 'prev', $prev_link );
331
+        }
332
+        if ( $max_pages > $page ) {
333
+            $next_page = $page + 1;
334
+            $next_link = add_query_arg( 'page', $next_page, $base );
335
+            $response->link_header( 'next', $next_link );
336
+        }
337
+
338
+        return $response;
339
+    }
340
+
341
+    /**
342
+     * Delete a single item.
343
+     *
344
+     * @param WP_REST_Request $request Full details about the request.
345
+     * @return WP_REST_Response|WP_Error
346
+     */
347
+    public function delete_item( $request ) {
348
+
349
+        // Fetch the item.
350
+        $item = $this->get_object( $request['id'] );
351
+        if ( is_wp_error( $item ) ) {
352
+            return $item;
353
+        }
354
+
355
+        $supports_trash = EMPTY_TRASH_DAYS > 0;
356
+        $force          = $supports_trash && (bool) $request['force'];
357
+
358
+        if ( ! $this->check_post_permissions( 'delete', $item->ID ) ) {
359
+            return new WP_Error( 'cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
360
+        }
361
+
362
+        $request->set_param( 'context', 'edit' );
363
+        $response = $this->prepare_item_for_response( $item, $request );
364
+
365
+        if ( ! wp_delete_post( $item->ID, $force ) ) {
366
+            return new WP_Error( 'rest_cannot_delete', sprintf( __( 'The resource cannot be deleted.', 'invoicing' ), $this->post_type ), array( 'status' => 500 ) );
367
+        }
368
+
369
+        return $response;
370
+    }
371
+
372
+    /**
373
+     * Prepare links for the request.
374
+     *
375
+     * @param GetPaid_Data    $object GetPaid_Data object.
376
+     * @return array Links for the given object.
377
+     */
378
+    protected function prepare_links( $object ) {
379
+
380
+        $links = parent::prepare_links( $object );
381
+
382
+        if ( is_callable( array( $object, 'get_user_id' ) ) ) {
383
+            $links['user'] = array(
384
+                'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_user_id' ) ) ),
385
+                'embeddable' => true,
386
+            );
387
+        }
388
+
389
+        if ( is_callable( array( $object, 'get_owner' ) ) ) {
390
+            $links['owner']  = array(
391
+                'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_owner' ) ) ),
392
+                'embeddable' => true,
393
+            );
394
+        }
395
+
396
+        if ( is_callable( array( $object, 'get_parent_id' ) ) && call_user_func( array( $object, 'get_parent_id' ) ) ) {
397
+            $links['parent']  = array(
398
+                'href'       => rest_url( "$this->namespace/$this->rest_base/" . call_user_func( array( $object, 'get_parent_id' ) ) ),
399
+                'embeddable' => true,
400
+            );
401
+        }
402
+
403
+        return $links;
404
+    }
405
+
406
+    /**
407
+     * Determine the allowed query_vars for a get_items() response and
408
+     * prepare for WP_Query.
409
+     *
410
+     * @param array           $prepared_args Prepared arguments.
411
+     * @param WP_REST_Request $request Request object.
412
+     * @return array          $query_args
413
+     */
414
+    protected function prepare_items_query( $prepared_args = array(), $request = null ) {
415
+
416
+        $valid_vars = array_flip( $this->get_allowed_query_vars() );
417
+        $query_args = array();
418
+        foreach ( $valid_vars as $var => $index ) {
419
+            if ( isset( $prepared_args[ $var ] ) ) {
420
+                $query_args[ $var ] = apply_filters( "getpaid_rest_query_var-{$var}", $prepared_args[ $var ], $index );
421
+            }
422
+        }
423
+
424
+        $query_args['ignore_sticky_posts'] = true;
425
+
426
+        if ( 'include' === $query_args['orderby'] ) {
427
+            $query_args['orderby'] = 'post__in';
428
+        } elseif ( 'id' === $query_args['orderby'] ) {
429
+            $query_args['orderby'] = 'ID'; // ID must be capitalized.
430
+        } elseif ( 'slug' === $query_args['orderby'] ) {
431
+            $query_args['orderby'] = 'name';
432
+        }
433
+
434
+        return apply_filters( 'getpaid_rest_prepare_items_query', $query_args, $request, $this );
435
+
436
+    }
437
+
438
+    /**
439
+     * Get all the WP Query vars that are allowed for the API request.
440
+     *
441
+     * @return array
442
+     */
443
+    protected function get_allowed_query_vars() {
444
+        global $wp;
445
+
446
+        /**
447
+         * Filter the publicly allowed query vars.
448
+         *
449
+         * Allows adjusting of the default query vars that are made public.
450
+         *
451
+         * @param array  Array of allowed WP_Query query vars.
452
+         */
453
+        $valid_vars = apply_filters( 'query_vars', $wp->public_query_vars );
454
+
455
+        $post_type_obj = get_post_type_object( $this->post_type );
456
+        if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
457
+            $private = apply_filters( 'getpaid_rest_private_query_vars', $wp->private_query_vars );
458
+            $valid_vars = array_merge( $valid_vars, $private );
459
+        }
460
+
461
+        // Define our own in addition to WP's normal vars.
462
+        $rest_valid = array(
463
+            'post_status',
464
+            'date_query',
465
+            'ignore_sticky_posts',
466
+            'offset',
467
+            'post__in',
468
+            'post__not_in',
469
+            'post_parent',
470
+            'post_parent__in',
471
+            'post_parent__not_in',
472
+            'posts_per_page',
473
+            'meta_query',
474
+            'tax_query',
475
+            'meta_key',
476
+            'meta_value',
477
+            'meta_compare',
478
+            'meta_value_num',
479
+        );
480
+        $valid_vars = array_merge( $valid_vars, $rest_valid );
481
+
482
+        // Filter allowed query vars for the REST API.
483
+        $valid_vars = apply_filters( 'getpaid_rest_query_vars', $valid_vars, $this );
484
+
485
+        return $valid_vars;
486
+    }
487
+
488
+    /**
489
+     * Get the query params for collections of attachments.
490
+     *
491
+     * @return array
492
+     */
493
+    public function get_collection_params() {
494
+
495
+        return array_merge(
496
+            parent::get_collection_params(),
497
+            array(
498
+                'status'  => array(
499
+                    'default'           => $this->get_post_statuses(),
500
+                    'description'       => __( 'Limit result set to resources assigned one or more statuses.', 'invoicing' ),
501
+                    'type'              => array( 'array', 'string' ),
502
+                    'items'             => array(
503
+                        'enum' => $this->get_post_statuses(),
504
+                        'type' => 'string',
505
+                    ),
506
+                    'validate_callback' => 'rest_validate_request_arg',
507
+                    'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
508
+                ),
509
+                'after'   => array(
510
+                    'description'       => __( 'Limit response to resources created after a given ISO8601 compliant date.', 'invoicing' ),
511
+                    'type'              => 'string',
512
+                    'format'            => 'string',
513
+                    'validate_callback' => 'rest_validate_request_arg',
514
+                    'sanitize_callback' => 'sanitize_text_field',
515
+                ),
516
+                'before'  => array(
517
+                    'description'       => __( 'Limit response to resources created before a given ISO8601 compliant date.', 'invoicing' ),
518
+                    'type'              => 'string',
519
+                    'format'            => 'string',
520
+                    'validate_callback' => 'rest_validate_request_arg',
521
+                    'sanitize_callback' => 'sanitize_text_field',
522
+                ),
523
+                'exclude' => array(
524
+                    'description'       => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
525
+                    'type'              => 'array',
526
+                    'items'             => array(
527
+                        'type' => 'integer',
528
+                    ),
529
+                    'default'           => array(),
530
+                    'sanitize_callback' => 'wp_parse_id_list',
531
+                    'validate_callback' => 'rest_validate_request_arg',
532
+                ),
533
+                'include' => array(
534
+                    'description'       => __( 'Limit result set to specific ids.', 'invoicing' ),
535
+                    'type'              => 'array',
536
+                    'items'             => array(
537
+                        'type' => 'integer',
538
+                    ),
539
+                    'default'           => array(),
540
+                    'sanitize_callback' => 'wp_parse_id_list',
541
+                    'validate_callback' => 'rest_validate_request_arg',
542
+                ),
543
+                'offset'  => array(
544
+                    'description'       => __( 'Offset the result set by a specific number of items.', 'invoicing' ),
545
+                    'type'              => 'integer',
546
+                    'sanitize_callback' => 'absint',
547
+                    'validate_callback' => 'rest_validate_request_arg',
548
+                ),
549
+                'order'   => array(
550
+                    'description'       => __( 'Order sort attribute ascending or descending.', 'invoicing' ),
551
+                    'type'              => 'string',
552
+                    'default'           => 'desc',
553
+                    'enum'              => array( 'asc', 'desc' ),
554
+                    'validate_callback' => 'rest_validate_request_arg',
555
+                ),
556
+                'orderby' => array(
557
+                    'description'       => __( 'Sort collection by object attribute.', 'invoicing' ),
558
+                    'type'              => 'string',
559
+                    'default'           => 'date',
560
+                    'enum'              => array(
561
+                        'date',
562
+                        'id',
563
+                        'include',
564
+                        'title',
565
+                        'slug',
566
+                        'modified',
567
+                    ),
568
+                    'validate_callback' => 'rest_validate_request_arg',
569
+                ),
570
+            )
571
+        );
572
+    }
573
+
574
+    /**
575
+     * Retrieves the items's schema, conforming to JSON Schema.
576
+     *
577
+     * @since 1.0.19
578
+     *
579
+     * @return array Item schema data.
580
+     */
581
+    public function get_item_schema() {
582
+
583
+        // Maybe retrieve the schema from cache.
584
+        if ( ! empty( $this->schema ) ) {
585
+            return $this->add_additional_fields_schema( $this->schema );
586
+        }
587
+
588
+        $type   = str_replace( 'wpi_', '', $this->post_type );
589
+        $schema = array(
590
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
591
+            'title'      => $this->post_type,
592
+            'type'       => 'object',
593
+            'properties' => wpinv_get_data( "$type-schema" ),
594
+        );
595
+
596
+        // Filters the invoice schema for the REST API.
597 597
         $schema = apply_filters( "wpinv_rest_{$type}_schema", $schema );
598 598
 
599
-		// Cache the invoice schema.
600
-		$this->schema = $schema;
601
-
602
-		return $this->add_additional_fields_schema( $this->schema );
603
-	}
604
-
605
-	/**
606
-	 * Sanitizes and validates the list of post statuses.
607
-	 *
608
-	 * @since 1.0.13
609
-	 *
610
-	 * @param string|array    $statuses  One or more post statuses.
611
-	 * @param WP_REST_Request $request   Full details about the request.
612
-	 * @param string          $parameter Additional parameter to pass to validation.
613
-	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
614
-	 */
615
-	public function sanitize_post_statuses( $statuses, $request, $parameter ) {
616
-		return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
617
-	}
618
-
619
-	/**
620
-	 * Retrieves a valid list of post statuses.
621
-	 *
622
-	 * @since 1.0.19
623
-	 *
624
-	 * @return array A list of registered item statuses.
625
-	 */
626
-	public function get_post_statuses() {
627
-		return get_post_stati();
628
-	}
629
-
630
-	/**
631
-	 * Checks if a key should be included in a response.
632
-	 *
633
-	 * @since  1.0.19
634
-	 * @param  GetPaid_Data $object  Data object.
635
-	 * @param  string       $field_key The key to check for.
636
-	 * @return bool
637
-	 */
638
-	public function object_supports_field( $object, $field_key ) {
639
-		$supports = parent::object_supports_field( $object, $field_key );
640
-		return apply_filters( "getpaid_rest_{$this->post_type}_object_supports_key", $supports, $object, $field_key );
641
-	}
599
+        // Cache the invoice schema.
600
+        $this->schema = $schema;
601
+
602
+        return $this->add_additional_fields_schema( $this->schema );
603
+    }
604
+
605
+    /**
606
+     * Sanitizes and validates the list of post statuses.
607
+     *
608
+     * @since 1.0.13
609
+     *
610
+     * @param string|array    $statuses  One or more post statuses.
611
+     * @param WP_REST_Request $request   Full details about the request.
612
+     * @param string          $parameter Additional parameter to pass to validation.
613
+     * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
614
+     */
615
+    public function sanitize_post_statuses( $statuses, $request, $parameter ) {
616
+        return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
617
+    }
618
+
619
+    /**
620
+     * Retrieves a valid list of post statuses.
621
+     *
622
+     * @since 1.0.19
623
+     *
624
+     * @return array A list of registered item statuses.
625
+     */
626
+    public function get_post_statuses() {
627
+        return get_post_stati();
628
+    }
629
+
630
+    /**
631
+     * Checks if a key should be included in a response.
632
+     *
633
+     * @since  1.0.19
634
+     * @param  GetPaid_Data $object  Data object.
635
+     * @param  string       $field_key The key to check for.
636
+     * @return bool
637
+     */
638
+    public function object_supports_field( $object, $field_key ) {
639
+        $supports = parent::object_supports_field( $object, $field_key );
640
+        return apply_filters( "getpaid_rest_{$this->post_type}_object_supports_key", $supports, $object, $field_key );
641
+    }
642 642
 
643 643
 }
Please login to merge, or discard this patch.
includes/class-wpinv-db.php 1 patch
Indentation   +232 added lines, -232 removed lines patch added patch discarded remove patch
@@ -7,237 +7,237 @@
 block discarded – undo
7 7
 
8 8
 abstract class Wpinv_DB {
9 9
 
10
-	/**
11
-	 * The name of our database table
12
-	 *
13
-	 * @access  public
14
-	 * @since   1.0.0
15
-	 */
16
-	public $table_name;
17
-
18
-	/**
19
-	 * The version of our database table
20
-	 *
21
-	 * @access  public
22
-	 * @since   1.0.0
23
-	 */
24
-	public $version;
25
-
26
-	/**
27
-	 * The name of the primary column
28
-	 *
29
-	 * @access  public
30
-	 * @since   1.0.0
31
-	 */
32
-	public $primary_key;
33
-
34
-	/**
35
-	 * Get things started
36
-	 *
37
-	 * @access  public
38
-	 * @since   1.0.0
39
-	 */
40
-	public function __construct() {}
41
-
42
-	/**
43
-	 * Whitelist of columns
44
-	 *
45
-	 * @access  public
46
-	 * @since   1.0.0
47
-	 * @return  array
48
-	 */
49
-	public function get_columns() {
50
-		return array();
51
-	}
52
-
53
-	/**
54
-	 * Default column values
55
-	 *
56
-	 * @access  public
57
-	 * @since   1.0.0
58
-	 * @return  array
59
-	 */
60
-	public function get_column_defaults() {
61
-		return array();
62
-	}
63
-
64
-	/**
65
-	 * Retrieve a row by the primary key
66
-	 *
67
-	 * @access  public
68
-	 * @since   1.0.0
69
-	 * @return  object
70
-	 */
71
-	public function get( $row_id ) {
72
-		global $wpdb;
73
-		return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
74
-	}
75
-
76
-	/**
77
-	 * Retrieve a row by a specific column / value
78
-	 *
79
-	 * @access  public
80
-	 * @since   1.0.0
81
-	 * @return  object
82
-	 */
83
-	public function get_by( $column, $row_id ) {
84
-		global $wpdb;
85
-		$column = esc_sql( $column );
86
-		return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", $row_id ) );
87
-	}
88
-
89
-	/**
90
-	 * Retrieve a specific column's value by the primary key
91
-	 *
92
-	 * @access  public
93
-	 * @since   1.0.0
94
-	 * @return  string
95
-	 */
96
-	public function get_column( $column, $row_id ) {
97
-		global $wpdb;
98
-		$column = esc_sql( $column );
99
-		return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
100
-	}
101
-
102
-	/**
103
-	 * Retrieve a specific column's value by the the specified column / value
104
-	 *
105
-	 * @access  public
106
-	 * @since   1.0.0
107
-	 * @return  string
108
-	 */
109
-	public function get_column_by( $column, $column_where, $column_value ) {
110
-		global $wpdb;
111
-		$column_where = esc_sql( $column_where );
112
-		$column       = esc_sql( $column );
113
-		return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $column_where = %s LIMIT 1;", $column_value ) );
114
-	}
115
-
116
-	/**
117
-	 * Insert a new row
118
-	 *
119
-	 * @access  public
120
-	 * @since   1.0.0
121
-	 * @return  int
122
-	 */
123
-	public function insert( $data, $type = '' ) {
124
-		global $wpdb;
125
-
126
-		// Set default values
127
-		$data = wp_parse_args( $data, $this->get_column_defaults() );
128
-
129
-		do_action( 'wpinv_pre_insert_' . $type, $data );
130
-
131
-		// Initialise column format array
132
-		$column_formats = $this->get_columns();
133
-
134
-		// Force fields to lower case
135
-		$data = array_change_key_case( $data );
136
-
137
-		// White list columns
138
-		$data = array_intersect_key( $data, $column_formats );
139
-
140
-		// Reorder $column_formats to match the order of columns given in $data
141
-		$data_keys = array_keys( $data );
142
-		$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
143
-
144
-		$wpdb->insert( $this->table_name, $data, $column_formats );
145
-		$wpdb_insert_id = $wpdb->insert_id;
146
-
147
-		do_action( 'wpinv_post_insert_' . $type, $wpdb_insert_id, $data );
148
-
149
-		return $wpdb_insert_id;
150
-	}
151
-
152
-	/**
153
-	 * Update a row
154
-	 *
155
-	 * @access  public
156
-	 * @since   1.0.0
157
-	 * @return  bool
158
-	 */
159
-	public function update( $row_id, $data = array(), $where = '' ) {
160
-
161
-		global $wpdb;
162
-
163
-		// Row ID must be positive integer
164
-		$row_id = absint( $row_id );
165
-
166
-		if ( empty( $row_id ) ) {
167
-			return false;
168
-		}
169
-
170
-		if ( empty( $where ) ) {
171
-			$where = $this->primary_key;
172
-		}
173
-
174
-		// Initialise column format array
175
-		$column_formats = $this->get_columns();
176
-
177
-		// Force fields to lower case
178
-		$data = array_change_key_case( $data );
179
-
180
-		// White list columns
181
-		$data = array_intersect_key( $data, $column_formats );
182
-
183
-		// Reorder $column_formats to match the order of columns given in $data
184
-		$data_keys = array_keys( $data );
185
-		$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
186
-
187
-		if ( false === $wpdb->update( $this->table_name, $data, array( $where => $row_id ), $column_formats ) ) {
188
-			return false;
189
-		}
190
-
191
-		return true;
192
-	}
193
-
194
-	/**
195
-	 * Delete a row identified by the primary key
196
-	 *
197
-	 * @access  public
198
-	 * @since   1.0.0
199
-	 * @return  bool
200
-	 */
201
-	public function delete( $row_id = 0 ) {
202
-
203
-		global $wpdb;
204
-
205
-		// Row ID must be positive integer
206
-		$row_id = absint( $row_id );
207
-
208
-		if ( empty( $row_id ) ) {
209
-			return false;
210
-		}
211
-
212
-		if ( false === $wpdb->query( $wpdb->prepare( "DELETE FROM $this->table_name WHERE $this->primary_key = %d", $row_id ) ) ) {
213
-			return false;
214
-		}
215
-
216
-		return true;
217
-	}
218
-
219
-	/**
220
-	 * Check if the given table exists
221
-	 *
222
-	 * @since  2.4
223
-	 * @param  string $table The table name
224
-	 * @return bool          If the table name exists
225
-	 */
226
-	public function table_exists( $table ) {
227
-		global $wpdb;
228
-		$table = sanitize_text_field( $table );
229
-
230
-		return $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE '%s'", $table ) ) === $table;
231
-	}
232
-
233
-	/**
234
-	 * Check if the table was ever installed
235
-	 *
236
-	 * @since  2.4
237
-	 * @return bool Returns if the customers table was installed and upgrade routine run
238
-	 */
239
-	public function installed() {
240
-		return $this->table_exists( $this->table_name );
241
-	}
10
+    /**
11
+     * The name of our database table
12
+     *
13
+     * @access  public
14
+     * @since   1.0.0
15
+     */
16
+    public $table_name;
17
+
18
+    /**
19
+     * The version of our database table
20
+     *
21
+     * @access  public
22
+     * @since   1.0.0
23
+     */
24
+    public $version;
25
+
26
+    /**
27
+     * The name of the primary column
28
+     *
29
+     * @access  public
30
+     * @since   1.0.0
31
+     */
32
+    public $primary_key;
33
+
34
+    /**
35
+     * Get things started
36
+     *
37
+     * @access  public
38
+     * @since   1.0.0
39
+     */
40
+    public function __construct() {}
41
+
42
+    /**
43
+     * Whitelist of columns
44
+     *
45
+     * @access  public
46
+     * @since   1.0.0
47
+     * @return  array
48
+     */
49
+    public function get_columns() {
50
+        return array();
51
+    }
52
+
53
+    /**
54
+     * Default column values
55
+     *
56
+     * @access  public
57
+     * @since   1.0.0
58
+     * @return  array
59
+     */
60
+    public function get_column_defaults() {
61
+        return array();
62
+    }
63
+
64
+    /**
65
+     * Retrieve a row by the primary key
66
+     *
67
+     * @access  public
68
+     * @since   1.0.0
69
+     * @return  object
70
+     */
71
+    public function get( $row_id ) {
72
+        global $wpdb;
73
+        return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
74
+    }
75
+
76
+    /**
77
+     * Retrieve a row by a specific column / value
78
+     *
79
+     * @access  public
80
+     * @since   1.0.0
81
+     * @return  object
82
+     */
83
+    public function get_by( $column, $row_id ) {
84
+        global $wpdb;
85
+        $column = esc_sql( $column );
86
+        return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", $row_id ) );
87
+    }
88
+
89
+    /**
90
+     * Retrieve a specific column's value by the primary key
91
+     *
92
+     * @access  public
93
+     * @since   1.0.0
94
+     * @return  string
95
+     */
96
+    public function get_column( $column, $row_id ) {
97
+        global $wpdb;
98
+        $column = esc_sql( $column );
99
+        return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
100
+    }
101
+
102
+    /**
103
+     * Retrieve a specific column's value by the the specified column / value
104
+     *
105
+     * @access  public
106
+     * @since   1.0.0
107
+     * @return  string
108
+     */
109
+    public function get_column_by( $column, $column_where, $column_value ) {
110
+        global $wpdb;
111
+        $column_where = esc_sql( $column_where );
112
+        $column       = esc_sql( $column );
113
+        return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $column_where = %s LIMIT 1;", $column_value ) );
114
+    }
115
+
116
+    /**
117
+     * Insert a new row
118
+     *
119
+     * @access  public
120
+     * @since   1.0.0
121
+     * @return  int
122
+     */
123
+    public function insert( $data, $type = '' ) {
124
+        global $wpdb;
125
+
126
+        // Set default values
127
+        $data = wp_parse_args( $data, $this->get_column_defaults() );
128
+
129
+        do_action( 'wpinv_pre_insert_' . $type, $data );
130
+
131
+        // Initialise column format array
132
+        $column_formats = $this->get_columns();
133
+
134
+        // Force fields to lower case
135
+        $data = array_change_key_case( $data );
136
+
137
+        // White list columns
138
+        $data = array_intersect_key( $data, $column_formats );
139
+
140
+        // Reorder $column_formats to match the order of columns given in $data
141
+        $data_keys = array_keys( $data );
142
+        $column_formats = array_merge( array_flip( $data_keys ), $column_formats );
143
+
144
+        $wpdb->insert( $this->table_name, $data, $column_formats );
145
+        $wpdb_insert_id = $wpdb->insert_id;
146
+
147
+        do_action( 'wpinv_post_insert_' . $type, $wpdb_insert_id, $data );
148
+
149
+        return $wpdb_insert_id;
150
+    }
151
+
152
+    /**
153
+     * Update a row
154
+     *
155
+     * @access  public
156
+     * @since   1.0.0
157
+     * @return  bool
158
+     */
159
+    public function update( $row_id, $data = array(), $where = '' ) {
160
+
161
+        global $wpdb;
162
+
163
+        // Row ID must be positive integer
164
+        $row_id = absint( $row_id );
165
+
166
+        if ( empty( $row_id ) ) {
167
+            return false;
168
+        }
169
+
170
+        if ( empty( $where ) ) {
171
+            $where = $this->primary_key;
172
+        }
173
+
174
+        // Initialise column format array
175
+        $column_formats = $this->get_columns();
176
+
177
+        // Force fields to lower case
178
+        $data = array_change_key_case( $data );
179
+
180
+        // White list columns
181
+        $data = array_intersect_key( $data, $column_formats );
182
+
183
+        // Reorder $column_formats to match the order of columns given in $data
184
+        $data_keys = array_keys( $data );
185
+        $column_formats = array_merge( array_flip( $data_keys ), $column_formats );
186
+
187
+        if ( false === $wpdb->update( $this->table_name, $data, array( $where => $row_id ), $column_formats ) ) {
188
+            return false;
189
+        }
190
+
191
+        return true;
192
+    }
193
+
194
+    /**
195
+     * Delete a row identified by the primary key
196
+     *
197
+     * @access  public
198
+     * @since   1.0.0
199
+     * @return  bool
200
+     */
201
+    public function delete( $row_id = 0 ) {
202
+
203
+        global $wpdb;
204
+
205
+        // Row ID must be positive integer
206
+        $row_id = absint( $row_id );
207
+
208
+        if ( empty( $row_id ) ) {
209
+            return false;
210
+        }
211
+
212
+        if ( false === $wpdb->query( $wpdb->prepare( "DELETE FROM $this->table_name WHERE $this->primary_key = %d", $row_id ) ) ) {
213
+            return false;
214
+        }
215
+
216
+        return true;
217
+    }
218
+
219
+    /**
220
+     * Check if the given table exists
221
+     *
222
+     * @since  2.4
223
+     * @param  string $table The table name
224
+     * @return bool          If the table name exists
225
+     */
226
+    public function table_exists( $table ) {
227
+        global $wpdb;
228
+        $table = sanitize_text_field( $table );
229
+
230
+        return $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE '%s'", $table ) ) === $table;
231
+    }
232
+
233
+    /**
234
+     * Check if the table was ever installed
235
+     *
236
+     * @since  2.4
237
+     * @return bool Returns if the customers table was installed and upgrade routine run
238
+     */
239
+    public function installed() {
240
+        return $this->table_exists( $this->table_name );
241
+    }
242 242
 
243 243
 }
Please login to merge, or discard this patch.
includes/wpinv-general-functions.php 1 patch
Indentation   +73 added lines, -73 removed lines patch added patch discarded remove patch
@@ -31,16 +31,16 @@  discard block
 block discarded – undo
31 31
 }
32 32
 
33 33
 function wpinv_can_checkout() {
34
-	$can_checkout = true; // Always true for now
34
+    $can_checkout = true; // Always true for now
35 35
 
36
-	return (bool) apply_filters( 'wpinv_can_checkout', $can_checkout );
36
+    return (bool) apply_filters( 'wpinv_can_checkout', $can_checkout );
37 37
 }
38 38
 
39 39
 function wpinv_get_success_page_uri() {
40
-	$page_id = wpinv_get_option( 'success_page', 0 );
41
-	$page_id = absint( $page_id );
40
+    $page_id = wpinv_get_option( 'success_page', 0 );
41
+    $page_id = absint( $page_id );
42 42
 
43
-	return apply_filters( 'wpinv_get_success_page_uri', get_permalink( $page_id ) );
43
+    return apply_filters( 'wpinv_get_success_page_uri', get_permalink( $page_id ) );
44 44
 }
45 45
 
46 46
 /**
@@ -51,22 +51,22 @@  discard block
 block discarded – undo
51 51
  */
52 52
 function wpinv_get_history_page_uri( $post_type = 'wpi_invoice' ) {
53 53
     $post_type = sanitize_key( str_replace( 'wpi_', '', $post_type ) );
54
-	$page_id   = wpinv_get_option( "{$post_type}_history_page", 0 );
55
-	$page_id   = absint( $page_id );
56
-	return apply_filters( 'wpinv_get_history_page_uri', get_permalink( $page_id ), $post_type );
54
+    $page_id   = wpinv_get_option( "{$post_type}_history_page", 0 );
55
+    $page_id   = absint( $page_id );
56
+    return apply_filters( 'wpinv_get_history_page_uri', get_permalink( $page_id ), $post_type );
57 57
 }
58 58
 
59 59
 function wpinv_is_success_page() {
60
-	$is_success_page = wpinv_get_option( 'success_page', false );
61
-	$is_success_page = ! empty( $is_success_page ) ? is_page( $is_success_page ) : false;
60
+    $is_success_page = wpinv_get_option( 'success_page', false );
61
+    $is_success_page = ! empty( $is_success_page ) ? is_page( $is_success_page ) : false;
62 62
 
63
-	return apply_filters( 'wpinv_is_success_page', $is_success_page );
63
+    return apply_filters( 'wpinv_is_success_page', $is_success_page );
64 64
 }
65 65
 
66 66
 function wpinv_is_invoice_history_page() {
67
-	$ret = wpinv_get_option( 'invoice_history_page', false );
68
-	$ret = $ret ? is_page( $ret ) : false;
69
-	return apply_filters( 'wpinv_is_invoice_history_page', $ret );
67
+    $ret = wpinv_get_option( 'invoice_history_page', false );
68
+    $ret = $ret ? is_page( $ret ) : false;
69
+    return apply_filters( 'wpinv_is_invoice_history_page', $ret );
70 70
 }
71 71
 
72 72
 function wpinv_is_subscriptions_history_page() {
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 }
93 93
 
94 94
 function wpinv_send_to_failed_page( $args = null ) {
95
-	$redirect = wpinv_get_failed_transaction_uri();
95
+    $redirect = wpinv_get_failed_transaction_uri();
96 96
 
97 97
     if ( ! empty( $args ) ) {
98 98
         // Check for backward compatibility
@@ -113,58 +113,58 @@  discard block
 block discarded – undo
113 113
 }
114 114
 
115 115
 function wpinv_get_checkout_uri( $args = array() ) {
116
-	$uri = wpinv_get_option( 'checkout_page', false );
117
-	$uri = isset( $uri ) ? get_permalink( $uri ) : null;
116
+    $uri = wpinv_get_option( 'checkout_page', false );
117
+    $uri = isset( $uri ) ? get_permalink( $uri ) : null;
118 118
 
119
-	if ( ! empty( $args ) ) {
120
-		// Check for backward compatibility
121
-		if ( is_string( $args ) ) {
122
-			$args = str_replace( '?', '', $args );
119
+    if ( ! empty( $args ) ) {
120
+        // Check for backward compatibility
121
+        if ( is_string( $args ) ) {
122
+            $args = str_replace( '?', '', $args );
123 123
         }
124 124
 
125
-		$args = wp_parse_args( $args );
125
+        $args = wp_parse_args( $args );
126 126
 
127
-		$uri = add_query_arg( $args, $uri );
128
-	}
127
+        $uri = add_query_arg( $args, $uri );
128
+    }
129 129
 
130
-	$scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin';
130
+    $scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin';
131 131
 
132
-	$ajax_url = admin_url( 'admin-ajax.php', $scheme );
132
+    $ajax_url = admin_url( 'admin-ajax.php', $scheme );
133 133
 
134
-	if ( ( ! preg_match( '/^https/', $uri ) && preg_match( '/^https/', $ajax_url ) ) || wpinv_is_ssl_enforced() ) {
135
-		$uri = preg_replace( '/^http:/', 'https:', $uri );
136
-	}
134
+    if ( ( ! preg_match( '/^https/', $uri ) && preg_match( '/^https/', $ajax_url ) ) || wpinv_is_ssl_enforced() ) {
135
+        $uri = preg_replace( '/^http:/', 'https:', $uri );
136
+    }
137 137
 
138
-	return apply_filters( 'wpinv_get_checkout_uri', $uri );
138
+    return apply_filters( 'wpinv_get_checkout_uri', $uri );
139 139
 }
140 140
 
141 141
 function wpinv_get_success_page_url( $query_string = null ) {
142
-	$success_page = wpinv_get_option( 'success_page', 0 );
143
-	$success_page = get_permalink( $success_page );
142
+    $success_page = wpinv_get_option( 'success_page', 0 );
143
+    $success_page = get_permalink( $success_page );
144 144
 
145
-	if ( $query_string ) {
146
-		$success_page .= $query_string;
145
+    if ( $query_string ) {
146
+        $success_page .= $query_string;
147 147
     }
148 148
 
149
-	return apply_filters( 'wpinv_success_page_url', $success_page );
149
+    return apply_filters( 'wpinv_success_page_url', $success_page );
150 150
 }
151 151
 
152 152
 function wpinv_get_failed_transaction_uri( $extras = false ) {
153
-	$uri = wpinv_get_option( 'failure_page', '' );
154
-	$uri = ! empty( $uri ) ? trailingslashit( get_permalink( $uri ) ) : home_url();
153
+    $uri = wpinv_get_option( 'failure_page', '' );
154
+    $uri = ! empty( $uri ) ? trailingslashit( get_permalink( $uri ) ) : home_url();
155 155
 
156
-	if ( $extras ) {
157
-		$uri .= $extras;
156
+    if ( $extras ) {
157
+        $uri .= $extras;
158 158
     }
159 159
 
160
-	return apply_filters( 'wpinv_get_failed_transaction_uri', $uri );
160
+    return apply_filters( 'wpinv_get_failed_transaction_uri', $uri );
161 161
 }
162 162
 
163 163
 function wpinv_is_failed_transaction_page() {
164
-	$ret = wpinv_get_option( 'failure_page', false );
165
-	$ret = isset( $ret ) ? is_page( $ret ) : false;
164
+    $ret = wpinv_get_option( 'failure_page', false );
165
+    $ret = isset( $ret ) ? is_page( $ret ) : false;
166 166
 
167
-	return apply_filters( 'wpinv_is_failure_page', $ret );
167
+    return apply_filters( 'wpinv_is_failure_page', $ret );
168 168
 }
169 169
 
170 170
 function wpinv_transaction_query( $type = 'start' ) {
@@ -244,36 +244,36 @@  discard block
 block discarded – undo
244 244
     $require_billing_details = apply_filters( 'wpinv_checkout_required_billing_details', wpinv_use_taxes() );
245 245
 
246 246
     if ( $require_billing_details ) {
247
-		if ( (bool)wpinv_get_option( 'fname_mandatory' ) ) {
248
-			$required_fields['first_name'] = array(
249
-				'error_id'      => 'invalid_first_name',
250
-				'error_message' => __( 'Please enter your first name', 'invoicing' ),
251
-			);
252
-		}
253
-		if ( (bool)wpinv_get_option( 'address_mandatory' ) ) {
254
-			$required_fields['address'] = array(
255
-				'error_id'      => 'invalid_address',
256
-				'error_message' => __( 'Please enter your address', 'invoicing' ),
257
-			);
258
-		}
259
-		if ( (bool)wpinv_get_option( 'city_mandatory' ) ) {
260
-			$required_fields['city'] = array(
261
-				'error_id'      => 'invalid_city',
262
-				'error_message' => __( 'Please enter your billing city', 'invoicing' ),
263
-			);
264
-		}
265
-		if ( (bool)wpinv_get_option( 'state_mandatory' ) ) {
266
-			$required_fields['state'] = array(
267
-				'error_id'      => 'invalid_state',
268
-				'error_message' => __( 'Please enter billing state / province', 'invoicing' ),
269
-			);
270
-		}
271
-		if ( (bool)wpinv_get_option( 'country_mandatory' ) ) {
272
-			$required_fields['country'] = array(
273
-				'error_id'      => 'invalid_country',
274
-				'error_message' => __( 'Please select your billing country', 'invoicing' ),
275
-			);
276
-		}
247
+        if ( (bool)wpinv_get_option( 'fname_mandatory' ) ) {
248
+            $required_fields['first_name'] = array(
249
+                'error_id'      => 'invalid_first_name',
250
+                'error_message' => __( 'Please enter your first name', 'invoicing' ),
251
+            );
252
+        }
253
+        if ( (bool)wpinv_get_option( 'address_mandatory' ) ) {
254
+            $required_fields['address'] = array(
255
+                'error_id'      => 'invalid_address',
256
+                'error_message' => __( 'Please enter your address', 'invoicing' ),
257
+            );
258
+        }
259
+        if ( (bool)wpinv_get_option( 'city_mandatory' ) ) {
260
+            $required_fields['city'] = array(
261
+                'error_id'      => 'invalid_city',
262
+                'error_message' => __( 'Please enter your billing city', 'invoicing' ),
263
+            );
264
+        }
265
+        if ( (bool)wpinv_get_option( 'state_mandatory' ) ) {
266
+            $required_fields['state'] = array(
267
+                'error_id'      => 'invalid_state',
268
+                'error_message' => __( 'Please enter billing state / province', 'invoicing' ),
269
+            );
270
+        }
271
+        if ( (bool)wpinv_get_option( 'country_mandatory' ) ) {
272
+            $required_fields['country'] = array(
273
+                'error_id'      => 'invalid_country',
274
+                'error_message' => __( 'Please select your billing country', 'invoicing' ),
275
+            );
276
+        }
277 277
     }
278 278
 
279 279
     return apply_filters( 'wpinv_checkout_required_fields', $required_fields );
Please login to merge, or discard this patch.
includes/wpinv-email-functions.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -109,8 +109,8 @@  discard block
 block discarded – undo
109 109
     $css = getpaid_get_email_css();
110 110
 
111 111
     // include css inliner
112
-	if ( ! class_exists( 'Emogrifier' ) ) {
113
-		include_once WPINV_PLUGIN_DIR . 'includes/libraries/class-emogrifier.php';
112
+    if ( ! class_exists( 'Emogrifier' ) ) {
113
+        include_once WPINV_PLUGIN_DIR . 'includes/libraries/class-emogrifier.php';
114 114
     }
115 115
 
116 116
     // Inline the css.
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
     $message = wpinv_email_style_body( $message );
190 190
     $to      = array_merge( wpinv_parse_list( $to ), wpinv_parse_list( $cc ) );
191 191
 
192
-	return $mailer->send(
192
+    return $mailer->send(
193 193
         $to,
194 194
         $subject,
195 195
         $message,
Please login to merge, or discard this patch.
includes/class-wpinv-notes.php 1 patch
Indentation   +191 added lines, -191 removed lines patch added patch discarded remove patch
@@ -12,207 +12,207 @@
 block discarded – undo
12 12
  */
13 13
 class WPInv_Notes {
14 14
 
15
-	/**
16
-	 * Class constructor.
17
-	 */
18
-	public function __construct() {
19
-
20
-		// Filter inovice notes.
21
-		add_action( 'pre_get_comments', array( $this, 'set_invoice_note_type' ), 11, 1 );
22
-		add_action( 'comment_feed_where', array( $this, 'wpinv_comment_feed_where' ), 10, 1 );
23
-
24
-		// Delete comments count cache whenever there is a new comment or a comment status changes.
25
-		add_action( 'wp_insert_comment', array( $this, 'delete_comments_count_cache' ) );
26
-		add_action( 'wp_set_comment_status', array( $this, 'delete_comments_count_cache' ) );
27
-
28
-		// Count comments.
29
-		add_filter( 'wp_count_comments', array( $this, 'wp_count_comments' ), 100, 2 );
30
-
31
-		// Fires after notes are loaded.
32
-		do_action( 'wpinv_notes_init', $this );
33
-	}
34
-
35
-	/**
36
-	 * Filters invoice notes query to only include our notes.
37
-	 *
38
-	 * @param WP_Comment_Query $query
39
-	 */
40
-	public function set_invoice_note_type( $query ) {
41
-		$post_id = ! empty( $query->query_vars['post_ID'] ) ? $query->query_vars['post_ID'] : $query->query_vars['post_id'];
42
-
43
-		if ( $post_id && getpaid_is_invoice_post_type( get_post_type( $post_id ) ) ) {
44
-			$query->query_vars['type'] = 'wpinv_note';
45
-		} else {
46
-
47
-			if ( empty( $query->query_vars['type__not_in'] ) ) {
48
-				$query->query_vars['type__not_in'] = array();
49
-			}
50
-
51
-			$query->query_vars['type__not_in'] = wpinv_parse_list( $query->query_vars['type__not_in'] );
52
-			$query->query_vars['type__not_in'] = array_merge( array( 'wpinv_note' ), $query->query_vars['type__not_in'] );
53
-		}
54
-
55
-		return $query;
56
-	}
57
-
58
-	/**
59
-	 * Exclude notes from the comments feed.
60
-	 */
61
-	function wpinv_comment_feed_where( $where ) {
62
-		return $where . ( $where ? ' AND ' : '' ) . " comment_type != 'wpinv_note' ";
63
-	}
64
-
65
-	/**
66
-	 * Delete comments count cache whenever there is
67
-	 * new comment or the status of a comment changes. Cache
68
-	 * will be regenerated next time WPInv_Notes::wp_count_comments()
69
-	 * is called.
70
-	 */
71
-	public function delete_comments_count_cache() {
72
-		delete_transient( 'getpaid_count_comments' );
73
-	}
74
-
75
-	/**
76
-	 * Remove invoice notes from wp_count_comments().
77
-	 *
78
-	 * @since  2.2
79
-	 * @param  object $stats   Comment stats.
80
-	 * @param  int    $post_id Post ID.
81
-	 * @return object
82
-	 */
83
-	public function wp_count_comments( $stats, $post_id ) {
84
-		global $wpdb;
85
-
86
-		if ( empty( $post_id ) ) {
87
-			$stats = get_transient( 'getpaid_count_comments' );
88
-
89
-			if ( ! $stats ) {
90
-				$stats = array(
91
-					'total_comments' => 0,
92
-					'all'            => 0,
93
-				);
94
-
95
-				$count = $wpdb->get_results(
96
-					"
15
+    /**
16
+     * Class constructor.
17
+     */
18
+    public function __construct() {
19
+
20
+        // Filter inovice notes.
21
+        add_action( 'pre_get_comments', array( $this, 'set_invoice_note_type' ), 11, 1 );
22
+        add_action( 'comment_feed_where', array( $this, 'wpinv_comment_feed_where' ), 10, 1 );
23
+
24
+        // Delete comments count cache whenever there is a new comment or a comment status changes.
25
+        add_action( 'wp_insert_comment', array( $this, 'delete_comments_count_cache' ) );
26
+        add_action( 'wp_set_comment_status', array( $this, 'delete_comments_count_cache' ) );
27
+
28
+        // Count comments.
29
+        add_filter( 'wp_count_comments', array( $this, 'wp_count_comments' ), 100, 2 );
30
+
31
+        // Fires after notes are loaded.
32
+        do_action( 'wpinv_notes_init', $this );
33
+    }
34
+
35
+    /**
36
+     * Filters invoice notes query to only include our notes.
37
+     *
38
+     * @param WP_Comment_Query $query
39
+     */
40
+    public function set_invoice_note_type( $query ) {
41
+        $post_id = ! empty( $query->query_vars['post_ID'] ) ? $query->query_vars['post_ID'] : $query->query_vars['post_id'];
42
+
43
+        if ( $post_id && getpaid_is_invoice_post_type( get_post_type( $post_id ) ) ) {
44
+            $query->query_vars['type'] = 'wpinv_note';
45
+        } else {
46
+
47
+            if ( empty( $query->query_vars['type__not_in'] ) ) {
48
+                $query->query_vars['type__not_in'] = array();
49
+            }
50
+
51
+            $query->query_vars['type__not_in'] = wpinv_parse_list( $query->query_vars['type__not_in'] );
52
+            $query->query_vars['type__not_in'] = array_merge( array( 'wpinv_note' ), $query->query_vars['type__not_in'] );
53
+        }
54
+
55
+        return $query;
56
+    }
57
+
58
+    /**
59
+     * Exclude notes from the comments feed.
60
+     */
61
+    function wpinv_comment_feed_where( $where ) {
62
+        return $where . ( $where ? ' AND ' : '' ) . " comment_type != 'wpinv_note' ";
63
+    }
64
+
65
+    /**
66
+     * Delete comments count cache whenever there is
67
+     * new comment or the status of a comment changes. Cache
68
+     * will be regenerated next time WPInv_Notes::wp_count_comments()
69
+     * is called.
70
+     */
71
+    public function delete_comments_count_cache() {
72
+        delete_transient( 'getpaid_count_comments' );
73
+    }
74
+
75
+    /**
76
+     * Remove invoice notes from wp_count_comments().
77
+     *
78
+     * @since  2.2
79
+     * @param  object $stats   Comment stats.
80
+     * @param  int    $post_id Post ID.
81
+     * @return object
82
+     */
83
+    public function wp_count_comments( $stats, $post_id ) {
84
+        global $wpdb;
85
+
86
+        if ( empty( $post_id ) ) {
87
+            $stats = get_transient( 'getpaid_count_comments' );
88
+
89
+            if ( ! $stats ) {
90
+                $stats = array(
91
+                    'total_comments' => 0,
92
+                    'all'            => 0,
93
+                );
94
+
95
+                $count = $wpdb->get_results(
96
+                    "
97 97
 					SELECT comment_approved, COUNT(*) AS num_comments
98 98
 					FROM {$wpdb->comments}
99 99
 					WHERE comment_type NOT IN ('action_log', 'order_note', 'webhook_delivery', 'wpinv_note')
100 100
 					GROUP BY comment_approved
101 101
 					",
102
-					ARRAY_A
103
-				);
104
-
105
-				$approved = array(
106
-					'0'            => 'moderated',
107
-					'1'            => 'approved',
108
-					'spam'         => 'spam',
109
-					'trash'        => 'trash',
110
-					'post-trashed' => 'post-trashed',
111
-				);
112
-
113
-				foreach ( (array) $count as $row ) {
114
-					// Don't count post-trashed toward totals.
115
-					if ( ! in_array( $row['comment_approved'], array( 'post-trashed', 'trash', 'spam' ), true ) ) {
116
-						$stats['all']            += $row['num_comments'];
117
-						$stats['total_comments'] += $row['num_comments'];
118
-					} elseif ( ! in_array( $row['comment_approved'], array( 'post-trashed', 'trash' ), true ) ) {
119
-						$stats['total_comments'] += $row['num_comments'];
120
-					}
121
-					if ( isset( $approved[ $row['comment_approved'] ] ) ) {
122
-						$stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments'];
123
-					}
124
-				}
125
-
126
-				foreach ( $approved as $key ) {
127
-					if ( empty( $stats[ $key ] ) ) {
128
-						$stats[ $key ] = 0;
129
-					}
130
-				}
131
-
132
-				$stats = (object) $stats;
133
-				set_transient( 'getpaid_count_comments', $stats );
134
-			}
102
+                    ARRAY_A
103
+                );
104
+
105
+                $approved = array(
106
+                    '0'            => 'moderated',
107
+                    '1'            => 'approved',
108
+                    'spam'         => 'spam',
109
+                    'trash'        => 'trash',
110
+                    'post-trashed' => 'post-trashed',
111
+                );
112
+
113
+                foreach ( (array) $count as $row ) {
114
+                    // Don't count post-trashed toward totals.
115
+                    if ( ! in_array( $row['comment_approved'], array( 'post-trashed', 'trash', 'spam' ), true ) ) {
116
+                        $stats['all']            += $row['num_comments'];
117
+                        $stats['total_comments'] += $row['num_comments'];
118
+                    } elseif ( ! in_array( $row['comment_approved'], array( 'post-trashed', 'trash' ), true ) ) {
119
+                        $stats['total_comments'] += $row['num_comments'];
120
+                    }
121
+                    if ( isset( $approved[ $row['comment_approved'] ] ) ) {
122
+                        $stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments'];
123
+                    }
124
+                }
125
+
126
+                foreach ( $approved as $key ) {
127
+                    if ( empty( $stats[ $key ] ) ) {
128
+                        $stats[ $key ] = 0;
129
+                    }
130
+                }
131
+
132
+                $stats = (object) $stats;
133
+                set_transient( 'getpaid_count_comments', $stats );
134
+            }
135 135
 }
136 136
 
137
-		return $stats;
138
-	}
139
-
140
-	/**
141
-	 * Returns an array of invoice notes.
142
-	 *
143
-	 * @param int $invoice_id The invoice ID whose notes to retrieve.
144
-	 * @param string $type Optional. Pass in customer to only return customer notes.
145
-	 * @return WP_Comment[]
146
-	 */
147
-	public function get_invoice_notes( $invoice_id = 0, $type = 'all' ) {
148
-
149
-		// Default comment args.
150
-		$args = array(
151
-			'post_id' => $invoice_id,
152
-			'orderby' => 'comment_ID',
153
-			'order'   => 'ASC',
154
-		);
155
-
156
-		// Maybe only show customer comments.
157
-		if ( $type == 'customer' ) {
158
-			$args['meta_key']   = '_wpi_customer_note';
159
-			$args['meta_value'] = 1;
160
-		}
161
-
162
-		$args = apply_filters( 'wpinv_invoice_notes_args', $args, $this, $invoice_id, $type );
163
-
164
-		return get_comments( $args );
165
-	}
166
-
167
-	/**
168
-	 * Saves an invoice comment.
169
-	 *
170
-	 * @param WPInv_Invoice $invoice The invoice to add the comment to.
171
-	 * @param string $note The note content.
172
-	 * @param string $note_author The name of the author of the note.
173
-	 * @param bool $for_customer Whether or not this comment is meant to be sent to the customer.
174
-	 * @return int|false The new note's ID on success, false on failure.
175
-	 */
176
-	function add_invoice_note( $invoice, $note, $note_author, $author_email, $for_customer = false ) {
177
-
178
-		do_action( 'wpinv_pre_insert_invoice_note', $invoice->get_id(), $note, $for_customer );
179
-
180
-		/**
181
-		 * Insert the comment.
182
-		 */
183
-		$note_id = wp_insert_comment(
184
-			wp_filter_comment(
185
-				array(
186
-					'comment_post_ID'      => $invoice->get_id(),
187
-					'comment_content'      => $note,
188
-					'comment_agent'        => 'Invoicing',
189
-					'user_id'              => get_current_user_id(),
190
-					'comment_author'       => $note_author,
191
-					'comment_author_IP'    => wpinv_get_ip(),
192
-					'comment_author_email' => $author_email,
193
-					'comment_author_url'   => $invoice->get_view_url(),
194
-					'comment_type'         => 'wpinv_note',
195
-				)
196
-			)
197
-		);
198
-
199
-		do_action( 'wpinv_insert_payment_note', $note_id, $invoice->get_id(), $note, $for_customer );
200
-
201
-		// Are we notifying the customer?
202
-		if ( empty( $note_id ) || empty( $for_customer ) ) {
203
-			return $note_id;
204
-		}
205
-
206
-		add_comment_meta( $note_id, '_wpi_customer_note', 1 );
207
-		do_action(
137
+        return $stats;
138
+    }
139
+
140
+    /**
141
+     * Returns an array of invoice notes.
142
+     *
143
+     * @param int $invoice_id The invoice ID whose notes to retrieve.
144
+     * @param string $type Optional. Pass in customer to only return customer notes.
145
+     * @return WP_Comment[]
146
+     */
147
+    public function get_invoice_notes( $invoice_id = 0, $type = 'all' ) {
148
+
149
+        // Default comment args.
150
+        $args = array(
151
+            'post_id' => $invoice_id,
152
+            'orderby' => 'comment_ID',
153
+            'order'   => 'ASC',
154
+        );
155
+
156
+        // Maybe only show customer comments.
157
+        if ( $type == 'customer' ) {
158
+            $args['meta_key']   = '_wpi_customer_note';
159
+            $args['meta_value'] = 1;
160
+        }
161
+
162
+        $args = apply_filters( 'wpinv_invoice_notes_args', $args, $this, $invoice_id, $type );
163
+
164
+        return get_comments( $args );
165
+    }
166
+
167
+    /**
168
+     * Saves an invoice comment.
169
+     *
170
+     * @param WPInv_Invoice $invoice The invoice to add the comment to.
171
+     * @param string $note The note content.
172
+     * @param string $note_author The name of the author of the note.
173
+     * @param bool $for_customer Whether or not this comment is meant to be sent to the customer.
174
+     * @return int|false The new note's ID on success, false on failure.
175
+     */
176
+    function add_invoice_note( $invoice, $note, $note_author, $author_email, $for_customer = false ) {
177
+
178
+        do_action( 'wpinv_pre_insert_invoice_note', $invoice->get_id(), $note, $for_customer );
179
+
180
+        /**
181
+         * Insert the comment.
182
+         */
183
+        $note_id = wp_insert_comment(
184
+            wp_filter_comment(
185
+                array(
186
+                    'comment_post_ID'      => $invoice->get_id(),
187
+                    'comment_content'      => $note,
188
+                    'comment_agent'        => 'Invoicing',
189
+                    'user_id'              => get_current_user_id(),
190
+                    'comment_author'       => $note_author,
191
+                    'comment_author_IP'    => wpinv_get_ip(),
192
+                    'comment_author_email' => $author_email,
193
+                    'comment_author_url'   => $invoice->get_view_url(),
194
+                    'comment_type'         => 'wpinv_note',
195
+                )
196
+            )
197
+        );
198
+
199
+        do_action( 'wpinv_insert_payment_note', $note_id, $invoice->get_id(), $note, $for_customer );
200
+
201
+        // Are we notifying the customer?
202
+        if ( empty( $note_id ) || empty( $for_customer ) ) {
203
+            return $note_id;
204
+        }
205
+
206
+        add_comment_meta( $note_id, '_wpi_customer_note', 1 );
207
+        do_action(
208 208
             'wpinv_new_customer_note',
209 209
             array(
210
-				'invoice_id' => $invoice->get_id(),
211
-				'user_note'  => $note,
210
+                'invoice_id' => $invoice->get_id(),
211
+                'user_note'  => $note,
212 212
             )
213 213
         );
214
-		do_action( 'getpaid_new_customer_note', $invoice, $note );
215
-		return $note_id;
216
-	}
214
+        do_action( 'getpaid_new_customer_note', $invoice, $note );
215
+        return $note_id;
216
+    }
217 217
 
218 218
 }
Please login to merge, or discard this patch.
includes/gateways/class-getpaid-authorize-net-legacy-gateway.php 1 patch
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -15,31 +15,31 @@  discard block
 block discarded – undo
15 15
 abstract class GetPaid_Authorize_Net_Legacy_Gateway extends GetPaid_Payment_Gateway {
16 16
 
17 17
     /**
18
-	 * Class constructor.
19
-	 */
20
-	public function __construct() {
18
+     * Class constructor.
19
+     */
20
+    public function __construct() {
21 21
         parent::__construct();
22 22
     }
23 23
 
24 24
     /**
25
-	 * Returns the API URL.
26
-	 *
27
-	 *
28
-	 * @param WPInv_Invoice $invoice Invoice.
29
-	 * @return string
30
-	 */
31
-	public function get_api_url( $invoice ) {
25
+     * Returns the API URL.
26
+     *
27
+     *
28
+     * @param WPInv_Invoice $invoice Invoice.
29
+     * @return string
30
+     */
31
+    public function get_api_url( $invoice ) {
32 32
         return $this->is_sandbox( $invoice ) ? 'https://apitest.authorize.net/xml/v1/request.api' : 'https://api.authorize.net/xml/v1/request.api';
33 33
     }
34 34
 
35 35
     /**
36
-	 * Communicates with authorize.net
37
-	 *
38
-	 *
39
-	 * @param array $post Data to post.
36
+     * Communicates with authorize.net
37
+     *
38
+     *
39
+     * @param array $post Data to post.
40 40
      * @param WPInv_Invoice $invoice Invoice.
41
-	 * @return stdClass|WP_Error
42
-	 */
41
+     * @return stdClass|WP_Error
42
+     */
43 43
     public function post( $post, $invoice ) {
44 44
 
45 45
         $url      = $this->get_api_url( $invoice );
@@ -89,12 +89,12 @@  discard block
 block discarded – undo
89 89
     }
90 90
 
91 91
     /**
92
-	 * Returns the API authentication params.
93
-	 *
94
-	 *
95
-	 * @return array
96
-	 */
97
-	public function get_auth_params() {
92
+     * Returns the API authentication params.
93
+     *
94
+     *
95
+     * @return array
96
+     */
97
+    public function get_auth_params() {
98 98
 
99 99
         return array(
100 100
             'name'           => $this->get_option( 'login_id' ),
@@ -104,13 +104,13 @@  discard block
 block discarded – undo
104 104
     }
105 105
 
106 106
     /**
107
-	 * Cancels a subscription remotely
108
-	 *
109
-	 *
110
-	 * @param WPInv_Subscription $subscription Subscription.
107
+     * Cancels a subscription remotely
108
+     *
109
+     *
110
+     * @param WPInv_Subscription $subscription Subscription.
111 111
      * @param WPInv_Invoice $invoice Invoice.
112
-	 */
113
-	public function cancel_subscription( $subscription, $invoice ) {
112
+     */
113
+    public function cancel_subscription( $subscription, $invoice ) {
114 114
 
115 115
         // Backwards compatibility. New version do not use authorize.net subscriptions.
116 116
         $this->post(
@@ -126,17 +126,17 @@  discard block
 block discarded – undo
126 126
     }
127 127
 
128 128
     /**
129
-	 * Processes ipns.
130
-	 *
131
-	 * @return void
132
-	 */
133
-	public function verify_ipn() {
129
+     * Processes ipns.
130
+     *
131
+     * @return void
132
+     */
133
+    public function verify_ipn() {
134 134
 
135 135
         $this->maybe_process_old_ipn();
136 136
 
137 137
         // Validate the IPN.
138 138
         if ( empty( $_POST ) || ! $this->validate_ipn() ) {
139
-		    wp_die( 'Authorize.NET IPN Request Failure', 'Authorize.NET IPN', array( 'response' => 200 ) );
139
+            wp_die( 'Authorize.NET IPN Request Failure', 'Authorize.NET IPN', array( 'response' => 200 ) );
140 140
         }
141 141
 
142 142
         // Event type.
@@ -175,24 +175,24 @@  discard block
 block discarded – undo
175 175
     }
176 176
 
177 177
     /**
178
-	 * Validates IPN invoices.
179
-	 *
178
+     * Validates IPN invoices.
179
+     *
180 180
      * @param WPInv_Invoice $invoice
181 181
      * @param object $payload
182
-	 * @return void
183
-	 */
184
-	public function validate_ipn_invoice( $invoice, $payload ) {
182
+     * @return void
183
+     */
184
+    public function validate_ipn_invoice( $invoice, $payload ) {
185 185
         if ( ! $invoice->exists() || $payload->id != $invoice->get_transaction_id() ) {
186 186
             exit;
187 187
         }
188 188
     }
189 189
 
190 190
     /**
191
-	 * Process subscriptio IPNS.
192
-	 *
193
-	 * @return void
194
-	 */
195
-	public function maybe_process_old_ipn() {
191
+     * Process subscriptio IPNS.
192
+     *
193
+     * @return void
194
+     */
195
+    public function maybe_process_old_ipn() {
196 196
 
197 197
         $data = wp_kses_post_deep( wp_unslash( $_POST ) );
198 198
 
@@ -234,11 +234,11 @@  discard block
 block discarded – undo
234 234
     }
235 235
 
236 236
     /**
237
-	 * Validates the old IPN signature.
237
+     * Validates the old IPN signature.
238 238
      *
239 239
      * @param array $posted
240
-	 */
241
-	public function validate_old_ipn_signature( $posted ) {
240
+     */
241
+    public function validate_old_ipn_signature( $posted ) {
242 242
 
243 243
         $signature = $this->get_option( 'signature_key' );
244 244
         if ( ! empty( $signature ) ) {
@@ -256,9 +256,9 @@  discard block
 block discarded – undo
256 256
     }
257 257
 
258 258
     /**
259
-	 * Check Authorize.NET IPN validity.
260
-	 */
261
-	public function validate_ipn() {
259
+     * Check Authorize.NET IPN validity.
260
+     */
261
+    public function validate_ipn() {
262 262
 
263 263
         wpinv_error_log( 'Validating Authorize.NET IPN response' );
264 264
 
Please login to merge, or discard this patch.
includes/gateways/class-getpaid-worldpay-gateway.php 1 patch
Indentation   +94 added lines, -94 removed lines patch added patch discarded remove patch
@@ -13,65 +13,65 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Worldpay_Gateway extends GetPaid_Payment_Gateway {
14 14
 
15 15
     /**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20 20
     public $id = 'worldpay';
21 21
 
22 22
     /**
23
-	 * Payment method order.
24
-	 *
25
-	 * @var int
26
-	 */
23
+     * Payment method order.
24
+     *
25
+     * @var int
26
+     */
27 27
     public $order = 5;
28 28
 
29 29
     /**
30
-	 * Endpoint for requests from Worldpay.
31
-	 *
32
-	 * @var string
33
-	 */
34
-	protected $notify_url;
35
-
36
-	/**
37
-	 * Endpoint for requests to Worldpay.
38
-	 *
39
-	 * @var string
40
-	 */
30
+     * Endpoint for requests from Worldpay.
31
+     *
32
+     * @var string
33
+     */
34
+    protected $notify_url;
35
+
36
+    /**
37
+     * Endpoint for requests to Worldpay.
38
+     *
39
+     * @var string
40
+     */
41 41
     protected $endpoint;
42 42
 
43 43
     /**
44
-	 * An array of features that this gateway supports.
45
-	 *
46
-	 * @var array
47
-	 */
44
+     * An array of features that this gateway supports.
45
+     *
46
+     * @var array
47
+     */
48 48
     protected $supports = array( 'sandbox' );
49 49
 
50 50
     /**
51
-	 * Currencies this gateway is allowed for.
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $currencies = array( 'AUD', 'ARS', 'CAD', 'CHF', 'DKK', 'EUR', 'HKD', 'MYR', 'GBP', 'NZD', 'NOK', 'SGD', 'LKR', 'SEK', 'TRY', 'USD', 'ZAR' );
51
+     * Currencies this gateway is allowed for.
52
+     *
53
+     * @var array
54
+     */
55
+    public $currencies = array( 'AUD', 'ARS', 'CAD', 'CHF', 'DKK', 'EUR', 'HKD', 'MYR', 'GBP', 'NZD', 'NOK', 'SGD', 'LKR', 'SEK', 'TRY', 'USD', 'ZAR' );
56 56
 
57 57
     /**
58
-	 * URL to view a transaction.
59
-	 *
60
-	 * @var string
61
-	 */
58
+     * URL to view a transaction.
59
+     *
60
+     * @var string
61
+     */
62 62
     public $view_transaction_url = 'https://www.{sandbox}paypal.com/activity/payment/%s';
63 63
 
64 64
     /**
65
-	 * URL to view a subscription.
66
-	 *
67
-	 * @var string
68
-	 */
69
-	public $view_subscription_url = 'https://www.{sandbox}paypal.com/cgi-bin/webscr?cmd=_profile-recurring-payments&encrypted_profile_id=%s';
65
+     * URL to view a subscription.
66
+     *
67
+     * @var string
68
+     */
69
+    public $view_subscription_url = 'https://www.{sandbox}paypal.com/cgi-bin/webscr?cmd=_profile-recurring-payments&encrypted_profile_id=%s';
70 70
 
71 71
     /**
72
-	 * Class constructor.
73
-	 */
74
-	public function __construct() {
72
+     * Class constructor.
73
+     */
74
+    public function __construct() {
75 75
 
76 76
         $this->method_title         = __( 'Worldpay', 'invoicing' );
77 77
         $this->title                = __( 'Worldpay - Credit Card / Debit Card', 'invoicing' );
@@ -85,15 +85,15 @@  discard block
 block discarded – undo
85 85
     }
86 86
 
87 87
     /**
88
-	 * Process Payment.
89
-	 *
90
-	 *
91
-	 * @param WPInv_Invoice $invoice Invoice.
92
-	 * @param array $submission_data Posted checkout fields.
93
-	 * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
94
-	 * @return array
95
-	 */
96
-	public function process_payment( $invoice, $submission_data, $submission ) {
88
+     * Process Payment.
89
+     *
90
+     *
91
+     * @param WPInv_Invoice $invoice Invoice.
92
+     * @param array $submission_data Posted checkout fields.
93
+     * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
94
+     * @return array
95
+     */
96
+    public function process_payment( $invoice, $submission_data, $submission ) {
97 97
 
98 98
         // Get redirect url.
99 99
         $worldpay_redirect = esc_url( $this->get_request_url( $invoice ) );
@@ -128,31 +128,31 @@  discard block
 block discarded – undo
128 128
     }
129 129
 
130 130
     /**
131
-	 * Get the Worldpay request URL for an invoice.
132
-	 *
133
-	 * @param  WPInv_Invoice $invoice Invoice object.
134
-	 * @return string
135
-	 */
136
-	public function get_request_url( $invoice ) {
131
+     * Get the Worldpay request URL for an invoice.
132
+     *
133
+     * @param  WPInv_Invoice $invoice Invoice object.
134
+     * @return string
135
+     */
136
+    public function get_request_url( $invoice ) {
137 137
 
138 138
         // Endpoint for this request
139
-		$this->endpoint = $this->is_sandbox( $invoice ) ? 'https://secure-test.worldpay.com/wcc/purchase' : 'https://secure.worldpay.com/wcc/purchase';
139
+        $this->endpoint = $this->is_sandbox( $invoice ) ? 'https://secure-test.worldpay.com/wcc/purchase' : 'https://secure.worldpay.com/wcc/purchase';
140 140
 
141 141
         return $this->endpoint;
142 142
 
143
-	}
143
+    }
144 144
 
145 145
     /**
146
-	 * Get Worldpay Args for passing to Worldpay.
147
-	 *
148
-	 * @param  WPInv_Invoice $invoice Invoice object.
149
-	 * @return array
150
-	 */
151
-	protected function get_worldpay_args( $invoice ) {
152
-
153
-		return apply_filters(
154
-			'getpaid_worldpay_args',
155
-			array(
146
+     * Get Worldpay Args for passing to Worldpay.
147
+     *
148
+     * @param  WPInv_Invoice $invoice Invoice object.
149
+     * @return array
150
+     */
151
+    protected function get_worldpay_args( $invoice ) {
152
+
153
+        return apply_filters(
154
+            'getpaid_worldpay_args',
155
+            array(
156 156
                 'amount'         => wpinv_sanitize_amount( $invoice->get_total() ), // mandatory
157 157
                 'cartId'         => wpinv_clean( $invoice->get_number() ), // mandatory reference for the item purchased
158 158
                 'currency'       => wpinv_clean( $invoice->get_currency() ), // mandatory
@@ -177,18 +177,18 @@  discard block
 block discarded – undo
177 177
                 'countryString'  => wpinv_clean( wpinv_country_name( $invoice->get_country() ) ),
178 178
                 'compName'       => wpinv_clean( $invoice->get_company() ),
179 179
             ),
180
-			$invoice
181
-		);
180
+            $invoice
181
+        );
182 182
 
183 183
     }
184 184
 
185 185
     /**
186
-	 * Secures worldpay args with an md5 hash.
187
-	 *
188
-	 * @param  array $args Gateway args.
189
-	 * @return array
190
-	 */
191
-	public function hash_args( $args ) {
186
+     * Secures worldpay args with an md5 hash.
187
+     *
188
+     * @param  array $args Gateway args.
189
+     * @return array
190
+     */
191
+    public function hash_args( $args ) {
192 192
 
193 193
         $md5_secret = $this->get_option( 'md5_secret' );
194 194
 
@@ -204,16 +204,16 @@  discard block
 block discarded – undo
204 204
     }
205 205
 
206 206
     /**
207
-	 * Processes ipns and marks payments as complete.
208
-	 *
209
-	 * @return void
210
-	 */
211
-	public function verify_ipn() {
207
+     * Processes ipns and marks payments as complete.
208
+     *
209
+     * @return void
210
+     */
211
+    public function verify_ipn() {
212 212
 
213 213
         // Validate the IPN.
214 214
         if ( empty( $_POST ) || ! $this->validate_ipn() ) {
215
-		    wp_die( 'Worldpay IPN Request Failure', 'Worldpay IPN', array( 'response' => 500 ) );
216
-		}
215
+            wp_die( 'Worldpay IPN Request Failure', 'Worldpay IPN', array( 'response' => 500 ) );
216
+        }
217 217
 
218 218
         // Process the IPN.
219 219
         $posted  = wp_kses_post_deep( wp_unslash( $_POST ) );
@@ -229,8 +229,8 @@  discard block
 block discarded – undo
229 229
                 $invoice->set_transaction_id( wpinv_clean( $posted['transId'] ) );
230 230
             }
231 231
 
232
-             // Update the ip address.
233
-             if ( ! empty( $posted['ipAddress'] ) ) {
232
+                // Update the ip address.
233
+                if ( ! empty( $posted['ipAddress'] ) ) {
234 234
                 $invoice->set_ip( wpinv_clean( $posted['ipAddress'] ) );
235 235
             }
236 236
 
@@ -257,9 +257,9 @@  discard block
 block discarded – undo
257 257
     }
258 258
 
259 259
     /**
260
-	 * Check Worldpay IPN validity.
261
-	 */
262
-	public function validate_ipn() {
260
+     * Check Worldpay IPN validity.
261
+     */
262
+    public function validate_ipn() {
263 263
 
264 264
         wpinv_error_log( 'Validating Worldpay IPN response' );
265 265
 
@@ -305,11 +305,11 @@  discard block
 block discarded – undo
305 305
     }
306 306
 
307 307
     /**
308
-	 * Filters the gateway settings.
309
-	 *
310
-	 * @param array $admin_settings
311
-	 */
312
-	public function admin_settings( $admin_settings ) {
308
+     * Filters the gateway settings.
309
+     *
310
+     * @param array $admin_settings
311
+     */
312
+    public function admin_settings( $admin_settings ) {
313 313
 
314 314
         $currencies = sprintf(
315 315
             __( 'Supported Currencies: %s', 'invoicing' ),
@@ -350,7 +350,7 @@  discard block
 block discarded – undo
350 350
             'readonly' => true,
351 351
         );
352 352
 
353
-		return $admin_settings;
354
-	}
353
+        return $admin_settings;
354
+    }
355 355
 
356 356
 }
Please login to merge, or discard this patch.