Passed
Push — master ( e4ac59...e8d602 )
by Brian
10:43
created
includes/data/currencies.php 1 patch
Indentation   +161 added lines, -161 removed lines patch added patch discarded remove patch
@@ -11,165 +11,165 @@
 block discarded – undo
11 11
 defined( 'ABSPATH' ) || exit;
12 12
 
13 13
 return array(
14
-	'USD' => __( 'US Dollar', 'invoicing' ),
15
-	'EUR' => __( 'Euro', 'invoicing' ),
16
-	'GBP' => __( 'Pound Sterling', 'invoicing' ),
17
-	'AED' => __( 'United Arab Emirates', 'invoicing' ),
18
-	'AFN' => __( 'Afghan Afghani', 'invoicing' ),
19
-	'ALL' => __( 'Albanian Lek', 'invoicing' ),
20
-	'AMD' => __( 'Armenian Dram', 'invoicing' ),
21
-	'ANG' => __( 'Netherlands Antillean Guilder', 'invoicing' ),
22
-	'AOA' => __( 'Angolan Kwanza', 'invoicing' ),
23
-	'ARS' => __( 'Argentine Peso', 'invoicing' ),
24
-	'AUD' => __( 'Australian Dollar', 'invoicing' ),
25
-	'AWG' => __( 'Aruban Florin', 'invoicing' ),
26
-	'AZN' => __( 'Azerbaijani Manat', 'invoicing' ),
27
-	'BAM' => __( 'Bosnia and Herzegovina Convertible Marka', 'invoicing' ),
28
-	'BBD' => __( 'Barbadian Dollar', 'invoicing' ),
29
-	'BDT' => __( 'Bangladeshi Taka', 'invoicing' ),
30
-	'BGN' => __( 'Bulgarian Lev', 'invoicing' ),
31
-	'BHD' => __( 'Bahraini Dinar', 'invoicing' ),
32
-	'BIF' => __( 'Burundian Franc', 'invoicing' ),
33
-	'BMD' => __( 'Bermudian Dollar', 'invoicing' ),
34
-	'BND' => __( 'Brunei Dollar', 'invoicing' ),
35
-	'BOB' => __( 'Bolivian Boliviano', 'invoicing' ),
36
-	'BRL' => __( 'Brazilian Real', 'invoicing' ),
37
-	'BSD' => __( 'Bahamian Dollar', 'invoicing' ),
38
-	'BTC' => __( 'Bitcoin', 'invoicing' ),
39
-	'BTN' => __( 'Bhutanese Ngultrum', 'invoicing' ),
40
-	'BWP' => __( 'Botswana Pula', 'invoicing' ),
41
-	'BYN' => __( 'Belarusian Ruble', 'invoicing' ),
42
-	'BZD' => __( 'Belize Dollar', 'invoicing' ),
43
-	'CAD' => __( 'Canadian Dollar', 'invoicing' ),
44
-	'CDF' => __( 'Congolese Franc', 'invoicing' ),
45
-	'CHF' => __( 'Swiss Franc', 'invoicing' ),
46
-	'CLP' => __( 'Chilean Peso', 'invoicing' ),
47
-	'CNY' => __( 'Chinese Yuan', 'invoicing' ),
48
-	'COP' => __( 'Colombian Peso', 'invoicing' ),
49
-	'CRC' => __( 'Costa Rican Colon', 'invoicing' ),
50
-	'CUC' => __( 'Cuban Convertible Peso', 'invoicing' ),
51
-	'CUP' => __( 'Cuban Peso', 'invoicing' ),
52
-	'CVE' => __( 'Cape Verdean escudo', 'invoicing' ),
53
-	'CZK' => __( 'Czech Koruna', 'invoicing' ),
54
-	'DJF' => __( 'Djiboutian Franc', 'invoicing' ),
55
-	'DKK' => __( 'Danish Krone', 'invoicing' ),
56
-	'DOP' => __( 'Dominican Peso', 'invoicing' ),
57
-	'DZD' => __( 'Algerian Dinar', 'invoicing' ),
58
-	'EGP' => __( 'Egyptian Pound', 'invoicing' ),
59
-	'ERN' => __( 'Eritrean Nakfa', 'invoicing' ),
60
-	'ETB' => __( 'Ethiopian Irr', 'invoicing' ),
61
-	'FJD' => __( 'Fijian Dollar', 'invoicing' ),
62
-	'FKP' => __( 'Falkland Islands Pound', 'invoicing' ),
63
-	'GEL' => __( 'Georgian Lari', 'invoicing' ),
64
-	'GGP' => __( 'Guernsey Pound', 'invoicing' ),
65
-	'GHS' => __( 'Ghana Cedi', 'invoicing' ),
66
-	'GIP' => __( 'Gibraltar Pound', 'invoicing' ),
67
-	'GMD' => __( 'Gambian Dalasi', 'invoicing' ),
68
-	'GNF' => __( 'Guinean Franc', 'invoicing' ),
69
-	'GTQ' => __( 'Guatemalan Quetzal', 'invoicing' ),
70
-	'GYD' => __( 'Guyanese Dollar', 'invoicing' ),
71
-	'HKD' => __( 'Hong Kong Dollar', 'invoicing' ),
72
-	'HNL' => __( 'Honduran Lempira', 'invoicing' ),
73
-	'HRK' => __( 'Croatian Kuna', 'invoicing' ),
74
-	'HTG' => __( 'Haitian Gourde', 'invoicing' ),
75
-	'HUF' => __( 'Hungarian Forint', 'invoicing' ),
76
-	'IDR' => __( 'Indonesian Rupiah', 'invoicing' ),
77
-	'ILS' => __( 'Israeli New Shekel', 'invoicing' ),
78
-	'IMP' => __( 'Manx Pound', 'invoicing' ),
79
-	'INR' => __( 'Indian Rupee', 'invoicing' ),
80
-	'IQD' => __( 'Iraqi Dinar', 'invoicing' ),
81
-	'IRR' => __( 'Iranian Rial', 'invoicing' ),
82
-	'IRT' => __( 'Iranian Toman', 'invoicing' ),
83
-	'ISK' => __( 'Icelandic Krona', 'invoicing' ),
84
-	'JEP' => __( 'Jersey Pound', 'invoicing' ),
85
-	'JMD' => __( 'Jamaican Dollar', 'invoicing' ),
86
-	'JOD' => __( 'Jordanian Dinar', 'invoicing' ),
87
-	'JPY' => __( 'Japanese Yen', 'invoicing' ),
88
-	'KES' => __( 'Kenyan Shilling', 'invoicing' ),
89
-	'KGS' => __( 'Kyrgyzstani Som', 'invoicing' ),
90
-	'KHR' => __( 'Cambodian Riel', 'invoicing' ),
91
-	'KMF' => __( 'Comorian Franc', 'invoicing' ),
92
-	'KPW' => __( 'North Korean Won', 'invoicing' ),
93
-	'KRW' => __( 'South Korean Won', 'invoicing' ),
94
-	'KWD' => __( 'Kuwaiti Dinar', 'invoicing' ),
95
-	'KYD' => __( 'Cayman Islands Dollar', 'invoicing' ),
96
-	'KZT' => __( 'Kazakhstani Tenge', 'invoicing' ),
97
-	'LAK' => __( 'Lao Kip', 'invoicing' ),
98
-	'LBP' => __( 'Lebanese Pound', 'invoicing' ),
99
-	'LKR' => __( 'Sri Lankan Rupee', 'invoicing' ),
100
-	'LRD' => __( 'Liberian Dollar', 'invoicing' ),
101
-	'LSL' => __( 'Lesotho Loti', 'invoicing' ),
102
-	'LYD' => __( 'Libyan Dinar', 'invoicing' ),
103
-	'MAD' => __( 'Moroccan Dirham', 'invoicing' ),
104
-	'MDL' => __( 'Moldovan Leu', 'invoicing' ),
105
-	'MGA' => __( 'Malagasy Ariary', 'invoicing' ),
106
-	'MKD' => __( 'Macedonian Denar', 'invoicing' ),
107
-	'MMK' => __( 'Burmese Kyat', 'invoicing' ),
108
-	'MNT' => __( 'Mongolian Tughrik', 'invoicing' ),
109
-	'MOP' => __( 'Macanese Pataca', 'invoicing' ),
110
-	'MRO' => __( 'Mauritanian Ouguiya', 'invoicing' ),
111
-	'MUR' => __( 'Mauritian Rupee', 'invoicing' ),
112
-	'MVR' => __( 'Maldivian Rufiyaa', 'invoicing' ),
113
-	'MWK' => __( 'Malawian Kwacha', 'invoicing' ),
114
-	'MXN' => __( 'Mexican Peso', 'invoicing' ),
115
-	'MYR' => __( 'Malaysian Ringgit', 'invoicing' ),
116
-	'MZN' => __( 'Mozambican Metical', 'invoicing' ),
117
-	'NAD' => __( 'Namibian Dollar', 'invoicing' ),
118
-	'NGN' => __( 'Nigerian Naira', 'invoicing' ),
119
-	'NIO' => __( 'Nicaraguan Cordoba', 'invoicing' ),
120
-	'NOK' => __( 'Norwegian Krone', 'invoicing' ),
121
-	'NPR' => __( 'Nepalese Rupee', 'invoicing' ),
122
-	'NZD' => __( 'New Zealand Dollar', 'invoicing' ),
123
-	'OMR' => __( 'Omani Rial', 'invoicing' ),
124
-	'PAB' => __( 'Panamanian Balboa', 'invoicing' ),
125
-	'PEN' => __( 'Peruvian Nuevo Sol', 'invoicing' ),
126
-	'PGK' => __( 'Papua New Guinean Kina', 'invoicing' ),
127
-	'PHP' => __( 'Philippine Peso', 'invoicing' ),
128
-	'PKR' => __( 'Pakistani Rupee', 'invoicing' ),
129
-	'PLN' => __( 'Polish Zloty', 'invoicing' ),
130
-	'PRB' => __( 'Transnistrian Ruble', 'invoicing' ),
131
-	'PYG' => __( 'Paraguayan Guarani', 'invoicing' ),
132
-	'QAR' => __( 'Qatari Riyal', 'invoicing' ),
133
-	'RON' => __( 'Romanian Leu', 'invoicing' ),
134
-	'RSD' => __( 'Serbian Dinar', 'invoicing' ),
135
-	'RUB' => __( 'Russian Ruble', 'invoicing' ),
136
-	'RWF' => __( 'Rwandan Franc', 'invoicing' ),
137
-	'SAR' => __( 'Saudi Riyal', 'invoicing' ),
138
-	'SBD' => __( 'Solomon Islands Dollar', 'invoicing' ),
139
-	'SCR' => __( 'Seychellois Rupee', 'invoicing' ),
140
-	'SDG' => __( 'Sudanese Pound', 'invoicing' ),
141
-	'SEK' => __( 'Swedish Krona', 'invoicing' ),
142
-	'SGD' => __( 'Singapore Dollar', 'invoicing' ),
143
-	'SHP' => __( 'Saint Helena Pound', 'invoicing' ),
144
-	'SLL' => __( 'Sierra Leonean Leone', 'invoicing' ),
145
-	'SOS' => __( 'Somali Shilling', 'invoicing' ),
146
-	'SRD' => __( 'Surinamese Dollar', 'invoicing' ),
147
-	'SSP' => __( 'South Sudanese Pound', 'invoicing' ),
148
-	'STD' => __( 'Sao Tomean Dobra', 'invoicing' ),
149
-	'SYP' => __( 'Syrian Pound', 'invoicing' ),
150
-	'SZL' => __( 'Swazi Lilangeni', 'invoicing' ),
151
-	'THB' => __( 'Thai Baht', 'invoicing' ),
152
-	'TJS' => __( 'Tajikistani Somoni', 'invoicing' ),
153
-	'TMT' => __( 'Turkmenistan Manat', 'invoicing' ),
154
-	'TND' => __( 'Tunisian Dinar', 'invoicing' ),
155
-	'TOP' => __( 'Tongan Paʻanga', 'invoicing' ),
156
-	'TRY' => __( 'Turkish Lira', 'invoicing' ),
157
-	'TTD' => __( 'Trinidad and Tobago Dollar', 'invoicing' ),
158
-	'TWD' => __( 'New Taiwan Dollar', 'invoicing' ),
159
-	'TZS' => __( 'Tanzanian Shilling', 'invoicing' ),
160
-	'UAH' => __( 'Ukrainian Hryvnia', 'invoicing' ),
161
-	'UGX' => __( 'Ugandan Shilling', 'invoicing' ),
162
-	'UYU' => __( 'Uruguayan Peso', 'invoicing' ),
163
-	'UZS' => __( 'Uzbekistani Som', 'invoicing' ),
164
-	'VEF' => __( 'Venezuelan Bolívar', 'invoicing' ),
165
-	'VND' => __( 'Vietnamese Dong', 'invoicing' ),
166
-	'VUV' => __( 'Vanuatu Vatu', 'invoicing' ),
167
-	'WST' => __( 'Samoan Tala', 'invoicing' ),
168
-	'XAF' => __( 'Central African CFA Franc', 'invoicing' ),
169
-	'XCD' => __( 'East Caribbean Dollar', 'invoicing' ),
170
-	'XOF' => __( 'West African CFA Franc', 'invoicing' ),
171
-	'XPF' => __( 'CFP Franc', 'invoicing' ),
172
-	'YER' => __( 'Yemeni Rial', 'invoicing' ),
173
-	'ZAR' => __( 'South African Rand', 'invoicing' ),
174
-	'ZMW' => __( 'Zambian Kwacha', 'invoicing' ),
14
+    'USD' => __( 'US Dollar', 'invoicing' ),
15
+    'EUR' => __( 'Euro', 'invoicing' ),
16
+    'GBP' => __( 'Pound Sterling', 'invoicing' ),
17
+    'AED' => __( 'United Arab Emirates', 'invoicing' ),
18
+    'AFN' => __( 'Afghan Afghani', 'invoicing' ),
19
+    'ALL' => __( 'Albanian Lek', 'invoicing' ),
20
+    'AMD' => __( 'Armenian Dram', 'invoicing' ),
21
+    'ANG' => __( 'Netherlands Antillean Guilder', 'invoicing' ),
22
+    'AOA' => __( 'Angolan Kwanza', 'invoicing' ),
23
+    'ARS' => __( 'Argentine Peso', 'invoicing' ),
24
+    'AUD' => __( 'Australian Dollar', 'invoicing' ),
25
+    'AWG' => __( 'Aruban Florin', 'invoicing' ),
26
+    'AZN' => __( 'Azerbaijani Manat', 'invoicing' ),
27
+    'BAM' => __( 'Bosnia and Herzegovina Convertible Marka', 'invoicing' ),
28
+    'BBD' => __( 'Barbadian Dollar', 'invoicing' ),
29
+    'BDT' => __( 'Bangladeshi Taka', 'invoicing' ),
30
+    'BGN' => __( 'Bulgarian Lev', 'invoicing' ),
31
+    'BHD' => __( 'Bahraini Dinar', 'invoicing' ),
32
+    'BIF' => __( 'Burundian Franc', 'invoicing' ),
33
+    'BMD' => __( 'Bermudian Dollar', 'invoicing' ),
34
+    'BND' => __( 'Brunei Dollar', 'invoicing' ),
35
+    'BOB' => __( 'Bolivian Boliviano', 'invoicing' ),
36
+    'BRL' => __( 'Brazilian Real', 'invoicing' ),
37
+    'BSD' => __( 'Bahamian Dollar', 'invoicing' ),
38
+    'BTC' => __( 'Bitcoin', 'invoicing' ),
39
+    'BTN' => __( 'Bhutanese Ngultrum', 'invoicing' ),
40
+    'BWP' => __( 'Botswana Pula', 'invoicing' ),
41
+    'BYN' => __( 'Belarusian Ruble', 'invoicing' ),
42
+    'BZD' => __( 'Belize Dollar', 'invoicing' ),
43
+    'CAD' => __( 'Canadian Dollar', 'invoicing' ),
44
+    'CDF' => __( 'Congolese Franc', 'invoicing' ),
45
+    'CHF' => __( 'Swiss Franc', 'invoicing' ),
46
+    'CLP' => __( 'Chilean Peso', 'invoicing' ),
47
+    'CNY' => __( 'Chinese Yuan', 'invoicing' ),
48
+    'COP' => __( 'Colombian Peso', 'invoicing' ),
49
+    'CRC' => __( 'Costa Rican Colon', 'invoicing' ),
50
+    'CUC' => __( 'Cuban Convertible Peso', 'invoicing' ),
51
+    'CUP' => __( 'Cuban Peso', 'invoicing' ),
52
+    'CVE' => __( 'Cape Verdean escudo', 'invoicing' ),
53
+    'CZK' => __( 'Czech Koruna', 'invoicing' ),
54
+    'DJF' => __( 'Djiboutian Franc', 'invoicing' ),
55
+    'DKK' => __( 'Danish Krone', 'invoicing' ),
56
+    'DOP' => __( 'Dominican Peso', 'invoicing' ),
57
+    'DZD' => __( 'Algerian Dinar', 'invoicing' ),
58
+    'EGP' => __( 'Egyptian Pound', 'invoicing' ),
59
+    'ERN' => __( 'Eritrean Nakfa', 'invoicing' ),
60
+    'ETB' => __( 'Ethiopian Irr', 'invoicing' ),
61
+    'FJD' => __( 'Fijian Dollar', 'invoicing' ),
62
+    'FKP' => __( 'Falkland Islands Pound', 'invoicing' ),
63
+    'GEL' => __( 'Georgian Lari', 'invoicing' ),
64
+    'GGP' => __( 'Guernsey Pound', 'invoicing' ),
65
+    'GHS' => __( 'Ghana Cedi', 'invoicing' ),
66
+    'GIP' => __( 'Gibraltar Pound', 'invoicing' ),
67
+    'GMD' => __( 'Gambian Dalasi', 'invoicing' ),
68
+    'GNF' => __( 'Guinean Franc', 'invoicing' ),
69
+    'GTQ' => __( 'Guatemalan Quetzal', 'invoicing' ),
70
+    'GYD' => __( 'Guyanese Dollar', 'invoicing' ),
71
+    'HKD' => __( 'Hong Kong Dollar', 'invoicing' ),
72
+    'HNL' => __( 'Honduran Lempira', 'invoicing' ),
73
+    'HRK' => __( 'Croatian Kuna', 'invoicing' ),
74
+    'HTG' => __( 'Haitian Gourde', 'invoicing' ),
75
+    'HUF' => __( 'Hungarian Forint', 'invoicing' ),
76
+    'IDR' => __( 'Indonesian Rupiah', 'invoicing' ),
77
+    'ILS' => __( 'Israeli New Shekel', 'invoicing' ),
78
+    'IMP' => __( 'Manx Pound', 'invoicing' ),
79
+    'INR' => __( 'Indian Rupee', 'invoicing' ),
80
+    'IQD' => __( 'Iraqi Dinar', 'invoicing' ),
81
+    'IRR' => __( 'Iranian Rial', 'invoicing' ),
82
+    'IRT' => __( 'Iranian Toman', 'invoicing' ),
83
+    'ISK' => __( 'Icelandic Krona', 'invoicing' ),
84
+    'JEP' => __( 'Jersey Pound', 'invoicing' ),
85
+    'JMD' => __( 'Jamaican Dollar', 'invoicing' ),
86
+    'JOD' => __( 'Jordanian Dinar', 'invoicing' ),
87
+    'JPY' => __( 'Japanese Yen', 'invoicing' ),
88
+    'KES' => __( 'Kenyan Shilling', 'invoicing' ),
89
+    'KGS' => __( 'Kyrgyzstani Som', 'invoicing' ),
90
+    'KHR' => __( 'Cambodian Riel', 'invoicing' ),
91
+    'KMF' => __( 'Comorian Franc', 'invoicing' ),
92
+    'KPW' => __( 'North Korean Won', 'invoicing' ),
93
+    'KRW' => __( 'South Korean Won', 'invoicing' ),
94
+    'KWD' => __( 'Kuwaiti Dinar', 'invoicing' ),
95
+    'KYD' => __( 'Cayman Islands Dollar', 'invoicing' ),
96
+    'KZT' => __( 'Kazakhstani Tenge', 'invoicing' ),
97
+    'LAK' => __( 'Lao Kip', 'invoicing' ),
98
+    'LBP' => __( 'Lebanese Pound', 'invoicing' ),
99
+    'LKR' => __( 'Sri Lankan Rupee', 'invoicing' ),
100
+    'LRD' => __( 'Liberian Dollar', 'invoicing' ),
101
+    'LSL' => __( 'Lesotho Loti', 'invoicing' ),
102
+    'LYD' => __( 'Libyan Dinar', 'invoicing' ),
103
+    'MAD' => __( 'Moroccan Dirham', 'invoicing' ),
104
+    'MDL' => __( 'Moldovan Leu', 'invoicing' ),
105
+    'MGA' => __( 'Malagasy Ariary', 'invoicing' ),
106
+    'MKD' => __( 'Macedonian Denar', 'invoicing' ),
107
+    'MMK' => __( 'Burmese Kyat', 'invoicing' ),
108
+    'MNT' => __( 'Mongolian Tughrik', 'invoicing' ),
109
+    'MOP' => __( 'Macanese Pataca', 'invoicing' ),
110
+    'MRO' => __( 'Mauritanian Ouguiya', 'invoicing' ),
111
+    'MUR' => __( 'Mauritian Rupee', 'invoicing' ),
112
+    'MVR' => __( 'Maldivian Rufiyaa', 'invoicing' ),
113
+    'MWK' => __( 'Malawian Kwacha', 'invoicing' ),
114
+    'MXN' => __( 'Mexican Peso', 'invoicing' ),
115
+    'MYR' => __( 'Malaysian Ringgit', 'invoicing' ),
116
+    'MZN' => __( 'Mozambican Metical', 'invoicing' ),
117
+    'NAD' => __( 'Namibian Dollar', 'invoicing' ),
118
+    'NGN' => __( 'Nigerian Naira', 'invoicing' ),
119
+    'NIO' => __( 'Nicaraguan Cordoba', 'invoicing' ),
120
+    'NOK' => __( 'Norwegian Krone', 'invoicing' ),
121
+    'NPR' => __( 'Nepalese Rupee', 'invoicing' ),
122
+    'NZD' => __( 'New Zealand Dollar', 'invoicing' ),
123
+    'OMR' => __( 'Omani Rial', 'invoicing' ),
124
+    'PAB' => __( 'Panamanian Balboa', 'invoicing' ),
125
+    'PEN' => __( 'Peruvian Nuevo Sol', 'invoicing' ),
126
+    'PGK' => __( 'Papua New Guinean Kina', 'invoicing' ),
127
+    'PHP' => __( 'Philippine Peso', 'invoicing' ),
128
+    'PKR' => __( 'Pakistani Rupee', 'invoicing' ),
129
+    'PLN' => __( 'Polish Zloty', 'invoicing' ),
130
+    'PRB' => __( 'Transnistrian Ruble', 'invoicing' ),
131
+    'PYG' => __( 'Paraguayan Guarani', 'invoicing' ),
132
+    'QAR' => __( 'Qatari Riyal', 'invoicing' ),
133
+    'RON' => __( 'Romanian Leu', 'invoicing' ),
134
+    'RSD' => __( 'Serbian Dinar', 'invoicing' ),
135
+    'RUB' => __( 'Russian Ruble', 'invoicing' ),
136
+    'RWF' => __( 'Rwandan Franc', 'invoicing' ),
137
+    'SAR' => __( 'Saudi Riyal', 'invoicing' ),
138
+    'SBD' => __( 'Solomon Islands Dollar', 'invoicing' ),
139
+    'SCR' => __( 'Seychellois Rupee', 'invoicing' ),
140
+    'SDG' => __( 'Sudanese Pound', 'invoicing' ),
141
+    'SEK' => __( 'Swedish Krona', 'invoicing' ),
142
+    'SGD' => __( 'Singapore Dollar', 'invoicing' ),
143
+    'SHP' => __( 'Saint Helena Pound', 'invoicing' ),
144
+    'SLL' => __( 'Sierra Leonean Leone', 'invoicing' ),
145
+    'SOS' => __( 'Somali Shilling', 'invoicing' ),
146
+    'SRD' => __( 'Surinamese Dollar', 'invoicing' ),
147
+    'SSP' => __( 'South Sudanese Pound', 'invoicing' ),
148
+    'STD' => __( 'Sao Tomean Dobra', 'invoicing' ),
149
+    'SYP' => __( 'Syrian Pound', 'invoicing' ),
150
+    'SZL' => __( 'Swazi Lilangeni', 'invoicing' ),
151
+    'THB' => __( 'Thai Baht', 'invoicing' ),
152
+    'TJS' => __( 'Tajikistani Somoni', 'invoicing' ),
153
+    'TMT' => __( 'Turkmenistan Manat', 'invoicing' ),
154
+    'TND' => __( 'Tunisian Dinar', 'invoicing' ),
155
+    'TOP' => __( 'Tongan Paʻanga', 'invoicing' ),
156
+    'TRY' => __( 'Turkish Lira', 'invoicing' ),
157
+    'TTD' => __( 'Trinidad and Tobago Dollar', 'invoicing' ),
158
+    'TWD' => __( 'New Taiwan Dollar', 'invoicing' ),
159
+    'TZS' => __( 'Tanzanian Shilling', 'invoicing' ),
160
+    'UAH' => __( 'Ukrainian Hryvnia', 'invoicing' ),
161
+    'UGX' => __( 'Ugandan Shilling', 'invoicing' ),
162
+    'UYU' => __( 'Uruguayan Peso', 'invoicing' ),
163
+    'UZS' => __( 'Uzbekistani Som', 'invoicing' ),
164
+    'VEF' => __( 'Venezuelan Bolívar', 'invoicing' ),
165
+    'VND' => __( 'Vietnamese Dong', 'invoicing' ),
166
+    'VUV' => __( 'Vanuatu Vatu', 'invoicing' ),
167
+    'WST' => __( 'Samoan Tala', 'invoicing' ),
168
+    'XAF' => __( 'Central African CFA Franc', 'invoicing' ),
169
+    'XCD' => __( 'East Caribbean Dollar', 'invoicing' ),
170
+    'XOF' => __( 'West African CFA Franc', 'invoicing' ),
171
+    'XPF' => __( 'CFP Franc', 'invoicing' ),
172
+    'YER' => __( 'Yemeni Rial', 'invoicing' ),
173
+    'ZAR' => __( 'South African Rand', 'invoicing' ),
174
+    'ZMW' => __( 'Zambian Kwacha', 'invoicing' ),
175 175
 );
Please login to merge, or discard this patch.
includes/api/class-wpinv-rest-items-controller.php 1 patch
Indentation   +163 added lines, -163 removed lines patch added patch discarded remove patch
@@ -15,172 +15,172 @@
 block discarded – undo
15 15
 class WPInv_REST_Items_Controller extends GetPaid_REST_Posts_Controller {
16 16
 
17 17
     /**
18
-	 * Post type.
19
-	 *
20
-	 * @var string
21
-	 */
22
-	protected $post_type = 'wpi_item';
18
+     * Post type.
19
+     *
20
+     * @var string
21
+     */
22
+    protected $post_type = 'wpi_item';
23 23
 	
24
-	/**
25
-	 * The base of this controller's route.
26
-	 *
27
-	 * @since 1.0.13
28
-	 * @var string
29
-	 */
30
-	protected $rest_base = 'items';
31
-
32
-	/** Contains this controller's class name.
33
-	 *
34
-	 * @var string
35
-	 */
36
-	public $crud_class = 'WPInv_Item';
37
-
38
-	/**
39
-	 * Registers the routes for the objects of the controller.
40
-	 *
41
-	 * @since 1.0.19
42
-	 *
43
-	 * @see register_rest_route()
44
-	 */
45
-	public function register_namespace_routes( $namespace ) {
46
-
47
-		parent::register_namespace_routes( $namespace );
48
-
49
-		register_rest_route(
50
-			$this->namespace,
51
-			'/' . $this->rest_base . '/item-types',
52
-			array(
53
-				array(
54
-					'methods'             => WP_REST_Server::READABLE,
55
-					'callback'            => array( $this, 'get_item_types' ),
56
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
57
-				),
58
-			)
59
-		);
60
-
61
-	}
62
-
63
-	/**
64
-	 * Handles rest requests for item types.
65
-	 *
66
-	 * @since 1.0.13
67
-	 * 
68
-	 * 
69
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
70
-	 */
71
-	public function get_item_types() {
72
-		return rest_ensure_response( wpinv_get_item_types() );
73
-	}
24
+    /**
25
+     * The base of this controller's route.
26
+     *
27
+     * @since 1.0.13
28
+     * @var string
29
+     */
30
+    protected $rest_base = 'items';
31
+
32
+    /** Contains this controller's class name.
33
+     *
34
+     * @var string
35
+     */
36
+    public $crud_class = 'WPInv_Item';
37
+
38
+    /**
39
+     * Registers the routes for the objects of the controller.
40
+     *
41
+     * @since 1.0.19
42
+     *
43
+     * @see register_rest_route()
44
+     */
45
+    public function register_namespace_routes( $namespace ) {
46
+
47
+        parent::register_namespace_routes( $namespace );
48
+
49
+        register_rest_route(
50
+            $this->namespace,
51
+            '/' . $this->rest_base . '/item-types',
52
+            array(
53
+                array(
54
+                    'methods'             => WP_REST_Server::READABLE,
55
+                    'callback'            => array( $this, 'get_item_types' ),
56
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
57
+                ),
58
+            )
59
+        );
60
+
61
+    }
62
+
63
+    /**
64
+     * Handles rest requests for item types.
65
+     *
66
+     * @since 1.0.13
67
+     * 
68
+     * 
69
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
70
+     */
71
+    public function get_item_types() {
72
+        return rest_ensure_response( wpinv_get_item_types() );
73
+    }
74
+
75
+    /**
76
+     * Retrieves the query params for the items collection.
77
+     *
78
+     * @since 1.0.13
79
+     *
80
+     * @return array Collection parameters.
81
+     */
82
+    public function get_collection_params() {
83
+
84
+        $params = array_merge(
85
+
86
+            parent::get_collection_params(),
87
+
88
+            array(
89
+
90
+                // Item types
91
+                'type'                  => array(
92
+                    'description'       => __( 'Type of items to fetch.', 'invoicing' ),
93
+                    'type'              => array( 'array', 'string' ),
94
+                    'default'           => 'any',
95
+                    'validate_callback' => 'rest_validate_request_arg',
96
+                    'sanitize_callback' => 'wpinv_parse_list',
97
+                    'items'             => array(
98
+                        'enum'          => array_merge( array( 'any' ), wpinv_item_types() ),
99
+                        'type'          => 'string',
100
+                    ),
101
+                ),
102
+
103
+            )
104
+        );
105
+
106
+        // Filter collection parameters for the items controller.
107
+        return apply_filters( 'getpaid_rest_items_collection_params', $params, $this );
108
+
109
+    }
110
+
111
+    /**
112
+     * Determine the allowed query_vars for a get_items() response and
113
+     * prepare for WP_Query.
114
+     *
115
+     * @param array           $prepared_args Prepared arguments.
116
+     * @param WP_REST_Request $request Request object.
117
+     * @return array          $query_args
118
+     */
119
+    protected function prepare_items_query( $prepared_args = array(), $request = null ) {
120
+
121
+        $query_args = parent::prepare_items_query( $prepared_args );
122
+
123
+        // Retrieve items by type.
124
+        if ( ! in_array( 'any', $request['type'] ) ) {
125
+
126
+            if ( empty( $query_args['meta_query'] ) ) {
127
+                $query_args['meta_query'] = array();
128
+            }
129
+
130
+            $query_args['meta_query'][] = array(
131
+                'key'     => '_wpinv_type',
132
+                'value'   => implode( ',', $request['type'] ),
133
+                'compare' => 'IN',
134
+            );
135
+
136
+        }
137
+
138
+        return apply_filters( 'getpaid_rest_items_prepare_items_query', $query_args, $request, $this );
139
+
140
+    }
141
+
142
+    /**
143
+     * Retrieves a valid list of post statuses.
144
+     *
145
+     * @since 1.0.15
146
+     *
147
+     * @return array A list of registered item statuses.
148
+     */
149
+    public function get_post_statuses() {
150
+        return array( 'draft', 'pending', 'publish' );
151
+    }
74 152
 
75 153
     /**
76
-	 * Retrieves the query params for the items collection.
77
-	 *
78
-	 * @since 1.0.13
79
-	 *
80
-	 * @return array Collection parameters.
81
-	 */
82
-	public function get_collection_params() {
83
-
84
-		$params = array_merge(
85
-
86
-			parent::get_collection_params(),
87
-
88
-        	array(
89
-
90
-				// Item types
91
-				'type'                  => array(
92
-					'description'       => __( 'Type of items to fetch.', 'invoicing' ),
93
-					'type'              => array( 'array', 'string' ),
94
-					'default'           => 'any',
95
-					'validate_callback' => 'rest_validate_request_arg',
96
-					'sanitize_callback' => 'wpinv_parse_list',
97
-					'items'             => array(
98
-						'enum'          => array_merge( array( 'any' ), wpinv_item_types() ),
99
-						'type'          => 'string',
100
-					),
101
-				),
102
-
103
-			)
104
-		);
105
-
106
-		// Filter collection parameters for the items controller.
107
-		return apply_filters( 'getpaid_rest_items_collection_params', $params, $this );
108
-
109
-	}
110
-
111
-	/**
112
-	 * Determine the allowed query_vars for a get_items() response and
113
-	 * prepare for WP_Query.
114
-	 *
115
-	 * @param array           $prepared_args Prepared arguments.
116
-	 * @param WP_REST_Request $request Request object.
117
-	 * @return array          $query_args
118
-	 */
119
-	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
120
-
121
-		$query_args = parent::prepare_items_query( $prepared_args );
122
-
123
-		// Retrieve items by type.
124
-		if ( ! in_array( 'any', $request['type'] ) ) {
125
-
126
-			if ( empty( $query_args['meta_query'] ) ) {
127
-				$query_args['meta_query'] = array();
128
-			}
129
-
130
-			$query_args['meta_query'][] = array(
131
-				'key'     => '_wpinv_type',
132
-				'value'   => implode( ',', $request['type'] ),
133
-				'compare' => 'IN',
134
-			);
135
-
136
-		}
137
-
138
-		return apply_filters( 'getpaid_rest_items_prepare_items_query', $query_args, $request, $this );
139
-
140
-	}
141
-
142
-	/**
143
-	 * Retrieves a valid list of post statuses.
144
-	 *
145
-	 * @since 1.0.15
146
-	 *
147
-	 * @return array A list of registered item statuses.
148
-	 */
149
-	public function get_post_statuses() {
150
-		return array( 'draft', 'pending', 'publish' );
151
-	}
152
-
153
-	/**
154
-	 * Checks if a key should be included in a response.
155
-	 *
156
-	 * @since  1.0.19
157
-	 * @param  WPInv_Item   $item  Item object.
158
-	 * @param  string       $field_key The key to check for.
159
-	 * @return bool
160
-	 */
161
-	public function object_supports_field( $item, $field_key ) {
162
-
163
-		if ( 'minimum_price' == $field_key && ! $item->user_can_set_their_price() ) {
164
-			return false;
165
-		}
166
-
167
-		foreach( wpinv_parse_list( 'initial_price the_initial_price recurring_price the_recurring_price recurring_period recurring_interval recurring_limit is_free_trial trial_period trial_interval first_renewal_date' ) as $key ) {
168
-
169
-			if ( $key == $field_key && ! $item->is_recurring() ) {
170
-				return false;
171
-			}
172
-
173
-		}
174
-
175
-		foreach( wpinv_parse_list( 'trial_period trial_interval' ) as $key ) {
176
-
177
-			if ( $key == $field_key && ! $item->has_free_trial() ) {
178
-				return false;
179
-			}
180
-
181
-		}
154
+     * Checks if a key should be included in a response.
155
+     *
156
+     * @since  1.0.19
157
+     * @param  WPInv_Item   $item  Item object.
158
+     * @param  string       $field_key The key to check for.
159
+     * @return bool
160
+     */
161
+    public function object_supports_field( $item, $field_key ) {
162
+
163
+        if ( 'minimum_price' == $field_key && ! $item->user_can_set_their_price() ) {
164
+            return false;
165
+        }
166
+
167
+        foreach( wpinv_parse_list( 'initial_price the_initial_price recurring_price the_recurring_price recurring_period recurring_interval recurring_limit is_free_trial trial_period trial_interval first_renewal_date' ) as $key ) {
168
+
169
+            if ( $key == $field_key && ! $item->is_recurring() ) {
170
+                return false;
171
+            }
172
+
173
+        }
174
+
175
+        foreach( wpinv_parse_list( 'trial_period trial_interval' ) as $key ) {
176
+
177
+            if ( $key == $field_key && ! $item->has_free_trial() ) {
178
+                return false;
179
+            }
180
+
181
+        }
182 182
 
183
-		return parent::object_supports_field( $item, $field_key );
184
-	}
183
+        return parent::object_supports_field( $item, $field_key );
184
+    }
185 185
 
186 186
 }
Please login to merge, or discard this patch.
includes/api/class-wpinv-rest-discounts-controller.php 1 patch
Indentation   +131 added lines, -131 removed lines patch added patch discarded remove patch
@@ -15,138 +15,138 @@
 block discarded – undo
15 15
 class WPInv_REST_Discounts_Controller extends GetPaid_REST_Posts_Controller {
16 16
 
17 17
     /**
18
-	 * Post type.
19
-	 *
20
-	 * @var string
21
-	 */
22
-	protected $post_type = 'wpi_discount';
23
-
24
-	/**
25
-	 * The base of this controller's route.
26
-	 *
27
-	 * @since 1.0.13
28
-	 * @var string
29
-	 */
30
-	protected $rest_base = 'discounts';
31
-
32
-	/** Contains this controller's class name.
33
-	 *
34
-	 * @var string
35
-	 */
36
-	public $crud_class = 'WPInv_Discount';
37
-
38
-	/**
39
-	 * Registers the routes for the objects of the controller.
40
-	 *
41
-	 * @since 1.0.19
42
-	 *
43
-	 * @see register_rest_route()
44
-	 */
45
-	public function register_namespace_routes( $namespace ) {
46
-
47
-		parent::register_namespace_routes( $namespace );
48
-
49
-		register_rest_route(
50
-			$this->namespace,
51
-			'/' . $this->rest_base . '/discount-types',
52
-			array(
53
-				array(
54
-					'methods'             => WP_REST_Server::READABLE,
55
-					'callback'            => array( $this, 'get_discount_types' ),
56
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
57
-				),
58
-			)
59
-		);
60
-
61
-	}
62
-
63
-	/**
64
-	 * Handles rest requests for discount types.
65
-	 *
66
-	 * @since 1.0.13
67
-	 *
68
-	 *
69
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
70
-	 */
71
-	public function get_discount_types() {
72
-		return rest_ensure_response( wpinv_get_discount_types() );
73
-	}
18
+     * Post type.
19
+     *
20
+     * @var string
21
+     */
22
+    protected $post_type = 'wpi_discount';
74 23
 
75 24
     /**
76
-	 * Retrieves the query params for the discount collection.
77
-	 *
78
-	 * @since 1.0.13
79
-	 *
80
-	 * @return array Collection parameters.
81
-	 */
82
-	public function get_collection_params() {
83
-
84
-		$params = array_merge(
85
-
86
-			parent::get_collection_params(),
87
-
88
-        	array(
89
-
90
-				// Discount types
91
-				'type'                  => array(
92
-					'description'       => __( 'Type of discounts to fetch.', 'invoicing' ),
93
-					'type'              => array( 'array', 'string' ),
94
-					'default'           => 'any',
95
-					'validate_callback' => 'rest_validate_request_arg',
96
-					'sanitize_callback' => 'wpinv_parse_list',
97
-					'items'             => array(
98
-						'enum'          => array_merge( array( 'any' ), array_keys( wpinv_get_discount_types() ) ),
99
-						'type'          => 'string',
100
-					),
101
-				),
102
-
103
-			)
104
-		);
105
-
106
-		// Filter collection parameters for the discounts controller.
107
-		return apply_filters( 'getpaid_rest_discounts_collection_params', $params, $this );
108
-	}
109
-
110
-	/**
111
-	 * Determine the allowed query_vars for a get_items() response and
112
-	 * prepare for WP_Query.
113
-	 *
114
-	 * @param array           $prepared_args Prepared arguments.
115
-	 * @param WP_REST_Request $request Request object.
116
-	 * @return array          $query_args
117
-	 */
118
-	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
119
-
120
-		$query_args = parent::prepare_items_query( $prepared_args );
121
-
122
-		// Retrieve items by type.
123
-		if ( ! in_array( 'any', $request['type'] ) ) {
124
-
125
-			if ( empty( $query_args['meta_query'] ) ) {
126
-				$query_args['meta_query'] = array();
127
-			}
128
-
129
-			$query_args['meta_query'][] = array(
130
-				'key'     => '_wpi_discount_type',
131
-				'value'   => implode( ',', $request['type'] ),
132
-				'compare' => 'IN',
133
-			);
134
-
135
-		}
136
-
137
-		return apply_filters( 'getpaid_rest_discounts_prepare_items_query', $query_args, $request, $this );
138
-
139
-	}
140
-
141
-	/**
142
-	 * Retrieves a valid list of post statuses.
143
-	 *
144
-	 * @since 1.0.15
145
-	 *
146
-	 * @return array A list of registered item statuses.
147
-	 */
148
-	public function get_post_statuses() {
149
-		return array( 'publish', 'pending', 'draft', 'expired' );
150
-	}
25
+     * The base of this controller's route.
26
+     *
27
+     * @since 1.0.13
28
+     * @var string
29
+     */
30
+    protected $rest_base = 'discounts';
31
+
32
+    /** Contains this controller's class name.
33
+     *
34
+     * @var string
35
+     */
36
+    public $crud_class = 'WPInv_Discount';
37
+
38
+    /**
39
+     * Registers the routes for the objects of the controller.
40
+     *
41
+     * @since 1.0.19
42
+     *
43
+     * @see register_rest_route()
44
+     */
45
+    public function register_namespace_routes( $namespace ) {
46
+
47
+        parent::register_namespace_routes( $namespace );
48
+
49
+        register_rest_route(
50
+            $this->namespace,
51
+            '/' . $this->rest_base . '/discount-types',
52
+            array(
53
+                array(
54
+                    'methods'             => WP_REST_Server::READABLE,
55
+                    'callback'            => array( $this, 'get_discount_types' ),
56
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
57
+                ),
58
+            )
59
+        );
60
+
61
+    }
62
+
63
+    /**
64
+     * Handles rest requests for discount types.
65
+     *
66
+     * @since 1.0.13
67
+     *
68
+     *
69
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
70
+     */
71
+    public function get_discount_types() {
72
+        return rest_ensure_response( wpinv_get_discount_types() );
73
+    }
74
+
75
+    /**
76
+     * Retrieves the query params for the discount collection.
77
+     *
78
+     * @since 1.0.13
79
+     *
80
+     * @return array Collection parameters.
81
+     */
82
+    public function get_collection_params() {
83
+
84
+        $params = array_merge(
85
+
86
+            parent::get_collection_params(),
87
+
88
+            array(
89
+
90
+                // Discount types
91
+                'type'                  => array(
92
+                    'description'       => __( 'Type of discounts to fetch.', 'invoicing' ),
93
+                    'type'              => array( 'array', 'string' ),
94
+                    'default'           => 'any',
95
+                    'validate_callback' => 'rest_validate_request_arg',
96
+                    'sanitize_callback' => 'wpinv_parse_list',
97
+                    'items'             => array(
98
+                        'enum'          => array_merge( array( 'any' ), array_keys( wpinv_get_discount_types() ) ),
99
+                        'type'          => 'string',
100
+                    ),
101
+                ),
102
+
103
+            )
104
+        );
105
+
106
+        // Filter collection parameters for the discounts controller.
107
+        return apply_filters( 'getpaid_rest_discounts_collection_params', $params, $this );
108
+    }
109
+
110
+    /**
111
+     * Determine the allowed query_vars for a get_items() response and
112
+     * prepare for WP_Query.
113
+     *
114
+     * @param array           $prepared_args Prepared arguments.
115
+     * @param WP_REST_Request $request Request object.
116
+     * @return array          $query_args
117
+     */
118
+    protected function prepare_items_query( $prepared_args = array(), $request = null ) {
119
+
120
+        $query_args = parent::prepare_items_query( $prepared_args );
121
+
122
+        // Retrieve items by type.
123
+        if ( ! in_array( 'any', $request['type'] ) ) {
124
+
125
+            if ( empty( $query_args['meta_query'] ) ) {
126
+                $query_args['meta_query'] = array();
127
+            }
128
+
129
+            $query_args['meta_query'][] = array(
130
+                'key'     => '_wpi_discount_type',
131
+                'value'   => implode( ',', $request['type'] ),
132
+                'compare' => 'IN',
133
+            );
134
+
135
+        }
136
+
137
+        return apply_filters( 'getpaid_rest_discounts_prepare_items_query', $query_args, $request, $this );
138
+
139
+    }
140
+
141
+    /**
142
+     * Retrieves a valid list of post statuses.
143
+     *
144
+     * @since 1.0.15
145
+     *
146
+     * @return array A list of registered item statuses.
147
+     */
148
+    public function get_post_statuses() {
149
+        return array( 'publish', 'pending', 'draft', 'expired' );
150
+    }
151 151
 
152 152
 }
Please login to merge, or discard this patch.
includes/data/discount-schema.php 1 patch
Indentation   +162 added lines, -162 removed lines patch added patch discarded remove patch
@@ -13,168 +13,168 @@
 block discarded – undo
13 13
 
14 14
 return array(
15 15
 
16
-	'id'              => array(
17
-		'description' => __( 'Unique identifier for the discount.', 'invoicing' ),
18
-		'type'        => 'integer',
19
-		'context'     => array( 'view', 'edit', 'embed' ),
20
-		'readonly'    => true,
21
-	),
22
-
23
-	'status'          => array(
24
-		'description' => __( 'A named status for the discount.', 'invoicing' ),
25
-		'type'        => 'string',
26
-		'enum'        => array( 'publish', 'pending', 'draft', 'expired' ),
27
-		'default'     => 'draft',
28
-		'context'     => array( 'view', 'edit', 'embed' ),
29
-	),
30
-
31
-	'version'         => array(
32
-		'description' => __( 'Plugin version when the discount was created.', 'invoicing' ),
33
-		'type'        => 'string',
34
-		'context'     => array( 'view', 'edit', 'embed' ),
35
-		'readonly'    => true,
36
-	),
37
-
38
-	'date_created'    => array(
39
-		'description' => __( "The date the discount was created, in the site's timezone.", 'invoicing' ),
40
-		'type'        => 'string',
41
-		'context'     => array( 'view', 'edit', 'embed' ),
42
-	),
43
-
44
-	'date_created_gmt'    => array(
45
-		'description' => __( 'The GMT date the discount was created.', 'invoicing' ),
46
-		'type'        => 'string',
47
-		'context'     => array( 'view', 'edit', 'embed' ),
48
-		'readonly'    => true,
49
-	),
50
-
51
-	'date_modified'   => array(
52
-		'description' => __( "The date the discount was last modified, in the site's timezone.", 'invoicing' ),
53
-		'type'        => 'string',
54
-		'context'     => array( 'view', 'edit', 'embed' ),
55
-		'readonly'    => true,
56
-	),
57
-
58
-	'date_modified_gmt'    => array(
59
-		'description' => __( 'The GMT date the discount was last modified.', 'invoicing' ),
60
-		'type'        => 'string',
61
-		'context'     => array( 'view', 'edit', 'embed' ),
62
-		'readonly'    => true,
63
-	),
64
-
65
-	'name'			  => array(
66
-		'description' => __( 'The discount name.', 'invoicing' ),
67
-		'type'        => 'string',
68
-		'context'     => array( 'view', 'edit', 'embed' ),
69
-	),
70
-
71
-	'description'     => array(
72
-		'description' => __( 'A description of what the discount is all about.', 'invoicing' ),
73
-		'type'        => 'string',
74
-		'context'     => array( 'view', 'edit', 'embed' ),
75
-	),
76
-
77
-	'code'            => array(
78
-		'description' => __( 'The discount code.', 'invoicing' ),
79
-		'type'        => 'string',
80
-		'context'     => array( 'view', 'edit', 'embed' ),
81
-		'required'	  => true,
82
-	),
83
-
84
-	'type'            => array(
85
-		'description' => __( 'The type of discount.', 'invoicing' ),
86
-		'type'        => 'string',
87
-		'enum'        => array_keys( wpinv_get_discount_types() ),
88
-		'context'     => array( 'view', 'edit', 'embed' ),
89
-		'default'	  => 'percent',
90
-	),
91
-
92
-	'amount'        => array(
93
-		'description' => __( 'The discount value.', 'invoicing' ),
94
-		'type'        => 'number',
95
-		'context'     => array( 'view', 'edit', 'embed' ),
96
-		'required'	  => true,
97
-	),
98
-
99
-	'formatted_amount'        => array(
100
-		'description' => __( 'The formatted discount value.', 'invoicing' ),
101
-		'type'        => 'string',
102
-		'context'     => array( 'view', 'edit', 'embed' ),
103
-		'readonly'    => true,
104
-	),
105
-
106
-	'uses'            => array(
107
-		'description' => __( 'The number of times the discount has been used.', 'invoicing' ),
108
-		'type'        => 'integer',
109
-		'context'     => array( 'view', 'embed' ),
110
-		'readonly'    => true,
111
-	),
112
-
113
-	'max_uses'        => array(
114
-		'description' => __( 'The maximum number of times the discount can be used.', 'invoicing' ),
115
-		'type'        => 'integer',
116
-		'context'     => array( 'view', 'edit' ),
117
-	),
118
-
119
-	'usage'           => array(
120
-		'description' => __( "The discount's usage, i.e uses / max uses.", 'invoicing' ),
121
-		'type'        => 'string',
122
-		'context'     => array( 'view', 'embed' ),
123
-		'readonly'    => true,
124
-	),
125
-
126
-	'is_single_use'   => array(
127
-		'description' => __( 'Whether or not the discount can only be used once per user.', 'invoicing' ),
128
-		'type'        => 'boolean',
129
-		'context'     => array( 'view', 'edit' ),
130
-	),
131
-
132
-	'is_recurring'   => array(
133
-		'description' => __( 'Whether or not the discount applies to the initial payment only or all recurring payments.', 'invoicing' ),
134
-		'type'        => 'boolean',
135
-		'context'     => array( 'view', 'edit' ),
136
-	),
137
-
138
-	'start_date'      => array(
139
-		'description' => __( 'The start date for the discount in the format of yyyy-mm-dd hh:mm:ss. If provided, the discount can only be used after or on this date.', 'invoicing' ),
140
-		'type'        => 'string',
141
-		'context'     => array( 'view', 'edit' ),
142
-	),
143
-
144
-	'end_date'        => array(
145
-		'description' => __( 'The expiration date for the discount.', 'invoicing' ),
146
-		'type'        => 'string',
147
-		'context'     => array( 'view', 'edit' ),
148
-	),
149
-
150
-	'allowed_items'   => array(
151
-		'description' => __( 'Items which are allowed to use this discount. Leave blank to enable for all items.', 'invoicing' ),
152
-		'type'        => 'array',
153
-		'context'     => array( 'view', 'edit' ),
154
-		'items'       => array(
155
-			'type'    => 'integer'
156
-		)
157
-	),
158
-
159
-	'excluded_items'  => array(
160
-		'description' => __( 'Items which are NOT allowed to use this discount.', 'invoicing' ),
161
-		'type'        => 'array',
162
-		'context'     => array( 'view', 'edit' ),
163
-		'items'       => array(
164
-			'type'    => 'integer'
165
-		)
166
-	),
16
+    'id'              => array(
17
+        'description' => __( 'Unique identifier for the discount.', 'invoicing' ),
18
+        'type'        => 'integer',
19
+        'context'     => array( 'view', 'edit', 'embed' ),
20
+        'readonly'    => true,
21
+    ),
22
+
23
+    'status'          => array(
24
+        'description' => __( 'A named status for the discount.', 'invoicing' ),
25
+        'type'        => 'string',
26
+        'enum'        => array( 'publish', 'pending', 'draft', 'expired' ),
27
+        'default'     => 'draft',
28
+        'context'     => array( 'view', 'edit', 'embed' ),
29
+    ),
30
+
31
+    'version'         => array(
32
+        'description' => __( 'Plugin version when the discount was created.', 'invoicing' ),
33
+        'type'        => 'string',
34
+        'context'     => array( 'view', 'edit', 'embed' ),
35
+        'readonly'    => true,
36
+    ),
37
+
38
+    'date_created'    => array(
39
+        'description' => __( "The date the discount was created, in the site's timezone.", 'invoicing' ),
40
+        'type'        => 'string',
41
+        'context'     => array( 'view', 'edit', 'embed' ),
42
+    ),
43
+
44
+    'date_created_gmt'    => array(
45
+        'description' => __( 'The GMT date the discount was created.', 'invoicing' ),
46
+        'type'        => 'string',
47
+        'context'     => array( 'view', 'edit', 'embed' ),
48
+        'readonly'    => true,
49
+    ),
50
+
51
+    'date_modified'   => array(
52
+        'description' => __( "The date the discount was last modified, in the site's timezone.", 'invoicing' ),
53
+        'type'        => 'string',
54
+        'context'     => array( 'view', 'edit', 'embed' ),
55
+        'readonly'    => true,
56
+    ),
57
+
58
+    'date_modified_gmt'    => array(
59
+        'description' => __( 'The GMT date the discount was last modified.', 'invoicing' ),
60
+        'type'        => 'string',
61
+        'context'     => array( 'view', 'edit', 'embed' ),
62
+        'readonly'    => true,
63
+    ),
64
+
65
+    'name'			  => array(
66
+        'description' => __( 'The discount name.', 'invoicing' ),
67
+        'type'        => 'string',
68
+        'context'     => array( 'view', 'edit', 'embed' ),
69
+    ),
70
+
71
+    'description'     => array(
72
+        'description' => __( 'A description of what the discount is all about.', 'invoicing' ),
73
+        'type'        => 'string',
74
+        'context'     => array( 'view', 'edit', 'embed' ),
75
+    ),
76
+
77
+    'code'            => array(
78
+        'description' => __( 'The discount code.', 'invoicing' ),
79
+        'type'        => 'string',
80
+        'context'     => array( 'view', 'edit', 'embed' ),
81
+        'required'	  => true,
82
+    ),
83
+
84
+    'type'            => array(
85
+        'description' => __( 'The type of discount.', 'invoicing' ),
86
+        'type'        => 'string',
87
+        'enum'        => array_keys( wpinv_get_discount_types() ),
88
+        'context'     => array( 'view', 'edit', 'embed' ),
89
+        'default'	  => 'percent',
90
+    ),
91
+
92
+    'amount'        => array(
93
+        'description' => __( 'The discount value.', 'invoicing' ),
94
+        'type'        => 'number',
95
+        'context'     => array( 'view', 'edit', 'embed' ),
96
+        'required'	  => true,
97
+    ),
98
+
99
+    'formatted_amount'        => array(
100
+        'description' => __( 'The formatted discount value.', 'invoicing' ),
101
+        'type'        => 'string',
102
+        'context'     => array( 'view', 'edit', 'embed' ),
103
+        'readonly'    => true,
104
+    ),
105
+
106
+    'uses'            => array(
107
+        'description' => __( 'The number of times the discount has been used.', 'invoicing' ),
108
+        'type'        => 'integer',
109
+        'context'     => array( 'view', 'embed' ),
110
+        'readonly'    => true,
111
+    ),
112
+
113
+    'max_uses'        => array(
114
+        'description' => __( 'The maximum number of times the discount can be used.', 'invoicing' ),
115
+        'type'        => 'integer',
116
+        'context'     => array( 'view', 'edit' ),
117
+    ),
118
+
119
+    'usage'           => array(
120
+        'description' => __( "The discount's usage, i.e uses / max uses.", 'invoicing' ),
121
+        'type'        => 'string',
122
+        'context'     => array( 'view', 'embed' ),
123
+        'readonly'    => true,
124
+    ),
125
+
126
+    'is_single_use'   => array(
127
+        'description' => __( 'Whether or not the discount can only be used once per user.', 'invoicing' ),
128
+        'type'        => 'boolean',
129
+        'context'     => array( 'view', 'edit' ),
130
+    ),
131
+
132
+    'is_recurring'   => array(
133
+        'description' => __( 'Whether or not the discount applies to the initial payment only or all recurring payments.', 'invoicing' ),
134
+        'type'        => 'boolean',
135
+        'context'     => array( 'view', 'edit' ),
136
+    ),
137
+
138
+    'start_date'      => array(
139
+        'description' => __( 'The start date for the discount in the format of yyyy-mm-dd hh:mm:ss. If provided, the discount can only be used after or on this date.', 'invoicing' ),
140
+        'type'        => 'string',
141
+        'context'     => array( 'view', 'edit' ),
142
+    ),
143
+
144
+    'end_date'        => array(
145
+        'description' => __( 'The expiration date for the discount.', 'invoicing' ),
146
+        'type'        => 'string',
147
+        'context'     => array( 'view', 'edit' ),
148
+    ),
149
+
150
+    'allowed_items'   => array(
151
+        'description' => __( 'Items which are allowed to use this discount. Leave blank to enable for all items.', 'invoicing' ),
152
+        'type'        => 'array',
153
+        'context'     => array( 'view', 'edit' ),
154
+        'items'       => array(
155
+            'type'    => 'integer'
156
+        )
157
+    ),
158
+
159
+    'excluded_items'  => array(
160
+        'description' => __( 'Items which are NOT allowed to use this discount.', 'invoicing' ),
161
+        'type'        => 'array',
162
+        'context'     => array( 'view', 'edit' ),
163
+        'items'       => array(
164
+            'type'    => 'integer'
165
+        )
166
+    ),
167 167
 	
168
-	'minimum_total'   => array(
169
-		'description' => __( 'The minimum total needed to use this invoice.', 'invoicing' ),
170
-		'type'        => 'number',
171
-		'context'     => array( 'view', 'edit' ),
172
-	),
173
-
174
-	'maximum_total'   => array(
175
-		'description' => __( 'The maximum total needed to use this invoice.', 'invoicing' ),
176
-		'type'        => 'number',
177
-		'context'     => array( 'view', 'edit' ),
178
-	),
168
+    'minimum_total'   => array(
169
+        'description' => __( 'The minimum total needed to use this invoice.', 'invoicing' ),
170
+        'type'        => 'number',
171
+        'context'     => array( 'view', 'edit' ),
172
+    ),
173
+
174
+    'maximum_total'   => array(
175
+        'description' => __( 'The maximum total needed to use this invoice.', 'invoicing' ),
176
+        'type'        => 'number',
177
+        'context'     => array( 'view', 'edit' ),
178
+    ),
179 179
 
180 180
 );
Please login to merge, or discard this patch.
uninstall.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
4
-	exit;
4
+    exit;
5 5
 }
6 6
 
7 7
 global $wpdb;
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-controller.php 1 patch
Indentation   +542 added lines, -542 removed lines patch added patch discarded remove patch
@@ -21,570 +21,570 @@
 block discarded – undo
21 21
  */
22 22
 class GetPaid_REST_Controller extends WP_REST_Controller {
23 23
 
24
-	/**
24
+    /**
25 25
      * The namespaces of this controller's route.
26 26
      *
27 27
      * @since 1.0.19
28 28
      * @var array
29 29
      */
30
-	protected $namespaces;
30
+    protected $namespaces;
31 31
 
32
-	/**
32
+    /**
33 33
      * The official namespace of this controller's route.
34 34
      *
35 35
      * @since 1.0.19
36 36
      * @var string
37 37
      */
38
-	protected $namespace = 'getpaid/v1';
38
+    protected $namespace = 'getpaid/v1';
39 39
 
40
-	/**
40
+    /**
41 41
      * Cached results of get_item_schema.
42 42
      *
43 43
      * @since 1.0.19
44 44
      * @var array
45 45
      */
46
-	protected $schema;
46
+    protected $schema;
47 47
 
48 48
     /**
49
-	 * Constructor.
50
-	 *
51
-	 * @since 1.0.19
52
-	 *
53
-	 */
54
-	public function __construct() {
55
-
56
-		// Offer several namespaces for backwards compatibility.
57
-		$this->namespaces = apply_filters(
58
-			'getpaid_rest_api_namespaces',
59
-			array(
60
-				'getpaid/v1',
61
-				'invoicing/v1',
62
-				'wpi/v1'
63
-			)
64
-		);
65
-
66
-		// Register REST routes.
49
+     * Constructor.
50
+     *
51
+     * @since 1.0.19
52
+     *
53
+     */
54
+    public function __construct() {
55
+
56
+        // Offer several namespaces for backwards compatibility.
57
+        $this->namespaces = apply_filters(
58
+            'getpaid_rest_api_namespaces',
59
+            array(
60
+                'getpaid/v1',
61
+                'invoicing/v1',
62
+                'wpi/v1'
63
+            )
64
+        );
65
+
66
+        // Register REST routes.
67 67
         add_action( 'rest_api_init', array( $this, 'register_routes' ) );
68 68
 
69
-	}
70
-
71
-	/**
72
-	 * Registers routes for each namespace.
73
-	 *
74
-	 * @since 1.0.19
75
-	 *
76
-	 */
77
-	public function register_routes() {
78
-
79
-		foreach ( $this->namespaces as $namespace ) {
80
-			$this->register_namespace_routes( $namespace );
81
-		}
82
-
83
-	}
84
-
85
-	/**
86
-	 * Registers routes for a namespace.
87
-	 *
88
-	 * @since 1.0.19
89
-	 *
90
-	 * @param string $namespace
91
-	 */
92
-	public function register_namespace_routes( /** @scrutinizer ignore-unused */ $namespace ) {
93
-
94
-		getpaid_doing_it_wrong(
95
-			__CLASS__ . '::' .__METHOD__,
96
-			/* translators: %s: register_namespace_routes() */
97
-			sprintf( __( "Method '%s' must be overridden." ), __METHOD__ ),
98
-			'1.0.19'
99
-		);
100
-
101
-	}
102
-
103
-	/**
104
-	 * Get normalized rest base.
105
-	 *
106
-	 * @return string
107
-	 */
108
-	protected function get_normalized_rest_base() {
109
-		return preg_replace( '/\(.*\)\//i', '', $this->rest_base );
110
-	}
111
-
112
-	/**
113
-	 * Fill batches.
114
-	 *
115
-	 * @param array array of request items.
116
-	 * @return array
117
-	 */
118
-	protected function fill_batch_keys( $items ) {
119
-
120
-		$items['create'] = empty( $items['create'] ) ? array() : $items['create'];
121
-		$items['update'] = empty( $items['update'] ) ? array() : $items['update'];
122
-		$items['delete'] = empty( $items['delete'] ) ? array() : wp_parse_id_list( $items['delete'] );
123
-		return $items;
124
-
125
-	}
126
-
127
-	/**
128
-	 * Check batch limit.
129
-	 *
130
-	 * @param array $items Request items.
131
-	 * @return bool|WP_Error
132
-	 */
133
-	protected function check_batch_limit( $items ) {
134
-		$limit = apply_filters( 'getpaid_rest_batch_items_limit', 100, $this->get_normalized_rest_base() );
135
-		$total = count( $items['create'] ) + count( $items['update'] ) + count( $items['delete'] );
136
-
137
-		if ( $total > $limit ) {
138
-			/* translators: %s: items limit */
139
-			return new WP_Error( 'getpaid_rest_request_entity_too_large', sprintf( __( 'Unable to accept more than %s items for this request.', 'invoicing' ), $limit ), array( 'status' => 413 ) );
140
-		}
141
-
142
-		return true;
143
-	}
144
-
145
-	/**
146
-	 * Bulk create items.
147
-	 *
148
-	 * @param array $items Array of items to create.
149
-	 * @param WP_REST_Request $request Full details about the request.
150
-	 * @param WP_REST_Server $wp_rest_server
151
-	 * @return array()
152
-	 */
153
-	protected function batch_create_items( $items, $request, $wp_rest_server ) {
154
-
155
-		$query  = $request->get_query_params();
156
-		$create = array();
157
-
158
-		foreach ( $items as $item ) {
159
-			$_item = new WP_REST_Request( 'POST' );
160
-
161
-			// Default parameters.
162
-			$defaults = array();
163
-			$schema   = $this->get_public_item_schema();
164
-			foreach ( $schema['properties'] as $arg => $options ) {
165
-				if ( isset( $options['default'] ) ) {
166
-					$defaults[ $arg ] = $options['default'];
167
-				}
168
-			}
169
-			$_item->set_default_params( $defaults );
170
-
171
-			// Set request parameters.
172
-			$_item->set_body_params( $item );
173
-
174
-			// Set query (GET) parameters.
175
-			$_item->set_query_params( $query );
176
-
177
-			// Create the item.
178
-			$_response = $this->create_item( $_item );
179
-
180
-			// If an error occured...
181
-			if ( is_wp_error( $_response ) ) {
182
-
183
-				$create[]   = array(
184
-					'id'    => 0,
185
-					'error' => array(
186
-						'code'    => $_response->get_error_code(),
187
-						'message' => $_response->get_error_message(),
188
-						'data'    => $_response->get_error_data(),
189
-					),
190
-				);
191
-
192
-				continue;
193
-			}
194
-
195
-			$create[] = $wp_rest_server->response_to_data( /** @scrutinizer ignore-type */ $_response, false );
196
-
197
-		}
198
-
199
-		return $create;
69
+    }
70
+
71
+    /**
72
+     * Registers routes for each namespace.
73
+     *
74
+     * @since 1.0.19
75
+     *
76
+     */
77
+    public function register_routes() {
78
+
79
+        foreach ( $this->namespaces as $namespace ) {
80
+            $this->register_namespace_routes( $namespace );
81
+        }
82
+
83
+    }
84
+
85
+    /**
86
+     * Registers routes for a namespace.
87
+     *
88
+     * @since 1.0.19
89
+     *
90
+     * @param string $namespace
91
+     */
92
+    public function register_namespace_routes( /** @scrutinizer ignore-unused */ $namespace ) {
93
+
94
+        getpaid_doing_it_wrong(
95
+            __CLASS__ . '::' .__METHOD__,
96
+            /* translators: %s: register_namespace_routes() */
97
+            sprintf( __( "Method '%s' must be overridden." ), __METHOD__ ),
98
+            '1.0.19'
99
+        );
100
+
101
+    }
102
+
103
+    /**
104
+     * Get normalized rest base.
105
+     *
106
+     * @return string
107
+     */
108
+    protected function get_normalized_rest_base() {
109
+        return preg_replace( '/\(.*\)\//i', '', $this->rest_base );
110
+    }
111
+
112
+    /**
113
+     * Fill batches.
114
+     *
115
+     * @param array array of request items.
116
+     * @return array
117
+     */
118
+    protected function fill_batch_keys( $items ) {
119
+
120
+        $items['create'] = empty( $items['create'] ) ? array() : $items['create'];
121
+        $items['update'] = empty( $items['update'] ) ? array() : $items['update'];
122
+        $items['delete'] = empty( $items['delete'] ) ? array() : wp_parse_id_list( $items['delete'] );
123
+        return $items;
124
+
125
+    }
126
+
127
+    /**
128
+     * Check batch limit.
129
+     *
130
+     * @param array $items Request items.
131
+     * @return bool|WP_Error
132
+     */
133
+    protected function check_batch_limit( $items ) {
134
+        $limit = apply_filters( 'getpaid_rest_batch_items_limit', 100, $this->get_normalized_rest_base() );
135
+        $total = count( $items['create'] ) + count( $items['update'] ) + count( $items['delete'] );
136
+
137
+        if ( $total > $limit ) {
138
+            /* translators: %s: items limit */
139
+            return new WP_Error( 'getpaid_rest_request_entity_too_large', sprintf( __( 'Unable to accept more than %s items for this request.', 'invoicing' ), $limit ), array( 'status' => 413 ) );
140
+        }
141
+
142
+        return true;
143
+    }
144
+
145
+    /**
146
+     * Bulk create items.
147
+     *
148
+     * @param array $items Array of items to create.
149
+     * @param WP_REST_Request $request Full details about the request.
150
+     * @param WP_REST_Server $wp_rest_server
151
+     * @return array()
152
+     */
153
+    protected function batch_create_items( $items, $request, $wp_rest_server ) {
154
+
155
+        $query  = $request->get_query_params();
156
+        $create = array();
157
+
158
+        foreach ( $items as $item ) {
159
+            $_item = new WP_REST_Request( 'POST' );
160
+
161
+            // Default parameters.
162
+            $defaults = array();
163
+            $schema   = $this->get_public_item_schema();
164
+            foreach ( $schema['properties'] as $arg => $options ) {
165
+                if ( isset( $options['default'] ) ) {
166
+                    $defaults[ $arg ] = $options['default'];
167
+                }
168
+            }
169
+            $_item->set_default_params( $defaults );
170
+
171
+            // Set request parameters.
172
+            $_item->set_body_params( $item );
173
+
174
+            // Set query (GET) parameters.
175
+            $_item->set_query_params( $query );
176
+
177
+            // Create the item.
178
+            $_response = $this->create_item( $_item );
179
+
180
+            // If an error occured...
181
+            if ( is_wp_error( $_response ) ) {
182
+
183
+                $create[]   = array(
184
+                    'id'    => 0,
185
+                    'error' => array(
186
+                        'code'    => $_response->get_error_code(),
187
+                        'message' => $_response->get_error_message(),
188
+                        'data'    => $_response->get_error_data(),
189
+                    ),
190
+                );
191
+
192
+                continue;
193
+            }
194
+
195
+            $create[] = $wp_rest_server->response_to_data( /** @scrutinizer ignore-type */ $_response, false );
196
+
197
+        }
198
+
199
+        return $create;
200
+
201
+    }
202
+
203
+    /**
204
+     * Bulk update items.
205
+     *
206
+     * @param array $items Array of items to update.
207
+     * @param WP_REST_Request $request Full details about the request.
208
+     * @param WP_REST_Server $wp_rest_server
209
+     * @return array()
210
+     */
211
+    protected function batch_update_items( $items, $request, $wp_rest_server ) {
212
+
213
+        $query  = $request->get_query_params();
214
+        $update = array();
215
+
216
+        foreach ( $items as $item ) {
217
+
218
+            // Create a dummy request.
219
+            $_item = new WP_REST_Request( 'PUT' );
220
+
221
+            // Add body params.
222
+            $_item->set_body_params( $item );
223
+
224
+            // Set query (GET) parameters.
225
+            $_item->set_query_params( $query );
226
+
227
+            // Update the item.
228
+            $_response = $this->update_item( $_item );
229
+
230
+            // If an error occured...
231
+            if ( is_wp_error( $_response ) ) {
232
+
233
+                $update[] = array(
234
+                    'id'    => $item['id'],
235
+                    'error' => array(
236
+                        'code'    => $_response->get_error_code(),
237
+                        'message' => $_response->get_error_message(),
238
+                        'data'    => $_response->get_error_data(),
239
+                    ),
240
+                );
241
+
242
+                continue;
243
+
244
+            }
245
+
246
+            $update[] = $wp_rest_server->response_to_data( /** @scrutinizer ignore-type */ $_response, false );
247
+
248
+        }
249
+
250
+        return $update;
251
+
252
+    }
253
+
254
+    /**
255
+     * Bulk delete items.
256
+     *
257
+     * @param array $items Array of items to delete.
258
+     * @param WP_REST_Server $wp_rest_server
259
+     * @return array()
260
+     */
261
+    protected function batch_delete_items( $items, $wp_rest_server ) {
262
+
263
+        $delete = array();
264
+
265
+        foreach ( array_filter( $items ) as $id ) {
266
+
267
+            // Prepare the request.
268
+            $_item = new WP_REST_Request( 'DELETE' );
269
+            $_item->set_query_params(
270
+                array(
271
+                    'id'    => $id,
272
+                    'force' => true,
273
+                )
274
+            );
275
+
276
+            // Delete the item.
277
+            $_response = $this->delete_item( $_item );
278
+
279
+            if ( is_wp_error( $_response ) ) {
280
+
281
+                $delete[] = array(
282
+                    'id'    => $id,
283
+                    'error' => array(
284
+                        'code'    => $_response->get_error_code(),
285
+                        'message' => $_response->get_error_message(),
286
+                        'data'    => $_response->get_error_data(),
287
+                    ),
288
+                );
289
+
290
+                continue;
291
+            }
200 292
 
201
-	}
202
-
203
-	/**
204
-	 * Bulk update items.
205
-	 *
206
-	 * @param array $items Array of items to update.
207
-	 * @param WP_REST_Request $request Full details about the request.
208
-	 * @param WP_REST_Server $wp_rest_server
209
-	 * @return array()
210
-	 */
211
-	protected function batch_update_items( $items, $request, $wp_rest_server ) {
212
-
213
-		$query  = $request->get_query_params();
214
-		$update = array();
215
-
216
-		foreach ( $items as $item ) {
217
-
218
-			// Create a dummy request.
219
-			$_item = new WP_REST_Request( 'PUT' );
220
-
221
-			// Add body params.
222
-			$_item->set_body_params( $item );
223
-
224
-			// Set query (GET) parameters.
225
-			$_item->set_query_params( $query );
226
-
227
-			// Update the item.
228
-			$_response = $this->update_item( $_item );
229
-
230
-			// If an error occured...
231
-			if ( is_wp_error( $_response ) ) {
232
-
233
-				$update[] = array(
234
-					'id'    => $item['id'],
235
-					'error' => array(
236
-						'code'    => $_response->get_error_code(),
237
-						'message' => $_response->get_error_message(),
238
-						'data'    => $_response->get_error_data(),
239
-					),
240
-				);
241
-
242
-				continue;
243
-
244
-			}
245
-
246
-			$update[] = $wp_rest_server->response_to_data( /** @scrutinizer ignore-type */ $_response, false );
247
-
248
-		}
249
-
250
-		return $update;
251
-
252
-	}
293
+            $delete[] = $wp_rest_server->response_to_data( /** @scrutinizer ignore-type */ $_response, false );
253 294
 
254
-	/**
255
-	 * Bulk delete items.
256
-	 *
257
-	 * @param array $items Array of items to delete.
258
-	 * @param WP_REST_Server $wp_rest_server
259
-	 * @return array()
260
-	 */
261
-	protected function batch_delete_items( $items, $wp_rest_server ) {
262
-
263
-		$delete = array();
264
-
265
-		foreach ( array_filter( $items ) as $id ) {
266
-
267
-			// Prepare the request.
268
-			$_item = new WP_REST_Request( 'DELETE' );
269
-			$_item->set_query_params(
270
-				array(
271
-					'id'    => $id,
272
-					'force' => true,
273
-				)
274
-			);
275
-
276
-			// Delete the item.
277
-			$_response = $this->delete_item( $_item );
278
-
279
-			if ( is_wp_error( $_response ) ) {
280
-
281
-				$delete[] = array(
282
-					'id'    => $id,
283
-					'error' => array(
284
-						'code'    => $_response->get_error_code(),
285
-						'message' => $_response->get_error_message(),
286
-						'data'    => $_response->get_error_data(),
287
-					),
288
-				);
289
-
290
-				continue;
291
-			}
292
-
293
-			$delete[] = $wp_rest_server->response_to_data( /** @scrutinizer ignore-type */ $_response, false );
294
-
295
-		}
296
-
297
-		return $delete;
298
-
299
-	}
300
-
301
-	/**
302
-	 * Bulk create, update and delete items.
303
-	 *
304
-	 * @param WP_REST_Request $request Full details about the request.
305
-	 * @return WP_Error|array.
306
-	 */
307
-	public function batch_items( $request ) {
308
-		global $wp_rest_server;
309
-
310
-		// Prepare the batch items.
311
-		$items = $this->fill_batch_keys( array_filter( $request->get_params() ) );
312
-
313
-		// Ensure that the batch has not exceeded the limit to prevent abuse.
314
-		$limit = $this->check_batch_limit( $items );
315
-		if ( is_wp_error( $limit ) ) {
316
-			return $limit;
317
-		}
318
-
319
-		// Process the items.
320
-		return array(
321
-			'create' => $this->batch_create_items( $items['create'], $request, $wp_rest_server ),
322
-			'update' => $this->batch_update_items( $items['update'], $request, $wp_rest_server ),
323
-			'delete' => $this->batch_delete_items( $items['delete'], $wp_rest_server ),
324
-		);
325
-
326
-	}
327
-
328
-	/**
329
-	 * Add meta query.
330
-	 *
331
-	 * @since 1.0.19
332
-	 * @param array $args       Query args.
333
-	 * @param array $meta_query Meta query.
334
-	 * @return array
335
-	 */
336
-	protected function add_meta_query( $args, $meta_query ) {
337
-		if ( empty( $args['meta_query'] ) ) {
338
-			$args['meta_query'] = array();
339
-		}
340
-
341
-		$args['meta_query'][] = $meta_query;
342
-
343
-		return $args['meta_query'];
344
-	}
345
-
346
-	/**
347
-	 * Get the batch schema, conforming to JSON Schema.
348
-	 *
349
-	 * @return array
350
-	 */
351
-	public function get_public_batch_schema() {
352
-
353
-		return array(
354
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
355
-			'title'      => 'batch',
356
-			'type'       => 'object',
357
-			'properties' => array(
358
-				'create' => array(
359
-					'description' => __( 'List of created resources.', 'invoicing' ),
360
-					'type'        => 'array',
361
-					'context'     => array( 'view', 'edit' ),
362
-					'items'       => array(
363
-						'type'    => 'object',
364
-					),
365
-				),
366
-				'update' => array(
367
-					'description' => __( 'List of updated resources.', 'invoicing' ),
368
-					'type'        => 'array',
369
-					'context'     => array( 'view', 'edit' ),
370
-					'items'       => array(
371
-						'type'    => 'object',
372
-					),
373
-				),
374
-				'delete' => array(
375
-					'description' => __( 'List of deleted resources.', 'invoicing' ),
376
-					'type'        => 'array',
377
-					'context'     => array( 'view', 'edit' ),
378
-					'items'       => array(
379
-						'type'    => 'integer',
380
-					),
381
-				),
382
-			),
383
-		);
384
-
385
-	}
386
-
387
-	/**
388
-	 * Returns the value of schema['properties']
389
-	 * 
390
-	 * i.e Schema fields.
391
-	 *
392
-	 * @since 1.0.19
393
-	 * @return array
394
-	 */
395
-	protected function get_schema_properties() {
396
-
397
-		$schema     = $this->get_item_schema();
398
-		$properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
399
-
400
-		// For back-compat, include any field with an empty schema
401
-		// because it won't be present in $this->get_item_schema().
402
-		foreach ( $this->get_additional_fields() as $field_name => $field_options ) {
403
-			if ( is_null( $field_options['schema'] ) ) {
404
-				$properties[ $field_name ] = $field_options;
405
-			}
406
-		}
407
-
408
-		return $properties;
409
-	}
410
-
411
-	/**
412
-	 * Filters fields by context.
413
-	 *
414
-	 * @param array $fields Array of fields
415
-	 * @param string|null context view, edit or embed
416
-	 * @since 1.0.19
417
-	 * @return array
418
-	 */
419
-	protected function filter_response_fields_by_context( $fields, $context ) {
420
-
421
-		if ( empty( $context ) ) {
422
-			return $fields;
423
-		}
424
-
425
-		foreach ( $fields as $name => $options ) {
426
-			if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
427
-				unset( $fields[ $name ] );
428
-			}
429
-		}
430
-
431
-		return $fields;
432
-
433
-	}
434
-
435
-	/**
436
-	 * Filters fields by an array of requested fields.
437
-	 *
438
-	 * @param array $fields Array of available fields
439
-	 * @param array $requested array of requested fields.
440
-	 * @since 1.0.19
441
-	 * @return array
442
-	 */
443
-	protected function filter_response_fields_by_array( $fields, $requested ) {
444
-
445
-		// Trim off any whitespace from the list array.
446
-		$requested = array_map( 'trim', $requested );
447
-
448
-		// Always persist 'id', because it can be needed for add_additional_fields_to_object().
449
-		if ( in_array( 'id', $fields, true ) ) {
450
-			$requested[] = 'id';
451
-		}
452
-
453
-		// Get rid of duplicate fields.
454
-		$requested = array_unique( $requested );
455
-
456
-		// Return the list of all included fields which are available.
457
-		return array_reduce(
458
-			$requested,
459
-			function( $response_fields, $field ) use ( $fields ) {
460
-
461
-				if ( in_array( $field, $fields, true ) ) {
462
-					$response_fields[] = $field;
463
-					return $response_fields;
464
-				}
465
-
466
-				// Check for nested fields if $field is not a direct match.
467
-				$nested_fields = explode( '.', $field );
468
-
469
-				// A nested field is included so long as its top-level property is
470
-				// present in the schema.
471
-				if ( in_array( $nested_fields[0], $fields, true ) ) {
472
-					$response_fields[] = $field;
473
-				}
474
-
475
-				return $response_fields;
476
-			},
477
-			array()
478
-		);
479
-
480
-	}
481
-
482
-	/**
483
-	 * Gets an array of fields to be included on the response.
484
-	 *
485
-	 * Included fields are based on item schema and `_fields=` request argument.
486
-	 * Copied from WordPress 5.3 to support old versions.
487
-	 *
488
-	 * @since 1.0.19
489
-	 * @param WP_REST_Request $request Full details about the request.
490
-	 * @return array Fields to be included in the response.
491
-	 */
492
-	public function get_fields_for_response( $request ) {
493
-
494
-		// Retrieve fields in the schema.
495
-		$properties = $this->get_schema_properties();
496
-
497
-		// Exclude fields that specify a different context than the request context.
498
-		$properties = $this->filter_response_fields_by_context( $properties, $request['context'] );
499
-
500
-		// We only need the field keys.
501
-		$fields = array_keys( $properties );
502
-
503
-		// Is the user filtering the response fields??
504
-		if ( empty( $request['_fields'] ) ) {
505
-			return $fields;
506
-		}
507
-
508
-		return $this->filter_response_fields_by_array( $fields, wpinv_parse_list( $request['_fields'] ) );
509
-
510
-	}
511
-
512
-	/**
513
-	 * Limits an object to the requested fields.
514
-	 *
515
-	 * Included fields are based on the `_fields` request argument.
516
-	 *
517
-	 * @since 1.0.19
518
-	 * @param array $data Fields to include in the response.
519
-	 * @param array $fields Requested fields.
520
-	 * @return array Fields to be included in the response.
521
-	 */
522
-	public function limit_object_to_requested_fields( $data, $fields, $prefix = '' ) {
523
-
524
-		// Is the user filtering the response fields??
525
-		if ( empty( $fields ) ) {
526
-			return $data;
527
-		}
528
-
529
-		foreach ( $data as $key => $value ) {
530
-
531
-			// Numeric arrays.
532
-			if ( is_numeric( $key ) && is_array( $value ) ) {
533
-				$data[ $key ] = $this->limit_object_to_requested_fields( $value, $fields, $prefix );
534
-				continue;
535
-			}
536
-
537
-			// Generate a new prefix.
538
-			$new_prefix = empty( $prefix ) ? $key : "$prefix.$key";
539
-
540
-			// Check if it was requested.
541
-			if ( ! empty( $key ) && ! $this->is_field_included( $new_prefix, $fields ) ) {
542
-				unset( $data[ $key ] );
543
-				continue;
544
-			}
545
-
546
-			if ( $key != 'meta_data' && is_array( $value ) ) {
547
-				$data[ $key ] = $this->limit_object_to_requested_fields( $value, $fields, $new_prefix );
548
-			}
549
-
550
-		}
551
-
552
-		return $data;
553
-	}
554
-
555
-	/**
556
-	 * Given an array of fields to include in a response, some of which may be
557
-	 * `nested.fields`, determine whether the provided field should be included
558
-	 * in the response body.
559
-	 *
560
-	 * Copied from WordPress 5.3 to support old versions.
561
-	 *
562
-	 * @since 1.0.19
563
-	 *
564
-	 * @param string $field  A field to test for inclusion in the response body.
565
-	 * @param array  $fields An array of string fields supported by the endpoint.
566
-	 * @return bool Whether to include the field or not.
567
-	 * @see rest_is_field_included()
568
-	 */
569
-	public function is_field_included( $field, $fields ) {
570
-		if ( in_array( $field, $fields, true ) ) {
571
-			return true;
572
-		}
573
-
574
-		foreach ( $fields as $accepted_field ) {
575
-			// Check to see if $field is the parent of any item in $fields.
576
-			// A field "parent" should be accepted if "parent.child" is accepted.
577
-			if ( strpos( $accepted_field, "$field." ) === 0 ) {
578
-				return true;
579
-			}
580
-			// Conversely, if "parent" is accepted, all "parent.child" fields
581
-			// should also be accepted.
582
-			if ( strpos( $field, "$accepted_field." ) === 0 ) {
583
-				return true;
584
-			}
585
-		}
586
-
587
-		return false;
588
-	}
295
+        }
296
+
297
+        return $delete;
298
+
299
+    }
300
+
301
+    /**
302
+     * Bulk create, update and delete items.
303
+     *
304
+     * @param WP_REST_Request $request Full details about the request.
305
+     * @return WP_Error|array.
306
+     */
307
+    public function batch_items( $request ) {
308
+        global $wp_rest_server;
309
+
310
+        // Prepare the batch items.
311
+        $items = $this->fill_batch_keys( array_filter( $request->get_params() ) );
312
+
313
+        // Ensure that the batch has not exceeded the limit to prevent abuse.
314
+        $limit = $this->check_batch_limit( $items );
315
+        if ( is_wp_error( $limit ) ) {
316
+            return $limit;
317
+        }
318
+
319
+        // Process the items.
320
+        return array(
321
+            'create' => $this->batch_create_items( $items['create'], $request, $wp_rest_server ),
322
+            'update' => $this->batch_update_items( $items['update'], $request, $wp_rest_server ),
323
+            'delete' => $this->batch_delete_items( $items['delete'], $wp_rest_server ),
324
+        );
325
+
326
+    }
327
+
328
+    /**
329
+     * Add meta query.
330
+     *
331
+     * @since 1.0.19
332
+     * @param array $args       Query args.
333
+     * @param array $meta_query Meta query.
334
+     * @return array
335
+     */
336
+    protected function add_meta_query( $args, $meta_query ) {
337
+        if ( empty( $args['meta_query'] ) ) {
338
+            $args['meta_query'] = array();
339
+        }
340
+
341
+        $args['meta_query'][] = $meta_query;
342
+
343
+        return $args['meta_query'];
344
+    }
345
+
346
+    /**
347
+     * Get the batch schema, conforming to JSON Schema.
348
+     *
349
+     * @return array
350
+     */
351
+    public function get_public_batch_schema() {
352
+
353
+        return array(
354
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
355
+            'title'      => 'batch',
356
+            'type'       => 'object',
357
+            'properties' => array(
358
+                'create' => array(
359
+                    'description' => __( 'List of created resources.', 'invoicing' ),
360
+                    'type'        => 'array',
361
+                    'context'     => array( 'view', 'edit' ),
362
+                    'items'       => array(
363
+                        'type'    => 'object',
364
+                    ),
365
+                ),
366
+                'update' => array(
367
+                    'description' => __( 'List of updated resources.', 'invoicing' ),
368
+                    'type'        => 'array',
369
+                    'context'     => array( 'view', 'edit' ),
370
+                    'items'       => array(
371
+                        'type'    => 'object',
372
+                    ),
373
+                ),
374
+                'delete' => array(
375
+                    'description' => __( 'List of deleted resources.', 'invoicing' ),
376
+                    'type'        => 'array',
377
+                    'context'     => array( 'view', 'edit' ),
378
+                    'items'       => array(
379
+                        'type'    => 'integer',
380
+                    ),
381
+                ),
382
+            ),
383
+        );
384
+
385
+    }
386
+
387
+    /**
388
+     * Returns the value of schema['properties']
389
+     * 
390
+     * i.e Schema fields.
391
+     *
392
+     * @since 1.0.19
393
+     * @return array
394
+     */
395
+    protected function get_schema_properties() {
396
+
397
+        $schema     = $this->get_item_schema();
398
+        $properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
399
+
400
+        // For back-compat, include any field with an empty schema
401
+        // because it won't be present in $this->get_item_schema().
402
+        foreach ( $this->get_additional_fields() as $field_name => $field_options ) {
403
+            if ( is_null( $field_options['schema'] ) ) {
404
+                $properties[ $field_name ] = $field_options;
405
+            }
406
+        }
407
+
408
+        return $properties;
409
+    }
410
+
411
+    /**
412
+     * Filters fields by context.
413
+     *
414
+     * @param array $fields Array of fields
415
+     * @param string|null context view, edit or embed
416
+     * @since 1.0.19
417
+     * @return array
418
+     */
419
+    protected function filter_response_fields_by_context( $fields, $context ) {
420
+
421
+        if ( empty( $context ) ) {
422
+            return $fields;
423
+        }
424
+
425
+        foreach ( $fields as $name => $options ) {
426
+            if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
427
+                unset( $fields[ $name ] );
428
+            }
429
+        }
430
+
431
+        return $fields;
432
+
433
+    }
434
+
435
+    /**
436
+     * Filters fields by an array of requested fields.
437
+     *
438
+     * @param array $fields Array of available fields
439
+     * @param array $requested array of requested fields.
440
+     * @since 1.0.19
441
+     * @return array
442
+     */
443
+    protected function filter_response_fields_by_array( $fields, $requested ) {
444
+
445
+        // Trim off any whitespace from the list array.
446
+        $requested = array_map( 'trim', $requested );
447
+
448
+        // Always persist 'id', because it can be needed for add_additional_fields_to_object().
449
+        if ( in_array( 'id', $fields, true ) ) {
450
+            $requested[] = 'id';
451
+        }
452
+
453
+        // Get rid of duplicate fields.
454
+        $requested = array_unique( $requested );
455
+
456
+        // Return the list of all included fields which are available.
457
+        return array_reduce(
458
+            $requested,
459
+            function( $response_fields, $field ) use ( $fields ) {
460
+
461
+                if ( in_array( $field, $fields, true ) ) {
462
+                    $response_fields[] = $field;
463
+                    return $response_fields;
464
+                }
465
+
466
+                // Check for nested fields if $field is not a direct match.
467
+                $nested_fields = explode( '.', $field );
468
+
469
+                // A nested field is included so long as its top-level property is
470
+                // present in the schema.
471
+                if ( in_array( $nested_fields[0], $fields, true ) ) {
472
+                    $response_fields[] = $field;
473
+                }
474
+
475
+                return $response_fields;
476
+            },
477
+            array()
478
+        );
479
+
480
+    }
481
+
482
+    /**
483
+     * Gets an array of fields to be included on the response.
484
+     *
485
+     * Included fields are based on item schema and `_fields=` request argument.
486
+     * Copied from WordPress 5.3 to support old versions.
487
+     *
488
+     * @since 1.0.19
489
+     * @param WP_REST_Request $request Full details about the request.
490
+     * @return array Fields to be included in the response.
491
+     */
492
+    public function get_fields_for_response( $request ) {
493
+
494
+        // Retrieve fields in the schema.
495
+        $properties = $this->get_schema_properties();
496
+
497
+        // Exclude fields that specify a different context than the request context.
498
+        $properties = $this->filter_response_fields_by_context( $properties, $request['context'] );
499
+
500
+        // We only need the field keys.
501
+        $fields = array_keys( $properties );
502
+
503
+        // Is the user filtering the response fields??
504
+        if ( empty( $request['_fields'] ) ) {
505
+            return $fields;
506
+        }
507
+
508
+        return $this->filter_response_fields_by_array( $fields, wpinv_parse_list( $request['_fields'] ) );
509
+
510
+    }
511
+
512
+    /**
513
+     * Limits an object to the requested fields.
514
+     *
515
+     * Included fields are based on the `_fields` request argument.
516
+     *
517
+     * @since 1.0.19
518
+     * @param array $data Fields to include in the response.
519
+     * @param array $fields Requested fields.
520
+     * @return array Fields to be included in the response.
521
+     */
522
+    public function limit_object_to_requested_fields( $data, $fields, $prefix = '' ) {
523
+
524
+        // Is the user filtering the response fields??
525
+        if ( empty( $fields ) ) {
526
+            return $data;
527
+        }
528
+
529
+        foreach ( $data as $key => $value ) {
530
+
531
+            // Numeric arrays.
532
+            if ( is_numeric( $key ) && is_array( $value ) ) {
533
+                $data[ $key ] = $this->limit_object_to_requested_fields( $value, $fields, $prefix );
534
+                continue;
535
+            }
536
+
537
+            // Generate a new prefix.
538
+            $new_prefix = empty( $prefix ) ? $key : "$prefix.$key";
539
+
540
+            // Check if it was requested.
541
+            if ( ! empty( $key ) && ! $this->is_field_included( $new_prefix, $fields ) ) {
542
+                unset( $data[ $key ] );
543
+                continue;
544
+            }
545
+
546
+            if ( $key != 'meta_data' && is_array( $value ) ) {
547
+                $data[ $key ] = $this->limit_object_to_requested_fields( $value, $fields, $new_prefix );
548
+            }
549
+
550
+        }
551
+
552
+        return $data;
553
+    }
554
+
555
+    /**
556
+     * Given an array of fields to include in a response, some of which may be
557
+     * `nested.fields`, determine whether the provided field should be included
558
+     * in the response body.
559
+     *
560
+     * Copied from WordPress 5.3 to support old versions.
561
+     *
562
+     * @since 1.0.19
563
+     *
564
+     * @param string $field  A field to test for inclusion in the response body.
565
+     * @param array  $fields An array of string fields supported by the endpoint.
566
+     * @return bool Whether to include the field or not.
567
+     * @see rest_is_field_included()
568
+     */
569
+    public function is_field_included( $field, $fields ) {
570
+        if ( in_array( $field, $fields, true ) ) {
571
+            return true;
572
+        }
573
+
574
+        foreach ( $fields as $accepted_field ) {
575
+            // Check to see if $field is the parent of any item in $fields.
576
+            // A field "parent" should be accepted if "parent.child" is accepted.
577
+            if ( strpos( $accepted_field, "$field." ) === 0 ) {
578
+                return true;
579
+            }
580
+            // Conversely, if "parent" is accepted, all "parent.child" fields
581
+            // should also be accepted.
582
+            if ( strpos( $field, "$accepted_field." ) === 0 ) {
583
+                return true;
584
+            }
585
+        }
586
+
587
+        return false;
588
+    }
589 589
 
590 590
 }
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-posts-controller.php 1 patch
Indentation   +619 added lines, -619 removed lines patch added patch discarded remove patch
@@ -18,628 +18,628 @@
 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
-
497
-			parent::get_collection_params(),
498
-
499
-			array(
500
-				'status' => array(
501
-					'default'           => $this->get_post_statuses(),
502
-					'description'       => __( 'Limit result set to resources assigned one or more statuses.', 'invoicing' ),
503
-					'type'              => array( 'array', 'string' ),
504
-					'items'             => array(
505
-						'enum'          => $this->get_post_statuses(),
506
-						'type'          => 'string',
507
-					),
508
-					'validate_callback' => 'rest_validate_request_arg',
509
-					'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
510
-				),
511
-				'after' => array(
512
-					'description'        => __( 'Limit response to resources created after a given ISO8601 compliant date.', 'invoicing' ),
513
-					'type'               => 'string',
514
-					'format'             => 'string',
515
-					'validate_callback'  => 'rest_validate_request_arg',
516
-					'sanitize_callback'  => 'sanitize_text_field',
517
-				),
518
-				'before' => array(
519
-					'description'        => __( 'Limit response to resources created before a given ISO8601 compliant date.', 'invoicing' ),
520
-					'type'               => 'string',
521
-					'format'             => 'string',
522
-					'validate_callback'  => 'rest_validate_request_arg',
523
-					'sanitize_callback'  => 'sanitize_text_field',
524
-				),
525
-				'exclude' => array(
526
-					'description'       => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
527
-					'type'              => 'array',
528
-					'items'             => array(
529
-						'type'          => 'integer',
530
-					),
531
-					'default'           => array(),
532
-					'sanitize_callback' => 'wp_parse_id_list',
533
-					'validate_callback' => 'rest_validate_request_arg',
534
-				),
535
-				'include' => array(
536
-					'description'       => __( 'Limit result set to specific ids.', 'invoicing' ),
537
-					'type'              => 'array',
538
-					'items'             => array(
539
-						'type'          => 'integer',
540
-					),
541
-					'default'           => array(),
542
-					'sanitize_callback' => 'wp_parse_id_list',
543
-					'validate_callback' => 'rest_validate_request_arg',
544
-				),
545
-				'offset' => array(
546
-					'description'        => __( 'Offset the result set by a specific number of items.', 'invoicing' ),
547
-					'type'               => 'integer',
548
-					'sanitize_callback'  => 'absint',
549
-					'validate_callback'  => 'rest_validate_request_arg',
550
-				),
551
-				'order' => array(
552
-					'description'        => __( 'Order sort attribute ascending or descending.', 'invoicing' ),
553
-					'type'               => 'string',
554
-					'default'            => 'desc',
555
-					'enum'               => array( 'asc', 'desc' ),
556
-					'validate_callback'  => 'rest_validate_request_arg',
557
-				),
558
-				'orderby' => array(
559
-					'description'        => __( 'Sort collection by object attribute.', 'invoicing' ),
560
-					'type'               => 'string',
561
-					'default'            => 'date',
562
-					'enum'               => array(
563
-						'date',
564
-						'id',
565
-						'include',
566
-						'title',
567
-						'slug',
568
-						'modified',
569
-					),
570
-					'validate_callback'  => 'rest_validate_request_arg',
571
-				),
572
-			)
573
-		);
574
-	}
575
-
576
-	/**
577
-	 * Retrieves the items's schema, conforming to JSON Schema.
578
-	 *
579
-	 * @since 1.0.19
580
-	 *
581
-	 * @return array Item schema data.
582
-	 */
583
-	public function get_item_schema() {
584
-
585
-		// Maybe retrieve the schema from cache.
586
-		if ( ! empty( $this->schema ) ) {
587
-			return $this->add_additional_fields_schema( $this->schema );
588
-		}
589
-
590
-		$type   = str_replace( 'wpi_', '', $this->post_type );
591
-		$schema = array(
592
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
593
-			'title'      => $this->post_type,
594
-			'type'       => 'object',
595
-			'properties' => wpinv_get_data( "$type-schema" ),
596
-		);
597
-
598
-		// 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
+
497
+            parent::get_collection_params(),
498
+
499
+            array(
500
+                'status' => array(
501
+                    'default'           => $this->get_post_statuses(),
502
+                    'description'       => __( 'Limit result set to resources assigned one or more statuses.', 'invoicing' ),
503
+                    'type'              => array( 'array', 'string' ),
504
+                    'items'             => array(
505
+                        'enum'          => $this->get_post_statuses(),
506
+                        'type'          => 'string',
507
+                    ),
508
+                    'validate_callback' => 'rest_validate_request_arg',
509
+                    'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
510
+                ),
511
+                'after' => array(
512
+                    'description'        => __( 'Limit response to resources created after a given ISO8601 compliant date.', 'invoicing' ),
513
+                    'type'               => 'string',
514
+                    'format'             => 'string',
515
+                    'validate_callback'  => 'rest_validate_request_arg',
516
+                    'sanitize_callback'  => 'sanitize_text_field',
517
+                ),
518
+                'before' => array(
519
+                    'description'        => __( 'Limit response to resources created before a given ISO8601 compliant date.', 'invoicing' ),
520
+                    'type'               => 'string',
521
+                    'format'             => 'string',
522
+                    'validate_callback'  => 'rest_validate_request_arg',
523
+                    'sanitize_callback'  => 'sanitize_text_field',
524
+                ),
525
+                'exclude' => array(
526
+                    'description'       => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
527
+                    'type'              => 'array',
528
+                    'items'             => array(
529
+                        'type'          => 'integer',
530
+                    ),
531
+                    'default'           => array(),
532
+                    'sanitize_callback' => 'wp_parse_id_list',
533
+                    'validate_callback' => 'rest_validate_request_arg',
534
+                ),
535
+                'include' => array(
536
+                    'description'       => __( 'Limit result set to specific ids.', 'invoicing' ),
537
+                    'type'              => 'array',
538
+                    'items'             => array(
539
+                        'type'          => 'integer',
540
+                    ),
541
+                    'default'           => array(),
542
+                    'sanitize_callback' => 'wp_parse_id_list',
543
+                    'validate_callback' => 'rest_validate_request_arg',
544
+                ),
545
+                'offset' => array(
546
+                    'description'        => __( 'Offset the result set by a specific number of items.', 'invoicing' ),
547
+                    'type'               => 'integer',
548
+                    'sanitize_callback'  => 'absint',
549
+                    'validate_callback'  => 'rest_validate_request_arg',
550
+                ),
551
+                'order' => array(
552
+                    'description'        => __( 'Order sort attribute ascending or descending.', 'invoicing' ),
553
+                    'type'               => 'string',
554
+                    'default'            => 'desc',
555
+                    'enum'               => array( 'asc', 'desc' ),
556
+                    'validate_callback'  => 'rest_validate_request_arg',
557
+                ),
558
+                'orderby' => array(
559
+                    'description'        => __( 'Sort collection by object attribute.', 'invoicing' ),
560
+                    'type'               => 'string',
561
+                    'default'            => 'date',
562
+                    'enum'               => array(
563
+                        'date',
564
+                        'id',
565
+                        'include',
566
+                        'title',
567
+                        'slug',
568
+                        'modified',
569
+                    ),
570
+                    'validate_callback'  => 'rest_validate_request_arg',
571
+                ),
572
+            )
573
+        );
574
+    }
575
+
576
+    /**
577
+     * Retrieves the items's schema, conforming to JSON Schema.
578
+     *
579
+     * @since 1.0.19
580
+     *
581
+     * @return array Item schema data.
582
+     */
583
+    public function get_item_schema() {
584
+
585
+        // Maybe retrieve the schema from cache.
586
+        if ( ! empty( $this->schema ) ) {
587
+            return $this->add_additional_fields_schema( $this->schema );
588
+        }
589
+
590
+        $type   = str_replace( 'wpi_', '', $this->post_type );
591
+        $schema = array(
592
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
593
+            'title'      => $this->post_type,
594
+            'type'       => 'object',
595
+            'properties' => wpinv_get_data( "$type-schema" ),
596
+        );
597
+
598
+        // Filters the invoice schema for the REST API.
599 599
         $schema = apply_filters( "wpinv_rest_{$type}_schema", $schema );
600 600
 
601
-		// Cache the invoice schema.
602
-		$this->schema = $schema;
603
-
604
-		return $this->add_additional_fields_schema( $this->schema );
605
-	}
606
-
607
-	/**
608
-	 * Sanitizes and validates the list of post statuses.
609
-	 *
610
-	 * @since 1.0.13
611
-	 *
612
-	 * @param string|array    $statuses  One or more post statuses.
613
-	 * @param WP_REST_Request $request   Full details about the request.
614
-	 * @param string          $parameter Additional parameter to pass to validation.
615
-	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
616
-	 */
617
-	public function sanitize_post_statuses( $statuses, $request, $parameter ) {
618
-		return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
619
-	}
620
-
621
-	/**
622
-	 * Retrieves a valid list of post statuses.
623
-	 *
624
-	 * @since 1.0.19
625
-	 *
626
-	 * @return array A list of registered item statuses.
627
-	 */
628
-	public function get_post_statuses() {
629
-		return get_post_stati();
630
-	}
631
-
632
-	/**
633
-	 * Checks if a key should be included in a response.
634
-	 *
635
-	 * @since  1.0.19
636
-	 * @param  GetPaid_Data $object  Data object.
637
-	 * @param  string       $field_key The key to check for.
638
-	 * @return bool
639
-	 */
640
-	public function object_supports_field( $object, $field_key ) {
641
-		$supports = parent::object_supports_field( $object, $field_key );
642
-		return apply_filters( "getpaid_rest_{$this->post_type}_object_supports_key", $supports, $object, $field_key );
643
-	}
601
+        // Cache the invoice schema.
602
+        $this->schema = $schema;
603
+
604
+        return $this->add_additional_fields_schema( $this->schema );
605
+    }
606
+
607
+    /**
608
+     * Sanitizes and validates the list of post statuses.
609
+     *
610
+     * @since 1.0.13
611
+     *
612
+     * @param string|array    $statuses  One or more post statuses.
613
+     * @param WP_REST_Request $request   Full details about the request.
614
+     * @param string          $parameter Additional parameter to pass to validation.
615
+     * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
616
+     */
617
+    public function sanitize_post_statuses( $statuses, $request, $parameter ) {
618
+        return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
619
+    }
620
+
621
+    /**
622
+     * Retrieves a valid list of post statuses.
623
+     *
624
+     * @since 1.0.19
625
+     *
626
+     * @return array A list of registered item statuses.
627
+     */
628
+    public function get_post_statuses() {
629
+        return get_post_stati();
630
+    }
631
+
632
+    /**
633
+     * Checks if a key should be included in a response.
634
+     *
635
+     * @since  1.0.19
636
+     * @param  GetPaid_Data $object  Data object.
637
+     * @param  string       $field_key The key to check for.
638
+     * @return bool
639
+     */
640
+    public function object_supports_field( $object, $field_key ) {
641
+        $supports = parent::object_supports_field( $object, $field_key );
642
+        return apply_filters( "getpaid_rest_{$this->post_type}_object_supports_key", $supports, $object, $field_key );
643
+    }
644 644
 
645 645
 }
Please login to merge, or discard this patch.
includes/data-stores/class-getpaid-data-store.php 1 patch
Indentation   +181 added lines, -181 removed lines patch added patch discarded remove patch
@@ -11,186 +11,186 @@
 block discarded – undo
11 11
  */
12 12
 class GetPaid_Data_Store {
13 13
 
14
-	/**
15
-	 * Contains an instance of the data store class that we are working with.
16
-	 *
17
-	 * @var GetPaid_Data_Store
18
-	 */
19
-	private $instance = null;
20
-
21
-	/**
22
-	 * Contains an array of default supported data stores.
23
-	 * Format of object name => class name.
24
-	 * Example: 'item' => 'GetPaid_Item_Data_Store'
25
-	 * You can also pass something like item-<type> for item stores and
26
-	 * that type will be used first when available, if a store is requested like
27
-	 * this and doesn't exist, then the store would fall back to 'item'.
28
-	 * Ran through `getpaid_data_stores`.
29
-	 *
30
-	 * @var array
31
-	 */
32
-	private $stores = array(
33
-		'item'         => 'GetPaid_Item_Data_Store',
34
-		'payment_form' => 'GetPaid_Payment_Form_Data_Store',
35
-		'discount'     => 'GetPaid_Discount_Data_Store',
36
-		'invoice'      => 'GetPaid_Invoice_Data_Store',
37
-		'subscription' => 'GetPaid_Subscription_Data_Store',
38
-	);
39
-
40
-	/**
41
-	 * Contains the name of the current data store's class name.
42
-	 *
43
-	 * @var string
44
-	 */
45
-	private $current_class_name = '';
46
-
47
-	/**
48
-	 * The object type this store works with.
49
-	 *
50
-	 * @var string
51
-	 */
52
-	private $object_type = '';
53
-
54
-	/**
55
-	 * Tells GetPaid_Data_Store which object
56
-	 * store we want to work with.
57
-	 *
58
-	 * @param string $object_type Name of object.
59
-	 */
60
-	public function __construct( $object_type ) {
61
-		$this->object_type = $object_type;
62
-		$this->stores      = apply_filters( 'getpaid_data_stores', $this->stores );
63
-
64
-		// If this object type can't be found, check to see if we can load one
65
-		// level up (so if item-type isn't found, we try item).
66
-		if ( ! array_key_exists( $object_type, $this->stores ) ) {
67
-			$pieces      = explode( '-', $object_type );
68
-			$object_type = $pieces[0];
69
-		}
70
-
71
-		if ( array_key_exists( $object_type, $this->stores ) ) {
72
-			$store = apply_filters( 'getpaid_' . $object_type . '_data_store', $this->stores[ $object_type ] );
73
-			if ( is_object( $store ) ) {
74
-				$this->current_class_name = get_class( $store );
75
-				$this->instance           = $store;
76
-			} else {
77
-				if ( ! class_exists( $store ) ) {
78
-					throw new Exception( __( 'Data store class does not exist.', 'invoicing' ) );
79
-				}
80
-				$this->current_class_name = $store;
81
-				$this->instance           = new $store();
82
-			}
83
-		} else {
84
-			throw new Exception( __( 'Invalid data store.', 'invoicing' ) );
85
-		}
86
-	}
87
-
88
-	/**
89
-	 * Only store the object type to avoid serializing the data store instance.
90
-	 *
91
-	 * @return array
92
-	 */
93
-	public function __sleep() {
94
-		return array( 'object_type' );
95
-	}
96
-
97
-	/**
98
-	 * Re-run the constructor with the object type.
99
-	 *
100
-	 * @throws Exception When validation fails.
101
-	 */
102
-	public function __wakeup() {
103
-		$this->__construct( $this->object_type );
104
-	}
105
-
106
-	/**
107
-	 * Loads a data store.
108
-	 *
109
-	 * @param string $object_type Name of object.
110
-	 *
111
-	 * @since 1.0.19
112
-	 * @throws Exception When validation fails.
113
-	 * @return GetPaid_Data_Store
114
-	 */
115
-	public static function load( $object_type ) {
116
-		return new GetPaid_Data_Store( $object_type );
117
-	}
118
-
119
-	/**
120
-	 * Returns the class name of the current data store.
121
-	 *
122
-	 * @since 1.0.19
123
-	 * @return string
124
-	 */
125
-	public function get_current_class_name() {
126
-		return $this->current_class_name;
127
-	}
128
-
129
-	/**
130
-	 * Returns the object type of the current data store.
131
-	 *
132
-	 * @since 1.0.19
133
-	 * @return string
134
-	 */
135
-	public function get_object_type() {
136
-		return $this->object_type;
137
-	}
138
-
139
-	/**
140
-	 * Reads an object from the data store.
141
-	 *
142
-	 * @since 1.0.19
143
-	 * @param GetPaid_Data $data GetPaid data instance.
144
-	 */
145
-	public function read( &$data ) {
146
-		$this->instance->read( $data );
147
-	}
148
-
149
-	/**
150
-	 * Create an object in the data store.
151
-	 *
152
-	 * @since 1.0.19
153
-	 * @param GetPaid_Data $data GetPaid data instance.
154
-	 */
155
-	public function create( &$data ) {
156
-		$this->instance->create( $data );
157
-	}
158
-
159
-	/**
160
-	 * Update an object in the data store.
161
-	 *
162
-	 * @since 1.0.19
163
-	 * @param GetPaid_Data $data GetPaid data instance.
164
-	 */
165
-	public function update( &$data ) {
166
-		$this->instance->update( $data );
167
-	}
168
-
169
-	/**
170
-	 * Delete an object from the data store.
171
-	 *
172
-	 * @since 1.0.19
173
-	 * @param GetPaid_Data $data GetPaid data instance.
174
-	 * @param array   $args Array of args to pass to the delete method.
175
-	 */
176
-	public function delete( &$data, $args = array() ) {
177
-		$this->instance->delete( $data, $args );
178
-	}
179
-
180
-	/**
181
-	 * Data stores can define additional function. This passes
182
-	 * through to the instance if that function exists.
183
-	 *
184
-	 * @since 1.0.19
185
-	 * @param string $method     Method.
186
-	 * @return mixed
187
-	 */
188
-	public function __call( $method, $parameters ) {
189
-		if ( is_callable( array( $this->instance, $method ) ) ) {
190
-			$object     = array_shift( $parameters );
191
-			$parameters = array_merge( array( &$object ), $parameters );
192
-			return call_user_func_array( array( $this->instance, $method ), $parameters );
193
-		}
194
-	}
14
+    /**
15
+     * Contains an instance of the data store class that we are working with.
16
+     *
17
+     * @var GetPaid_Data_Store
18
+     */
19
+    private $instance = null;
20
+
21
+    /**
22
+     * Contains an array of default supported data stores.
23
+     * Format of object name => class name.
24
+     * Example: 'item' => 'GetPaid_Item_Data_Store'
25
+     * You can also pass something like item-<type> for item stores and
26
+     * that type will be used first when available, if a store is requested like
27
+     * this and doesn't exist, then the store would fall back to 'item'.
28
+     * Ran through `getpaid_data_stores`.
29
+     *
30
+     * @var array
31
+     */
32
+    private $stores = array(
33
+        'item'         => 'GetPaid_Item_Data_Store',
34
+        'payment_form' => 'GetPaid_Payment_Form_Data_Store',
35
+        'discount'     => 'GetPaid_Discount_Data_Store',
36
+        'invoice'      => 'GetPaid_Invoice_Data_Store',
37
+        'subscription' => 'GetPaid_Subscription_Data_Store',
38
+    );
39
+
40
+    /**
41
+     * Contains the name of the current data store's class name.
42
+     *
43
+     * @var string
44
+     */
45
+    private $current_class_name = '';
46
+
47
+    /**
48
+     * The object type this store works with.
49
+     *
50
+     * @var string
51
+     */
52
+    private $object_type = '';
53
+
54
+    /**
55
+     * Tells GetPaid_Data_Store which object
56
+     * store we want to work with.
57
+     *
58
+     * @param string $object_type Name of object.
59
+     */
60
+    public function __construct( $object_type ) {
61
+        $this->object_type = $object_type;
62
+        $this->stores      = apply_filters( 'getpaid_data_stores', $this->stores );
63
+
64
+        // If this object type can't be found, check to see if we can load one
65
+        // level up (so if item-type isn't found, we try item).
66
+        if ( ! array_key_exists( $object_type, $this->stores ) ) {
67
+            $pieces      = explode( '-', $object_type );
68
+            $object_type = $pieces[0];
69
+        }
70
+
71
+        if ( array_key_exists( $object_type, $this->stores ) ) {
72
+            $store = apply_filters( 'getpaid_' . $object_type . '_data_store', $this->stores[ $object_type ] );
73
+            if ( is_object( $store ) ) {
74
+                $this->current_class_name = get_class( $store );
75
+                $this->instance           = $store;
76
+            } else {
77
+                if ( ! class_exists( $store ) ) {
78
+                    throw new Exception( __( 'Data store class does not exist.', 'invoicing' ) );
79
+                }
80
+                $this->current_class_name = $store;
81
+                $this->instance           = new $store();
82
+            }
83
+        } else {
84
+            throw new Exception( __( 'Invalid data store.', 'invoicing' ) );
85
+        }
86
+    }
87
+
88
+    /**
89
+     * Only store the object type to avoid serializing the data store instance.
90
+     *
91
+     * @return array
92
+     */
93
+    public function __sleep() {
94
+        return array( 'object_type' );
95
+    }
96
+
97
+    /**
98
+     * Re-run the constructor with the object type.
99
+     *
100
+     * @throws Exception When validation fails.
101
+     */
102
+    public function __wakeup() {
103
+        $this->__construct( $this->object_type );
104
+    }
105
+
106
+    /**
107
+     * Loads a data store.
108
+     *
109
+     * @param string $object_type Name of object.
110
+     *
111
+     * @since 1.0.19
112
+     * @throws Exception When validation fails.
113
+     * @return GetPaid_Data_Store
114
+     */
115
+    public static function load( $object_type ) {
116
+        return new GetPaid_Data_Store( $object_type );
117
+    }
118
+
119
+    /**
120
+     * Returns the class name of the current data store.
121
+     *
122
+     * @since 1.0.19
123
+     * @return string
124
+     */
125
+    public function get_current_class_name() {
126
+        return $this->current_class_name;
127
+    }
128
+
129
+    /**
130
+     * Returns the object type of the current data store.
131
+     *
132
+     * @since 1.0.19
133
+     * @return string
134
+     */
135
+    public function get_object_type() {
136
+        return $this->object_type;
137
+    }
138
+
139
+    /**
140
+     * Reads an object from the data store.
141
+     *
142
+     * @since 1.0.19
143
+     * @param GetPaid_Data $data GetPaid data instance.
144
+     */
145
+    public function read( &$data ) {
146
+        $this->instance->read( $data );
147
+    }
148
+
149
+    /**
150
+     * Create an object in the data store.
151
+     *
152
+     * @since 1.0.19
153
+     * @param GetPaid_Data $data GetPaid data instance.
154
+     */
155
+    public function create( &$data ) {
156
+        $this->instance->create( $data );
157
+    }
158
+
159
+    /**
160
+     * Update an object in the data store.
161
+     *
162
+     * @since 1.0.19
163
+     * @param GetPaid_Data $data GetPaid data instance.
164
+     */
165
+    public function update( &$data ) {
166
+        $this->instance->update( $data );
167
+    }
168
+
169
+    /**
170
+     * Delete an object from the data store.
171
+     *
172
+     * @since 1.0.19
173
+     * @param GetPaid_Data $data GetPaid data instance.
174
+     * @param array   $args Array of args to pass to the delete method.
175
+     */
176
+    public function delete( &$data, $args = array() ) {
177
+        $this->instance->delete( $data, $args );
178
+    }
179
+
180
+    /**
181
+     * Data stores can define additional function. This passes
182
+     * through to the instance if that function exists.
183
+     *
184
+     * @since 1.0.19
185
+     * @param string $method     Method.
186
+     * @return mixed
187
+     */
188
+    public function __call( $method, $parameters ) {
189
+        if ( is_callable( array( $this->instance, $method ) ) ) {
190
+            $object     = array_shift( $parameters );
191
+            $parameters = array_merge( array( &$object ), $parameters );
192
+            return call_user_func_array( array( $this->instance, $method ), $parameters );
193
+        }
194
+    }
195 195
 
196 196
 }
Please login to merge, or discard this patch.
includes/data-stores/class-getpaid-payment-form-data-store.php 1 patch
Indentation   +169 added lines, -169 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 if ( ! defined( 'ABSPATH' ) ) {
7
-	exit;
7
+    exit;
8 8
 }
9 9
 
10 10
 /**
@@ -14,179 +14,179 @@  discard block
 block discarded – undo
14 14
  */
15 15
 class GetPaid_Payment_Form_Data_Store extends GetPaid_Data_Store_WP {
16 16
 
17
-	/**
18
-	 * Data stored in meta keys, but not considered "meta" for a form.
19
-	 *
20
-	 * @since 1.0.19
21
-	 * @var array
22
-	 */
23
-	protected $internal_meta_keys = array(
24
-		'wpinv_form_elements',
25
-		'wpinv_form_items',
26
-		'wpinv_form_earned',
27
-		'wpinv_form_refunded',
28
-		'wpinv_form_cancelled',
29
-		'wpinv_form_failed'
30
-	);
31
-
32
-	/**
33
-	 * A map of meta keys to data props.
34
-	 *
35
-	 * @since 1.0.19
36
-	 *
37
-	 * @var array
38
-	 */
39
-	protected $meta_key_to_props = array(
40
-		'wpinv_form_elements'  => 'elements',
41
-		'wpinv_form_items'     => 'items',
42
-		'wpinv_form_earned'    => 'earned',
43
-		'wpinv_form_refunded'  => 'refunded',
44
-		'wpinv_form_cancelled' => 'cancelled',
45
-		'wpinv_form_failed'    => 'failed',
46
-	);
47
-
48
-	/*
17
+    /**
18
+     * Data stored in meta keys, but not considered "meta" for a form.
19
+     *
20
+     * @since 1.0.19
21
+     * @var array
22
+     */
23
+    protected $internal_meta_keys = array(
24
+        'wpinv_form_elements',
25
+        'wpinv_form_items',
26
+        'wpinv_form_earned',
27
+        'wpinv_form_refunded',
28
+        'wpinv_form_cancelled',
29
+        'wpinv_form_failed'
30
+    );
31
+
32
+    /**
33
+     * A map of meta keys to data props.
34
+     *
35
+     * @since 1.0.19
36
+     *
37
+     * @var array
38
+     */
39
+    protected $meta_key_to_props = array(
40
+        'wpinv_form_elements'  => 'elements',
41
+        'wpinv_form_items'     => 'items',
42
+        'wpinv_form_earned'    => 'earned',
43
+        'wpinv_form_refunded'  => 'refunded',
44
+        'wpinv_form_cancelled' => 'cancelled',
45
+        'wpinv_form_failed'    => 'failed',
46
+    );
47
+
48
+    /*
49 49
 	|--------------------------------------------------------------------------
50 50
 	| CRUD Methods
51 51
 	|--------------------------------------------------------------------------
52 52
 	*/
53 53
 
54
-	/**
55
-	 * Method to create a new form in the database.
56
-	 *
57
-	 * @param GetPaid_Payment_Form $form Form object.
58
-	 */
59
-	public function create( &$form ) {
60
-		$form->set_version( WPINV_VERSION );
61
-		$form->set_date_created( current_time('mysql') );
62
-
63
-		// Create a new post.
64
-		$id = wp_insert_post(
65
-			apply_filters(
66
-				'getpaid_new_payment_form_data',
67
-				array(
68
-					'post_date'     => $form->get_date_created( 'edit' ),
69
-					'post_type'     => 'wpi_payment_form',
70
-					'post_status'   => $this->get_post_status( $form ),
71
-					'ping_status'   => 'closed',
72
-					'post_author'   => $form->get_author( 'edit' ),
73
-					'post_title'    => $form->get_name( 'edit' ),
74
-				)
75
-			),
76
-			true
77
-		);
78
-
79
-		if ( $id && ! is_wp_error( $id ) ) {
80
-			$form->set_id( $id );
81
-			$this->update_post_meta( $form );
82
-			$form->save_meta_data();
83
-			$form->apply_changes();
84
-			$this->clear_caches( $form );
85
-			do_action( 'getpaid_create_payment_form', $form );
86
-			return true;
87
-		}
88
-
89
-		if ( is_wp_error( $id ) ) {
90
-			$form->last_error = $id->get_error_message();
91
-		}
92
-
93
-		return false;
94
-	}
95
-
96
-	/**
97
-	 * Method to read a form from the database.
98
-	 *
99
-	 * @param GetPaid_Payment_Form $form Form object.
100
-	 *
101
-	 */
102
-	public function read( &$form ) {
103
-
104
-		$form->set_defaults();
105
-		$form_object = get_post( $form->get_id() );
106
-
107
-		if ( ! $form->get_id() || ! $form_object || $form_object->post_type != 'wpi_payment_form' ) {
108
-			$form->last_error = __( 'Invalid form.', 'invoicing' );
109
-			$form->set_id( 0 );
110
-			return false;
111
-		}
112
-
113
-		$form->set_props(
114
-			array(
115
-				'date_created'  => 0 < $form_object->post_date ? $form_object->post_date : null,
116
-				'date_modified' => 0 < $form_object->post_modified ? $form_object->post_modified : null,
117
-				'status'        => $form_object->post_status,
118
-				'name'          => $form_object->post_title,
119
-				'author'        => $form_object->post_author,
120
-			)
121
-		);
122
-
123
-		$this->read_object_data( $form, $form_object );
124
-		$form->read_meta_data();
125
-		$form->set_object_read( true );
126
-		do_action( 'getpaid_read_payment_form', $form );
127
-
128
-	}
129
-
130
-	/**
131
-	 * Method to update a form in the database.
132
-	 *
133
-	 * @param GetPaid_Payment_Form $form Form object.
134
-	 */
135
-	public function update( &$form ) {
136
-		$form->save_meta_data();
137
-		$form->set_version( WPINV_VERSION );
138
-
139
-		if ( null === $form->get_date_created( 'edit' ) ) {
140
-			$form->set_date_created(  current_time('mysql') );
141
-		}
142
-
143
-		// Grab the current status so we can compare.
144
-		$previous_status = get_post_status( $form->get_id() );
145
-
146
-		$changes = $form->get_changes();
147
-
148
-		// Only update the post when the post data changes.
149
-		if ( array_intersect( array( 'date_created', 'date_modified', 'status', 'name', 'author' ), array_keys( $changes ) ) ) {
150
-			$post_data = array(
151
-				'post_date'         => $form->get_date_created( 'edit' ),
152
-				'post_status'       => $form->get_status( 'edit' ),
153
-				'post_title'        => $form->get_name( 'edit' ),
154
-				'post_author'       => $form->get_author( 'edit' ),
155
-				'post_modified'     => $form->get_date_modified( 'edit' ),
156
-			);
157
-
158
-			/**
159
-			 * When updating this object, to prevent infinite loops, use $wpdb
160
-			 * to update data, since wp_update_post spawns more calls to the
161
-			 * save_post action.
162
-			 *
163
-			 * This ensures hooks are fired by either WP itself (admin screen save),
164
-			 * or an update purely from CRUD.
165
-			 */
166
-			if ( doing_action( 'save_post' ) ) {
167
-				$GLOBALS['wpdb']->update( $GLOBALS['wpdb']->posts, $post_data, array( 'ID' => $form->get_id() ) );
168
-				clean_post_cache( $form->get_id() );
169
-			} else {
170
-				wp_update_post( array_merge( array( 'ID' => $form->get_id() ), $post_data ) );
171
-			}
172
-			$form->read_meta_data( true ); // Refresh internal meta data, in case things were hooked into `save_post` or another WP hook.
173
-		}
174
-		$this->update_post_meta( $form );
175
-		$form->apply_changes();
176
-		$this->clear_caches( $form );
177
-
178
-		// Fire a hook depending on the status - this should be considered a creation if it was previously draft status.
179
-		$new_status = $form->get_status( 'edit' );
180
-
181
-		if ( $new_status !== $previous_status && in_array( $previous_status, array( 'new', 'auto-draft', 'draft' ), true ) ) {
182
-			do_action( 'getpaid_new_payment_form', $form );
183
-		} else {
184
-			do_action( 'getpaid_update_payment_form', $form );
185
-		}
186
-
187
-	}
188
-
189
-	/*
54
+    /**
55
+     * Method to create a new form in the database.
56
+     *
57
+     * @param GetPaid_Payment_Form $form Form object.
58
+     */
59
+    public function create( &$form ) {
60
+        $form->set_version( WPINV_VERSION );
61
+        $form->set_date_created( current_time('mysql') );
62
+
63
+        // Create a new post.
64
+        $id = wp_insert_post(
65
+            apply_filters(
66
+                'getpaid_new_payment_form_data',
67
+                array(
68
+                    'post_date'     => $form->get_date_created( 'edit' ),
69
+                    'post_type'     => 'wpi_payment_form',
70
+                    'post_status'   => $this->get_post_status( $form ),
71
+                    'ping_status'   => 'closed',
72
+                    'post_author'   => $form->get_author( 'edit' ),
73
+                    'post_title'    => $form->get_name( 'edit' ),
74
+                )
75
+            ),
76
+            true
77
+        );
78
+
79
+        if ( $id && ! is_wp_error( $id ) ) {
80
+            $form->set_id( $id );
81
+            $this->update_post_meta( $form );
82
+            $form->save_meta_data();
83
+            $form->apply_changes();
84
+            $this->clear_caches( $form );
85
+            do_action( 'getpaid_create_payment_form', $form );
86
+            return true;
87
+        }
88
+
89
+        if ( is_wp_error( $id ) ) {
90
+            $form->last_error = $id->get_error_message();
91
+        }
92
+
93
+        return false;
94
+    }
95
+
96
+    /**
97
+     * Method to read a form from the database.
98
+     *
99
+     * @param GetPaid_Payment_Form $form Form object.
100
+     *
101
+     */
102
+    public function read( &$form ) {
103
+
104
+        $form->set_defaults();
105
+        $form_object = get_post( $form->get_id() );
106
+
107
+        if ( ! $form->get_id() || ! $form_object || $form_object->post_type != 'wpi_payment_form' ) {
108
+            $form->last_error = __( 'Invalid form.', 'invoicing' );
109
+            $form->set_id( 0 );
110
+            return false;
111
+        }
112
+
113
+        $form->set_props(
114
+            array(
115
+                'date_created'  => 0 < $form_object->post_date ? $form_object->post_date : null,
116
+                'date_modified' => 0 < $form_object->post_modified ? $form_object->post_modified : null,
117
+                'status'        => $form_object->post_status,
118
+                'name'          => $form_object->post_title,
119
+                'author'        => $form_object->post_author,
120
+            )
121
+        );
122
+
123
+        $this->read_object_data( $form, $form_object );
124
+        $form->read_meta_data();
125
+        $form->set_object_read( true );
126
+        do_action( 'getpaid_read_payment_form', $form );
127
+
128
+    }
129
+
130
+    /**
131
+     * Method to update a form in the database.
132
+     *
133
+     * @param GetPaid_Payment_Form $form Form object.
134
+     */
135
+    public function update( &$form ) {
136
+        $form->save_meta_data();
137
+        $form->set_version( WPINV_VERSION );
138
+
139
+        if ( null === $form->get_date_created( 'edit' ) ) {
140
+            $form->set_date_created(  current_time('mysql') );
141
+        }
142
+
143
+        // Grab the current status so we can compare.
144
+        $previous_status = get_post_status( $form->get_id() );
145
+
146
+        $changes = $form->get_changes();
147
+
148
+        // Only update the post when the post data changes.
149
+        if ( array_intersect( array( 'date_created', 'date_modified', 'status', 'name', 'author' ), array_keys( $changes ) ) ) {
150
+            $post_data = array(
151
+                'post_date'         => $form->get_date_created( 'edit' ),
152
+                'post_status'       => $form->get_status( 'edit' ),
153
+                'post_title'        => $form->get_name( 'edit' ),
154
+                'post_author'       => $form->get_author( 'edit' ),
155
+                'post_modified'     => $form->get_date_modified( 'edit' ),
156
+            );
157
+
158
+            /**
159
+             * When updating this object, to prevent infinite loops, use $wpdb
160
+             * to update data, since wp_update_post spawns more calls to the
161
+             * save_post action.
162
+             *
163
+             * This ensures hooks are fired by either WP itself (admin screen save),
164
+             * or an update purely from CRUD.
165
+             */
166
+            if ( doing_action( 'save_post' ) ) {
167
+                $GLOBALS['wpdb']->update( $GLOBALS['wpdb']->posts, $post_data, array( 'ID' => $form->get_id() ) );
168
+                clean_post_cache( $form->get_id() );
169
+            } else {
170
+                wp_update_post( array_merge( array( 'ID' => $form->get_id() ), $post_data ) );
171
+            }
172
+            $form->read_meta_data( true ); // Refresh internal meta data, in case things were hooked into `save_post` or another WP hook.
173
+        }
174
+        $this->update_post_meta( $form );
175
+        $form->apply_changes();
176
+        $this->clear_caches( $form );
177
+
178
+        // Fire a hook depending on the status - this should be considered a creation if it was previously draft status.
179
+        $new_status = $form->get_status( 'edit' );
180
+
181
+        if ( $new_status !== $previous_status && in_array( $previous_status, array( 'new', 'auto-draft', 'draft' ), true ) ) {
182
+            do_action( 'getpaid_new_payment_form', $form );
183
+        } else {
184
+            do_action( 'getpaid_update_payment_form', $form );
185
+        }
186
+
187
+    }
188
+
189
+    /*
190 190
 	|--------------------------------------------------------------------------
191 191
 	| Additional Methods
192 192
 	|--------------------------------------------------------------------------
Please login to merge, or discard this patch.